创新实验报告.docx

上传人:b****8 文档编号:29016242 上传时间:2023-07-20 格式:DOCX 页数:24 大小:291.82KB
下载 相关 举报
创新实验报告.docx_第1页
第1页 / 共24页
创新实验报告.docx_第2页
第2页 / 共24页
创新实验报告.docx_第3页
第3页 / 共24页
创新实验报告.docx_第4页
第4页 / 共24页
创新实验报告.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

创新实验报告.docx

《创新实验报告.docx》由会员分享,可在线阅读,更多相关《创新实验报告.docx(24页珍藏版)》请在冰豆网上搜索。

创新实验报告.docx

创新实验报告

 

第一章摘要

一.实验器材

MSP430单片机

DS1302日历芯片

MAX7219数码管驱动芯片

数码管

发光二极管或蜂鸣器

二.设计思路

本实验利用MSP430单片机,基于时钟报时原理,使用DS1302时钟芯片计时,使用数码管显示时间,由MSP430从DS1302中读取当前日期和时间送到数码管显示。

当到达设定的定时时间是,由MSP430发出信号,驱动发光二极管闪烁或者蜂鸣器报警。

由于数码管只能显示八位数据,所以以显示时间为主,在特定的时间会显示日期,本实验设置为每三个小时显示一次日期,并在报时时显示日期。

三.功能概述

在程序中设定时间初值并启动DS1302计时,由MSP430循环从DS1302中读取当前时间值,并送到MAX7219中驱动数码管显示时间。

在主程序中定义一个二维数组用来存放设定的报时时间。

MSP430每次读取时间信息后与数组中的值进行比较,判断当前时间是否为设定的报时时间,如果需要报时,则单片机驱动发光二级管闪烁或蜂鸣器报警以提示报时,

同时数码管交替显示日期和时间,十秒后,报时结束。

此外,判断当前小时是否为3的整数倍,若是,显示日期,显示方式为,时间和日期交替显示,十秒后停止。

第二章芯片信息

第一节MSP430

MSP430系列单片机是美国德州仪器(TI)1996年开始推向市场的一种16位超低功耗、具有精简指令集(RISC)的混合信号处理器(MixedSignalProcessor)。

其特点为:

处理能力强

MSP430系列单片机是一个16位的单片机,采用了精简指令集(RISC)结构,具有丰富的寻址方式(7种源操作数寻址、4种目的操作数寻址)、简洁的27条内核指令以及大量的模拟指令;大量的寄存器以及片内数据存储器都可参加多种运算;还有高效的查表处理指令。

这些特点保证了可编制出高效率的源程序。

运算速度快

MSP430系列单片机能在25MHz晶体的驱动下,实现40ns的指令周期。

16位的数据宽度、40ns的指令周期以及多功能的硬件乘法器(能实现乘加运算)相配合,能实现数字信号处理的某些算法(如FFT等)。

超低功耗

MSP430单片机之所以有超低的功耗,是因为其在降低芯片的电源电压和灵活而可控的运行时钟方面都有其独到之处。

首先,MSP430系列单片机的电源电压采用的是1.8-3.6V电压。

因而可使其在1MHz的时钟条件下运行时,芯片的电流最低会在165μA左右,RAM保持模式下的最低功耗只有0.1μA。

其次,独特的时钟系统设计。

在MSP430系列中有两个不同的时钟系统:

基本时钟系统、锁频环(FLL和FLL+)时钟系统和DCO数字振荡器时钟系统。

可以只使用一个晶体振荡器(32768Hz),也可以使用两个晶体振荡器。

由系统时钟系统产生CPU和各功能所需的时钟。

并且这些时钟可以在指令的控制下,打开和关闭,从而实现对总体功耗的控制。

由于系统运行时开启的功能模块不同,即采用不同的工作模式,芯片的功耗有着显著的不同。

在系统中共有一种活动模式(AM)和五种低功耗模式(LPM0~LPM4)。

在实时时钟模式下,可达2.5μA,在RAM保持模式下,最低可达0.1μA。

片内资源丰富

MSP430系列单片机的各系列都集成了较丰富的片内外设。

它们分别是看门狗(WDT)、模拟比较器A、定时器A0(Timer_A0)、定时器A1(Timer_A1)、定时器B0(Timer_B0)、UART、SPI、I2C、硬件乘法器、液晶驱动器、10位/12位ADC、16位Σ-ΔADC、DMA、I/O端口、基本定时器(BasicTimer)、实时时钟(RTC)和USB控制器等若干外围模块的不同组合。

其中,看门狗可以使程序失控时迅速复位;模拟比较器进行模拟电压的比较,配合定时器,可设计出A/D转换器;16位定时器(Timer_A和Timer_B)具有捕获/比较功能,大量的捕获/比较寄存器,可用于事件计数、时序发生、PWM等;有的器件更具有可实现异步、同步及多址访问串行通信接口可方便的实现多机通信等应用;具有较多的I/O端口,P0、P1、P2端口能够接收外部上升沿或下降沿的中断输入;10/12位硬件A/D转换器有较高的转换速率,最高可达200kbps,能够满足大多数数据采集应用;能直接驱动液晶多达160段;实现两路的12位D/A转换;硬件I2C串行总线接口实现存储器串行扩展;以及为了增加数据传输速度,而采用的DMA模块。

MSP430系列单片机的这些片内外设为系统的单片解决方案提供了极大的方便。

另外,MSP430系列单片机的中断源较多,并且可以任意嵌套,使用时灵活方便。

当系统处于省电的低功耗状态时,中断唤醒只需5μs。

方便高效的开发环境

MSP430系列有OPT型、FLASH型和ROM型三种类型的器件,这些器件的开发手段不同。

对于OPT型和ROM型的器件是使用仿真器开发成功之后烧写或掩膜芯片;对于FLASH型则有十分方便的开发调试环境,因为器件片内有JTAG调试接口,还有可电擦写的FLASH存储器,因此采用先下载程序到FLASH内,再在器件内通过软件控制程序的运行,由JTAG接口读取片内信息供设计者调试使用的方法进行开发。

这种方式只需要一台PC机和一个JTAG调试器,而不需要仿真器和编程器。

开发语言有汇编语言和C语言。

第二节DS1302

1、DS1302引脚排列:

如下图

引脚说明:

1)Vcc1:

后备电源,VCC2:

主电源。

在主电源关闭的情况下,也能保持时钟的连续运行。

DS1302由Vcc1或Vcc2两者中的较大者供电。

当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电。

当Vcc2小于Vcc1时,DS1302由Vcc1供电。

2)X1、X2:

振荡源,外接32.768kHz晶振。

3)RST:

复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。

RST输入有两种功能:

首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据的传送手段。

当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。

如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。

上电运行时,在Vcc>2.0V之前,RST必须保持低电平。

只有在SCLK为低电平时,才能将RST置为高电平。

4)I/O为串行数据输入输出端(双向)。

5)SCLK为时钟输入端。

2、DS1302的控制字节

 DS1302的控制字如下图所示。

控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。

 

3、数据输入输出(I/O)

在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。

同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。

DS1302的寄存器

DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式,其日历、时间寄存器及其控制字见数据手册。

此外,DS1302还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。

时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。

DS1302与RAM相关的寄存器分为两类:

一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H~FDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。

第三节MAX7219

MAX7219是MAXIM公司生产的串行输入/输出共阴极数码管显示驱动芯片,一片MAX7219可驱动8个7段(包括小数点共8段)数字LED、LED条线图形显示器、或64个分立的LED发光二级管。

该芯片具有10MHz传输率的三线串行接口可与任何微处理器相连,只需一个外接电阻即可设置所有LED的段电流。

它的操作很简单,MCU只需通过模拟SPI三线接口就可以将相关的指令写入MAX7219的内部指令和数据寄存器,同时它还允许用户选择多种译码方式和译码位。

此外它还支持多片7219串联方式,这样MCU就可以通过3根线(即串行数据线、串行时钟线和芯片选通线)控制更多的数码管显示。

MAX7219的外部引脚分配如图1所示及内部结构如图2所示。

图1  MAX7219的外部引脚分配

图2  MAX7219的内部引脚分配

各引脚的功能为:

DIN:

串行数据输入端

DOUT:

串行数据输出端,用于级连扩展

LOAD:

装载数据输入

CLK:

串行时钟输入

DIG0~DIG7:

8位LED位选线,从共阴极LED中吸入电流

SEGA~SEGGDP    7段驱动和小数点驱动

ISET:

 通过一个10k电阻和Vcc相连,设置段电流

MAX7219有下列几组寄存器:

(如图3)

MAX7219内部的寄存器如图3,主要有:

译码控制寄存器、亮度控制寄存器、扫描界限寄存器、关断模式寄存器、测试控制寄存器。

编程时只有正确操作这些寄存器,MAX7219才可工作。

 

图3  MAX7219内部的相关寄存器

分别介绍如下:

(1)译码控制寄存器(X9H)

如图4所示,MAX7219有两种译码方式:

B译码方式和不译码方式。

当选择不译码时,8个数据为分别一一对应7个段和小数点位;B译码方式是BCD译码,直接送数据就可以显示。

实际应用中可以按位设置选择B译码或是不译码方式。

图4  MAX7219的译码控制寄存器

(2)扫描界限寄存器(XBH)

如图5所示,此寄存器用于设置显示的LED的个数(1~8),比如当设置为0xX4时,LED0~5显示。

 

图5  MAX7219的扫描界限控制寄存器

(3)亮度控制寄存器(XAH)

共有16级可选择,用于设置LED的显示亮度,从0xX0~0xXF

(4)关断模式寄存器(XCH)

共有两种模式选择,一是关断状态,(最低位D0=0)一是正常工作状态(D0=1)。

(5)显示测试寄存器(XFH)

用于设置LED是测试状态还是正常工作状态,当测试状态时(最低位D0=1)各位显示全亮,正常工作状态(D0=0)。

各寄存器具体操作见驱动程序详解。

2读写时序说明

MAX7129是SPI总线驱动方式。

它不仅要向寄存器写入控制字,还需要读取相应寄存器的数据。

要想与MAX7129通信,首先要先了解MAX7129的控制字。

MAX7129的控制字格式如图6。

图6  控制字(即地址及命令字节)

如图,工作时,MAX7219规定一次接收16位数据,在接收的16位数据中:

D15~D12可以与操作无关,可以任意写入,D11~D8决定所选通的内部寄存器地址,D7~D0为待显示数据或是初始化控制字。

在CLK脉冲作用下,DIN的数据以串行方式依次移入内部16位寄存器,然后在一个LOAD上升沿作用下,锁存到内部的寄存器中。

注意在接收时,先接收最高位D16,最后是D0,因此,在程序发送时必须先送高位数据,在循环移位。

工作时序图见图7。

由于51是8位单片机故需要分两次来送数据。

具体操作见驱动程序详解。

图7 数据读写时序

3电路原理图

电路原理图

电路原理图如图7,MAX7219与单片机的连接只需要3条线:

LOAD(CS)片选引脚、CLK串行时钟引脚、DIN串行数据引脚。

其中C1为电源滤波电容,R1用来设置段电流。

 

图8 电路原理图

典型应用电路:

第三章程序信息

第一节程序原理图

第二节程序代码

程序共三个文件,分别为主程序文件main.c,DS1302驱动函数文件1302.c,MAX7219驱动函数文件7219.c。

文件一main.c

#include

#include"1302.c"

#include"7219.c"

#defineuintunsignedchar

#defineF_OSC(1048576)

#definedelay_ms(xms)__delay_cycles((unsignedlong)(F_OSC*(float)xms/1000.0))

#definedelay_us(xms)__delay_cycles((unsignedlong)(F_OSC*(float)xms/1000000.0))

#defineCLOCK_OFFP4OUT|=BIT0+BIT1+BIT2+BIT3+BIT4

#defineCLOCK_ONP4OUT&=~(BIT0+BIT1+BIT2+BIT3+BIT4)

uintclock[4][2]={{0x08,0x57},{0x08,0x58},{0x09,0x15},{0x09,0x45}};

uintflag=0;

intmain(void)

{

//Stopwatchdogtimertopreventtimeoutreset

WDTCTL=WDTPW+WDTHOLD;

//端口定义

//P3.0=7219CLK,P3.1=7219DIN,P3.2=7219CE;P3.3=1302CE,P4.4=1302clk,P4.5=1302IN,;

P3DIR|=BIT0+BIT1+BIT2+BIT3+BIT4+BIT5;

P4DIR|=BIT0+BIT1+BIT2+BIT3+BIT4;//P4端口0~3接发光二级管,P4.4接蜂鸣器,用于报时

CLOCK_OFF;

init7219();

DS1302_Reset();

DS1302_SettingData();

for(uinti=1;i<9;i++)

write7219(i,0);

while

(1)

{

//读取1302计时时间

DS1302_GetData(ReadingData);

//通过7219显示时间

write7219(8,ReadingData[4]/16);

write7219(7,ReadingData[4]%16);//显示小时

write7219(6,10);//显示“—”

write7219(5,ReadingData[5]/16);

write7219(4,ReadingData[5]%16);//显示分钟

write7219(3,10);//显示“—”

write7219(2,ReadingData[6]/16);

write7219(1,ReadingData[6]%16);//显示秒

//判断是否到达报时时间

if((ReadingData[4]==clock[flag][0]&&ReadingData[5]==clock[flag][1]&&ReadingData[6]<=0x10))

{

//到达报时时间,报时10秒

CLOCK_ON;//启动报时,蜂鸣器报警,灯闪烁

delay_ms(500);//延时

write7219(8,0x02);//显示日期

write7219(7,0x00);

write7219(6,ReadingData[0]/16);

write7219(5,ReadingData[0]%16);

write7219(4,ReadingData[2]/16);

write7219(3,ReadingData[2]%16);

write7219(2,ReadingData[3]/16);

write7219(1,ReadingData[3]%16);

CLOCK_OFF;//关闭报时

delay_ms(500);//延时

if(ReadingData[6]==0x08)

{

//标志加一,指向下一报时时间;

flag++;

//最后一个报时时间已报时,重新指向第一个报时时间

if(flag==4)flag=0;

}

}

else

//每隔3小时显示一次日期,显示10秒

if((ReadingData[4]%3==0x00)&&(ReadingData[5]==0x00)&&(ReadingData[6]<0x10))

{

delay_ms(1000);//延时

write7219(8,0x02);//显示日期

write7219(7,0x00);

write7219(6,ReadingData[0]/16);

write7219(5,ReadingData[0]%16);

write7219(4,ReadingData[2]/16);

write7219(3,ReadingData[2]%16);

write7219(2,ReadingData[3]/16);

write7219(1,ReadingData[3]%16);

delay_ms(1000);//延时

}

}

}

文件二1302.c

#include

#defineDS1302_DIRP3DIR

#defineDS1302_INP3IN

#defineDS1302_OUTP3OUT

#defineDS1302_RSTBIT3

#defineDS1302_SCLKBIT4

#defineDS1302_SDIBIT5//定义MSP320的端口

#defineDS1302_RST_LODS1302_OUT&=~DS1302_RST

#defineDS1302_RST_HIDS1302_OUT|=DS1302_RST

#defineDS1302_SCLK_LODS1302_OUT&=~DS1302_SCLK

#defineDS1302_SCLK_HIDS1302_OUT|=DS1302_SCLK

#defineDS1302_SDI_LODS1302_OUT&=~DS1302_SDI

#defineDS1302_SDI_HIDS1302_OUT|=DS1302_SDI

voidDS1302_Delay(unsignedintdtime);

voidDS1302_Reset(void);

voidDS1302_WriteOneByte(unsignedcharw_dat);

voidDS1302_WriteData(unsignedcharaddr,unsignedcharw_dat);

voidDS1302_SettingData(void);

voidDS1302_GetData(unsignedchar*str);

unsignedcharDS1302_ReadOneByte(void);

unsignedcharDS1302_ReadData(unsignedcharaddr);

unsignedcharSetting_Time[7]={//bit7bit6bit5bit4bit3bit2bit1bit0

0x12,//--------十位-------|-------个位--------|年份(当前07年)

0x01,//|-----个位-----|星期(当前周日)

0x05,//|十位|-------个位--------|月份(当前07月)

0x31,//|--十位---|-------个位--------|日期(当前01号)

0x08,//-12H||--十位---|-------个位--------|小时(当前18点)

0x56,//|-----十位-----|-------个位--------|分钟(当前20分)

0x50//|-----十位-----|-------个位--------|秒钟(当前30秒)

};

unsignedcharReadingData[7];//读出来的数据,同SettingData定义与格式

//延时函数

voidDS1302_Delay(unsignedintdtime)

{

unsignedinttemp;

for(temp=0;temp

}

//DS1302复位

voidDS1302_Reset(void)

{

DS1302_DIR|=(DS1302_RST+DS1302_SCLK);

DS1302_SCLK_LO;

DS1302_RST_LO;

DS1302_Delay(10);

DS1302_SCLK_HI;

}

//向DS1302写入一个字节

voidDS1302_WriteOneByte(unsignedcharw_dat)

{

unsignedchartemp;

DS1302_RST_HI;

DS1302_DIR|=DS1302_SDI;

for(temp=8;temp>0;temp--)

{

DS1302_SDI_LO;

if(w_dat&BIT0)DS1302_SDI_HI;

DS1302_SCLK_LO;

DS1302_Delay(10);

DS1302_SCLK_HI;

DS1302_Delay(10);

w_dat>>=1;

}

}

//从DS1302中读取一个字节

unsignedcharDS1302_ReadOneByte(void)

{

unsignedchartemp,rdata;

rdata=0x00;

DS1302_RST_HI;

DS1302_DIR&=~DS1302_SDI;

for(temp=0;temp<8;temp++)

{

rdata>>=1;//将移位放到前面,否则读不到最高一位

DS1302_SCLK_HI;

DS1302_Delay(10);

DS1302_SCLK_LO;

DS1302_Delay(10);

if((DS1302_IN&DS1302_SDI)==DS1302_SDI)

rdata|=BIT7;

//rdata>>=1;

}

return(rdata);

}

//向DS1302中写入地址后写入数据

voidDS1302_WriteData(unsignedcharaddr,unsignedcharw_dat)

{

DS1302_RST_LO;

DS1302_SCLK_LO;

DS1302_RST_HI;

DS1302_WriteOneByte(addr);//写入地址

DS1302_WriteOneByte(w_dat);//写入数据

DS1302_SCLK_HI;

DS1302_RST_LO;

}

//向DS1302写入地址后,从DS1302中读取数据

unsignedcharDS1302_Rea

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 育儿知识

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1