1、电子钟设计第一章 电子时钟功能及设计方案1.1电子时钟功能1.1.1时钟简介现代的电子时钟是基于单片机的一种计时工具,采用延时程序产生一定的时间中断,用于一秒的定义,通过计数方式进行满六十秒分钟进一,满六十分小时进一,满二十四小时小时清零。从而达到计时的功能,是人民日常生活补课缺少的工具。1.1.2时钟的基本特点及原理现在高精度的计时工具大多数都使用了石英晶体振荡器,由于电子钟、石英钟、石英表都采用了石英技术,因此走时精度高,稳定性好,使用方便,不需要经常调试,数字式电子钟用集成电路计时时,译码代替机械式传动,用LED显示器代替指针显示进而显示时间,减小了计时误差,这种表具有时、分、秒显示时间
2、的功能,还可以进行时和分的校对,片选的灵活性好。该电子时钟由89C51,BUTTON,LCD等构成,采用晶振电路作为驱动电路,由延时程序和循环程序产生的一秒定时,达到时分秒的计时,六十秒为一分钟,六十分钟为一小时,满二十四小时为一天。而电路中唯一的一个控制键却拥有多种不同的功能,按下又松开,可以实现屏蔽数码管显示的功能,达到省电的目的;直接按下不松开,则可以通过按键实现分钟的累加,每按一次分钟加一;而连续两次按下按键不放松,则可实现小时的调节,同样每按一次小时加一。1.1.3 闹钟设计的基本特点及原理当所设的闹钟时间与在液晶屏上所显示的时间是一样时,闹铃功能将被启动。操作过程:将时间与闹铃切换
3、开关提起,LCD所显示的时间为00:00:00,即为闹铃的起始设计时间,当按下开关天+键可实现天数的增加,没按一次,则增加一天,当按下开关时天+可实现对小时的增加或调整,则增加一个小时,当按下分+可实现对分钟的调整或增加,每按一次就可增加一分钟。如闹铃设定时间为09:08:12即9日08:12。当此时的时间与其相同,闹铃即被启动。1.2设计方案1.2.1计时方案利用AT89S51单片机内部的定时/计数器进行中断定时,配合软件延时实现时、分、秒的计时。该方案节省硬件成本,且能使读者在定时/计数器的使用、中断及程序设计方面得到锻炼与提高,对单片机的指令系统能有更深入的了解,从而对学好单片机技术这门
4、课程起到一定的作用。1.2.2显示方案AT89S51的P0口和P2口外接由8个LED数码管(LED7LED0)构成的显示器,用P0口作LED的段码输出口,P2口作LCD的位控输出线,P1口外接四个按键A、B、C、D构成键盘电路。简易电子钟的功能不复杂,采用其现有的I/O便可完成。第二章 硬件介绍2.1单片机简介2.1.1单片机的特点 1 . 单片机的存储器ROM和RAM时严格区分的。ROM称为程序存储器,只存放程序,固定常数,及数据表格。RAM则为数据存储器,用作工作区及存放用户数据。 2 . 采用面向控制的指令系统。为满足控制需要,单片机有更强的逻辑控制能力,特别是单片机具有很强的位处理能力
5、。 3 . 单片机的I/O口通常时多功能的。由于单片机芯片上引脚数目有限,为了解决实际引脚数和需要的信号线的矛盾,采用了引脚功能复用的方法,引脚处于何种功能,可由指令来设置或由机器状态来区分。 4 . 单片机的外部扩展能力很强。在内部的各种功能部件不能满足应用的需求时,均可在外部进行扩展,与许多通用的微机接口芯片兼容,给应用系统设计带来了很大的方便。2.1.2 89C51单片机介绍 VCC:电源。 GND:接地。 P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程 序数据存储器,它可以被定义为数据/地址的第八
6、位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。 P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作 输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。 P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻 拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉
7、的缘故。P2口当用于外部程序存储器或16位地址外部数据存 储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器 的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。 89C51单片机 P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。P3口也可作为AT89C51的一些特殊功能口,如下表所示:口管脚 备选功能P3.0 RXD
8、(串行输入口)P3.1 TXD(串行输出口)P3.2 /INT0(外部中断0)P3.3 /INT1(外部中断1)P3.4 T0(记时器0外部输入)P3.5 T1(记时器1外部输入)P3.6 /WR(外部数据存储器写选通)P3.7 /RD(外部数据存储器读选通)P3口同时为闪烁编程和编程校验接收一些控制信号。RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE 端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它
9、可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器 时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。 PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。EA/VPP:当/EA保持低电平时,则在此期间外部程序存储(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时, /EA将内部锁定为R
10、ESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。2.3晶振电路每个单片机系统里都有晶振,全程是叫晶体震荡器,在单片机系统里晶振的作用非常大,他结合单片机内部的电路,产生单片机所必须的时钟频率,单片机的一切指令的执行都是建立在这个基础上的,晶振的提供的时钟频率越高,那单片机的运行速度也就越快。晶振用一种能把电能和机械能相互转化的晶体在共振的状态下工作,以提供稳定,精确的单频振荡。在通常工作条件下,普通的晶振频率绝对精度可达百万分之五十。高级的精度更高。有些晶振还可以由外加电压在一定范围内调整频率,称为压控振荡器(VCO)。 晶
11、振的作用是为系统提供基本的时钟信号。通常一个系统共用一个晶振,便于各部分保持同步。有些通讯系统的基频和射频使用不同的晶振,而通过电子调整频率的方法保持同步。 晶振通常与锁相环电路配合使用,以提供系统所需的时钟频率。如果不同子系统需要不同频率的时钟信号,可以用与同一个晶振相连的不同锁相环来提供。 图 晶振电路 2.4、定时器/计数器T0中断服务程序 T0用于计时,选中方式一,重复定时,定时时间设为50ms,定时时间到则中断,在中断服务程序中用一个计数器对50ms计数,计20次则对秒单元加一。秒单元加到60则对分单元加一,同时秒单元清0;分单元加到60则对时单元加一,同时分单元清0;时单元加到24
12、则对时单元清0,标志一天时间计满。在对各单元计数的同时,把他们的值放到存储器单元的指定位置。2.5按键处理模块 时间按键设置:如果按下K1键,则为当前时间,此时按下K2,则进入调时间分状态,时钟停止走动,依次按下K2可分别对年-月-星期-天-时-分-的调整,按K+和K-按键可以进行加一和减一操作;继续按K3键启动计时,即为当前调整的时间。第三章 软件仿真3.1 protues软件3.1.1protues软件简介Proteus ISIS是英国Labcenter公司开发的电路分析与实物仿真软件。它运行于Windows操作系统上,可以仿真、分析(SPICE)各种模拟器件和集成电路,该软件的特点是:实
13、现了单片机仿真和SPICE电路仿真相结合。具有模拟电路仿真、数字电路仿真、单片机及其外围电路组成的系统的仿真、RS232动态仿真、I2C调试器、SPI调试器、键盘和LCD系统仿真的功能;有各种虚拟仪器,如示波器、逻辑分析仪、信号发生器等。支持主流单片机系统的仿真。目前支持的单片机类型有:68000系列、8051系列、AVR系列、PIC12系列、PIC16系列、PIC18系列、Z80系列、HC11系列以及各种外围芯片。提供软件调试功能。在硬件仿真系统中具有全速、单步、设置断点等调试功能,同时可以观察各个变量、寄存器等的当前状态,因此在该软件仿真系统中,也必须具有这些功能;同时支持第三方的软件编译
14、和调试环境,如Keil C51 uVision2等软件。具有强大的原理图绘制功能。总之,该软件是一款集单片机和SPICE分析于一身的仿真软件,功能极其强大。本章介绍Proteus ISIS软件的工作环境和一些基本操作。3.1.2电路功能仿真在PROTUES绘制好原理图后,调入已编译好的目标代码文件:*.HEX,可以在PROTUES的原理图中看到模拟的实物运行状态和过程。 PROTUES 是单片机课堂教学的先进助手。 PROTUES不仅可将许多单片机实例功能形象化,也可将许多单片机实例运行过程形象化。前者可在相当程度上得到实物演示实验的效果,后者则是实物演示实验难以达到的效果。 它的元器件、连接
15、线路等却和传统的单片机实验硬件高度对应。这在相当程度上替代了传统的单片机实验教学的功能,例:元器件选择、电路连接、电路检测、电路修改、软件调试、运行结果等。 课程设计、毕业设计是学生走向就业的重要实践环节。由于PROTUES提供了实验室无法相比的大量的元器件库,提供了修改电路设计的灵活性、提供了实验室在数量、质量上难以相比的虚拟仪器、仪表,因而也提供了培养学生实践精神、创造精神的平台 随着科技的发展,“计算机仿真技术”已成为许多设计部门重要的前期设计手段。它具有设计灵活,结果、过程的统一的特点。可使设计时间大为缩短、耗资大为减少,也可降低工程制造的风险。相信在单片机开发应用中PROTUES也能
16、茯得愈来愈广泛的应用。3.2电路原理图3.3源程序代码#include#include#defineucharunsignedchar#defineuintunsignedintsbitzhuan=P15;/dingyiyinjiaosbitLED2=P26;sbitLED1=P17;/声音引脚sbitLED=P27;/时钟引脚sbitSDA=P10;sbitCLK=P11;sbitRST=P12;/液晶显示屏引脚yejingpinyinjiaosbitRS=P20;sbitRW=P21;sbitEN=P22;/K按键sbitk1=P34;sbitk2=P35;sbitk3=P36;sbitk
17、4=P37;ucharcodedis_alarm0=ALARM D H M ; /定义一个字符串uchar dis_alarm1=TM: 00:00:00 ; / 56 天 89 时 11 12 分uchar tian=0;uchar shi=0;uchar fen=0;uchar tcount=0;/ 一年中每个月份天数,二月天数有年份决定 uchar monthdays=0,31,0,31,30,31,30,31,31,30,31,30,31;uchar *week=sun,mon,tus,wen,thu,fri,sat;/LCD huanchong xianshiuchar idata
18、lcd_dis_buffer1=DT:2000-00-00 ; uchar idata lcd_dis_buffer2= TM: 00:00:00 ;uchar datetime7; /读取日期时间uchar adjust_index=-1; uchar change_flag=-MHDM-Y; /年-月-星期-天-时-分调整/yanshi/-void delay(uint x) uchar i; while(x-) for(i=0;i120;i+) ;/空语句1us /*驱动程序*DS_ 1302 *8 / xie ru yige zijie DS1302 void write_to_DS(
19、uchar x) uchar i; for(i=0;i=1; /-/ get a byte from DS1302 uchar get_from_DS() uchar i,b,t; for(i=0;i=1;t=SDA;b|=t7;CLK=1;CLK=0; /BCD ma zhuanhuan return b/16*10+b%16; uchar read_data(uchar addr) uchar dat; RST=0;CLK=0;RST=1; write_to_DS(addr); dat=get_from_DS(); CLK=1;RST=0; return dat; /xiang DS mo
20、u zhiding weizhi xie ru shuju void write_DS(uchar addr,uchar dat) CLK=0; RST=1; write_to_DS(addr); write_to_DS(dat); CLK=0; RST=0; /set timevoid set_DS() uchar i; write_DS(0x8E,0x00);/write control ,delete protete /fen,shi,ri,yue ,nian, yicixieru for(i=1;i7;i+) write_DS(0x80+2*i,(datetimei/104)| (da
21、tetimei%10); write_DS(0x8E,0x80);/ add protect / read current time void gettime() uchar i; for(i=0;i7;i+) datetimei=read_data(0x81+2*i); /-*DS_驱动 结束*- /LCD 控制/读lcd 状态uchar read_lcd_state() uchar state ; RS=0;RW=1;EN=1;delay(1);state=P0;EN=0;delay(1); return state; / 忙等待void lcd_busy_wait() while(rea
22、d_lcd_state()&0x80)=0x80); delay(5);/向LCD写数据 void write_lcd_data(uchar dat) lcd_busy_wait(); RS=1;RW=0;EN=0;P0=dat;EN=1;delay(1);EN=0; /向LCD写指令 void write_lcd_cmd(uchar cmd) lcd_busy_wait(); RS=0;RW=0;EN=0;P0=cmd;EN=1;delay(1);EN=0; /LCD初始化void Init_lcd() write_lcd_cmd(0x38); delay(1); write_lcd_cmd
23、(0x01) ; delay(1); write_lcd_cmd(0x06); delay(1); write_lcd_cmd(0x0C) ; delay(1); /设置液晶显示位置 void set_lcd_pos(uchar p) write_lcd_cmd(p| 0x80); /在LCD zhiding hang 上显示字符串 void dis_lcd_string(uchar p,uchar *s) /位置,字符指针 uchar i; set_lcd_pos(p); for(i=0;i16;i+)/16*2 write_lcd_data(si) ; delay(1); /LCD 驱动结
24、束/ 闹钟显示void alarm_xs() / 将闹钟时间 转换成字符串 dis_alarm15=tian/10 +0; dis_alarm16=tian%10+0;dis_alarm18=shi/10+0; dis_alarm19=shi%10+0;dis_alarm111=fen/10+0; dis_alarm112=fen%10+0;dis_lcd_string(0x00,dis_alarm0); /第一行显示字符串 dis_lcd_string(0x40,dis_alarm1); /第二行显示字符串/ date time changto string void format_date
25、time(uchar d,uchar *a) a0=d/10+0;a1=d%10+0; /- /瑞年判断 uchar isleapyear(uint y) return (y%4=0 & y%100 !=0 | (y%400=0); /求weekday void refreshweekday() uint i,d,w=5; for(i=2000;i2000+datetime6;i+) d=isleapyear(i) ? 366:365; w=(w+d)%7; d=0; for(i=1;idatetime4;i+) d+=monthdaysi;d+=datetime3; datetime5=(w
26、+d) %7+1; / set year month day hour min scend +/-void datetime_adjust(uchar x) switch(adjust_index) case 6: / nian 00-99 if(x=1& datetime60) datetime6-; /get er yue tianshu monthdays2=isleapyear(2000+datetime6) ? 29:28; if(datetime3monthdaysdatetime4) datetime3=monthdaysdatetime4 ; refreshweekday();
27、 /refresh weekday break; case 4:/yue 01-12 if(x=1& datetime41) datetime4-; /get er yue tianshu monthdays2=isleapyear(2000+datetime6) ? 29:28; if(datetime3monthdaysdatetime4) datetime3=monthdaysdatetime4 ; refreshweekday(); /refresh weekday break; case 3:/ ri monthdays2=isleapyear(2000+datetime6) ? 29:28; if(x=1& datetime30) datetime3-; refreshweekday(); /refresh weekday break; case 2:/ hour if(x=1& datetime20) datetime2-; break; case 1:/ minut if(x=1& datetime10) datetime1-; break; /- /T0 per 1s refresh the LCD T0中断 void T0_int()
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1