找回密码
 注册会员
搜索附件  

未命名.jpg

 

51单片机的电子钟 显示时间 年月日 闹钟 整点报时 秒表 硬件原理图 仿真结果都有:


一、系统概述:

1.基本要求:

(1) 显示准确的北京时间(时、分、秒),可用24小时制式;

(2) 随时可以调校时间。

(3) 增加公历日期显示功能(年、月、日),年号只显示最后两位;

(4) 随时可以调校年、月、日;

(5) 允许通过转换功能键转换显示时间或日期。

(6) 所有按键需要通过串口自发自收来调校各种功能。

2.发挥部分

1)增加秒表功能

2)增加闹铃功能

3)增加整点报时功能。

实验功能:

本系统是基于单片机AT89S52制作的数字电子钟。根据实验要求,在完成实验所要求的基本功能外,扩展了几个功能。

硬件系统设计方面:

采用六位LED数码管,用切换的方式显示日期或时间和设置的闹钟时间;

可调整日期或时间以及闹钟时间;

具有设置闹钟的功能;

软件系统设计方面:

程序采用汇编语言编写,使自己更加理解硬件语言以及其工作原理。

“时钟”基准时间由单片机内部的定时中断提供用一个计数器对定时中断的次数进行计数,可实现“秒”定时,同理可以进行“分”﹑“时”定时,以及“日”﹑“月”﹑“年”定时,并充分考虑闰年等情况下的日期的差异

采用按键查询功能复用,简化了程序的设计

采用动态扫描法显示6位数码管


方案考虑:

1、硬件方案

1)、采用6LED数码管显示日期或者时间。

2)、显示器的驱动可采用“静态显示驱动”(如7段译码/锁存/驱动芯片CD4511);也可采用“动态扫描驱动”,但后者比前者所需驱动电流要大。

3)显示部分也可采用液晶,但液晶成本较高。

4)、键盘的按键数目较多时则采用行列式矩阵结构为好。“一键多用”的构思和设计能大为减少按键的数目。  

5)、整体设计上应考虑其结构简单﹑操作简便﹑布局美观﹑成本低廉。

2、软件方案

(1)、“时钟”基准时间由单片机内部的定时中断提供,定时时间应是“秒”的整除数,且长短适宜。最长不能超过16位定时器的最长定时时间;最短不



能少于中断服务程序的执行时间。通常来说基准时间越短,越有利于提高时钟的运行精确度。

(2)、用一个计数器对定时中断的次数进行计数,可实现“秒”定时,同理可以进行“分”﹑“时”定时,以及“日”﹑“月”﹑“年”定时。

(3)、LED 数码管显示器采用“动态扫描驱动”时要注意的是:驱动信号的维持时间必须大于“起辉时间”(电流大起辉时间短),而驱动信号的间歇时间必须小于“余辉时间”(电流大余辉时间长),但驱动电流大小受硬件电路能力和LED数码管极限功耗的制约。

(4)、动态扫描显示方式在更新显示内容时,因LED数码管余辉的存在可能会造成显示字符的模糊,新内容写入显示器之前须将所有的LED数码管熄灭。

(5)、关于自动识别“月大﹑月小”和“平年﹑润年”问题的考虑


方案比较:

显示部分:

我们采用了数码管显示,鉴于数码管也能实现基本的功能,而且液晶成本又太昂贵,同时我们放弃了用译码芯片,一方面进一步降低成本,另一方面少了部分电路,减少错误产生。


焊接部分:



印制电路板的特点是布线紧凑、优点是美观,跳线少,线路稳定,主要的工作量在于前期原理图的绘制跟PCB板的布线,缺点是腐蚀容易不均匀而断线;而手工焊万用板优点是可变性高,自由度高,主要工作量是原理图的布线与跳线的构思跟焊接,缺点是电路板焊接麻烦。

我们选择手工焊万用板的原因:

1 原材料提供的只是万用板,从按照题目要求的方面考虑

2 万用板便于功能的扩展,板上也留了很多空位为创新功能使用。

按键部分


按键方面,主要是采用矩阵键盘扫描跟按键查询。矩阵键盘扫描法用到比较多的按键,使操作复杂,资源得不到充分利用。为了避免不必要的失误,所以采用“按键查询,一个功能一个按键”的方式,排列整齐,简洁美观


单片机作品实物图:


二、元器件清单:

IC



89S52
1

IC座


40脚
3

晶体振荡器

12MHz
1

微型按钮

4脚

5

LED发光二极管
红色
1

电阻


4.7K
2

电阻


1k

6

电阻


3K


6

电阻


330  
7

排阻            1k      1

电解电容

10UF
1

万能电路板



1

LED七段数码管
共阳BS
6

晶体三极管

PNP8550
6

蜂鸣器                  1


三.按键使用


1)。P0.7口按键具有切换显示模式的功能

2)。P0.6口按键具有闪烁位移位的功能

3)。P0.5 口按键具有对闪烁位加一的功能

4)。P0.4口按键具有计秒的功能,即开始秒表/停止秒表/清楚秒表,同时还具有停止闹钟的功能。

5)第9口具有复位的功能。即一按下去后恢复到初始化状态

6)串口自收自发功能,当p3.0p3.1连接起来后,按键有效,但当p3.0p3.1断开后,按键无效。


系统使用调试说明:

按开关key1次数系统状态
0(50)00H(51H)00H,正常显示时间
1(50)01H(51H)00H,正常显示日期
2(50)02H(51H)00H正常显示闹铃
3(50)03H(51H)00H,正常显示秒表
4(50)00H(51H)00H,正常显示时间


按键2

按开关key2次数系统状态
0(50)00H(51H)00H,不闪烁
1(50)00H(51H)01H,低两位闪烁
2(50)00H(51H)02H中两位闪烁
3(50)00H(51H)03H,高两位闪烁
4(50)00H(51H)00H,不闪烁



数码管显示代码表:

数码管管脚号Dpgfedcba数码管显示值编码数值
P1端口P1.7P1.6P1.5P1.4P1.3P1.2P1.1P1.0
端口电平110000000C0H
1111100110F9H
1010010020A4H
1011000030B0H
10010100199H
10010010592H
10000010682H
1111100070F8H
10000000880H
10010000990H




主程序流程图:


当有不同按键,进入不同的服务子程序,同时在查询的时候判断是不是整点,有没有到达闹铃设置的时间

进入服务子程序采用的是查询的模式。

显示模式调整流程图:


显示标志位位50h


闪烁位移位:其中设定闪烁标志位为51H.当它变化时标志着不同的闪烁位


闪烁位加一子程序:对当前闪烁的位进行加一


file:///D:/Personal/Temp/ksohtml/wps_clip_image-8871.png其中

同理对于分,时,日,月,年,都要判断是否到达最大数,是则分,时,清0,日,月,年置一,


秒表子程序


闹铃功能子程序:

整点报时子程序流程图:


TO中断子程序:

日历子程序


  1. 附程序清单:
  2. ;;;;;;;;;;;;;;;;;;;
  3. ;预定义部分;;;;;;;;
  4. ;;;;;;;;;;;;;;;;;;;

  5. ;预定义用来显示小时、分钟、秒钟的存储单元
  6. secL equ 30h;秒的十位
  7. secH equ 31h;秒的个位
  8. minL equ 32h;
  9. minH equ 33h;
  10. hourL equ  34h;
  11. hourH equ 35h;
  12. dayL equ 36h
  13. dayH equ 37h
  14. monL equ 38h
  15. monH equ 39h
  16. yearL equ 3ah
  17. yearH equ 3bh
  18. als_l equ 40h;
  19. als_h equ 41h;
  20. alm_l equ 42h;
  21. alm_h equ 43h;
  22. alh_l equ 44h;
  23. alh_h equ 45h;
  24. xsbz  equ 50h;
  25. shanshou  equ 51h;
  26. mao_sfw equ 5ah;秒的十分位
  27. mao_bfw equ 5bh;秒的百分位
  28. mao_sw  equ 5ch;秒的十位
  29. mao_gw  equ 5dh; 秒的各位
  30. mao_qw  equ 5eh;qianwei
  31. mao_bw  equ 5fh;baiwei

  32. org 0000h;复位入口
  33. ljmp main
  34. org 000bh;定时器T0入口
  35. ljmp time0
  36. org 0003h;外部中断0入口
  37. reti;
  38. org  0013h;外部中断1入口
  39. reti
  40. org 001bh;定时器T1入口
  41. ljmp time1;
  42. org 0023h;串行中断入口
  43. reti


  44. ;;;;;;;;;;;;;;;;;;;;;;
  45. ;主程序入口;;;;;;;;;;;
  46. ;;;;;;;;;;;;;;;;;;;;;;
  47. main:
  48. ;放置初始值,H表示低地址,L表示高地址
  49. mov secH,#0h
  50. mov secL,#5h
  51. mov minH,#9h
  52. mov minL,#5h
  53. mov hourH,#2h
  54. mov hourL,#1h
  55. mov yearH,#8h
  56. mov yearL,#0h
  57. mov monH,#1h
  58. mov monL,#1h
  59. mov dayH,#0h
  60. mov dayL,#2h
  61. mov als_l,#3h;
  62. mov als_h,#1h;
  63. mov alm_l,#3h;
  64. mov alm_h,#0h;
  65. mov alh_l,#1h;
  66. mov alh_h,#2h;
  67. mov mao_sfw ,#00h;秒的十分位
  68. mov mao_bfw ,#00h;秒的百分位
  69. mov mao_sw,#00h  ;秒的十位
  70. mov mao_gw,#00h  ; 秒的各位
  71. mov mao_qw,#00h;  
  72. mov mao_bw,#00h;
  73. mov 50h,#00h;
  74. mov 51h,#00h;
  75. clr p3.2;
  76. MOV SCON,#90H;串行口工作于方式2
  77. ;定时器T0,T1设置
  78. mov TMOD,#11H;设置T0与T1为16位定时器
  79. mov TL0,#0b0h;
  80. mov TH0,#3ch;T0初值为3cb0h定时50ms
  81. mov TL1,#0f0h;
  82. mov TH1,#0d8h;T1初值为fc18h定时10ms
  83. setb pt0;
  84. setb EA;总中断允许
  85. setb et0;
  86. setb TR0;开启T0中断开始记时
  87. mov r4,#20;定时次数,刚好1s
  88. mov 60h,#0ah;定时器1定时次数10次
  89. start:
  90.      lcall display;
  91.        jnb P0.7,k0;
  92.        jnb p0.6,k1;
  93.        jnb p0.5,k3;
  94.        jnb p0.4,k4;
  95.        lcall naoling1;
  96.        lcall zhengdi
  97.        jmp start;

  98. k0:    lcall chxianshi;
  99. k1:    lcall k2
  100. k4:    ljmp jimiao;
  101. ;;;;;;;;;;;;;;;;;;;;;;;;;
  102. ;;;;闪烁位加一
  103. ;;;;;;;;;;;;;;;;;;;;;;;;;
  104. k3:      lcall dl30ms;
  105.          jb p0.5,outout;
  106. set12:   jnb p0.5,set12;
  107.          lcall chuan;
  108.          mov a,50h;
  109.          cjne a,#01h,sjiantz;
  110.          mov a,51h;
  111.          cjne a,#01h,zhwei;
  112.          mov r1,#dayH;
  113.          lcall add1;
  114.          mov a,r3;
  115.          cjne a,#32h,ftiao;分若小于则转退出
  116.          mov dayH,#01h;否则清0
  117.          mov dayL,#00h;
  118. ftiao:   ljmp outout;  
  119. zhwei:  cjne a,#02h,gwei;
  120.         mov r1,#monH;
  121.         lcall add1;
  122.         mov a,r3;
  123.         cjne a,#13h,outout;
  124.         mov monH,#01h;
  125.         mov monL,#00h;
  126.         ljmp outout;
  127. gwei:   cjne a,#03h,outout;
  128.         mov r1,#yearH;
  129.         lcall add1;
  130.         mov a,r3;
  131.         cjne a,#99h,outout;
  132.         mov yearH,#00h;
  133.         mov yearL,#00h;
  134.         ljmp outout;
  135. outout: ljmp start; 跳出
  136. sjiantz:cjne a,#00h,naozhtz;转闹钟调整
  137.         mov a,51h;
  138.         cjne a,#01h,zhwei2;
  139.         mov r1,#secH;
  140.         lcall add1;
  141.         mov a,r3;
  142.         cjne a,#60h,ftiao2;分若小于则转退出
  143.         mov secH,#00h;否则清0
  144.         mov secL,#00h;
  145. ftiao2: ljmp outout;        
  146. zhwei2: cjne a,#02h,gwei2;
  147.         mov r1,#minH;
  148.         lcall add1;
  149.         mov a,r3;
  150.         cjne a,#60h,outout;
  151.         mov minH,#00h;
  152.         mov minL,#00h;
  153.         ljmp outout;
  154. gwei2:  cjne a,#03h,outout;
  155.         mov r1,#hourH;
  156.         lcall add1;
  157.         mov a,r3;
  158.         cjne a,#24h,outout;
  159.         mov hourH,#00h;
  160.         mov hourL,#00h;
  161.         ljmp outout;

  162. naozhtz:mov a,51h;
  163.         cjne a,#01h,zhwei3;
  164.         mov r1,#als_h;
  165.         lcall add1;
  166.         mov a,r3;
  167.         cjne a,#60h,ftiao3;分若小于则转退出
  168.         mov als_h,#00h;否则清0
  169.         mov als_l,#00h;
  170. ftiao3: ljmp outout;        
  171. zhwei3: cjne a,#02h,gwei3;
  172.         mov r1,#alm_h;
  173.         lcall add1;
  174.         mov a,r3;
  175.         cjne a,#60h,outout;
  176.         mov alm_h,#00h;
  177.         mov alm_l,#00h;
  178.         ljmp outout;
  179. gwei3:  cjne a,#03h,outout;
  180.         mov r1,#alh_h;
  181.         lcall add1;
  182.         mov a,r3;
  183.         cjne a,#24h,outout;
  184.         mov alh_h,#00h;
  185.         mov alh_l,#00h;
  186.         ljmp outout;
  187. ;;;;;;;;;;;;;;;;;;;;;;;;
  188. ;;;;naoling
  189. ;;;;;;;;;;;;;;;;;;;;;;;;;
  190. naoling1:push acc;
  191.          setb p0.1
  192.          mov a,31h;
  193.          cjne a,41h,out6;
  194.          mov a,30h;
  195.          cjne a,40h,out6;
  196.          mov a,33h;
  197.          cjne a,43h,out6;
  198.          mov a,32h;
  199.          cjne a,42h,out6;
  200.          mov a,35h;
  201.          cjne a,45h,out6;
  202.          mov a,34h;
  203.          cjne a,44h,out6;
  204. nao:    clr P0.1
  205.          lcall display
  206.          jnb P0.4,stopnao
  207.          sjmp nao
  208. stopnao: lcall dl30ms
  209.          mov P0,#0ffH
  210. out6:   pop acc;
  211.         lcall display;
  212.          ret;  



  213. ;;;;;;;;;;;;;;;;;;;;;;;;
  214. ;;;;;整点报时;;;;;;;;;;;;
  215. ;;;;;;;;;;;;;;;;;;;;;;;;;
  216. zhengdi: push acc;
  217.          mov a,31h;
  218.          cjne a,#00h,out7;
  219.          mov a,30h;
  220.          cjne a,#00h,out7;
  221.          mov a,33h;
  222.          cjne a,#00h,out7;
  223.          mov a,32h;
  224.          cjne a,#00h,out7;
  225.          mov a,#0ah;
  226.          clr p0.1;
  227.          clr p0.3
  228.          lcall display;
  229.          lcall display;
  230.          lcall display;
  231.          lcall display;
  232.          lcall display;
  233.          lcall display;
  234.          lcall display;
  235.          lcall display;
  236.          lcall display;
  237.          lcall display;
  238.          lcall display;
  239.          lcall display;
  240.          lcall display;
  241.          lcall display;
  242.          lcall display;
  243.          lcall display;
  244.          lcall display;
  245.          lcall display;
  246.          lcall display;
  247.          lcall display;
  248.          lcall display;
  249.          lcall display;
  250.          lcall display;
  251.          lcall display;
  252.          lcall display;
  253.          lcall display;
  254.          lcall display;
  255.          lcall display;
  256.          setb p0.1;
  257.          setb p0.3
  258. out7:    pop acc;
  259.          lcall display;
  260.          ret;



  261. ;**************************************************
  262. ;函数名:
  263. ;功能:   串口发送数据函数
  264. ;传入参数: 无
  265. ;传出参数: A
  266. ;**************************************************
  267. chuan: MOV  A,p0  ;读取P1口数据
  268. MOV  SBUF,A
  269. JNB  TI,$  ;等待发送完毕
  270. CLR   TI
  271.         lcall  dl30ms;
  272. wait:   jnb  ri,out9;
  273. MOV  A,SBUF
  274. CLR  RI
  275.         sjmp  out10;
  276. out9:   lcall  display;
  277.         jmp  chuan;   
  278. out10:  ret;

  279.    
  280. ;**************************************************
  281. ;函数名:chxianshi
  282. ;功能:   显示调整函数
  283. ;传入参数: 无
  284. ;传出参数:
  285. ;**************************************************
  286. chxianshi: lcall dl30ms;
  287.            jb P0.7,set2;
  288. set1:      jnb p0.7,set1;
  289.            lcall chuan;
  290.            mov a,50h;
  291.            cjne a,#00h,nianfen
  292.            mov a,#01h;
  293.            mov 50h,a;;
  294.    sjmp set2;
  295. nianfen:   cjne a,#01h,naoling;
  296.            mov a,#02h;
  297.            mov 50h,a;
  298.            sjmp set2;
  299. naoling:   cjne a,#02h,maobiao;
  300.            mov a,#03h;
  301.    mov 50h,a;
  302.            sjmp set2;
  303. maobiao:   mov a,#00h;
  304.            mov 50h,a;
  305. set2:      lcall display;
  306. out:       ret;
  307.    
  308.    
  309. ;**************************************************
  310. ;函数名:k2
  311. ;功能:   调整位移位函数
  312. ;传入参数: 无
  313. ;传出参数:
  314. ;**************************************************

  315. k2:        lcall dl30ms;
  316.            jb P0.6,set11;判断是否有键按下  
  317. set10:     jnb p0.6,set10;
  318.            lcall chuan;
  319.            mov a,51h;
  320.            cjne a,#00h,zliang
  321.            mov a,#01h;
  322.            mov 51h,a;;
  323.    sjmp set11;
  324. zliang:    cjne a,#01h,gliang;
  325.            mov a,#02h;
  326.            mov 51h,a;
  327.            sjmp set11;
  328. gliang:    cjne a,#02h,bliang;
  329.            mov a,#03h;
  330.            mov 51h,a;
  331.            sjmp set11;
  332. bliang:    cjne a,#03h,set11
  333.            mov a,#00h;
  334.            mov 51h,a;
  335. set11:     lcall display;
  336.            ret;



  337. ;**************************************************
  338. ;函数名:       jimiao
  339. ;功能:         计秒程序
  340. ;传入参数: 无
  341. ;传出参数: 无
  342. ;**************************************************

  343. jimiao: push PSW;
  344.         push acc;
  345.        lcall dl30ms;
  346.        jb p0.4,out5;
  347. jimao1:jnb p0.4,jimao1;第一次开中断计秒
  348.        mov a,50h;
  349.        cjne a,#03h,out5;
  350.        setb et1;
  351.        setb tr1;

  352. jimao2:call display;第二次停止
  353.        jb p0.4,jimao2;
  354.        lcall display;
  355.        jb p0.4,out5;
  356. jimao3:jnb p0.4,jimao3;
  357.        clr tr1;
  358.        clr et1;
  359. jimao4:call display;第三次清0

  360.        jb p0.4,jimao4;
  361.        lcall display;
  362.        jb p0.4,out5;
  363. jimao5:jnb p0.4,jimao5;
  364.        mov mao_sfw ,#00h;秒的十分位
  365.        mov mao_bfw ,#00h;秒的百分位
  366.        mov mao_sw,#00h  ;秒的十位
  367.        mov mao_gw,#00h  ; 秒的各位
  368.        mov mao_qw,#00h;  
  369.        mov mao_bw,#00h;
  370. out5:  pop acc;
  371.        pop PSW;
  372.        ljmp start;




  373. ;;***********************************************
  374. ;函数名         time1
  375. ;功能:   t1中断函数
  376. ;传入参数: 无
  377. ;************************************************

  378. time1:
  379. push  PSW
  380. push acc
  381. mov TL1,#0f0h;
  382. mov TH1,#0d8h;T1初值为fc18h定时1ms
  383. mov r1,#mao_bfw;指向秒计时单元
  384. lcall add1;调用加1程序
  385. mov a,r2;将经过处理的数据放入a中
  386. cjne a,#99h,outT01;当秒到未到达60时跳出中断
  387. mov 5ah,#00h
  388. mov 5bh,#00h;将秒清零
  389. mov r1,#mao_gw;指向分计时单元
  390. lcall add1;调用加1程序
  391. mov a,r2;将经过处理的数据放入a中
  392. cjne a,#60h,outT01;当分钟未到达60时跳出中断
  393. mov 5ch,#00h;
  394. mov 5dh,#00h;
  395. mov r1,#mao_bw;指向小时计时单元
  396. lcall add1;调用加1程序
  397. mov a,r2;将经过处理的数据放入a中
  398. cjne a,#60h,outT0;当小时未到达60时跳出中断
  399. mov 5eh,#00h;
  400. mov 5fh,#00h;

  401. outt01:
  402. pop acc
  403. pop psw;恢复现场
  404. reti ;中断返回


  405. ;**************************************************
  406. ;函数名:       time0
  407. ;功能:   t0中断处理程序函数
  408. ;传入参数: 无
  409. ;**************************************************

  410. time0:
  411. push  PSW
  412. push acc
  413. push b   ;保护现场
  414. push 02h
  415. push 01h
  416. clr ET0;关T0中断允许
  417. clr TR0;关T0定时中断
  418. mov th0,#3ch;
  419. mov a,#0b0h
  420. add a,TL0
  421. mov TL0,a;给定时器重新装值
  422. setb TR0;允许计时
  423. djnz r4,outT0;定时没到1s就退出中断
  424. mov r4,#20;给r0重新赋值
  425. mov r1,#secH;指向秒计时单元
  426. lcall add1;调用加1程序
  427. mov a,r2;将经过处理的数据放入a中
  428. cjne a,#60h,outT0;当秒到未到达60时跳出中断

  429. addmin: ;否则分钟加1
  430. mov secL,#0
  431. mov secH,#0;将秒清零
  432. mov r1,#minH;指向分计时单元
  433. lcall add1;调用加1程序
  434. mov a,r2;将经过处理的数据放入a中
  435. cjne a,#60h,outT0;当分钟未到达60时跳出中断

  436. addhour:  ;否则小时加1
  437. mov minL,#0
  438. mov minH,#0;将分清零
  439. mov r1,#hourH;指向小时计时单元
  440. lcall add1;调用加1程序
  441. mov a,r2;将经过处理的数据放入a中
  442. cjne a,#24h,outT0;当小时未到达60时跳出中断

  443. lcall rili     ;调用日历子程序

  444. outT0:
  445. pop 01h
  446. pop 02h
  447. pop b
  448. pop acc
  449. pop psw;恢复现场
  450. setb ET0;开放中断
  451. reti ;中断返回

  452. ;**************************************************
  453. ;函数名:       rili
  454. ;功能:         日历处理程序函数
  455. ;传入参数: 无
  456. ;传出参数:
  457. ;**************************************************

  458. rili:
  459. addday: mov hourL,#0
  460. mov hourH,#0;将小时清零
  461. mov r1,#dayH;指向天计时单元
  462. lcall add1;调用加1程序
  463. mov a,r2;将经过处理的数据放入a中

  464. day31:      
  465. cjne a,#32h,day30;看是不是31号
  466. ajmp addmon;是的话,加月

  467. day30:
  468. mov r5,a
  469. cjne a,#31h,day29;看是不是30号;是的话,处理
  470. mov a,#0h
  471. mov a,monL
  472. swap a
  473. orl a,monh;将月份放入a中
  474. cjne a,#04h,outri;判断是不是4,6,9,11中的某一月
  475. cjne a,#06h,outri
  476. cjne a,#09h,outri
  477. cjne a,#11h,outri;不是的话跳出
  478. ajmp addmon;是的话,加月

  479. day29:
  480. mov a,r5
  481. cjne a,#30h,day28;看是不是29号
  482. mov a,#0h
  483. mov a,monL
  484. swap a
  485. orl a,monH
  486. cjne a,#02h,outri;是的话,看月份是不是2月
  487. ajmp addmon

  488. day28:
  489. mov a,r5
  490. cjne a,#29h,outri;看是不是28号,不是的话跳出
  491. mov a,#0h
  492. mov a,monL
  493. swap a
  494. orl a,monH
  495. cjne a,#02h,outri;看月份是不是2月;是2月,则判断是不是润年
  496. mov a,#0h
  497. mov a,yearL
  498. swap a
  499. orl a,yearH
  500. da a
  501. mov b,#04h
  502. div ab
  503. mov r5,b
  504. cjne r5,#0h,outri
  505. ajmp addmon

  506. addmon: ;月加1
  507. mov dayL,#0
  508. mov dayH,#0;将天清零
  509. mov r1,#monH;指向月计时单元
  510. lcall add1;调用加1程序
  511. mov a,r2;将经过处理的数据放入a中
  512. cjne a,#12h,outri;当月未到达12时

  513. addyear: ;年加1
  514. mov monL,#0
  515. mov monH,#0;将月清零
  516. mov r1,#yearH;指向年计时单元
  517. lcall add1;调用加1程序
  518. mov a,r2;将经过处理的数据放入a中
  519. outri:
  520. ret


  521. ;**************************************************
  522. ;函数名:       add1
  523. ;功能:   加一函数
  524. ;传入参数: r1存的是地址指针
  525.                 ;r2存的是返回的处理数据
  526. ;**************************************************

  527. add1:
  528. mov a,#0;对a进行清零

  529. dec r1;指向高四位数据地址
  530. mov a,@r1;将高四位移入a
  531. inc r1;指向低四位
  532. swap a;a中高四位与低四位互换
  533. orl a,@r1;将低四位显示数据放入a中
  534. add a,#01h;
  535. da a;对a中数据进行加1,并作十进制调整
  536. mov r2,a;将处理后的数据移入r2中,注意r2中存的是十进制对应的bcd码
  537. mov r3,a;下面是将a中然数据恢复为高位与低位
  538. anl a,#0f0h;取高四位
  539. swap a
  540. dec r1;
  541. mov @r1,a;将高四位移入低位地址中
  542. mov a,r3;将暂存数据移回
  543. anl a,#0fh;取其低四位
  544. inc r1;指针指向高四位地址
  545. mov @r1,a;将低四位移到高位地址中
  546. ret ;子程序返回




  547. ;**************************************************
  548. ;函数名:       display
  549. ;功能:         显示处理程序函数
  550. ;传入参数: 无
  551. ;传出参数:
  552. ;**************************************************
  553. display:mov a,50h;
  554. cjne a,#00H,dat;00h是时间显示不等则转到年份显示
  555. timdis: mov r0,#secL;
  556.         sjmp aa
  557. dat: cjne a,#01h,ala;若为01h则显示年份,否则显示闹钟
  558.         mov r0,#dayL;
  559. sjmp aa;
  560. ala:    cjne a,#02h,mbiao
  561.         mov r0,#als_l;
  562.         sjmp aa;
  563. mbiao:  mov r0,#mao_sfw;
  564.         nop;
  565. aa:     mov p2,#0ffh;
  566. mov a,@r0
  567. mov dptr,#TAB
  568. movc a,@a+dptr;
  569. mov p1,a;
  570.         mov a,51h;
  571.         cjne a,#01h,aa01;
  572.         mov a,r4;
  573.         rrc a;
  574. jnc aa02;
  575. aa01:   mov p2,#0feh;
  576. aa02: lcall dl5ms;
  577.         lcall dl5ms;


  578.         mov p2,#0FFh;
  579. inc r0;
  580.         mov a,@r0
  581. mov dptr,#TAB
  582. movc a,@a+dptr;
  583. mov p1,a;
  584.         mov a,51h;
  585.         cjne a,#01h,bb01;
  586. mov a,r4;
  587. rrc a;
  588. jnc bb02;
  589. bb01:   mov p2,#0fdh;
  590. bb02:   lcall dl5ms;
  591.         lcall dl5ms;


  592. mov p2,#0ffh;
  593.         inc r0;
  594.         mov a,@r0
  595. mov dptr,#TAB
  596. movc a,@a+dptr;
  597. mov p1,a;
  598. mov a,51h;
  599. cjne a,#02h,cc01;
  600. mov a,r4
  601. rrc a;
  602. jnc cc02
  603. cc01:   mov p2,#0fbh;
  604. cc02:   lcall dl5ms;
  605.         lcall dl5ms;



  606. mov p2,#0ffh;
  607.         inc r0;
  608.         mov a,@r0
  609. mov dptr,#TAB
  610. movc a,@a+dptr;
  611. mov p1,a;
  612. mov a,51h;
  613. cjne a,#02h,dd01;
  614. mov a,r4
  615. rrc a;
  616. jnc dd02
  617. dd01:   mov p2,#0f7h;
  618. dd02:   lcall dl5ms;
  619.         lcall dl5ms;



  620. mov p2,#0ffh;
  621.         inc r0;
  622.         mov a,@r0
  623. mov dptr,#TAB
  624. movc a,@a+dptr;
  625. mov p1,a;
  626. mov a,51h;
  627. cjne a,#03h,ee01;
  628. mov a,r4
  629. rrc a;
  630. jnc ee02
  631. ee01:   mov p2,#0efh;
  632. ee02:   lcall dl5ms;
  633.         lcall dl5ms;




  634. mov p2,#0ffh;
  635.         inc r0;
  636.         mov a,@r0
  637. mov dptr,#TAB
  638. movc a,@a+dptr;
  639. mov p1,a;
  640. mov a,51h;
  641. cjne a,#03h,ff01;
  642. mov a,r4
  643. rrc a;
  644. jnc ff02
  645. ff01:   mov p2,#0dfh;
  646. ff02:   lcall dl5ms;
  647.         lcall dl5ms;
  648.         ret;   
  649.       


  650. ;;;;;;;;;;;;
  651. ;延时程序;;;
  652. ;1ms延时;;;;
  653. ;;;;;;;;;;;;
  654. delay1ms:
  655. mov R6,#14H
  656. dl1:mov R7,#19H
  657. dl2:djnz R7,dl2
  658. djnz R6,dl1
  659. ret

  660. dl5ms:  mov  55h,#03h;
  661. d2:     mov  56h,#0fh;
  662. d1:     djnz 56h,d1;
  663.         djnz 55h,d2;
  664.         ret;

  665. dl30ms: lcall dl5ms;
  666. lcall dl5ms;
  667. lcall dl5ms;
  668. lcall dl5ms;
  669. lcall dl5ms;
  670. lcall dl5ms;
  671.         ret;
  672. dl20ms: lcall dl5ms;
  673.         lcall dl5ms;
  674.         lcall dl5ms;
  675.         lcall dl5ms;
  676.         ret;

  677.       
  678. TAB:DB 0C0H,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h;
  679. end<!--EndFragment-->
复制代码

闹钟:

实现闹钟功能主要有两个步骤,首先是能在按键中把闹钟数值写进寄存器,实现存储功能。其次是根据在查询按键服务程序中作判别,检查当前时间是否与闹铃时间相等,如果相等,则使在相应时间时对蜂鸣器提供驱动电流即可。就实现了闹钟设置的功能。

整点报时:


整点报时是在查询按键程序中调用到zhengdi子程序,检查当前的时间是否整点,如果是,则点亮整点指示灯,并响蜂鸣器,停留约2秒钟,自行熄灭与关闭。

按键消抖:

按键消抖可以采用硬件消抖跟软件消抖。我们初定了两种方案:

1是利用数字电路的反相器或斯密特触发器进行整形,如图:


2是采用软件消抖技术

应该说用硬件消抖可以达到更好的效果,不过由于提供的材料跟自身手上的材料没有以上元件,故采用软件消抖。软件的消抖主要是调整出一个切到好处的延迟检测时间,一般为5-30ms。经过我们的多次调试,我们最终得到不错的去抖动效果。在程序中为DMS子程序实现。软件延时是用的最多的消抖方法,但是耗时间。在CPU耗不起时间的情况下,硬件消抖会更好

在本程序中设置了30ms的按键消抖。


感想体会:

   本实验花了我们四天的时间,由于该大作业是用汇编语言写的,很多语句掌握都不是很牢固,但是经过这么长时间的实验,我基本掌握了部分汇编语言的用法,特别是实验中经常用到的按键查询,跳转语句,以及汇编的方法。



刚开始的时候,我什麽都不懂,根本不知怎样入门,后来查找了一些系统资料,渐渐有了些了解,才开始写自己的程序。虽然如此,中间还是遇到过不少困难,不如些按键查询的时候,仿真不出来,不知道哪里出错了,也不知道是不是程序有问题,后来在小组成员的帮助下,终于找到问题所在,通过不断的琢磨,后来不仅实现了老师的要求的基本功能,更加了秒表,闹铃还有整点报时。本来还想加上纪念日和音乐闹铃,当一方面时间有限,另一方面尝试后失败了就暂时搁下。


  调试的时候,刚上去的时候,板子工作很不稳定,虽然有时候能够显示到正确的东西,当大多数时间都是显示的杂乱无章,鉴于有时候能够正确显示,我们是板子焊的不好,于是重新焊过,第二个版子刚上电的时候,还是不能很正确的工作,后来,一步一步的调试,先用简单的程序检查板子,发现板子是没有问题的,于是就确定是程序的问题,我把程序分为好几块,一块一块的调试,一段好了之后,在加上一段。最后发现是在一个子程序里边用了一个错误的ljmp。 改正了之后就完全正确了。

    经过这次试验,确实学到我好多好多的东西。



回复 1# admin


    太好了
很好的 想法,就是是汇编的,几乎不会看了
原理图怎么打开?{:13_801:}
不错啊   就是太简单了  {:13_779:}
恩,谢谢分享,只是是汇编,暂时看不懂
顶顶顶,好东西啊,赞一个
回复 admin 的帖子

ding顶一下!!!!
还是想看看,尽管不够
很好的东西 谢谢楼主了
不错,很有说服力!顶了!整个C的就更美了!
这个很好,对于学习单片机很有帮助,顶
不错,下来看看参考一下
楼主做的不错,但有待改进
您好,如果只要显示时间呢?
{:e163:}{:e163:}{:e113:}{:e113:}O(∩_∩)O谢谢楼主,这么无私,好东西大家分享。。。
学习学习!!!!!!!!!
顶 顶 顶 谢谢!版主真厚道
这个好详细  楼主用心了
赞啊啊啊啊啊啊啊啊啊啊
未命名.jpg

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-12-23 22:56 , Processed in 0.041288 second(s), 8 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

返回顶部