电子日历时钟设计_第1页
电子日历时钟设计_第2页
电子日历时钟设计_第3页
电子日历时钟设计_第4页
电子日历时钟设计_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、目录1题目设计的要求12 系统硬件设计12.1 设计原理12.2 器件的功能与作用12.2.1 MCS51单片机AT89C5112.2.2 串行时钟日历片DS130222.2.3 液晶显示LCD160233 系统软件设计43.1 程序流程43.2 程序代码54 系统仿真调试124.1 仿真原理图设计124.2 仿真运行过程124.3 仿真运行结果135 总结136 参考文献131题目设计的要求通过串行日历时钟芯片DS1302生成当前日期和是时间,通过IO口传输到AT89c52芯片中,然后再将AT89c52接收到的数据输出到LCD上。要求LCD上显示的日期和时间与当前系统时间保持一致。2 系统硬

2、件设计2.1 设计原理图3.1 电路原理图2.2 器件的功能与作用2.2.1 MCS51单片机AT89C51XXAT89C51是一种带4K字节FLASH存储器(FPEROMFlash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称单片机。AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除1000次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATME

3、L的AT89C51是一种高效微控制器。AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。2.2.2 串行时钟日历片DS1302系统的组成与工作原理:系统由单片机AT89C52,串行日历时钟片DS1302,液晶显示模组LCD1602。DS1302的CLOCK与AT89C52的P1.6相连,RST与P1.5相连,IO与P1.7相连。LCD1602的D0D7与AT89C51的P0.0P.7相连,并接上拉电阻,RS与P2.0相连,RW与P2.1相连,E与P2.2相连。DS1302是DALLAS公司拖出的涓流充电时钟芯片,内含有一个实时时钟/日历和31个季节静态RAM,通过简单地串

4、行接口与单片机进行通信,实时时钟/日历电路提供秒、分、时、日、日期、月、年的信息,每月的天数和闰年的天数可自动调整,时钟操作可通过AM/PM指示决定采用24小时或12小时格式,DS1302与单片机之间能简单地采用同步串行方式进行通信,仅需用到RES复位、I/O数据线、SCLK串行时钟3个口线。对时钟、RAM的读/写,可以改用单字节方式或多达31个字节的字符组方式。DS1302工作时功耗很低,保持数据和时钟信息是功率小于1mW。DS1302广泛应用于电话传真、便携式仪器及电池供电的仪器仪表等产品领域中。RT-1602 字符型液晶模块是以两行16个子的5*7点阵吐信来显示字符的液晶显示器。 DS1

5、302有8个引脚:X1、X2:32.768kHz晶振介入引脚。GND:地。RST:复位引脚,低电平有效。I/O:数据输入/输出引脚,具有三态功能。SCLK:串行时钟输入引脚。Vcc1:工作电源引脚。Vcc2:备用电源引脚。DS1302有一个控制寄存器,12个日历,时钟寄存器和31个RAM。控制寄存器控制寄存器用于存放DS1302的控制命令字,DS1302的RST引脚回到高电平后写入的第一个字就为控制命令。它用于对DS1302读写过程进行控制,它的格式如下:表2.1 控制寄存器的格式 D7 D6 D5 D4 D3 D2 D1 D01RAM/CKA4A3A2A1A0RD/W各项功能说明如下。D7:

6、固定为1D6:RAM/CK位,片内RAM或日历、时钟寄存器选择位,当RAM/CK=1时,对片内RAM进行读写,当RAM/CK=0时,对日历、时钟寄存器进行读写。D5D1:地址位,用于选择进行读写的日历、时钟寄存器或片内RAM。对日历、时钟寄存器或片内RAM的选择。D0:读写位,当RD/W=1时,对日历、时钟寄存器或片内RAM进行读操作,当RD/W=0时,对日历、时钟寄存器或片内RAM进行写操作。日历、时钟寄存器DS1302共有12个寄存器,其中有7个与日历、时钟相关,存放的数据为BCD码形式。日历、时钟寄存器的格式。说明:数据都以BCD码形式表示。小时寄存器的D7位为12小时制/24小时制的选

7、择位,当为1时选择12小时制,当为0时选24小时制。当12小时制时,D5位为1是上午,D5位为0是下午,D4位小时的十位。当24小时制时,D5、D4位为小时的十位。秒寄存器中的CH位为时钟暂停位,当为1时,时钟暂停,为0时,时钟开始启动。写保护寄存器中的WP为写保护位,WP=1时,写保护,当WP=0时,未写保护,当对日历、时钟寄存器或片内RAM进行写时,WP应清零,当对日历、时钟寄存器或片内RAM进行读时,WP一般置1.慢充电寄存器的TCS位为控制慢充电的选择,当它为1010时才能是慢充电工作。DS为二极管选择位。DS为01选择一个二极管,DS为10选择两个二极管,DS为11或00充电器被禁止

8、,与TCS无关。RS用于选择连接在Vcc2与Vcc1之间的电阻,RS为00,充电器被禁止,与TCS无关。2.2.3 液晶显示LCD1602RT-1602采用表中的16 脚接口:第一脚:Vss,电源地。第二脚:VDD,+5V电源。第三脚:VL,液晶显示偏压信号。第四脚:RS,数据/命令选择端,高电平时选择数据寄存器,低电平时选择指令寄存器。第五脚:R/W,读/写选择端。第六脚:E,使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。第七14脚:D0D7,为8位双向数据线。第15脚:BLA,背光源正极。第16脚:BLK,背光源负极。3 系统软件设计3.1 程序流程图4.1 程序流程图3.2 程

9、序代码#include<reg51.h> /包含单片机寄存器的头文件#include<intrins.h> /包含_nop_()函数定义的头文件/*以下是DS1302芯片的操作程序*/unsigned char code digit10="0123456789" /定义字符数组显示数字sbit DATA=P17; /位定义1302芯片的接口,数据输出端定义在P1.7引脚sbit RST=P15; /位定义1302芯片的接口,复位端口定义在P1.5引脚sbit SCLK=P16; /位定义1302芯片的接口,时钟输出端口定义在P1.6引脚/*函数功能:

10、延时若干微秒入口参数:n*/ void delaynus(unsigned char n)unsigned char i;for(i=0;i<n;i+);/*函数功能:向1302写一个字节数据入口参数:x*/ void Write1302(unsigned char dat)unsigned char i; SCLK=0; /拉低SCLK,为脉冲上升沿写入数据做好准备delaynus(2); /稍微等待,使硬件做好准备for(i=0;i<8;i+) /连续写8个二进制位数据DATA=dat&0x01; /取出dat的第0位数据写入1302delaynus(2); /稍微等待

11、,使硬件做好准备SCLK=1; /上升沿写入数据delaynus(2); /稍微等待,使硬件做好准备SCLK=0; /重新拉低SCLK,形成脉冲dat>>=1; /将dat的各数据位右移1位,准备写入下一个数据位/*函数功能:根据命令字,向1302写一个字节数据入口参数:Cmd,储存命令字;dat,储存待写的数据*/ void WriteSet1302(unsigned char Cmd,unsigned char dat)RST=0; /禁止数据传递SCLK=0; /确保写数居前SCLK被拉低RST=1; /启动数据传输delaynus(2); /稍微等待,使硬件做好准备Writ

12、e1302(Cmd); /写入命令字Write1302(dat); /写数据SCLK=1; /将时钟电平置于已知状态RST=0; /禁止数据传递/*函数功能:从1302读一个字节数据入口参数:x*/ unsigned char Read1302(void)unsigned char i,dat;delaynus(2); /稍微等待,使硬件做好准备for(i=0;i<8;i+) /连续读8个二进制位数据dat>>=1; /将dat的各数据位右移1位,因为先读出的是字节的最低位if(DATA=1) /如果读出的数据是1dat|=0x80; /将1取出,写在dat的最高位SCLK=

13、1; /将SCLK置于高电平,为下降沿读出delaynus(2); /稍微等待SCLK=0; /拉低SCLK,形成脉冲下降沿delaynus(2); /稍微等待 return dat; /将读出的数据返回 /*函数功能:根据命令字,从1302读取一个字节数据入口参数:Cmd*/ unsigned char ReadSet1302(unsigned char Cmd)unsigned char dat;RST=0; /拉低RSTSCLK=0; /确保写数居前SCLK被拉低RST=1; /启动数据传输Write1302(Cmd); /写入命令字dat=Read1302(); /读出数据SCLK=1

14、; /将时钟电平置于已知状态RST=0; /禁止数据传递return dat; /将读出的数据返回/*以下是对液晶模块的操作程序*/sbit RS=P20; /寄存器选择位,将RS位定义为P2.0引脚sbit RW=P21; /读写选择位,将RW位定义为P2.1引脚sbit E=P22; /使能信号位,将E位定义为P2.2引脚sbit BF=P07; /忙碌标志位,将BF位定义为P0.7引脚/*函数功能:延时1ms(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒*/void delay1ms()unsigned char i,j; for(i=0

15、;i<10;i+)for(j=0;j<33;j+); /*函数功能:延时若干毫秒入口参数:n*/void delaynms(unsigned char n)unsigned char i;for(i=0;i<n;i+)delay1ms();/*函数功能:判断液晶模块的忙碌状态返回值:result。result=1,忙碌;result=0,不忙*/bit BusyTest(void)bit result;RS=0; /根据规定,RS为低电平,RW为高电平时,可以读状态RW=1;E=1; /E=1,才允许读写_nop_(); /空操作_nop_();_nop_(); _nop_(

16、); /空操作四个机器周期,给硬件反应时间 result=BF; /将忙碌标志电平赋给resultE=0; /将E恢复低电平return result;/*函数功能:将模式设置指令或显示地址写入液晶模块入口参数:dictate*/void WriteInstruction (unsigned char dictate) while(BusyTest()=1); /如果忙就等待RS=0; /根据规定,RS和R/W同时为低电平时,可以写入指令RW=0; E=0; /E置低电平/ 就是让E从0到1发生正跳变,所以应先置"0"_nop_();_nop_(); /空操作两个机器周期,

17、给硬件反应时间P0=dictate; /将数据送入P0口,即写入指令或地址_nop_();_nop_();_nop_();_nop_(); /空操作四个机器周期,给硬件反应时间E=1; /E置高电平_nop_();_nop_();_nop_();_nop_(); /空操作四个机器周期,给硬件反应时间E=0; /当E由高电平跳变成低电平时,液晶模块开始执行命令/*函数功能:指定字符显示的实际地址入口参数:x*/void WriteAddress(unsigned char x)WriteInstruction(x|0x80); /显示位置的确定方法规定为"80H+地址码x"/

18、*函数功能:将数据(字符的标准ASCII码)写入液晶模块入口参数:y(为字符常量)*/void WriteData(unsigned char y)while(BusyTest()=1); RS=1; /RS为高电平,RW为低电平时,可以写入数据RW=0;E=0; / 就是让E从0到1发生正跳变,所以应先置"0"P0=y; /将数据送入P0口,即将数据写入液晶模块_nop_();_nop_();_nop_();_nop_(); /空操作四个机器周期,给硬件反应时间E=1; /E置高电平_nop_();_nop_();_nop_();_nop_(); /空操作四个机器周期,给

19、硬件反应时间E=0; /当E由高电平跳变成低电平时,液晶模块开始执行命令/*函数功能:对LCD的显示模式进行初始化设置*/void LcdInitiate(void)delaynms(15); /延时15ms,首次写指令时应给LCD一段较长的反应时间WriteInstruction(0x38); /显示模式设置:16×2显示,5×7点阵,8位数据接口delaynms(5); /延时5ms,给硬件一点反应时间WriteInstruction(0x38);delaynms(5); /延时5ms,给硬件一点反应时间WriteInstruction(0x38); /连续三次,确保初

20、始化成功delaynms(5); /延时5ms,给硬件一点反应时间WriteInstruction(0x0c); /显示模式设置:显示开,无光标,光标不闪烁delaynms(5); /延时5ms,给硬件一点反应时间WriteInstruction(0x06); /显示模式设置:光标右移,字符不移delaynms(5); /延时5ms,给硬件一点反应时间WriteInstruction(0x01); /清屏幕指令,将以前的显示内容清除delaynms(5); /延时5ms,给硬件一点反应时间 /*以下是1302数据的显示程序*/void Display(unsigned char x,unsig

21、ned char y)unsigned char i,j; i=x/10;j=x%10; WriteAddress(y); WriteData(digiti); WriteData(digitj); delaynms(50); /延时1ms给硬件一点反应时间 /*函数功能:主函数*/ void main(void)unsigned char second,minute,hour,day,month,year; /分别储存秒、分、小时,日,月,年unsigned char ReadValue; /储存从1302读取的数据LcdInitiate(); /将液晶初始化WriteAddress(0x0

22、0); /写Date的显示地址,将在第1行第1列开始显示WriteData('D'); /将字符常量写入LCDWriteAddress(0x01);WriteData('a'); /将字符常量写入LCD WriteAddress(0x02);WriteData('t'); /将字符常量写入LCDWriteAddress(0x03);WriteData('e'); /将字符常量写入LCDWriteAddress(0x04);WriteData(':'); /将字符常量写入LCDWriteAddress(0x08);

23、/写年月分隔符的显示地址, 显示在第1行第9列WriteData('-'); /将字符常量写入LCDWriteAddress(0x0b); /写月日分隔符的显示地址, 显示在第1行第12列WriteData('-'); /将字符常量写入LCDWriteAddress(0x40);WriteData('T');WriteAddress(0x41);WriteData('i');WriteAddress(0x42);WriteData('m');WriteAddress(0x43);WriteData('e&#

24、39;);WriteAddress(0x44);WriteData(':');WriteAddress(0x48); WriteData(':'); /将字符常量写入LCDWriteAddress(0x4b); WriteData(':'); /将字符常量写入LCD while(1)ReadValue = ReadSet1302(0x81); /从秒寄存器读数据second=(ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);/将读出数据转化Display(second,0x4c);

25、/显示秒ReadValue = ReadSet1302(0x83); /从分寄存器读minute=(ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); /将读出数据转化 Display(minute,0x49); /显示分ReadValue = ReadSet1302(0x85); /从小时寄存器读hour=(ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); /将读出数据转化Display(hour,0x46); /显示小时ReadValue = ReadSet1302(0x87); /从分寄存器读day=(ReadValue&0x70)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论