《本科毕业设计--单片机多功能数字电子时钟设计.doc》由会员分享,可在线阅读,更多相关《本科毕业设计--单片机多功能数字电子时钟设计.doc(42页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、单片机多功能数字电子时钟设计绪论概述时间对人们来说是非常宝贵的,准确的掌握时间和分配时间对人们来说至关重要。因此自从时钟发明的那刻起,就成为人类的好朋友。随着时间的流逝,科学技术的不断发展和提高人们对时间计量的精度要求越来越高,应用越来越广。怎样让时钟更好、更方便、更精确的显示时间,这就要求人们不断设计研发。出新型的时钟。高精度的计时工具大多数都使用了石英晶体振荡器,由于电子钟,石英表,石英钟都采用了石英技术,因此走时精度高稳定性好、使用方便、不需要经常调校。数字式电子钟用集成电路计时时译码代替机械式传动,用LCD显示器代替指针进而显示时间、减小了计时误差,这种表具有时、分、秒显示时间的功能,
2、还可以进行时和分的校对,片选的灵活性好。 时钟电路在计算机系统中起着非常重要的作用是保证系统正常工作的基础。在单片机的应用系统中,时钟有两个方面的含义。一是指为保障系统正常工作的基准振荡定时信号、主要由晶振和外围电路组成,晶振频率的大小决定了单片机系统工作的快慢二是指系统的标准定时时钟即定时时间。它通常有两种实现方法:一是用软件实现,即用单片机内部的可编程定时器/计数器来实现,二是用专门的时钟芯实现。2研究目的通过利用STC89C52单片机和DS1302芯片和DS18B20以及外围的按键和LCD显示器等部件显示完整的日历和温度,设计一个基于单片机的电子时钟。通过设计可以很好的学习单片机的基础知
3、识。具有日历、时间、温度显示功能。设计的电子时钟通过液晶显示器显示并能通过按键对时间进行设置。第一章 设计要求与方案论证1.1设计要求1具有年、月、日、星期、时、分、秒显示功能,2具有年、月、日、星期、时、分、秒校正功能,3具有12/24小时切换显示功能,4具有显示温度功能。1.2系统基本方案选择和论证1.2.1 单片机芯片的选择方案和论证方案一:采用STC89C52芯片作为硬件核心。STC89C52内部具有8KB ROM 存储空间,512字节数据存储空间、带有2K字节的EEPROM存储空间与MCS-51系列单片机完全兼容,STC89C52可以通过串口下载。方案二:采用AT89S52。AT89
4、S52片内具有8K字节程序存储空间、256字节的数据存储空间没有EEPROM存储空间也与MCS-51系列单片机完全兼容,具有在线编程可擦除技术。两种单片机都完全能够满足设计需要、STC89C52相对ATS89C52价格便宜且抗干扰能力强。考虑到成本因素,因此选用STC89C52。1.2.2 显示模块选择方案和论证方案一采用点阵式数码管显示。点阵式数码管是由八行八列的发光二极管组成,可用来显示数。但体积较大、且价格也相对较高、从便携实用的角度出发,不采用此种方案。方案二采用LED数码管动态扫描。LED数码管价格便宜,对于显示数字最合适,但功耗较大且显示容量不够,所以也不用此种方案。方案三采用LC
5、D液晶显示屏。液晶显示屏的显示功能强大,可显示大量文字、显示多样,清晰可见,且价格适中所以采用了LCD数码管作为显示。1.2.3 时钟芯片的选择方案和论证方案一直接采用单片机定时计数器提供秒信号,使用程序实现年、月、日、星期、时、分、秒计数。采用此种方案虽然减少芯片的使用、节约成本,但是实现的时间误差较大。所以不采用此方案。方案二采用DS1302时钟芯片实现时钟。DS1302芯片是一种高性能的时钟芯片,可自动对秒、分、时、日、周、月、年以及闰年补偿的年进行计数,而且精度高,工作电压2.5V5.5V范围内2.5V时耗电小于300nA.1.2.4温度传感器的选择方案与论证:方案一:使用热敏电阻作为
6、传感器,用热敏电阻与一个相应阻值电阻相串联分压,利用热敏电阻阻值随温度变化而变化的特性,采集这两个电阻变化的分压值,并进行A/D转换。此设计方案需用A/D转换电路,增加硬件成本而且热敏电阻的感温特性曲线并不是严格线性的,会产生较大的测量误差。方案二:采用数字式温度传感器DS18B20,此类传感器为数字式传感器而且仅需要一条数据线进行数据传输,易于与单片机连接,可以去除A/D模块,降低硬件成本,简化系统电路。另外,数字式温度传感器还具有测量精度高、测量范围广等优点。1.3 电路设计最终方案决定综上各方案所述,对此次作品的方案选定: 采用STC89C52单片机作为主控制系统;采用DS1302作为时
7、钟芯片;采用1602 LCD液晶作为显示器件。第二章 主要元器件介绍2.1 STC89C52介绍2.1.1 STC89C52主要功能及PDIP封装STC89C52是由深圳宏晶科技公司生产的与工业标准MCS-51指令集和输出管脚相兼容的单片机。STC89C52主要功能如表1所示其PDIP封装如表1所示 主要功能特性。表2-1 STC89C52主要功能表:主要功能特性32兼容MCS51指令系统8K可反复擦写Flash ROM32个双向I/O口256X8Bit内部RAM3个16位可编程定时/计数器中断时钟频率024MHZ2个串行中断可编程UART串行通道两个外部中断共6个中断源2个读写中中断口线3级
8、加密位低功耗空闲和掉电模式软件设置睡眠和唤醒功能2.1.2 STC89C52引脚介绍 主电源引脚 (2根)VCC(Pin40):电源输入,接+5V电源GND(Pin20):接地线外接晶振引脚 (2根)XTAL1(Pin19):片内振荡电路的输入端XTAL2(Pin20):片内振荡电路的输出端控制引脚 (4根)RST/VPP(Pin9):复位引脚引脚上出现2个机器周期的高电平将使单片机复位。ALE/PROG(Pin30):地址锁存允许信号PSEN(Pin29):外部存储器读选通信号EA/VPP(Pin31):程序存储器的内外部选通,接低电平从外部程序存储器读指令,如果接高电平则从内部程序存储器读
9、指令。可编程输入/输出引脚 (32根)STC89C52单片机有4组8位的可编程I/O口,分别位P0、P1、P2、P3口,每个口有8位(8根引脚),共32根。P0口(Pin39Pin32):8位双向I/O口线名称为P0.0P0.7P1口(Pin1Pin8):8位准双向I/O口线名称为P1.0P1.7P2口(Pin21Pin28):8位准双向I/O口线名称为P2.0P2.7P3口(Pin10Pin17):8位准双向I/O口线名称为P3.0P3.7其功能引脚如图2-1所示。图2-1 STC89C52 PDIP封装图2.1.3 STC89C52最小系统最小系统是指能进行正常工作的最简单电路。STC89
10、C52最小应用系统电路如图2.2所示。它包含五个电路部分:电源电路、时钟电路、复位电路、片内外程序存储器选择电路、输入/输出接口电路。其中电源电路、时钟电路、复位电路是 保证单片机系统能够正常工作的最基本的三部分电路,缺一不可。电源电路 芯片引脚VCC一般接上直流稳压电源+5V,引脚GND接电源+5V的负极,电源电压范围在45.5之间,可保证单片机系统能正常工作。为提高电路的抗干扰性能,通常在引角VCC与GND之间接上一个10uF的电解电容和一个0.1uF陶片电容,这样可抑制杂波串扰,从而有效确保电路稳定性。时钟电路 单片机引脚18和引脚19外接晶振及电容,STC89C52芯片的工作频率可在2
11、33MHz范围之间选,单片机工作频率取决于晶振XT的频率,通常选用11.0592MHz晶振。两个小电容通常取值3pF,以保证振荡器电路的稳定性及快速性。复位电路 一般若在引脚RST上保持24个工作主频周期的高电平,单片机就可以完成复位但为了保证系统可靠地复位复位电路应使引脚RST保持10ms以上的高电平。如图复位电路带有上电自动复位功能当电路上电时,由于C1电容两端电压值不能突变,电源+5V会通过电容向RST提供充电电流,因此在RST引脚上产生一高电平,使单片机进入复位状态。随着电容C1充电,它两端电压上升使得RST电位下降,最终使单片机退出复位状态。正常运行时可按复位按钮对单片机复位,如图2
12、-2所示图2-2 STC89C52最小系统2.2 DS1302时钟芯片介绍2.2.1 DS1302概述DS1302 是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟芯片,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V5.5V。采用双电源供电,主电源和备用电源,同时提供了对后背电源进行涓细电流充电的能力。采用三线接口与CPU进行同步通信,图2-3所示图2-3 DS1302封装图2.2.2 DS1302引脚介绍各引脚功能为:VCC:主电源Vcc2:备用电源。当Vcc2Vcc1+0.2V时,由Vcc2向DS1302供电:当Vcc20;x-)for
13、(y=110;y0;y-);由for循环构成的延时函数,z的取值为这个函数的延时ms数,如delay(200);大约延时200ms. delay(500);大约延时500ms。因下文多次用到,固在此先作说明。4.3 对DS1302读写操作函数。在对DS1302时钟芯片操作前,应对其操作时序有所了解,参看前文DS1302介绍。DS1302采用串行方式与单片机进行通信,一个机器周期只能读写一个字节的一位,因此在单片机与DS1302芯片间传输一字节,8位数据要分8次进行且先从低位开始传输。4.3.1 向DS1302写数据/*写数据字节子函数*/void write_1302_byte(uchar t
14、emp)/用来发送8位数据信息uchar i;for(i=0;i=1;/右移一位sck=1;/在SCK上升沿的时候字节写入DS1302/*1302写数据子函数*/void write_1302(uchar addd,uchar dat)rst=0; _nop_();sck=0;_nop_();rst=1;_nop_();write_1302_byte(addd);/发送地址write_1302_byte(dat);/发送数据rst=0;4.3.2 从DS1302读数据/*读DS1302数据函数*/uchar read_1302(uchar add)/输入地址add,返回读取的数据uchar i
15、,temp=0x00;rst=0;sck=0;rst=1;write_1302_byte(add);for(i=0;i=1;/右移一位sck=1; /sck被置高在其下一次变为0时数据被写入rst=0;/以下为DS1302复位的稳定时间sck=0;sck=1;sda=0;sda=1;return(temp);/将temp值返回4.4 显示函数对1602进行操作前要对其进行初使化,初使化完成后它才能正常显示。如果想在1602液晶的某一个位置显示一个内容,要先对其写入一个指令,在什么地方显示。然后再对其写入一个数据,要显示什么内容。对1602的液晶初使化,需要用写入指令的方式完成。4.4.1向16
16、02液晶中写一个指令void write_com(uchar com)lcdwr=0; /lcdwr为读写控制端lcdwr=0,这里可不写lcdrs=0; /液晶rs接口为0时,写指令rs为1时写数据P0=com; /将要写的指令赋给P0口delay(5); /由1602读写操作时序图先将指令赋给P0口延时后将使能lcden=1; 端lcden置高再延时一段时间然后将lcden置低这样指令delay(5); 就写入到LCD了lcden=0;4.4.2向液晶写数据void write_data(uchar date)与写指令类似这里lcdrs设为1lcdrs=1;P0=date;delay(5)
17、;lcden=1;delay(5);lcden=0;4.4.3初使化1602液晶此函数首先对液晶进行初使化,使其处于待命状态,然后将时钟框架显示出来:年、月、日、之间的“”时分秒之间的“:”,还有世纪年的高两位。void init_1602()uchar num;lcdwr=0;lcden=0;write_com(0x38);/设置LCD为16*2显示、5*7点阵、8位数据接口模式write_com(0x0c);/开显示、不显示光标write_com(0x06);/写一个字符后地址指针加1write_com(0x01);/显示清0write_com(0x80);/将指针指向初始位置for(nu
18、m=0;num14;num+)/循环函数用于将 20 - - 写入液晶write_data(tablenum);write_com(0x80+0x40+4);/将指针指向1602液晶的第二行第四个字段for(num=0;num8;num+)/功能与上同用于将 : : 写入write_data(table1num);4.4.4 如何在液晶上显示时间、日期及周DS1302中的时间、日期等信息是以BCD码的形式存放的,要先将从1302中读取的数据转化成10进制,然后显示在液晶上相应的位置。/*显示时间、日期子函数*/void write_sfm(uchar add,uchar time)/用于在16
19、02上显示年、月、日、时、分、秒。 Add为显示位置time为要显示的内容uchar shi,ge;shi=time/16; /将从DS1302中读取的BCD码数据转化成10进制个位和10ge=time%16; 进制十位write_com(add+0x80);/定义显示在液晶的什么位置write_data(0x30+shi);/由1602液晶字库可知09的数据码分别对应0x300x39write_data(0x30+ge); /初使化中设定了写一个字符后地址指针加1因此这里 不用重新光标定位/*显示周子函数*/void write_zhou(uchar time1)用于在1602上显示周信息与
20、显示 时间日期子函数类似uchar ge;ge=time1%16;/一周七天因此只需个位write_com(0x80+13);write_data(0x30+ge);4.5按键函数此电子时钟共有4个按键S1、S2、S3与调时有关图按键程序如图11S4为12小时切换键S1功能键:在24小时显示模式下该键被第一次按下后进入秒调整液晶显示器上的时间停止走动。模式再次按下后进入分调整模式接着是调时模式、调年模式、调月模式、调日模式、调周模式当第八次按下该键后退出S2 调整键:在调整模式下该键每按一次相应时间或日期加1S3 确定键:在调整模式下该键被按下后退出调整模式并将调整后的时间、日期写入DS130
21、2S4 显示模式调整键:用于对时间的12/24小时模式的切换4.5.1 12/24小时显示模式切换键时钟默认在24小时模式下运行定义一个标志位flag1。第一次按下切换键把瞬时时间转化成12小时制令flag1=1。并写入DS1302芯片此后DS1302芯片在12小时模式下运行。第二次按下切换键即返回24小时显示模式,令flag1=0,把瞬时时间转化成24小时模式并写入DS1302芯片。有关DS1302的时间寄存器存放形式参阅前文。如24小时模式下的22:00,存放的形式为00100010。12小时模式下的22点,也就是10:00PM,存放形式为10110000,在切换的一瞬间,我们只需要把小时
22、数据0xb0写入到DS1302,这样就能让时钟芯片在12小时模式下运行了。需要注意的是,12小时模式下,只用到后5位来表示时间,第6位用来表示AM或PM信息,如果真接用24小时模式下的显示方法是会出错的,这里我们需要对时进行转化。首先提取AM/PM信息,让其显示。然后提取其后5位时间,显示时间。在主函数部分如果检测到flag1=1,就进行转换。12转24小进模式与其类似,不再赘述。if(s1num=0&s4=0)/ 设置键没被按下,且12/24小时模式切换键被按下后delay(5);if(s4=0)s2num+;while(!s4);if(s2num=1)/24小时切换成12小时int ge,
23、shi;flag1=1;hour=read_1302(0x85);ge=hour%16;shi=hour/16;if(shi=1&ge=1&ge=3&ge=9)/13点19点hour=hour-0x12;hour=hour+0x80;hour=hour+0x20;if(shi=2&ge=0)/20点hour=0xa8;if(shi=2&ge=1)hour=0xa9;if(shi=2&ge=2)hour=0xb0;if(shi=2&ge=3)hour=0xb1;write_1302(0x8e,0x00);write_1302(0x84,hour);write_1302(0x8e,0x80);if
24、(s2num=2)/12小时切换成24小时int ap1,ap2;hour=read_1302(0x85);ap1=hour&0x20;/ ap1=0时 AM ,ap1!=0时 PMap2=hour&0x1f;if(ap1=0&ap2!=0x12)/AM,且小时不等于12hour=hour&0x1f;if(ap1=0&ap2=0x12)/AM ,小时等于12即0点hour=0x00;if(ap1!=0&ap2=0x08)/下午8点转化成20点hour=0x20;if(ap1!=0&ap2=0x09)/下午9点转化成21点hour=0x21;if(ap1!=0&ap2!=0x08&ap2!=0x
25、09)/PM,且不是8点或9点hour=hour-0xa0;hour=hour+0x12;if(ap1!=0&ap2=0x12)/12点PM也就是24小时模式下的12点hour=hour-0xa0;write_1302(0x8e,0x00);/把转化成24小进模式后的时写入DS1302write_1302(0x84,hour);write_1302(0x8e,0x80);flag1=0;s2num=0;/按键次数清04.5.2 功能键函数if(s1=0&s2num=0)/如果S1被按下 当在12小时模式下显示时按此键无效delay(5);if(s1=0)/以上用于键盘消抖差小误差flag=1;/时钟暂停标志位flag=1时液晶时钟计时暂停s1num+;/s1num表示按键被按下的次数按下次数加1while(!s1);/松手后继续执行后面指令if(s1num=1)/如果S1按下一次秒的个位位置闪烁光标write_com(0x80+0x40+11);write_com(0x0f);if(s1num=2)/如果S1按下两次先将设置后的秒写到DS1302再在分的个位位置闪烁光标write_13
限制150内