找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1580|回复: 7
打印 上一主题 下一主题
收起左侧

为什么闹钟响了之后秒数不会转动而且时间有时快有时慢?附单片机程序

[复制链接]
跳转到指定楼层
楼主
ID:924233 发表于 2021-6-21 21:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
9黑币
能不能帮我看一下,先谢谢
单片机源程序如下:
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char
  5. #define LCD1602_DB  P0 //定义1602的DB口为P0口
  6. uchar code table[]="CurrentTime"; //当前时间
  7. uchar code table1[]="00:00:00";
  8. uchar key1Flag = 0;//定义按键关闭符
  9. uchar key2Flag = 0;
  10. uchar key3Flag = 0;
  11. uchar key4Flag = 0;
  12. uchar count = 0;
  13. uchar sec = 57;//秒
  14. uchar min = 59;//分
  15. uchar hour = 9;//小时
  16. uchar clockHour = 0;//闹钟小时
  17. uchar clockMin = 0;//分
  18. uchar clockFlag = 0;// 定义闹钟关闭符
  19. uchar beepNum = 0;//声音
  20. uchar temp=0;
  21. uchar shijian=0;
  22. sbit LCD1602_RS = P2^0;        //指令1/数据0选择端
  23. sbit LCD1602_RW = P2^1;        //读1写0选择端
  24. sbit LCD1602_E = P2^2;        //读1写0使能端
  25. sbit Key1 = P1^0;//定义键位符
  26. sbit Key2 = P1^1;
  27. sbit Key3 = P1^2;
  28. sbit Key4 = P1^3;
  29. sbit Speaker = P2^5;//定义蜂鸣器
  30. sbit LED=P2^4;
  31. void Delay1ms()                //@12.000MHz
  32. {
  33.         uchar i, j;

  34.         i = 12;
  35.         j = 169;
  36.         do
  37.         {
  38.                 while (--j);
  39.         } while (--i);
  40. }
  41. void Delay20ms()                //@12.000MHz
  42. {
  43.         uchar i, j, k;

  44.         _nop_();
  45.         _nop_();
  46.         i = 1;
  47.         j = 234;
  48.         k = 113;
  49.         do
  50.         {
  51.                 do
  52.                 {
  53.                         while (--k);
  54.                 } while (--j);
  55.         } while (--i);
  56. }
  57. void delay()
  58. {
  59.     unsigned int a;
  60.         while(a--);
  61. }
  62. void Beep()         //蜂鸣器警报
  63. {                                 
  64.         Speaker = 0;
  65.         Delay20ms();
  66.         Speaker = 1;
  67. }
  68. void LcdWaitReady()         //检查LCD忙函数
  69. {

  70.         uchar sta;
  71.         LCD1602_DB = 0xFF;
  72.         LCD1602_RS = 0;
  73.         LCD1602_RW = 1;
  74.         do        {
  75.                 LCD1602_E = 1;
  76.                 sta = LCD1602_DB;
  77.                 LCD1602_E = 0;
  78.         }while(sta & 0x80);
  79. }

  80. void LcdWriteCmd(uchar cmd)        //写命令函数
  81. {

  82.         LcdWaitReady();
  83.         LCD1602_RS = 0;
  84.         LCD1602_RW = 0;
  85.         LCD1602_DB = cmd;
  86.         LCD1602_E = 1;
  87.         LCD1602_E = 0;
  88. }
  89. void LcdWriteDat(uchar dat)        //写数据函数
  90. {

  91.         LcdWaitReady();
  92.         LCD1602_RS = 1;
  93.         LCD1602_RW = 0;
  94.         LCD1602_DB = dat;
  95.         LCD1602_E = 1;
  96.         LCD1602_E = 0;
  97. }
  98. void LcdSetCursor(uchar x, uchar y)//时间设置
  99. {

  100.         uchar addr;
  101.         if(y == 0)
  102.                 addr = 0x00 + x;
  103.         else
  104.                 addr = 0x40 + x;
  105.         LcdWriteCmd(addr | 0x80);
  106. }
  107. void LcdShowStr(uchar x, uchar y, uchar *str)
  108. {

  109.         LcdSetCursor(x, y);
  110.         while(*str != '\0')
  111.         {
  112.                 LcdWriteDat(*str++);   
  113.         }
  114. }
  115. void InitLcd1602()//初始化LCD函数         
  116. {

  117.         LcdWriteCmd(0x01);
  118.         LcdWriteCmd(0x38);
  119.         LcdWriteCmd(0x0c);
  120.         LcdWriteCmd(0x06);
  121. }
  122. void WriteAddress(uchar x)
  123. {
  124.          LcdWriteCmd(0x80 + x);
  125. }
  126. void DisplayMinTens()   //显示分十位
  127. {                                
  128.         WriteAddress(0x49);
  129.         LcdWriteDat((min / 10) + '0');
  130.         Delay1ms();
  131. }
  132. void DisplayMinUnits()          //显示分个位
  133. {                    
  134.         WriteAddress(0x4A);
  135.         LcdWriteDat((min % 10) + '0');
  136.         Delay1ms();        
  137. }
  138. void DisplayHourTens()   //显示时十位
  139. {                                
  140.         WriteAddress(0x46);
  141.         LcdWriteDat((hour / 10) + '0');
  142.         Delay1ms();
  143. }
  144. void DisplayHourUnits()//显示时个位
  145. {                     
  146.         WriteAddress(0x47);
  147.         LcdWriteDat((hour % 10) + '0');
  148.         Delay1ms();        
  149. }
  150. void DisplayClkMinTens()  //显示闹钟分十位
  151. {                                 
  152.         WriteAddress(0x49);
  153.         LcdWriteDat((clockMin / 10) + '0');
  154.         Delay1ms();
  155. }
  156. void DisplayClkMinUnits() //显示闹钟分个位
  157. {                     
  158.         WriteAddress(0x4A);
  159.         LcdWriteDat((clockMin % 10) + '0');
  160.         Delay1ms();        
  161. }
  162. void DisplayClkHourTens()  //显示闹钟时十位
  163. {                        
  164.         WriteAddress(0x46);
  165.         LcdWriteDat((clockHour / 10) + '0');
  166.         Delay1ms();
  167. }
  168. void DisplayClkHourUnits() //显示闹钟时个位
  169. {                     
  170.         WriteAddress(0x47);
  171.         LcdWriteDat((clockHour % 10) + '0');
  172.         Delay1ms();        
  173. }
  174. void DisplayClkSecTens() //显示秒十位
  175. {                     
  176.         WriteAddress(0x4C);
  177.         LcdWriteDat((sec / 10) + '0');
  178.         Delay1ms();        
  179. }
  180. void DisplayClkSecUnits() //显示秒个位
  181. {                        
  182.         WriteAddress(0x4D);
  183.         LcdWriteDat((sec % 10) + '0');
  184.         Delay1ms();        
  185. }

  186. void ScanKey4()
  187. {
  188.         if((Key4 == 0)&(clockFlag ==1))
  189.         {
  190.                 Delay20ms();
  191.                 if((Key4 == 0)&(clockFlag ==1))
  192.                  {
  193.                         clockFlag = 0;
  194.                         beepNum = 0;
  195.                         key4Flag = 0;
  196.                 }
  197.         }
  198. }
  199. void InitTimer0()//初始化定时器0
  200. {                                 
  201.         TMOD = 0x11;
  202.         TH0 = (65536 - 50000) / 256;
  203.         TL0 = (65536 - 50000) % 256;
  204.         TH1 = (65536 - 50000) / 256;
  205.         TL1 = (65536 - 50000) % 256;
  206.         ET1=1;
  207.    ET0=1;
  208.         EA = 1;
  209.         PT0=1;
  210.         TR0=1;
  211.         TR1=1;
  212.         
  213.                
  214. }
  215. void main()//主函数
  216. {

  217.         InitLcd1602();
  218.         LcdShowStr(0,0,table);
  219.         LcdShowStr(6,1,table1);
  220.         InitTimer0();
  221.         while(1)
  222.          {
  223.                 if(sec == 60)
  224.                 {
  225.                 sec = 0;
  226.                 min++;
  227.                 }
  228.                 if(min == 60)
  229.                  {
  230.                         min = 0;
  231.                         hour++;
  232.                 }
  233.                 if(hour == 24)
  234.                  {
  235.                         hour = 0;
  236.                 }
  237.                 LcdShowStr(0,0,table);
  238.                 DisplayHourTens();
  239.                 DisplayHourUnits();
  240.                 LcdShowStr(8,1,":");               
  241.                 DisplayMinTens();
  242.                 DisplayMinUnits();
  243.                 LcdShowStr(11,1,":");
  244.                 DisplayClkSecUnits();
  245.                 DisplayClkSecTens();
  246. //==============================================================        
  247.                 if((Key1 == 0)&(key1Flag == 0)) {              //设置当前时间
  248.                         Delay20ms();
  249.                         if((Key1 == 0)&(key1Flag == 0)) {
  250.                                 TR0 = 0;
  251.                                 InitLcd1602();
  252.                                 LcdShowStr(0,0,"SetCurrentTime");
  253.                                 DisplayHourTens();
  254.                                 DisplayHourUnits();
  255.                                 LcdShowStr(8,1,":");
  256.                                 DisplayMinTens();
  257.                                 DisplayMinUnits();
  258.                                 key1Flag = 1;
  259.                         }
  260.            }
  261.                 while(key1Flag == 1)
  262.                  {
  263.                         if(Key1 == 0) {
  264.                                 Delay20ms();
  265.                                 if(Key1 == 0)
  266.                                 {
  267.                                         hour++;
  268.                                         if(hour == 24)
  269.                                          {
  270.                                                 hour = 0;
  271.                                         }
  272.                                         DisplayHourTens();
  273.                                         DisplayHourUnits();
  274.                                         LcdShowStr(8,1,":");
  275.                                         DisplayMinTens();
  276.                                         DisplayMinUnits();
  277.                                 }
  278.                         }
  279.                         if(Key2 == 0)
  280.                         {
  281.                                 Delay20ms();
  282.                                 if(Key2 == 0)
  283.                                 {
  284.                                         min++;
  285.                                         if(min == 60)
  286.                                         {
  287.                                                 min = 0;
  288.                                                 hour++;
  289.                                         }
  290.                                         DisplayHourTens();
  291.                                         DisplayHourUnits();
  292.                                         LcdShowStr(8,1,":");
  293.                                         DisplayMinTens();
  294.                                         DisplayMinUnits();
  295.                                 }
  296.                         }
  297.                         if((Key3 == 0)&(key1Flag == 1)) {                 //退出设置当前时间
  298.                                 Delay20ms();
  299.                                 if((Key3 == 0)&(key1Flag == 1)) {
  300.                                         InitLcd1602();
  301.                                         LcdShowStr(0,0,table);
  302.                                         DisplayHourTens();
  303.                                         DisplayHourUnits();
  304.                                         LcdShowStr(8,1,":");               
  305.                                         DisplayMinTens();
  306.                                         DisplayMinUnits();
  307.                                         LcdShowStr(11,1,":");
  308.                                         DisplayClkSecUnits();
  309.                                         DisplayClkSecTens();        
  310.                                         key1Flag = 0;
  311.                                         TR0 = 1;
  312.                                 }
  313.                         }                                       
  314.                 }
  315. //==============================================================
  316.                 if((min==0)&(sec<5)) //时间到整点
  317.                  {        
  318.                          LED=0;
  319.                         delay();
  320.                          Beep();
  321.                          Beep();
  322.                          Delay20ms();            
  323.                 }
  324.                 if((min==0)&(sec>=5))
  325.                 {
  326.                 LED=1;
  327.                 }

  328. //==============================================================
  329.                 if((Key2 == 0)&(key2Flag == 0))
  330.                 {                        //显示闹钟时间
  331.                         Delay20ms();  
  332.                         if((Key2 == 0)&(key2Flag == 0))
  333.                          {
  334.                                 key2Flag = 1;
  335.                                 InitLcd1602();
  336.                                 while(key2Flag == 1)
  337.                                  {
  338.                                         LcdShowStr(0,0,"Clock Time");
  339.                                         DisplayClkHourTens();
  340.                                         DisplayClkHourUnits();
  341.                                         LcdShowStr(8,1,":");
  342.                                         DisplayClkMinTens();
  343.                                         DisplayClkMinUnits();
  344.                                         if(Key2 == 0)
  345.                                         {
  346.                                                 Delay20ms();
  347.                                                 if(Key2 == 0)
  348.                                                  {
  349.                                                         key2Flag = 0;
  350.                                                         InitLcd1602();
  351.                                                         DisplayHourTens();
  352.                                                         DisplayHourUnits();
  353.                                                         LcdShowStr(8,1,":");               
  354.                                                         DisplayMinTens();
  355.                                                         DisplayMinUnits();
  356.                                                         LcdShowStr(11,1,":");
  357.                                                         DisplayClkSecUnits();
  358.                                                         DisplayClkSecTens();
  359.                                                 }
  360.                                         }        
  361.                                 }
  362.                         }
  363.                 }
  364. //==============================================================
  365.                 if((Key3 == 0)&(key3Flag == 0))         //设置闹钟时间
  366.                  {                        
  367.                         Delay20ms();
  368.                         if((Key3 == 0)&(key3Flag == 0))
  369.                          {
  370.                                 TR0 = 0;
  371.                                 InitLcd1602();
  372.                                 LcdShowStr(0,0,"SetClockTime");
  373.                                 DisplayClkHourTens();
  374.                                 DisplayClkHourUnits();
  375.                                 LcdShowStr(8,1,":");
  376.                                 DisplayClkMinTens();
  377.                                 DisplayClkMinUnits();
  378.                                 key3Flag = 1;
  379.                         }        
  380.                 }
  381.                 while(key3Flag == 1)
  382.                 {
  383.                         if(Key1 == 0)
  384.                         {
  385.                                 Delay20ms();
  386.                                 if(Key1 == 0)
  387.                                 {
  388.                                          clockHour++;
  389.                                          if(clockHour == 24)
  390.                                          {
  391.                                                  clockHour = 0;
  392.                                          }
  393.                                          DisplayClkHourTens();
  394.                                          DisplayClkHourUnits();
  395.                                          LcdShowStr(8,1,":");
  396.                                          DisplayClkMinTens();
  397.                                          DisplayClkMinUnits();
  398.                                 }
  399.                         }
  400.                         if(Key2 == 0)
  401.                         {
  402.                                 Delay20ms();
  403.                                 if(Key2 == 0)
  404.                                 {
  405.                                         clockMin++;
  406.                                         if(clockMin == 60)
  407.                                          {
  408.                                                 clockHour++;
  409.                                                 clockMin = 0;
  410.                                         }
  411.                                          DisplayClkHourTens();
  412.                                          DisplayClkHourUnits();
  413.                                          LcdShowStr(8,1,":");
  414.                                          DisplayClkMinTens();
  415.                                          DisplayClkMinUnits();
  416.                                 }
  417.                         }
  418.                         if(Key3 == 0)
  419.                         {                                                         //退出设置闹钟时间
  420.                                 Delay20ms();
  421.                                 if(Key3 == 0)
  422.                                 {
  423.                                         key3Flag = 0;
  424.                                         InitLcd1602();
  425.                                         TR0 = 1;
  426.                                         DisplayHourTens();
  427.                                         DisplayHourUnits();
  428.                                         LcdShowStr(8,1,":");               
  429.                                         DisplayMinTens();
  430.                                         DisplayMinUnits();
  431.                                         LcdShowStr(11,1,":");
  432.                                         DisplayClkSecUnits();
  433.                                         DisplayClkSecTens();
  434.                                 }
  435.                         }
  436.                 }
  437. //==============================================================
  438.                 if((Key4 == 0)&(key4Flag == 0)) //闹钟ON/OFF位设置
  439.                 {                        
  440.                         Delay20ms();
  441.                         if((Key4 == 0)&(key4Flag == 0))
  442.                          {
  443.                                 key4Flag = 1;
  444.                                 InitLcd1602();
  445.                                 LcdShowStr(0,0,"Clock ON");
  446.                                 Delay20ms();
  447.                                 
  448.                                 Delay20ms();
  449.                                 
  450.                                 Delay20ms();
  451.                                 
  452.                                 Delay20ms();
  453.                                 
  454.                                 Delay20ms();
  455.                         }
  456.                 }
  457.                 if((Key4 == 0)&(key4Flag == 1))         //闹钟ON/OFF位设置
  458.                  {                        
  459.                         Delay20ms();
  460.                         if((Key4 == 0)&(key4Flag == 1))
  461.                         {
  462.                                 key4Flag = 0;
  463.                                 InitLcd1602();                                   
  464.                                 LcdShowStr(0,0,"Clock OFF");
  465.                                 Delay20ms();
  466.                                 Delay20ms();
  467.                                 Delay20ms();
  468.                                 Delay20ms();
  469.                         }
  470.                 }
  471. //==============================================================
  472.         if((key4Flag == 1)&(hour == clockHour)&(min == clockMin))
  473.         {        
  474.                         clockFlag = 1;                                                         //闹钟时间到
  475.                         InitLcd1602();
  476.                         LcdShowStr(0,0,table);
  477.                         LcdShowStr(0,0,"Time's up");
  478.                                         DisplayHourTens();
  479.                                         DisplayHourUnits();
  480.                                         LcdShowStr(8,1,":");               
  481.                                         DisplayMinTens();
  482.                                         DisplayMinUnits();
  483.                                         LcdShowStr(11,1,":");
  484.                                         DisplayClkSecUnits();
  485.                                         DisplayClkSecTens();
  486.                         while(clockFlag == 1)
  487.                         {
  488.                             LED=!LED;
  489.                                 Beep();
  490.                                 ScanKey4();
  491.                                 Delay20ms();
  492.                                 ScanKey4();
  493.                                 Delay20ms();
  494.                                 ScanKey4();
  495.                                 Delay20ms();
  496.                                 ScanKey4();
  497.                                 Delay20ms();
  498.                                 ScanKey4();
  499.                                         Delay20ms();
  500.                                 ScanKey4();
  501.                                         Delay20ms();
  502.                                 ScanKey4();
  503.                                 Delay20ms();
  504.                                 ScanKey4();
  505.                                 Delay20ms();
  506.                                 ScanKey4();
  507.                                 beepNum++;
  508.                                 if(beepNum == 20)
  509.                                 {
  510.                                         clockFlag = 0;
  511.                                         beepNum = 0;
  512.                                         key4Flag = 0;
  513.                                         LED=1;
  514.                                 }        
  515.                         }
  516.                 }
  517.         }
  518. }
  519. void Timer0() interrupt 1
  520. {
  521.         temp++;
  522.         if(temp == 20)
  523.         {
  524.                 sec++;
  525.                 temp = 0;
  526.         }
  527.         TH0 = (65536 - 50000) / 256;
  528.         TL0 = (65536 - 50000) % 256;
  529. }
  530. void Timer1() interrupt 3
  531. {
  532. TH1=(65536-50000)/256;
  533. TL1=(65536-50000)%256;
  534. }
复制代码

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:752974 发表于 2021-6-22 08:28 | 只看该作者
在使用单片机时,有一个重要的概念:叫做“实时性”。
回复

使用道具 举报

板凳
ID:924233 发表于 2021-6-22 08:33 | 只看该作者
munuc_w 发表于 2021-6-22 08:28
在使用单片机时,有一个重要的概念:叫做“实时性”。

能够指点 一下吗不是很懂
回复

使用道具 举报

地板
ID:811711 发表于 2021-6-22 09:21 | 只看该作者
找例程看一下把,代码太长看不懂啊
回复

使用道具 举报

5#
ID:94031 发表于 2021-6-22 09:59 | 只看该作者
定时1中断就没用,为什么初始化要开定时1中断。
回复

使用道具 举报

6#
ID:924233 发表于 2021-6-22 10:06 | 只看该作者
xuyaqi 发表于 2021-6-22 09:59
定时1中断就没用,为什么初始化要开定时1中断。

因为想用这个定时1中断去使闹钟程序响了之后秒数能够继续转动,不会用就放在那里了
回复

使用道具 举报

7#
ID:123289 发表于 2021-6-22 13:46 | 只看该作者
记住:CPU在任何时刻只能做一件事,
当时钟该走的时候CPU没有让它走,它就不走了。
如果你的程序能不用DELAY,估计问题就解决了。
我猜你离开了DELAY就不会延时了。即搞不定!
回复

使用道具 举报

8#
ID:924233 发表于 2021-6-22 22:01 | 只看该作者
yzwzfyz 发表于 2021-6-22 13:46
记住:CPU在任何时刻只能做一件事,
当时钟该走的时候CPU没有让它走,它就不走了。
如果你的程序能不用DE ...

是的  之前就想过是因为delay太多导致那个闹钟秒数不走  延时完之后就继续走了   想用两个定时器解决 但是不会【笑哭】
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表