单片机的数字时钟

Code:
  1. #include<reg52.h>
  2. #include<absacc.h>
  3. #defineunitunsignedint
  4. #defineucharunsignedchar
  5. /*定义字型字位口*/
  6. #defineDIGPORTXBYTE[0x8000]
  7. #defineWORDPORTXBYTE[0x4000]
  8. /*定义P1口各管脚*/
  9. sbitK0=P1^0;
  10. sbitK1=P1^1;
  11. sbitK2=P1^2;
  12. sbitBEEP=P1^3;
  13. sbitL0=P1^4;
  14. sbitL1=P1^5;
  15. sbitL2=P1^6;
  16. sbitL3=P1^7;
  17. uchardataBUFFER[2]={0,0};/*显示缓冲区(依次为低位,高位)*/
  18. uchardataCLOCK[4]={0,0,0,0};/*存放时钟时间(依次为百分秒,秒,分和时位)*/
  19. uchardataSECOND[2]={0,0};/*存放秒表时间(依次为百分秒,秒)*/
  20. uchardataREVERSE[4]={0,0,0,0};/*存放倒计时时间(依次为百分秒,秒,分和时位)*/
  21. /*定义运行状态*/
  22. uchardataSTATE=0;
  23. /*STATE=0,秒表*/
  24. /*STATE=1,倒计时分调整*/
  25. /*STATE=2,倒计时小时调整*/
  26. /*STATE=3,倒计时运行*/
  27. /*STATE=4or7,时钟运行*/
  28. /*STATE=5,时钟分调整*/
  29. /*STATE=6,时钟时调整*/
  30. bitbdataSND=0;/*秒表START*/
  31. bitbdataRST=0;/*秒表RESET*/
  32. bitbdataSTP=0;/*倒计时STOP*/
  33. /*数码管显示编码"0"-"9","A","-"*/
  34. ucharcodeTABLE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x40};
  35. voiddisplay(void)
  36. {
  37. uchari;/*显示缓冲区首址*/
  38. uchardelay;/*显示延时*/
  39. uchardisp;/*显示内容*/
  40. uchardigit;/*定义数码管显示位*/
  41. digit=0x08;
  42. for(i=0;i<2;i++)/*秒表,显示百分秒和秒*/
  43. {
  44. if(BUFFER[i]>100)disp=BUFFER[i]%10+10;
  45. elsedisp=BUFFER[i]%10;
  46. DIGPORT=digit;
  47. WORDPORT=TABLE[disp];
  48. for(delay=0;delay<=200;delay++);
  49. digit=digit>>1;
  50. disp=BUFFER[i]/10;
  51. DIGPORT=digit;
  52. WORDPORT=TABLE[disp];
  53. for(delay=0;delay<=200;delay++);
  54. digit=digit>>1;
  55. }
  56. }
  57. voidtimer0(void)interrupt1using1
  58. {
  59. /*重置定时初值*/
  60. TH0=-5000/256;
  61. TL0=-5000%256;
  62. /*时钟处理*/
  63. CLOCK[0]=CLOCK[0]+1;
  64. if((CLOCK[0]==50)&&(STATE>=4))
  65. {
  66. L0=!L0;
  67. }
  68. if(CLOCK[0]==100)
  69. {
  70. if(STATE>=4)L0=!L0;
  71. CLOCK[0]=0;
  72. CLOCK[1]=CLOCK[1]+1;
  73. if(CLOCK[1]==60)
  74. {
  75. CLOCK[1]=0;
  76. CLOCK[2]=CLOCK[2]+1;
  77. if(CLOCK[2]==60)
  78. {
  79. CLOCK[2]=0;
  80. CLOCK[3]=CLOCK[3]+1;
  81. if(CLOCK[3]==24)
  82. {
  83. CLOCK[3]=0;
  84. }
  85. }
  86. }
  87. }
  88. }
  89. voidtimer2(void)interrupt5using3
  90. {
  91. TF2=0;
  92. TH2=-5000/256;
  93. TL2=-5000%256;
  94. /*秒表处理*/
  95. if(STATE==0)
  96. {
  97. SECOND[0]=SECOND[0]+1;
  98. if(SECOND[0]==50)
  99. {
  100. L1=!L1;
  101. }
  102. if(SECOND[0]==100)
  103. {
  104. L1=!L1;
  105. SECOND[0]=0;
  106. SECOND[1]=SECOND[1]+1;
  107. if(SECOND[1]==100)
  108. {
  109. SECOND[1]=0;
  110. }
  111. }
  112. }
  113. /*倒计时处理*/
  114. if(STATE==3)
  115. {
  116. REVERSE[0]=REVERSE[0]+1;
  117. if(REVERSE[0]==50)
  118. {
  119. L2=!L2;
  120. }
  121. if(REVERSE[0]==100)
  122. {
  123. L2=!L2;
  124. REVERSE[0]=0;
  125. REVERSE[1]=REVERSE[1]+1;
  126. if(REVERSE[1]==60)
  127. {
  128. REVERSE[1]=00;
  129. REVERSE[2]=REVERSE[2]-1;
  130. if((REVERSE[2]==0)&&(REVERSE[3]==0))
  131. {
  132. TR2=0;
  133. STP=1;
  134. BEEP=0;
  135. }
  136. elseif(REVERSE[2]==0xff)
  137. {
  138. REVERSE[2]=59;
  139. REVERSE[3]=REVERSE[3]-1;
  140. }
  141. }
  142. }
  143. }
  144. }
  145. voidintsvr1(void)interrupt2using2
  146. {
  147. if(STATE==5)
  148. {
  149. CLOCK[2]=CLOCK[2]+1;
  150. if(CLOCK[2]==60)CLOCK[2]=0;
  151. }
  152. if(STATE==6)
  153. {
  154. CLOCK[3]=CLOCK[3]+1;
  155. if(CLOCK[3]==24)CLOCK[3]=0;
  156. }
  157. }
  158. voidtimer1(void)interrupt3using3
  159. {
  160. if(STATE==0)
  161. {
  162. if(RST)
  163. {
  164. SECOND[0]=0;
  165. SECOND[1]=0;
  166. L1=1;
  167. RST=0;
  168. }
  169. else
  170. {
  171. if(SND)TR2=1;
  172. else
  173. {
  174. L1=1;
  175. TR2=0;
  176. RST=1;
  177. }
  178. SND=!SND;
  179. }
  180. }
  181. elseif(STATE==1)
  182. {
  183. REVERSE[2]=REVERSE[2]+1;
  184. if(REVERSE[2]==60)REVERSE[2]=0;
  185. }
  186. elseif(STATE==2)
  187. {
  188. REVERSE[3]=REVERSE[3]+1;
  189. if(REVERSE[3]==24)REVERSE[3]=0;
  190. }
  191. else
  192. {
  193. if(STP)
  194. {
  195. BEEP=1;
  196. L2=1;
  197. STP=0;
  198. }
  199. elseTR2=0;
  200. }
  201. }
  202. voidmain(void)
  203. {
  204. ucharstabak;/*上一次程序运行的状态*/
  205. P1=0x0f;
  206. EA=1;IT1=1;ET0=1;
  207. TMOD=0x61;/*T1方式2计数,T0方式1计时*/
  208. TH0=-5000/256;TL0=-5000%256;
  209. TH1=0xff;TL1=0xff;
  210. T2CON=0;TH2=-5000/256;TL2=-5000%256;
  211. K0=1;K1=1;K2=1;
  212. STATE=P1&0x07;
  213. stabak=STATE;
  214. for(;;)
  215. {
  216. switch(STATE)
  217. {
  218. case0:/*STATE=0,秒表*/
  219. {
  220. EX1=0;ET1=1;ET2=1;TR1=1;SND=1;
  221. L1=1;L0=0;L2=0;
  222. SECOND[0]=0;
  223. SECOND[1]=0;
  224. }break;
  225. case1:/*STATE=1,倒计时分调整*/
  226. {
  227. EX1=0;ET1=1;ET2=1;TR1=1;TR2=0;
  228. L2=1;L0=0;L1=0;
  229. REVERSE[0]=0;
  230. REVERSE[1]=0;
  231. }break;
  232. case2:/*STATE=2,倒计时小时调整*/
  233. {
  234. EX1=0;ET1=1;ET2=1;TR1=1;TR2=0;
  235. L2=1;L0=0;L1=0;
  236. REVERSE[0]=0;
  237. REVERSE[1]=0;
  238. }break;
  239. case3:/*STATE=3,倒计时运行*/
  240. {
  241. EX1=0;ET1=1;ET2=1;TR1=1;
  242. if((REVERSE[2]==0)&&(REVERSE[3]==0))L2=1;
  243. elseTR2=1;
  244. L0=0;L1=0;
  245. }break;
  246. case5:/*STATE=5,时钟分调整*/
  247. {
  248. IE1=0;EX1=1;ET1=0;ET2=1;TR0=0;
  249. L0=1;L1=0;L2=0;
  250. }break;
  251. case6:/*STATE=6,时钟时调整*/
  252. {
  253. IE1=0;EX1=1;ET1=0;ET2=1;TR0=0;
  254. L0=1;L1=0;L2=0;
  255. }break;
  256. default:/*STATE=4or7,时钟运行*/
  257. {
  258. EX1=0;ET1=0;ET2=1;TR0=1;
  259. L1=0;L2=0;
  260. }
  261. }
  262. while(STATE==stabak)
  263. {
  264. switch(STATE)
  265. {
  266. case0:/*STATE=0,秒表*/
  267. {
  268. BUFFER[0]=SECOND[0];
  269. BUFFER[1]=SECOND[1];
  270. }break;
  271. case1:/*STATE=1,倒计时分调整*/
  272. {
  273. BUFFER[0]=REVERSE[2];
  274. BUFFER[1]=101;/*A-*/
  275. }break;
  276. case2:/*STATE=2,倒计时小时调整*/
  277. {
  278. BUFFER[0]=110;/*-A*/
  279. BUFFER[1]=REVERSE[3];
  280. }break;
  281. case3:/*STATE=3,倒计时运行*/
  282. {
  283. BUFFER[0]=REVERSE[2];
  284. BUFFER[1]=REVERSE[3];
  285. }break;
  286. case5:/*STATE=5,时钟分调整*/
  287. {
  288. BUFFER[0]=CLOCK[2];
  289. BUFFER[1]=101;/*A-*/
  290. }break;
  291. case6:/*STATE=6,时钟时调整*/
  292. {
  293. BUFFER[0]=110;/*-A*/
  294. BUFFER[1]=CLOCK[3];
  295. }break;
  296. default:/*STATE=4or7,时钟运行*/
  297. {
  298. BUFFER[0]=CLOCK[2];
  299. BUFFER[1]=CLOCK[3];
  300. }
  301. }
  302. display();
  303. K0=1;K1=1;K2=1;
  304. STATE=P1&0x07;
  305. }
  306. stabak=STATE;
  307. }
  308. }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值