基于单片机的多功能电子时钟设计.doc

上传人:夺命阿水 文档编号:15989 上传时间:2022-06-30 格式:DOC 页数:18 大小:667.53KB
返回 下载 相关 举报
基于单片机的多功能电子时钟设计.doc_第1页
第1页 / 共18页
基于单片机的多功能电子时钟设计.doc_第2页
第2页 / 共18页
基于单片机的多功能电子时钟设计.doc_第3页
第3页 / 共18页
基于单片机的多功能电子时钟设计.doc_第4页
第4页 / 共18页
基于单片机的多功能电子时钟设计.doc_第5页
第5页 / 共18页
点击查看更多>>
资源描述

《基于单片机的多功能电子时钟设计.doc》由会员分享,可在线阅读,更多相关《基于单片机的多功能电子时钟设计.doc(18页珍藏版)》请在课桌文档上搜索。

1、目录一、 设计目的、设计题目3二、 设计任务、功能描述.3三、 硬件原理分析.3四、 软件设计.71 地址空间分配.72 软件整体架构分析.82.1总体架构说明:设计思路.82.2主程序功能描述及分析、主程序流程图.92.3各子程序功能描述及子程序入口出口、各程序流程图.9五、 程序清单.12一、 设计题目:数字时钟。设计的时钟能够实现日常的时钟显示,同时具有时钟调整、两个闹钟及正点报时功能。二、 设计任务、功能描述整体设计任务:本电子时钟设计首要的工作是结合以往所学的单片机程序编写理论和编写规则来编写电子时钟的软件部分,编写时要结合所配的AT89S52芯片的管脚功能和其他硬件电路,该部分运用

2、keil单片机软件来完成。在编写完软件并检测完正确后再编译成.hex载入用Isis仿真软件布好的仿真硬件中运行检测程序是否正确,并调试。待这一切工作做好后再利用已焊接好的小系统板硬件电路来实践实现软件功能与硬件的结合。此步骤要用progisp单片机烧写软件来实现。在硬件设计上:1用四个电位按键来实现对电子时钟的调试工作,当按第一下总控键时进入时钟的调整状态,有两个电位按键分别来调整时钟的分和时,在调整时秒正常运行;当按第二下总控键时时钟进入闹钟一设置,有两个电位按键分别来调整时钟的分和时的设定,另外有一个时钟控键来实现闹钟是否开启;当按第三下总控键时时钟进入闹钟二设置,其余操作同闹钟一设置操作

3、,当按第四下总控键时时钟退出调整模式进入正常时钟走势。2用两个四位数码管来实现设计的显示部分,其演示模式是: 时时-分分-秒秒 该数码管组合的功能管脚是八个位选择连接芯片的p2引脚,八个显示管位并联再接入到芯片p0引脚。从而在功能上区分开,实现数码管的显示功能。 3用一个led灯和电阻组成的简易电路结合设计来实现正点报时的功能,当时钟走到正点时,该led灯便能够闪烁五秒刚好是五下,之后进入暗的状态,等到下一个整点到来。 4用一个喇叭和三极管等配件组成一个闹钟电路,再与芯片的p1.0引脚连接。当时钟到设定的报时点时便会发出嘟嘟嘟嘟.的声音来实现闹钟功能。 5用一个按键和其他部件组成的复位电路与芯

4、片连接来实现整个程序及硬件的重新复位功能。三、 硬件原理分析电路设计分析电路原理设计是基于小系统包括电源电路、复位电路、按键电路、时钟电路、数码管显示驱动电路、输出控制电路。电源部分是用电池来提供的3v-5v,晶体振荡器采用的是12MHz的石英晶体振荡器。总体硬件设计框图如下:主 控制器AT89S52系列单片机芯片电源复位电路按键电路时钟振荡电路七段数码管数码管显示驱动电路输出控制电路1.1复位电路 本次设计采用按键电平复位,按键电平复位相当于按复位键后,复位端通过电阻与Vcc电源接通;1.2振荡器和时钟电路设计1.21振荡器和时钟电路工作原理80C51系列单片机部有一个高增益反相放大器,用于

5、构成振荡器,但要形成时钟,外部还需附加电路。XTAL1引脚为反相放大器和时钟发生电路的输入端,XTAL2引脚为反相放大器的输出端。片时钟发生器实质是个2分频的触发其输入来自振荡器的fosc,输出为2相时钟信号,即节拍信号P1、P2,器频率为fosc2。2个节拍为1个状态时钟S。状态时钟再3分频后为ALE信号,其频率为fosc6,状态时钟6分频后为机器周期信号,器频率为fosc12。特殊功能寄存器PCON的PD位可以控制振荡器的工作,当PD=0时,振荡器停止工作,单片机进入低功耗工作状态,复位后,PD=0,振荡器正常工作。1.22 本次设计采用常用的部时钟方式接法:通过在引脚XTAL1和XTAL

6、2两端跨接晶体或瓷谐振器,再利用芯片部的振荡电路,就构成了稳定的自激振荡器,其发出的脉冲直接送入部时钟电路,如图所示,外接晶振时,C5和C6的值通常选择为20-30pf。C5、C6对频率有微调作用,影响振荡的稳定性和起振速度。所采用的晶体或瓷谐振器得频率选择0-2433MHz。为了减小寄生电容,更好的保证振荡器稳定、可靠的工作,谐振器和电容赢尽可能与单片机芯片靠近安装。1.3电源 因为该电路所需电压为3-5v,可直接用电池供应或也可以用直流电源供应,但需经过变压才行。1.4数码管显示电路 采用LED共阳极数码管的发光二极管接到高电平电压为5V,用LED动态扫描显示方式,在单片机电路里,芯片的驱

7、动电流很小,一般为微安级别的,要通过三极管可驱动电流为毫安级别,甚至更大来驱动LED正常工作电流为几十毫安发光,本设计由P2端口扫描数码管的选通,P0口送数据显示。1.5按键电路S1按键接在P3.0口,用于切换正常走时、调时间、设定闹钟;S2按键接在P3.1口,用于调整时钟分加一和调闹钟时间分加一的功能;S3按键接在P3.2口,用于调整时钟时加一和调闹钟时加一的功能;S4按键接在P3.3口,用于设定是否开启闹钟。1.6输出控制电路 在P1.1和P1.0端口分别接一个发光二极管,用于整点报时,和一个蜂鸣器,用于响闹铃。1.7整体布局图四、软件设计分析1、地址空间及端口分配30h37h地址空间分别

8、分配给led1、led2、led3、led7、led4、led8、led5、led6.用于数码管显示。38h地址空间分配给gn,定义38h空间为按键次数读取的缓存空间。3bh地址空间分配给nk1,定义3bh空间是闹钟开启开关按键次数读取缓存空间。39h地址空间分配给nao1f,用于存储调整闹钟一分加一按键次数读取缓存。3ah地址空间分配给nao1s,用于存储调整闹钟一时加一按键次数读取缓存。3dh地址空间分配给nao2f,用于存储调整闹钟二分加一按键次数读取缓存。3eh地址空间分配给nao2s,用于存储调整闹钟二时加一按键次数读取缓存。50h地址空间用于存放50ms中断寄存。51h地址空间用与

9、存放秒的十位和个位。52h地址空间用与存放分的十位和个位。53h地址空间用与存放时的十位和个位。p1.1端口分配给zdled ,定义灯接到p1.1.利用setb和clr zdled控制灯的亮暗起到整点报时显示作用。p1.0 端口分配给nb,定义蜂鸣器接到p1.0 利来实现闹肿p0端口分配给数码管显示控制p2端口分配给数码管选择显示控制。2、总体架构说明该时钟程序设计思路如下:1、在程序头将设计中的一些固定空间进行分配并注释。2、初始化程序,如设定时钟初始显示005956 以便一开始就能进入整点报时状态,显示该功能;设定使用定时器1;将一些未到时钟设计功能的功能端口关闭等。3开始主程序进行程序扫

10、描,先扫描拆字子程序,将分配好的时分秒等高地位的数字调入到显示子程序中。显示子程序通过分配的空间对应口将拆字子程序的容在七段数码管上显示相应的时分秒,再调用走时程序使时钟进行读秒等工作。进入按键扫描,判断按键是否有变动,若有就根据设计程序对相应的按键按入次数而进行实现相应的功能。如进入时间调整、闹钟一设置、闹钟开启与否等。进入闹钟一、二的判断,在时分上与设置的闹铃时间吻合的话就做相对应的判断,再依据是否有开启闹钟而进行响铃与否,如果有响铃则设置其一直响铃知道有人为按取消按键取消闹铃。进入整点报时扫描,判断是否在时分上都进入了整点,如果是就报时显示灯闪烁五下5s,然后就退出整点报时,等到下一个整

11、点的到来。最后返回主程序头重新依次扫描。显示过程设有消隐,按键设有去斗。4、子程序部分。在主程序的调用下依据不同的子程序工能而编写子程序,有多级嵌套。这些子程序包括显示子程序、拆字子程序、延时子程序、走时间子程序、整点报时子程序、按键处理子程序、调时间子程序、闹钟设置子程序、闹钟子程序、闹钟开启子程序。3、各子程序功能及出入口地址1各子程序功能: 显示子程序:将拆分好的高低位时分秒拆分码放入相对应的数码管,调用tab选通相应的七段数码显示时分秒当前数字。 拆字子程序:将空间51h、52h、53h的秒时分拆成高低字节分配到,30h、31h、33h、34h、36h、37h实现时分秒的显示。 延时子

12、程序:该子程序是为了实现八个七段数码管显示的顺序显示选通时间,2ms的显示时间频率是的显示效果稳定,同时作为按键开关扫描判断去抖走时间子程序:该程序功能是使得秒程序走动,走到59后进位分,后变00从新开始计时,分走到59后进位时,分从新开始00计时,时走到23,分走到59,秒走到59后进入从新日期周期计时。整点报时子程序:在达到整点时该程序的功能实现报时,报时以led灯闪烁显示为报时信号。按键处理子程序:该程序进行按键处理的功能判断分别是有调试按键处理,闹钟设置按键处理,闹钟开启与否按键处理。调时间子程序:该程序功能实现时间的调整。调闹钟子程序:该程序闹钟程序设计与按键结合实现闹钟设置调整的功

13、能。闹钟开启子程序:该功能实现闹钟开启与否而达到闹钟响铃功能。4、程序流程图开始调用拆字节子程序调用延时显示时分秒调用按键子程序调用闹钟1.2判断闹钟调用闹钟子程序调用整点报时子程序结束,循环子程序Led1r0tabdptr查表#07r2,显示控制#0fehr3,秒个位显示ar0,a+dptra,查表#0ffhp2消隐ap0,显示当前文字R3a,ap2,选通相应数码管Inc r0,指向下一位显示ar3,保存下一位选码延时2ms显示当前数字R2-1=?0拆字子程序YN一主程序流程图二显示子程序显示闹钟二A=?#3显示闹钟二的时分秒Lcall bcd处理led3,led6显示显示闹钟一时分秒显示闹

14、钟一调用bcd调用bcdACC、PSW入栈保存Chaizi1.显示A=?#2retbcd程序retYYN三拆字子程序T1.重新赋值Th1#3chTl1.50h,重新赋值,再定时1sPSW .ACC出栈reti50h-1=?051h=?6052h=?6053h=?24YYYYNNNN四走时间子程序#0FFa,ap1调用延时ret#0gngn+1gna P2.0=?1P2.0=?1调用延时P2.0=?1a=?4调时间程序NYNYYNNY五按键处理五、 程序清单; 初始化 ; led1 equ 30h ;定义30h = 第8个数码管最右边第1个数码管的显示容 =LED1=秒的个位 led2 equ

15、31h ;定义31h = 第7个数码管显示容 =LED2=秒的十位 led3 equ 32h ;定义32h = 第6个数码管显示容 =LED3=时分秒中间的一个横杆 led7 equ 33h ;定义33h = 第5个数码管显示容 =LED7=分的个位 led4 equ 34h ;定义34h = 第4个数码管显示容 =LED4=分的十位 led8 equ 35h ;定义35h = 第3个数码管显示容 =LED8=时分秒中间的一个横杆 led5 equ 36h ;定义36h = 第2个数码管显示容 =LED5=时的个位 led6 equ 37h ;定义37h = 第1个数码管显示容 =LED6=时

16、的十位 gn equ 38h ;定义38h空间为按键次数读取的缓存空间 bssj equ 3fh ; zdled bit p1.1 ;定义灯接到p1.1.利用setb和clr zdled控制灯的亮暗 nb bit p1.0 ;定义蜂鸣器接到p1.0 利来实现闹铃响 nk1 equ 3bh nao1f equ 39h nao1s equ 3ah nao2f equ 3dh nao2s equ 3eh org 00h ; 这句话把下面那条指令定位到00h这个地址去 sjmp main ;这里是单片机复位后运行的第一条指令, 这句话使单片机跳到main那里继续执行程序 org 001bh ;这句话把

17、下面那条指令定位到001b这个地址去. ljmp zoushijian ;这句话是定时器50毫秒定时到之后,TH0,TL0记数到FFFFH时单片机自动跳到 这里运行,我们再把它跳到zoushijian 继续执行,因为这个时候主程序已经暂停运行,我们称主程序发生了中断,而zuoshijian就是中断服务主程序. org 40h ;把主程序main定位到40h这个地址 main: mov sp,#5FH;设置堆栈指针,存放进入50ms中断时的PC值 mov 50h,#01;50h存放定时器中断的次数,现在定时器每50ms中断一次,所以 ;赋初值20,利用djnz减,减到0时自然就是1秒到了 mov

18、 51h,#55;51h存放秒的十位和个位,现在给32h等于十进制的50,相当于一开始让 ;第7个,第8个数码管显示50秒,尽快到达整点,利于调试整点报时. mov 52h,#59;52h存放分的十位和个位,现在给3bh等于十进制的59,相当于一开始让 ;第4个,第5个数码管显示59分,尽快到达整点,利于调试整点报时. mov 53h,#00;53h存放小时的十位和个位,现在给00h等于十进制的00,相当于一开始让 ;第1个,第2个数码管显示00小时, mov tmod,#10h;使定时器1工作在工作模式1,即16位定时器工作模式 mov th1,#3ch;65536us-50000us=15

19、536微秒,刚好是3cb0h,这样定时器1每50ms进入中断一次 mov tl1,#0afh setb zdled ; 还没到整点,先让灯暗 mov a,#0 mov r1,a mov bssj,#10 clr rs0 clr rs1 clr gn clr nao1f clr nao1s clr nk1 setb nb setb tr1 ;开启定时器1,使TH1,TL1不断加1 setb et1 ;开启定时器1中断,使TH1,TL1加到FFFF时让单片机自动跳到001bh去执行,如果不 开启这个中断标志,那么即使单片机TH1,TL1记数到FFFF,单片机也不会跳到001bh去的. setb e

20、a ;开启总中断; 主程序 ;l5: nop lcall chaizi;把当前的时分秒的值按照十位,个位拆到35h30h中 lcall display;把拆好的时分秒的十位,个位分别显示到相应的数码管上面. lcall anjian ;理按键 lcall xiang1 ;判断闹钟 lcall xiang2 lcall nk ;设置闹钟是否开 lcall zdbs ;整点报时 sjmp l5;主循环结束,又跳到主循环开始处;显示子程序,把拆好的时分秒的十位,个位分别显示到相应的数码管上面 ;入口地址:r2、r3;出口地址:p0、p2display:mov r0,#led1;从LED1开始显示,即

21、从第8个数码管秒的个位开始 mov dptr,#tab mov r2,#08;8个数码管同时显示 mov r3,#0feh;选通第8个数码管,关闭其他的数码管disp_1: mov a,r0;把当前要显示的数放到A里面 movc a,a+dptr;得到当前要显示数的7段码 mov p2,#0ffh ;关掉所有数码管显示,消隐,把残留在数码管上面的乱码消去 mov p0,a;显示当前的数,运行到这里,人的眼睛应该看到显示容 mov a,r3;位选给A mov p2,a;选通相应的数码管 rl a;得到新的位选码 inc r0;指针指向下一个要显示的容 mov r3,a;保存下一个位选码,以便选通

22、下一个数码管. lcall delay;延时4毫秒显示当前的数码管 djnz r2,disp_1;跳回去,进入下一个数码管的显示 rettab: db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h,0bfh,0ffh,8ch,3fh,7fh; 采用除法指令实现的拆字程序 ;入口地址:38h、;出口地址:30h38h、3bhchaizi: mov a,gn ;显示闹钟二 cjne a,#3,chaizi2 mov a,nao2f mov b,#10 div ab mov led2,a mov led1,b mov a,nao2s mov b,#10 d

23、iv ab mov led4,a mov led7,b mov led5,#02h mov led6,#0ch retchaizi2:mov a,gn ;显示闹钟一 cjne a,#2,chaizi1 mov a,nao1f mov b,#10 div ab mov led2,a mov led1,b mov a,nao1s mov b,#10 div ab mov led4,a mov led7,b mov led5,#01h mov led6,#0chlcall bcd retchaizi1:mov a,51h;把51h这个秒的数值拆成个位和十位 mov b,#10 div ab mov

24、led2,a;秒的十位进入LED2保存 mov led1,b;秒的个位进入LED1保存 mov a,52h;把52h这个分的数值拆成个位和十位 mov b,#10 div ab mov led4,a;分的十位进入LED4保存 mov led7,b;分的个位进入LED7保存 mov a,53h;把53h这个时的数值拆成个位和十位 mov b,#10 div ab mov led6,a;时的十位进入LED6保存 mov led5,b;时的个位进入LED5保存lcall bcd1 lcall bcd2;处理第3个和第6个数码管的显示 retbcd1: mov a,gn cjne a,#0,l3 cj

25、ne r1,#0,l3 mov a,50h;读取50ms中断的次数,看看经过了几次50ms的中断 cjne a,#09,l1l1: jc l3 mov a,nk1 cjne a,#1,k_1 mov led3,#0dh retk_1: mov led3,#0bh;没到0.5秒,显示横杆 ret ;是否经过了0.5秒l3: mov a,nk1 cjne a,#1,k_2 mov led3,#0eh retk_2: mov led3,#0ah;已经到了0.5秒,让两个横杆消失,这样造成两个横杆一闪一闪效果 retbcd2: mov a,gn cjne a,#0,l13 cjne r1,#0,l13

26、 mov a,50h;读取50ms中断的次数,看看经过了几次50ms的中断 cjne a,#09,l11l11: jc l13 mov a,nk1 cjne a,#1,k_11 mov led8,#0dh retk_11: mov led8,#0bh;没到0.5秒,显示横杆 ret ;是否经过了0.5秒l13: mov a,nk1 cjne a,#1,k_21 mov led8,#0eh retk_21: mov led8,#0ah;已经到了0.5秒,让两个横杆消失,这样造成两个横杆一闪一闪效果 ret; 延时程序 ;;入口地址:r6、r7;出口地址:r6delay: mov r6,#5 ;这

27、是一个*100+2+1*5=2015微秒=2毫秒的延时程序 dl2: mov r7,#100 ;1微秒 dl1: nop ;1 微秒 nop ;1微秒 djnz r7,dl1 ;2微秒 djnz r6,dl2 ;2微秒 ret; 走时间 ;;入口地址:acc、psw;出口地址:acczoushijian: PUSH acc ;0E0H就是A,见课本44页,因为这个时候SP=5fh,故把A的值保存在5fh里面去 PUSH psw ;因为0D0H就是PSW,此时SP=60H,所以这句话是把PSW的值保存到60h中去 mov th1,#3ch ;重新给定时器赋初值,让它再定时50ms mov tl1

28、,#0afh djnz 50h,l2 ;判断是否到了1秒没有,50h减到0表示已经进行了20次的50ms,刚好1秒 mov 50h,#20 ;已经到1秒,重新赋次数,再定时记数一秒 inc 51h mov a,51h ;从51h读取秒的值 cjne a,#60,l2 ;判断是否到60秒,没到60秒,中断返回退到主程序 mov 51h,#0 ;到60秒,重新从0秒加起,分钟加1 inc 52h mov a,52h ;读取分钟 cjne a,#60,l2 ;判断是否到了60分钟,没到60分钟,中断返回退到主程序 mov 52h,#0 ;到60分钟,重新从0分钟加,小时加1 inc 53h mov

29、a,53h ;读取小时值 cjne a,#24,l2 ;判断是否到了24小时,没到24小时街卸戏祷赝说街鞒绦? mov 53h,#0 ;到了24小时,重新清零小时,从00小时又开始新一天定时l2: POP psw ;把放在60h的东西放回到PSW里面,因为这个时候SP=60h,0D0H就是PSW POP acc ;把放在60h的东西放回到PSW里面,因为这个时候SP=5fh,0E0H就是A reti ;PC指针变回进入中断时的下一条指令的值; 整点报时子程序 ?报时时间为 5 秒 ;;入口地址:51h、52h;出口地址:p1.1zdbs: mov a,52h cjne a,#0,zdbs_1

30、mov a,50h cjne a,#10,zdbs_2zdbs_2: jc zdbs_3 mov a,51h cjne a,#5,zdbs_4zdbs_4: jnc zdbs_1 clr p1.1 retzdbs_3: mov a,51h cjne a,#5,zdbs_5zdbs_5: jnc zdbs_1 setb p1.1 ret ;打开整点报时的指示灯zdbs_1: setb zdled ret; 按键处理 ;;入口地址:38h、p3;出口地址:p3.0anjian: mov a,#0ffh mov p3,a ;0000给P1口上拉高电频 p3.0,js_1 lcall delay p3

31、.0,js_1a_1: jnb p3.0,a_1 lcall delay jnb p3.0,a_1 inc gn mov a,gn cjne a,#4,js_1 mov gn,#0 retfanhui: ret; 调时间 ;;入口地址:38h、52h、53h;出口地址:38h、p3.1、p3.2js_1: mov a,gn cjne a,#1,jn1_1js1_2: p3.1,js2_2 lcall delay p3.1,js2_2js1_1: jnb p3.1,js1_1 lcall delay jnb p3.1,js1_1 inc 52h mov a,52h cjne a,#60,anjian mov 52h,#0 retjs2_2:

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

当前位置:首页 > 在线阅读 > 生活休闲


备案号:宁ICP备20000045号-1

经营许可证:宁B2-20210002

宁公网安备 64010402000986号