单片机仿真课程设计——基于单片机的实时时钟_第1页
单片机仿真课程设计——基于单片机的实时时钟_第2页
单片机仿真课程设计——基于单片机的实时时钟_第3页
单片机仿真课程设计——基于单片机的实时时钟_第4页
单片机仿真课程设计——基于单片机的实时时钟_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

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

文档简介

1、基于51系列单片机及DS1302时钟芯片的实时时钟仿真设计一、课程设计目的意义通过本次课程设计可以灵活运用单片机的基础知识,依据课程设计内容,能够完成从硬件电路图设计,到软件编程及系统调试实现系统功能, 完成课程设计,加深对单片机基 础知识的理解并灵活运用。二、实现目标本设计主要为实现一款可正常显示时钟/日历的实时电子时钟。对当前电子钟开发手段进行了比较和分析,最终确定了采用单片机技术实现电子时钟。本设计应用AT89C52芯片作为核心,LCD显示屏,使用 DS1302实时时钟日历芯片完成时钟 /日历的基本功能。这种 实现方法的优点是电路简单,性能可靠,实时性好,时间精确,操作简单,编程容易。三

2、、硬件设计本设计采用具有 32根I/O引脚的AT89C52单片机。AT89C52单片机是一款低功耗,低 电压,高性能 CMOS位单片机,片内含 4KB (可经受1000次擦写周期)的FLASH可编程可 反复擦写的只读程序存储器(EPROM,器件采用CMO工艺和ATMEI公司的高密度、非易失性存储器(NURAM技术制造,其输出引脚和指令系统都与MCS-52兼容。片内的FLASH存储器允许在系统内可改编程序或用常规的非易失性存储器编程器来编程。因此,AT89C52是一种功能强,灵活性高且价格合理的单片机,可方便的应用在各个控制领域。AT89C52具有以下主要性能:1.2.3.4.5.6.7.4KB

3、可改编程序Flash存储器;全静态工作:024Hz;128 X 8字节内部RAM32个外部双向输入/输出(I/O ) 口;6个中断优先级;2个16位可编程定时计数器;可编程串行通道;片内时钟振荡器。十1463?UIL12 "T314151'IS1920P1 0vccP11PO'.OP1:P11ro?P1 -P1 5P1 6PO'.?P1 Fro.sRS7弘*P30R?DZ A V?PP? 1 TXJaleprSgp进P3 - Tft叫P?TPM両Pl*X 二AU士 XLALlTP2.0T30'DS1302是美国DALLAS公司推出的一种高性能、低功耗的

4、实时时钟日历芯片,附加31字节静态RAM采用SPI三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号和 RAM数据。实时时钟可提供秒、分、时、日、星期、月和年,一个月小于31天时可以自动调整,且具有闰年补偿功能。工作电压宽达2.55.5V。采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后备电源进行涓 细电流充电的能力。有主电源和备份电源双引脚,而且备份电源可由大容量电容( 1F)来替代。需要强调的是,DS1302需要使用32.768KHZ的晶振。E» 53 沁V0C1V0C2XIStCLX.X2IOONDSiT四、原理图F? 了町门 P;即

5、蚣1 IN "2I V如叫P2 -mFX邸k j.LJk ! F:.-l?pU pa还卫p = AnnPT; fhW ra IfPTI I町;V电亡 PQ®円X3 W464“ MJ沖巧 PC CMCPS ;Mr?C"i:*l IHS<pg三H5F: IfTZEXPF rMU1R1C213MI 二I X2心 恢H y2_:r.l VL : 1f亡二空一 £:=XI-0 OS'#屈1“RP1五、程序源代码#in elude <REGX52.H> #in elude "LCD1602.h" #in clude &q

6、uot;DS1302.h" void Delay1ms( un sig ned int count)un sig ned int i,j;for(i=0;i<co un t;i+) for(j=0;j<120;j+); mai n()SYSTEMTIME CurrentTime;LCD_Initial();Initial_DS1302();GotoXY(0,0);Print("Date: ");GotoXY(0,1);Print("Time: "); while(1)DS1302_GetTime(&CurrentTime);

7、DateToStr(&CurrentTime);TimeToStr(&CurrentTime);GotoXY(6,0);Print(CurrentTime.DateString);GotoXY(6,1);Print(CurrentTime.TimeString);Delay1ms(300);REAL_TIMER_DS1302#ifndef#define _REAL_TIMER_DS1302sbitDS1302_CLK = P 1人6;/ 实时时钟时钟线引脚sbitDS1302_IO = PIA7;/ 实时时钟数据线引脚sbitDS1302_RST = P 1人5;/ 实时时钟复

8、位线引脚sbitACC0 = ACCS;sbitACC7 = ACC7;typedef struct _SYSTEMTIME_ unsigned char Second; unsigned char Minute; unsigned char Hour; unsigned char Week; unsigned char Day; unsigned char Month; unsigned char Year; unsigned char DateString9;unsigned char TimeString9; SYSTEMTIME/;/ 定义的时间类型#define AM(X) X#de

9、fine PM(X) (X+12)#define DS1302_SECOND#define DS1302_MINUTE#define DS1302_HOUR#define DS1302_WEEK#define DS1302_DAY#define DS1302_MONTH#define DS1302_YEAR0x800x820x840x8A0x860x880x8C/转成 24 小时制#define DS1302_RAM(X)(0xC0+(X)*2)/ 用于计算 DS1302_RAM 地址的宏void DS1302InputByte(unsigned char d) / 实时时钟写入一字节 (内部

10、函数 )unsigned char i; ACC = d; for(i=8; i>0; i-) / 相当于汇编中的 RRCDS1302_IO = ACC0;DS1302_CLK = 1;DS1302_CLK = 0;ACC = ACC >> 1;unsigned char DS1302OutputByte(void) / 实时时钟读取一字节 (内部函数 )unsigned char i; for(i=8; i>0; i-)/ 相当于汇编中的 RRCACC = ACC >>1;ACC7 = DS1302_IO;DS1302_CLK = 1;DS1302_CLK

11、 = 0;return(ACC);void Write1302(unsigned char ucAddr, unsigned char ucDa)/ucAddr: DS1302 地址 , ucData:要写的数据DS1302_RST = 0;DS1302_CLK = 0;DS1302_RST = 1;DS1302InputByte(ucAddr);DS1302InputByte(ucDa);DS1302_CLK = 1;DS1302_RST = 0;/ 地址,命令 / 写 1Byte 数据unsigned char Read1302(unsigned char ucAddr) / 读取 DS1

12、302 某地址的数据 unsigned char ucData;DS1302_RST = 0;DS1302_CLK = 0;DS1302_RST = 1; DS1302InputByte(ucAddr|0x01); ucData = DS1302OutputByte();DS1302_CLK = 1;DS1302_RST = 0; return(ucData);/ 地址,命令/ 读 1Byte 数据void DS1302_SetProtect(bit flag)/ 是否写保护if(flag)Write1302(0x8E,0x10); elseWrite1302(0x8E,0x00);void

13、DS1302_SetTime(unsigned char Address, unsigned char Value) / 设置时间函数DS1302_SetProtect(0);Write1302(Address, (Value/10)<<4 | (Value%10);void DS1302_GetTime(SYSTEMTIME *Time)unsigned char ReadValue;ReadValue = Read1302(DS1302_SECOND);Time->Second = (ReadValue&0x70)>>4)*10 + (ReadValu

14、e&0x0F);ReadValue = Read1302(DS1302_MINUTE);Time->Minute = (ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_HOUR);Time->Hour = (ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_DAY);Time->Day = (ReadValue&0x70)&g

15、t;>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_WEEK);Time->Week = (ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_MONTH);Time->Month = (ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_YEAR);Time->Year =

16、 (ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); void DateToStr(SYSTEMTIME *Time)Time->DateString0 = Time->Year/10 + '0'Time->DateString1 = Time->Year%10 + '0'Time->DateString2 = '-'Time->DateString3 = Time->Month/10 + '0'Time->DateSt

17、ring4 = Time->Month%10 + '0'Time->DateString5 = '-'Time->DateString6 = Time->Day/10 + '0'Time->DateString7 = Time->Day%10 + '0'Time->DateString8 = '0'void TimeToStr(SYSTEMTIME *Time) Time->TimeString0 = Time->Hour/10 + '0'Tim

18、e->TimeString1 = Time->Hour%10 + '0'Time->TimeString2 = ':'Time->TimeString3 = Time->Minute/10 + '0'Time->TimeString4 = Time->Minute%10 + '0'Time->TimeString5 = ':'Time->TimeString6 = Time->Second/10 + '0'Time->TimeStri

19、ng7 = Time->Second%10 + '0'Time->DateString8 = '0'void Initial_DS1302(void)unsigned char Second=Read1302(DS1302_SECOND); if(Second&0x80)DS1302_SetTime(DS1302_SECOND,0);#endif#ifndef LCD_CHAR_1602#define LCD_CHAR_1602 #include <intrins.h> /Port Definitionssfr DBPortIIP

20、 0=0x80, P1=0x90, P2=0xA0, P3=0xB0.数据端口sbit LcdRs sbit LcdRw sbit LcdEn=P20;=PM;=P 2人2;= 0x80;II 内部等待函数 unsigned char LCD_Wait(void) LcdRs=0; LcdRw=1;_nop_(); LcdEn=1;_nop_();在用 Proteus 仿真时,注意用屏蔽此语句,在调用GotoXYO 时,IIwhile(DBPort&0x80);II会进入死循环,II 可能在写该控制字时,该模块没有返回写入完备命令,即DBPort&0x80=0x80II 实际硬

21、件时打开此语句LcdEn=0; return DBPort;II向LCD写入命令或数据II Command#define LCD_COMMAND#define LCD_DATAII Data#define LCD_CLEAR_SCREEN0x01II 清屏#define LCD_HOMING0x02 II 光标返回原点void LCD_Write(bit style, unsigned char input)LcdEn=0;LcdRs=style;LcdRw=0;_nop_();DBPort=input; _nop_();II 注意顺序LcdEn=1;_nop_();II 注意顺序LcdEn=

22、0;_nop_();LCD_Wait();/ 设置显示模式#define LCD_SHOW#define LCD_HIDE0x04/ 显示开0x00/ 显示关#define LCD_CURSOR#define LCD_NO_CURSOR0x02/ 显示光标0x00/ 无光标#define LCD_FLASH#define LCD_NO_FLASH0x01/ 光标闪动0x00/ 光标不闪动void LCD_SetDisplay(unsigned char DisplayMode)LCD_Write(LCD_COMMAND, 0x08|DisplayMode);0x02/ 设置输入模式 #define LCD_AC_UP#define LCD_AC_DOWN0x00/ default#define LCD_MOVE#define LCD_NO_MOVE0x010x00/画面可平移/defaultvoid LCD_SetInput(unsigned char InputMode)LCD_Write(LCD_COM

温馨提示

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

评论

0/150

提交评论