AT89C51数字电子钟(已测试通过)

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

AT89C51数字电子钟(已测试通过)该数字钟可实现精度误差≤1S/天的变精度时钟,并能方便地调节时钟、时间、定时时间等.led1bitp1.0;LED定义led2bitp1.1led3bitp1.2led4bitp1.3led5bitp1.4led6bitp1.5led7bitp1.6led8bitp1.7s1bitp0.0;数码管位数定义s2bitp0.1s3bitp0.2s4bitp0.3s5bitp0.4s6bitp0.5s7bitp0.6s8bitp0.7led_dataequp2;数码管定义key1bitp3.5;按键定义key2bitp3.6key3bitp3.7keyequ56htime_hequ57h;定时初值高位time_lequ58h;低位t_hequ60h;时分秒对应的地址t_sequ61ht_mequ62htimeequ63h;时钟计数单元timer_hequ64h;定时时单元timer_mequ65h;定时分单元timsetbit00h;设置时间标志disstartequ70h;显示单元首地址int_dataequ45h;中断数据地址count_dataequ44h;计数单元地址timer_dataequ43h;定时地址;**************以上为预定义部分;**************以下程序开始org00h;程序开始地址jmpmain;跳转到代码开始处org1bh;定时器T1中断服务程序入口jmptim1org030h;主程序开始的地址30Hmain:MOVsp,#30h;首先定义堆栈lcallrest;初始化lcallpro_set;设置定时器开始工作lpp:lcalltime_set;接受用户设置时间lcalltimer;时钟处理lcalltime_pro;时间格式处理,码型变化等lcalltime_display;显示jmplpp;*************初始化程序***************************rest:MOVa,#00h;累加器清零MOVb,#00hMOVp0,#0;数码管禁止显示MOVt_h,#0;时单元MOVt_m,#0;分单元MOVt_s,#0;秒单元MOVtime,#00h;计数溢出次数,溢出20次为一秒clrtimset;定时设置标志位,0-增加1-减少MOVtimer_h,#12;定时器时单元,设置定时为12:00MOVtimer_m,#00h;定时器分单元MOVp2,#255;禁止显示数码管clrbeep;禁止蜂鸣器ret;返回;***************定时器T1中断服务程序****tim1:clrtr1;首先停止定时操作MOVth1,time_h;MOVtl1,time_linctime;自增MOVa,time;取得溢出次数cjnea,#20,retend;如果满20此表示到1秒cplp1.0;取反p1.0,p1.1指示秒钟cplp1.1MOVtime,#00h;重新开始等待1秒inct_s;秒单元加1retend:setbtr1;定时开始reti;中断返回;*****************设置定时器初始化,定时时间为50ms****pro_set:MOVdptr,#0000h;数据指针清零MOVtmod,#10h;设置定时器1工作在方式1MOVtime_h,#3ch;计算定时50ms需要的初值MOVth1,time_h;保存高位MOVtime_l,#0c1h;低位MOVtl1,time_l;保存低位setbea;总的中断允许setbet1;定时器1允许setbtr1;定时器1开始运行ret;返回;******************timer程序主要完成数据的处理**********timer:MOVa,t_s;取得秒单元数据cjnea,#60,tend;秒不到60返回MOVt_s,#00h;清除秒单元inct_m;为分单元加1MOVa,t_m;取得分单元数据cjnea,#60,tend;分不等于60返回MOVt_m,#00h;分单元清零setbbeep;整点短鸣提示lcalldelay;鸣叫延时clrbeep;停止蜂鸣器inct_h;同时为时单元加1MOVa,t_h;取得时单元数据cjnea,#24,timetest;如果不等于24,查看定时MOVt_h,#00h;时单元清零jmptend;返回timetest:cjnea,timer_h,tend;不等于定时的时单元,返回MOVa,t_m;取得定时的分单元cjnea,timer_m,tend;当前分不等于定时的分单元,返回setbbeep;定时到,蜂鸣提示lcalldelayclrbeeplcalldelaysetbbeeplcalldelayclrbeep;连续发出短音提示tend:ret;返回;************time_display程序主要为显示时间值用*************time_display:MOVr0,#disstart;取得显示单元首地址MOVr1,#01h;从第一个数码管开始MOVr2,#06h;共6个数码管dislp:MOVled_data,@r0;获得当前单元数据incr0;指向下一个单元MOVp0,r1;数码显示MOVa,r1;为下一个数准备rla;下一个单元MOVr1,a;保存lcalldelay5ms;为了保证数码管亮度,;但要防止闪烁,延时5msdjnzr2,dislp;重复显示,直到全部数据刷新过ret;返回;*******time_pro时间处理,主要为bcd码转换,查表***********time_pro:lcallbcd;BCD码转换MOVr0,#disstart;获得显示单元首地址MOVr2,#06h;需要转换的个数prlp:MOVa,@r0;取得当前需要转换的数据MOVdptr,#tab_nu;获得表头MOVca,@a+dptr;获得转换后的数据MOV@r0,a;存回去incr0;指向下一个djnzr2,prlp;重复转换,直到6个全部完成ret;返回;****************码型变换****************************************bcd:MOVr0,#disstart;获得首地址MOVa,t_s;获得待转化的低位MOVb,#10;转化进制,如果要进行十进制转换改为10divab;计算A/BMOV@r0,b;第一位转换完毕,保存低位转化后的数据incr0;自增MOV@r0,a;保存高位incr0;取第二个数据地址MOVa,t_m;获得第二个需要转换的数据MOVb,#10;十六进制divab;计算MOV@r0,b;存低位incr0MOV@r0,a;存高位incr0;第三位MOVa,t_h;获得数据MOVb,#10;十六进制divab;计算MOV@r0,b;存低位incr0MOV@r0,a;存高位ret;完毕,返回;***************************************************************************************;********time_set设置时间*******************************************************;**;*检测用户按键,1-设置时单元2-设置分单元,3-设置增减方式*;*如果需要增加时,先将方式设置为增加(默认为减),即,按下KEY3一下,*;*然后按KEY1,如果要减少时单元,需要再次按下KEY3,然后按KEY1;*;*分的设置也是如此。*;***************************************************************************************time_set:MOVp0,#00h;禁止数码管显示MOVp2,#255;防止按键时闪烁lcallpro_key;查找用户按键情况MOVa,key;查找键值jztsend;如果等于0,表示没用按键,直接返回cjnea,#1,tset1;是否等于1?没有到下一个处理程序MOVkey,#00h;等于1,表示设置时请零,否则会引起重复设置jbtimset,tset10;时间设置标志位,1-减少,0-增加MOVa,t_h;标志位0,增加,取得时单元cjnea,#23,ts1;如果时单元不等于23,转移到增加操作jmptsend;等于23直接返回ts1:inct_h;时单元增加1jmptsend;返回tset10:MOVa,t_h;这里处理为减少的情况jztsend;如果时单元为0,直接返回dect_h;否则,数据减1jmptsend;返回,以下关于分的设置一样tset1:cjnea,#2,tset2;如果按键不是2则转移到下一个处理MOVkey,#00h;是2,表示设置分jbtimset,tset20;其余同上MOVa,t_mcjnea,#59,ts2jmptsendts2:inct_mjmptsendtset20:MOVa,t_mjztsenddect_mjmptsendtset2:cjnea,#3,tsend;等于3表示设置标志MOVkey,#00h;清零cpltimset;标志取反tsend:ret;返回;*********按键处理读取键盘*************************;参见有关键盘查询的说明,和前面的有关程序pro_key:;键盘查询子程序setbkey1;首先输出高电平,检测低电平的到来setbkey2;不同电路,可能检测方式不一样setbkey3jbkey1,ke1;如果用户没有按第一个键,到第下个处理部分,MOVkey,#1;表示用户按了第一个键lcalldelay20ms;软件延时,防止干扰jmppro_key;重新查询,直到用户释放按键ke1:jbkey2,ke2;处理第二个按键,如果没有到下一个处理部分MOVkey,#2;以下和第一个处理单元相似。lcalldelay20msjmppro_keyke2:jbkey3,ke3MOVkey,#3lcalldelay20msjmppro_keyke3:ret;**************************************;********定时器T0设置**************;定时器工作在方式1,为提高精度,总定时时间为50ms,;定时器溢出20次为1秒,pro_timer:MOVtmod,#01h;设置定时器为定时方式1MOVth0,#0ffh;初始化定时初值MOVtl0,#0a1h;setbea;总中断允许setbet0;定时器0允许setbtr0;开始定时ret;返回;*****************************************;***************软件延时*************delay:pushpsw;保存原来的寄存器内容clrpsw.3;clrpsw.4;设置新的寄存器组MOVr0,#2;延时参数1MOVr1,#250;延时参数2MOVr2,#2;延时参数3dl1:djnzr0,dl1;延时循环1MOVr0,#250;dl2:djnzr1,dl1;延时循环2MOVr0,#240;MOVr1,#248;dl3:djnzr2,dl1;延时循环3nop;定时精度调整poppsw;恢复原来的寄存器ret;返回;*****************************************;***************键盘延时***************delay20ms:pushpswclrpsw.3clrpsw.4MOVr0,#250MOVr1,#40d20:djnzr0,d20MOVr0,#250djnzr1,d20poppswret;**************************************;***********延时5ms*******

1 / 8
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功