找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机数字电子钟,可以实现按键控制,但是闹钟方面好像有问题,有大神能帮忙看看吗?

[复制链接]
跳转到指定楼层
楼主
ID:907391 发表于 2021-5-23 07:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如题
  1. #include<reg51.h>
  2. #include<intrins.h>                              
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. uchar led[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};  //用一维数组定义0-9、横杠、全灭
  6. uchar a[8];     
  7. uchar second=0,minute=0,hour=0;
  8. uchar minute1=0,hour1=0;
  9. uchar b[8]={0x01,0x02,0x04,0x08}; //扫描按键1的信号,进行选位
  10. uchar k=0; unsigned int temp;   // 记录毫秒为秒的变量
  11. uchar M,flag; //M是模式,更新时间的种模式加上正常模式
  12. uchar counter;
  13. sbit K1=P1^0;
  14. sbit K2=P1^1;
  15. sbit K3=P1^2;
  16. sbit K4=P1^3;
  17. sbit S1=P1^6;
  18. sbit S2=P1^7;

  19. void T0_ISR() interrupt 1
  20. {
  21.        
  22.         TMOD=1;
  23.         TH0=(65536-50000)/256;
  24.         TL0=(65536-50000)%256;
  25.         EA=1;
  26.         ET0=1;
  27.         TR0=1;
  28.         while(1);
  29.         if(20==counter)
  30.         {
  31.                  counter=0;
  32.                  S2=~S2;
  33.         }
  34. }
  35. void delay(unsigned n)       //0.2毫秒
  36. {  
  37. int x,y;   
  38. for(x=0;x<n;x++)   
  39. for(y=0;y<24;y++);
  40. }

  41.    
  42. void time1()interrupt 3   //定时器中断函数
  43. {   
  44. TH1=0xfc;     //定时ms   
  45. TL1=0x18;   
  46. temp++;
  47. counter++;   
  48. if(temp==1000)   //配合定时器定时s   
  49. {  
  50. temp=0;  
  51. second++;   
  52. }  
  53. if(second==59)  
  54. {  
  55. second=0;   
  56. if(minute<59)  
  57. minute++;  
  58. else      
  59. {
  60. minute=0;   
  61. hour++;   
  62. hour%=24;      
  63. }
  64. }      
  65. if(hour1==hour&&minute1==0&&second<10)    //整点报时   
  66. {
  67. if(M==0)   
  68. S1=0;
  69. S2=0;   
  70. }        
  71. if(temp%250==0)            //每ms        
  72. flag=!flag;       //闪烁标志位取反     
  73. if(k==8)  
  74. k=0;   
  75. P0=a[k];     
  76. P2=b[k++];      
  77. delay(1);     
  78. P2=0x00;   
  79. }
  80.       
  81. void display()
  82. {  
  83. switch(M)  
  84. {  
  85. case 0:   
  86. {
  87. if(flag==1)   
  88. a[0]=led[hour/10];   
  89. a[1]=led[hour%10];   
  90. a[2]=led[minute/10];   
  91. a[3]=led[minute%10];   
  92. }
  93. break;  
  94. case 1:   
  95. {   
  96. if(flag==1)   
  97. {     
  98. a[0]=led[hour/10];     
  99. a[1]=led[hour%10];        
  100. a[2]=led[minute/10];   
  101. a[3]=led[minute%10];     
  102. }
  103. break;  
  104. case 2:
  105. {
  106. if(flag==1)
  107. {  
  108. a[0]=led[hour/10];   
  109. a[1]=led[hour%10];           
  110. a[2]=led[minute/10];     
  111. a[3]=led[minute%10];   
  112. }        
  113. }
  114. break;  
  115. case 3:   
  116. {   
  117. if(flag==1)   
  118. {     
  119. a[0]=led[hour1/10];     
  120. a[1]=led[hour1%10];   
  121. a[2]=led[minute1/10];   
  122. a[3]=led[minute1%10];
  123. }           
  124. }
  125. break;  
  126. case 4:   
  127. {
  128. if(flag==1)
  129. {   
  130. a[0]=led[hour1/10];   
  131. a[1]=led[hour1%10];      
  132. a[2]=led[minute1/10];     
  133. a[3]=led[minute1%10];
  134. }        
  135. }  
  136. }
  137. }
  138. }
  139.    
  140. void key_scan()
  141. {     
  142. if(K1==0)   
  143. {   
  144. delay(10);  //延时去抖        
  145. if(K1==0)    //按K1进行模式切换     
  146. {   
  147. M++;     
  148. if(M==5)                  
  149. M=0;
  150. if(K4==0)
  151. M=0;
  152. }   
  153. while(!K1);   //等待按键释放   
  154. }                 
  155. if(M!=0)        
  156. {         
  157. switch(M)         
  158. {               
  159. case 1:     //调时              
  160. {      
  161. if(K2==0)           //加键按下
  162. {      
  163. delay(10);           
  164. if(K2==0)         
  165. {           
  166. if(hour<23) hour++;      
  167. else hour=0;      
  168. }      
  169. while(!K2);      
  170. }            
  171. if(K3==0)     
  172. {      
  173. delay(10);               
  174. if(K3==0)         
  175. {        
  176. if(hour> 0) hour--;      
  177. else hour=23;         
  178. }      
  179. while(!K3);      
  180. }        
  181. }
  182. break;         
  183. case 2:    //调分      
  184. {           
  185. if(K2==0)   
  186. {      
  187. delay(10);        
  188. if(K2==0)            
  189. {           
  190. if(minute<59)
  191. minute++;      
  192. else
  193. minute=0;      
  194. }      
  195. while(!K2);     
  196. }              
  197. if(K3==0)     
  198. {      
  199. delay(10);         
  200. if(K3==0)           
  201. {        
  202. if(minute>0)
  203. minute--;      
  204. else
  205. minute=59;         
  206. }      
  207. while(!K3);        
  208. }
  209. }
  210. break;      
  211. case 3:    //闹钟调时      
  212. {            
  213. if(K2==0)      
  214. {        
  215. delay(10);                  
  216. if(K2==0)               
  217. {               
  218. if(hour1<23)                        
  219. hour1++;            
  220. else hour1=0;         
  221. }        
  222. while(!K2);            
  223. }      
  224. if(K3==0)      
  225. {        
  226. delay(10);           
  227. if(K3==0)                     
  228. {
  229. if(hour1>0)                          
  230. hour1--;           
  231. else hour1=23;                     
  232. }      
  233. while(!K3);         
  234. }      
  235. }  
  236. break;              
  237. case 4:    //闹钟调分         
  238. {         
  239. if(K2==0)      
  240. {        
  241. delay(10);                    
  242. if(K2==0)                  
  243. {               
  244. if(minute1<59)                        
  245. minute1++;           
  246. else minute1=0;         
  247. }        
  248. while(!K2);      
  249. }      
  250. if(K3==0)      
  251. {        
  252. delay(10);  //延时去抖              
  253. if(K3==0)   //减键按下                    
  254. { if(minute1>0)
  255. minute1--;         
  256. else minute1=59;                     
  257. }      
  258. while(!K3);               
  259. }      
  260. }  
  261. break;   
  262. }  
  263. }      
  264. }   
  265. void main()
  266. {   
  267. M=0;  
  268. flag=0;     //闪烁标志位  
  269. TMOD=0x10;   //定时器以方式定时  
  270. TL1=0x18;  
  271. EA=1;     //打开总中断  
  272. ET1=1;  //允许定时器中断  
  273. TR1=1;  //开启定时器(开始定时计数)  

  274. while(1)     
  275. {   
  276. key_scan();   
  277. display();

  278. }
  279. }
复制代码

shuzidianzizhong 2.zip

35.77 KB, 下载次数: 7

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

使用道具 举报

沙发
ID:94031 发表于 2021-5-23 09:16 | 只看该作者
在中断里只干必须干的事,把处理的事放到main循环里去干,减少中断干扰程序运行。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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