单片机课程设计-多功能数字时钟.doc

上传人:李主任 文档编号:3262623 上传时间:2019-08-06 格式:DOC 页数:36 大小:1.34MB
返回 下载 相关 举报
单片机课程设计-多功能数字时钟.doc_第1页
第1页 / 共36页
单片机课程设计-多功能数字时钟.doc_第2页
第2页 / 共36页
单片机课程设计-多功能数字时钟.doc_第3页
第3页 / 共36页
单片机课程设计-多功能数字时钟.doc_第4页
第4页 / 共36页
单片机课程设计-多功能数字时钟.doc_第5页
第5页 / 共36页
点击查看更多>>
资源描述

《单片机课程设计-多功能数字时钟.doc》由会员分享,可在线阅读,更多相关《单片机课程设计-多功能数字时钟.doc(36页珍藏版)》请在三一文库上搜索。

1、单片机课程设计姓名: 题目:多功能数字时钟 完成日期:2011 年 12 月摘要多功能数字时钟的设计基于STC90C516RD+单片机系统,通过精确的时钟芯片计时,并通过单片机从时钟芯片内读出时间精确在液晶上显示。同时还能在红外遥控发射器与红外接收探头的配合下通过单片机系统对时钟芯片内的时间进行修改,并将修改后的时间写入时钟芯片进行精确计时。为了防止突然掉电时间复位的情况,每隔一定的时间通过单片机从时钟芯片里读出确定的时间并写入到掉电存储模块里面,这样即使掉电时间也能正常精确的进行计时。关键字:单片机;时钟;红外;掉电存储;目录单片机课程设计1摘要21 前言51.2背景51.2方案62 硬件方

2、面721 MCU722人机界面823 外围器件9231电源输入模块9232掉电存储模块9233时钟模块10234红外接收模块10235液晶模块113 软件设计1131 模块框图1132 总流程图1233 分模块流程图13331掉电存储模块流程图13332 DS1302时钟流程图14333 WD6122红外遥控发射流程图15334 HS0038红外接收探头流程图154 综合调试175 总结17附录1:实物图19附录2:源代码201 前言1.2背景 20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现

3、代电子产品性能进一步提高,产品更新换代的节奏也越来越快。现代生活的人们越来越重视起了时间观念,可以说是时间和金钱划上了等号。对于那些对时间把握非常严格和准确的人或事来说,时间的不准确会带来非常大的麻烦。数字钟已成为人们日常生活中:必不可少的必需品,广泛用于个人家庭以及车站、码头、剧场、办公室等公共场所,给人们的生活、学习、工作、娱乐带来极大的方便。由于数字集成电路技术的发展和采用了先进的石英技术,使数字钟具有走时准确、性能稳定、携带方便等优点,它还用于计时、自动报时及自动控制等各个领域。数字钟广泛用于个人家庭,车站, 码头办公室等公共场所,成为人们日常生活中不可少的必需品,由于集成电路的发展和

4、广泛应用,使得数字钟的精度,远远超过老式钟表, 钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为基础的。因此,研究数字钟及扩大其应用,有着非常现实的意义但当前的数字钟存在诸多弊端。我们设计的液晶显示的时间简单明了而且读数快、时间准确显示到秒,所以液晶为显示器的时钟比指针式的时钟表现出了很大的优势。而机械式的依赖于晶体震荡器,可能会导致误差。数字钟DS1302的计时精度、稳定度远远超过老式机械钟。采用红外遥

5、控装置进行时间的重置,对一些比较高活不易接触的时钟显得更加方便。若设计了掉电存储功能,即使突然断电,时间仍旧精确计时,不会就此复位或者停止,当重新装上电源,时间准确现实当前时间,这是一个很大的优势,有很大的市场。我们希望做出一个能解决以上缺陷的数字时钟!1.2方案多功能数字钟是采用DS1302以 24小时计时方式实现对“时”、“分”、“秒”、“星期”、“日”、“月”、“年”数字显示的计时装置。根据LCD1602液晶显示原理来进行显示“时”、“分”、“秒”、“星期”、“日”、“月”、“年”,用DS1302实现精确计时、进位。数字钟通过从AT24C02读出时间,写入DS1302,DS1302自动运

6、行计时,读出DS1302的数并在LCD1602中显示,同时不停的将DS1302中的时间写入AT24C02中供掉电存。在执行程序过程中还要及时响应来自外部的红外中断信号,进行新的时间调整并写入DS1302,最终实现主程序的循环!2 硬件方面21 MCU 单片机微型计算机是微型计算机的一个重要分支,也是颇具生命力的机种。单片机微型计算机简称单片机,特别适用于控制领域,故又称为微控制器。 通常,单片机由单块集成电路芯片构成,内部包含有计算机的基本功能部件:中央处理器、存储器和I/O接口电路等。因此,单片机只需要和适当的软件及外部设备相结合,便可成为一个单片机控制系统。 单片机经过1、2、3、3代的发

7、展,正朝着多功能、高性能、低电压、低功耗、低价格、大存储容量、强I/O功能及较好的结构兼容性方向发展。其发展趋势不外乎以下几个方面:1、多功能 单片机中尽可能地把所需要的存储器和I/O口都集成在一块芯片上,使得单片机可以实现更多的功能。比如A/D、PWM、PCA(可编程计数器阵列)、WDT(监视定时器-看家狗)、高速I/O口及计数器的捕获/比较逻辑等。 有的单片机针对某一个应用领域,集成了相关的控制设备,以减少应用系统的芯片数量。例如,有的芯片以51内核为核心,集成了USB控制器、SMART CARD接口、MP3解码器、CAN或者I*I*C总线控制器等,LED、LCD或VFD显示驱动器也开始集

8、成在8位单片机中。2、高效率和高性能 为了提高执行速度和执行效率,单片机开始使用RISC、流水线和DSP的设计技术,使单片机的性能有了明显的提高,表现为:单片机的时钟频率得到提高;同样频率的单片机运行效率也有了很大的提升;由于集成度的提高,单片机的寻址能力、片内ROM(FLASH)和RAM的容量都突破了以往的数量和限制。 由于系统资源和系统复杂程度的增加,开始使用高级语言(如C语言)来开发单片机的程序。使用高级语言可以降低开发 难度,缩短开发周期,增强软件的可读性和可移植性,便于改进和扩充功能。3、低电压和低功耗 单片机的嵌入式应用决定了低电压和低功耗的特性十分重要。由于CMOS等工艺的大量采

9、用,很多单片机可以在更低的电压下工作(1.2V或0.9V),功耗已经降低到uA级。这些特性使得单片机系统可以在更小电源的支持下工作更长的时间。4、低价格 单片机应用面广,使用数量大,带来的直接好处就是成本的降低。目前世界各大公司为了提高竞争力,在提高单片机性能的同时,十分注意降低其产品的价格。22人机界面单片机最小系统:图2.2.1 STC90C516RD+单片机系统23 外围器件231电源输入模块图2.3.1 电源输入232掉电存储模块图2.3.2 AT24C02掉电存储AT24C02是一个2K位串行CMOS E2PROM, 内部含有256个8位字节,CATALYST公司的先进CMOS技术实

10、质上减少了器件的功耗。AT24C02有一个16字节页写缓冲器。该器件通过IIC总线接口进行操作,有一个专门的写保护功能。AT24C02支持I2C,总线数据传送协议I2C,总线协议规定任何将数据传送到总线的器件作为发送器。任何从总线接收数据的器件为接收器。数据传送是由产生串行时钟和所有起始停止信号的主器件控制的。主器件和从器件都可以作为发送器或接收器,但由主器件控制传送数据(发送或接收)的模式,通过器件地址输入端A0、A1和A2可以实现将最多8个AT24C02器件连接到总线上。233时钟模块 图2.3.23DS1302时钟DS1302 是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实

11、时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个318的用于临时性存放数据的RAM寄存器。DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后备电源双电源引脚,同时提供了对后备电源进行涓细电流充电的能力。DS1302的引脚排列,其中Vcc1为后备电源,VCC2为主电源。在主电源关闭的情况下,也能保持时钟的连续运行。DS1302由Vcc1或Vcc2两者中的较大者供电。当Vcc2大于Vcc1+0.2V时,Vc

12、c2给DS1302供电。当Vcc2小于Vcc1时,DS1302由Vcc1供电。X1和X2是振荡源,外接32.768kHz晶振。RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据的传送手段。当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。上电运行时,在Vcc2.0V之前,RST必须保持低电平。只有在SCLK为低电平时,才能将RST置为高电平。I/O为串行数

13、据输入输出端(双向),SCLK为时钟输入端。234红外接收模块图2.3.4 HS0038红外接收红外接收电路一体化的红外接收装置将遥控信号的接收、放大、检波、整形集于一身,并且输出可以让单片机识别的TTL 信号,这样大大简化了接收电路的复杂程度和电路的设计工作,方便使用。在本系统中我们采用红外一体化接收头HS0038,外观图如图3 所示。HS0038 黑色环氧树脂封装,不受日光、荧光灯等光源干扰,内附磁屏蔽,功耗低,灵敏度高。在用小功率发射管发射信号情况下,其接收距离可达35m。它能与TTL、COMS 电路兼容。HS0038 为直立侧面收光型。它接收红外信号频率为38 kHz,周期约26 s,

14、同时能对信号进行放大、检波、整形,得到TTL 电平的编码信号。三个管脚分别是地、5 V 电源、解调信号输出端。235液晶模块图2.3.5 LCD1602液晶显示3 软件设计31 模块框图 掉电存储 红外遥控MCU时钟模块 液晶显示 其它功能32 总流程图开始 从AT24C02寄存器读取时间将时间写入DS1302DS1302计时从DS1302读取时间将时间写入AT24C02LCD1602显示时间是否有红外中断信号Y N 红外遥控修改时间结束33 分模块流程图331掉电存储模块流程图开始发送起始信号发送从地址等到确认发送片内地址等待确认重复发送起始信号和从机地址等待确认开始读数据结束332 DS1

15、302时钟流程图开始变量初始化使DS1302不具备写保护复位并产生一个高电平 复位并产生一个高电平写DS1302地址写DS1302地址延时一段时间 延时一段时间向该地址写数据 向该地址写入数据地址增加 地址增加 Y NN数据是否写完? 数据是否写完? Y 显示数据结束333 WD6122红外遥控发射流程图开始键盘扫描程序否是否右键按下是读取用户码和键数据码22ms后遥控输出端启动输出结束334 HS0038红外接收探头流程图红外信号触发中断准备软件解码存储编码的时间周期到解码缓存区否判断是否到停止位 是 没有找到从停止位开始在编码缓存区寻找解码标准 已经找到对编码缓存区的编码周期进行二次重组把

16、二次重组的数据移位存入到6FH中通过6FH中的数据识别遥控器的按键位置把位置信息通过查表得到键值4 综合调试调试次数标准时间单位:S测试时间单位:S误差时间单位:S误差率16060002300300003600600004900900005150015000061800180010.05%73000300010.03%5 总结本次最终设计结果能通过单片机对时钟芯片读写时间,通过红外遥控器对时间(年、月、日、星期、时、分)进行修改,并能进行掉电存储。在一些细节上也有完善,在时间设置时能光标显示,这是取得的成绩;同时我们还存在各方面的不足:在程序调试过程中,进行时间设置时对闰年以及月份大小的保护与

17、光标显示发生冲突,最终没能调试成功。对红外技术明显不熟练,缺乏经验。对其功能扩展还可加上闹钟,整点报时,并伴随蜂鸣器工作。还可加上温度模块,采集实时温度并在液晶上显示,根据温度的等级可出现一些温馨提示语句。通过这样一次课程设计,带给我们一次单片机设计的全新体验。通过查找资料,设计,绘图等,在实践过程中,我们学到了不少知识,增强了自学能力,加深了对单片机系统的认识。我相信今后再遇到这样的设计问题,甚至是更大型的设计问题,我们都会充满信心的。从这个角度上说,这次的设计是很成功的。由于整体系统比较复杂庞大,个人的实际设计经验不足,加之时间匆忙,因此,在本设计中,也难免会出现错误和有部分环节不能很理想

18、的完成,希望老师们给予我们一些适当帮助和谅解。附录1:实物图附录2:源代码主程序:#define uint unsigned int#define uchar unsigned char#include at89x51.h#include lcd1602.c#includesbit ACC0 = ACC0;sbit ACC7 = ACC7;sbit T_CLK = P16; /*实时时钟时钟线引脚 */sbit T_IO = P35; /*实时时钟数据线引脚 */sbit T_RST = P17; /*实时时钟复位线引脚 */sbit scl=P15; /24c08 SCLsbit sda=P

19、36; /24c08 SDAsbit IRIN = P33; /红外接收器数据线bit flag3=0;uchar a11=0,0,0,0,0,0,1,0,0,0,0;uchar IRCOM7;uchar miao=0x00;/秒uchar fen=0x00; /分uchar shi=0x00; /时uchar ri=0x01; /日uchar yue=0x12; /月uchar nian=0x00;/年uchar xingqi=0x04;/星期uint flag=0;uchar flag2=0;/= void delay(uchar x); /x*0.14MSvoid delay3(int

20、ms);main() /主程序IE = 0x84; /允许总中断中断,使能 INT1 外部中断 TCON = 0x10; /触发方式为脉冲负边沿触发 IRIN=1; /红外接收器数据线 delay3(10); /延时x24c02_init(); /初始化24C02x24c02radedata(); /从24c02中读出时间LCD_Initial(); /lcd初始化GotoXY(0,1);Print( );Write_DS1302Init(); /向ds1302中写入时间Run_DS1302(); /时间跑动(显示;存;改动)LCD1602液晶显示子函数:#define DBPort P0/L

21、CD数据端口sbit LcdRs= P25;sbit LcdRw= P26;sbit LcdEn = P27;sbit Lcdbf = P07;/LCD忙标志 Busy Flagvoid delay0(unsigned char t) /延时 while(t-);void LCD_Wait(void)/读忙状态LcdRs=0;LcdRw=1;LcdEn=1;delay0(10);LcdEn=0;/下降沿while(Lcdbf) LcdEn=0;LcdEn=1; /仿真才需要此语句,实际硬件中不需要 void LCD_Write(bit style, unsigned char input) /

22、写数据1/命令0LcdRs=style;LcdRw=0;DBPort=input;/p0=0x38LcdEn=1;delay0(10);LcdEn=0;LCD_Wait();void LCD_Initial(void) /初始化LCDLCD_Write(0,0x38); /8位数据端口,2行显示,5*7点阵0011 1000delay0(300);LCD_Write(0,0x0c); /显示模式LCD_Write(0,0x01); /清屏LCD_Write(0,0x06); /输入模式void GotoXY(unsigned char x, unsigned char y) /移动光标到指定位

23、置if(y=0)LCD_Write(0,0x80|x);if(y=1) LCD_Write(0,0xc0|x);void Print(unsigned char *str) /指定坐标输出字符串while(*str) LCD_Write(1,*str+);void Run_DS1302(void) /时间跑动(显示;存;改动)while(1)while(1)v_W1302(0x8f, 0);miao = bcdtodec(uc_R1302(0x81); /读出DS1302中的秒v_W1302(0x8f, 0);fen = bcdtodec(uc_R1302(0x83); /读出DS1302中的

24、分v_W1302(0x8f, 0);shi = bcdtodec(uc_R1302(0x85); /读出DS1302中的小时v_W1302(0x8f, 0);ri = bcdtodec(uc_R1302(0x87); /读出DS1302中的日v_W1302(0x8f, 0);yue = bcdtodec(uc_R1302(0x89); /读出DS1302中的月v_W1302(0x8f, 0);nian = bcdtodec(uc_R1302(0x8d); /读出DS1302中的年v_W1302(0x8f, 0);xingqi = bcdtodec(uc_R1302(0x8b); /读出DS13

25、02中的星期GotoXY(0,0);Print( 20);/显示时间 LCD_Write(1,nian/10+0);LCD_Write(1,nian%10+0);LCD_Write(1,-);LCD_Write(1,yue/10+0);LCD_Write(1,yue%10+0);LCD_Write(1,-);LCD_Write(1,ri/10+0);LCD_Write(1,ri%10+0);LCD_Write(1, );LCD_Write(1,xingqi+0);GotoXY(2,1);LCD_Write(1,shi/10+0);LCD_Write(1,shi%10+0);LCD_Write(

26、1,:);LCD_Write(1,fen/10+0);LCD_Write(1,fen%10+0);LCD_Write(1,:);LCD_Write(1,miao/10+0);LCD_Write(1,miao%10+0);Print( );x24c02writedata(); /向24c02中写入时间if(flag=885)/flag为按键变量 flag=0;flag2=0;break;a0=nian/10;a1=nian%10;a2=yue/10;a3=yue%10;a4=ri/10;a5=ri%10;a6=xingqi;a7=shi/10;a8=shi%10;a9=fen/10;a10=fe

27、n%10;while(1)GotoXY(0,0);Print(* 20);LCD_Write(1,a0+0);LCD_Write(1,a1+0);LCD_Write(1,-);LCD_Write(1,a2+0);LCD_Write(1,a3+0);LCD_Write(1,-);LCD_Write(1,a4+0);LCD_Write(1,a5+0);LCD_Write(1, );LCD_Write(1,a6+0);Print( );GotoXY(0,1);Print( );LCD_Write(1,a7+0);LCD_Write(1,a8+0);LCD_Write(1,:);LCD_Write(1

28、,a9+0);LCD_Write(1,a10+0);Print( );if(flag=886)flag=0;flag2=0;a0=0;a1=0;a2=0;a3=1;a4=0;a5=1;a6=1;a7=0;a8=0;a9=0;a10=0;if(flag=836)flag=0;flag2+;aflag2-1=0;/数组a分别记录第“flag2”次按下的键所对应的值,这里记录的是年的十位if(flag=835)flag=0;flag2+;aflag2-1=1;if(flag=840)flag=0;flag2+;aflag2-1=2;if(flag=917)flag=0;flag2+;aflag2-1

29、=3;if(flag=824)flag=0;flag2+;aflag2-1=4;if(flag=851)flag=0;flag2+;aflag2-1=5;if(flag=913)flag=0;flag2+;aflag2-1=6;if(flag=882)flag=0;flag2+;aflag2-1=7;if(flag=898)flag=0;flag2+;aflag2-1=8;if(flag=897)flag=0;flag2+;aflag2-1=9;nian=a0*16+a1;if(a2*10+a312)a2=1;a3=2;yue=a2*16+a3;if(yue=0)a3=1;yue=1;if(a

30、4*16+a649) & (yue=1|yue=3|yue=5|yue=7|yue=8|yue=16|yue=18)a4=3;a5=1; /31天if(a4*16+a648) & (yue=4|yue=6|yue=9|yue=17)a4=3;a5=0; /30天if(yue=2)if(a4*16+a541) & (a0*10+a1)%4=0)a4=2;a5=9; /闰年29天if(a4*16+a540) & (a0*10+a1)%4!=0)a4=2;a5=8; /平年28天ri=a4*16+a5;if(ri=0)a5=1;ri=1;if(a67)a6=7;xingqi=a6;if(xingqi

31、=0)a6=1;xingqi=1;if(a7*10+a823)a7=2;a8=3;shi=a7*16+a8;if(a9*10+a1059)a9=5;a10=9;fen=a9*16+a10;if(flag=887) Write_DS1302Init(); /向1302中写入改动过后的时间break; AT24C02掉电储存代码:void flash(void) /延时_nop_();_nop_();void delay1(uchar x)/延时 uint i;for(i=0; ix; i+);void Delay2()/延时int i,j;for(i=0; i=10; i+)for(j=0; j

32、=2; j+);void x24c02_init(void) /24c02初始化scl = 1;flash();sda = 1;flash();void start(void) /开始24c02中读写数据用到sda = 1;flash(); scl = 1; flash(); sda = 0; flash(); scl = 0; flash();void clock(void) /时钟 24c02中读写数据用到uchar i = 0;scl = 1;flash();while(sda = 1) & (i 255) i+;scl = 0;flash();uchar readx(void) /从2

33、4c02中读出一个字节数据uchar i, j, k = 0;scl = 0;flash();sda = 1;for(i=0; i8; i+) flash();scl = 1;flash();if(sda = 1)j = 1;else j = 0;k = (k 1) | j; scl = 0;flash(); return(k);void writex(uchar j) /向24c02中写入一个字节数据 uchar i,temp;temp = j;for(i=0; i8; i+)temp = temp 1; scl = 0; flash(); sda = CY; flash();scl = 1

34、; flash();scl = 0;flash(); sda = 1;flash();void stop() /停止24c02中读写数据用到sda = 0; flash();scl = 1;flash();sda = 1;flash();uchar x24c02_read(uchar address) /从24c02中读出数据uchar i;start();writex(0xa0);clock();writex(address);clock();start();writex(0xa1);clock();i = readx();stop();delay1(10);return(i);void x

35、24c02_write(uchar address, uchar info) /向24c02中写入数据delay1(50);/不加这个延时则不能存两个及以上数据,用中断控时每秒写入还没试过EA = 0;start();writex(0xa0);clock();writex(address);clock();writex(info);clock();stop();EA = 1;delay1(50);void x24c02writedata() /从24c02中读出日期时间等数据x24c02_write(6,nian);x24c02_write(5,yue);x24c02_write(4,ri);

36、x24c02_write(3,xingqi);x24c02_write(2,shi); x24c02_write(1,fen);x24c02_write(0,miao); void x24c02radedata() /向24c02中写入日期时间等数据nian = dectobcd(x24c02_read(6);yue = dectobcd(x24c02_read(5);ri = dectobcd(x24c02_read(4);xingqi = dectobcd(x24c02_read(3);shi = dectobcd(x24c02_read(2);/ 需要转换为bcd不然会乱码fen = dectobcd(x24c02_read(1);miao = dectobcd(x24c02_read(0);/读出保存的数据赋于miaoDS1302时钟代码:void v_RTInputByte(uchar ucDa) /往ds1302中写1字节的数据uchar i;ACC = ucDa;

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

当前位置:首页 > 研究报告 > 信息产业


经营许可证编号:宁ICP备18001539号-1