找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2171|回复: 0
收起左侧

基于51单片机的电子时钟设计

[复制链接]
ID:786289 发表于 2020-6-23 16:33 | 显示全部楼层 |阅读模式
发贴仅为黑币,非原创,已表明出处,如有冒犯,还望海涵
所选用器材

单片机最小系统选用AT89C51),排阻,四个按钮开关,8位共阴数码管,蜂鸣器;

有protues仿真电路原理图源代码:


  1. #include<reg51.h>

  2. #define uChar unsigned char

  3. #define uInt unsigned int

  4. uChar a[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

  5. uChar b[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

  6. uChar second=50,minute=59,hour=12,year=18,month=07,day=21,count;

  7. sbit Key1 = P3^0; //计时停止

  8. sbit Key2 = P3^1; //调位

  9. sbit Key3 = P3^2; //加一

  10. sbit Key4 = P3^3; //切换  

  11. sbit Buzzer=P1^1;

  12. /*********************延迟函数********************/

  13. void Delay(uInt t)

  14. {

  15. while(t)

  16. {

  17. t--;

  18. }

  19. }

  20. /*********************时分秒显示函数*******************/

  21. void Dispaly1(uChar second,uChar minute,uChar hour)

  22. {

  23. /*********************第一位数码管*********************/

  24. P2=b[0];

  25. P0=a[hour/10];

  26. Delay(10);

  27. /*********************第二位数码管*********************/

  28. P2=b[1];

  29. P0=a[hour%10];

  30. Delay(10);

  31. /*********************第三位数码管*********************/

  32. P2=b[2];

  33. P0=0x40;

  34. Delay(10);

  35. /*********************第四位数码管*********************/

  36. P2=b[3];

  37. P0=a[minute/10];

  38. Delay(10);

  39. /*********************第五位数码管*********************/

  40. P2=b[4];

  41. P0=a[minute%10];

  42. Delay(10);

  43. /*********************第六位数码管*********************/

  44. P2=b[5];

  45. P0=0x40;

  46. Delay(10);

  47. /*********************第七位数码管*********************/

  48. P2=b[6];

  49. P0=a[second/10];

  50. Delay(10);

  51. /*********************第八位数码管*********************/

  52. P2=b[7];;

  53. P0=a[second%10];

  54. Delay(10);

  55. }

  56. /*********************年月日显示函数********************/

  57. void Dispaly2(uChar day,uChar month,uChar year)

  58. {

  59. P2=b[0];

  60. P0=a[day/10];

  61. Delay(10);

  62. P2=b[1];

  63. P0=a[day%10];

  64. Delay(10);

  65. P2=b[2];

  66. P0=0x40;

  67. Delay(10);

  68. P2=b[3];

  69. P0=a[month/10];

  70. Delay(10);

  71. P2=b[4];

  72. P0=a[month%10];

  73. Delay(10);

  74. P2=b[5];

  75. P0=0x40;

  76. Delay(10);

  77. P2=b[6];

  78. P0=a[year/10];

  79. Delay(10);

  80. P2=b[7];

  81. P0=a[year%10];

  82. Delay(10);

  83. }

  84. /*********************时钟按键扫描函数*********************/

  85. void Keyscan1()

  86. {

  87. static uChar i=0,j=0;

  88. if(Key1==0)

  89. {

  90. Delay(10); //消抖

  91. if(Key1==0)

  92. while(!Key1); //等待按键弹

  93. i++;

  94. }

  95. /*时钟暂停功能*/

  96. if(i%2==1)

  97. {

  98. TR0=0;/*如果是奇数次按键自然关闭定时器0*/

  99. }

  100. if(i%2==0)

  101. {

  102. TR0=1;/*如果是偶数次按键则打开定时器0*/

  103. }

  104. /*时钟调位和数值加一功能*/

  105. if(Key2==0)

  106. {

  107. Delay(10);

  108. if(Key2==0)

  109. while(!Key2);

  110. j++;

  111. }

  112. if(j%4==1)

  113. {

  114. if(Key3==0)

  115. {

  116. Delay(10);

  117. if(Key3==0)

  118. while(!Key3);

  119. second++;

  120. if(second==60)

  121. second=0;

  122. }

  123. }

  124. if(j%4==2)

  125. {

  126. if(Key3==0)

  127. {

  128. Delay(10);

  129. if(Key3==0)

  130. while(!Key3);

  131. minute++;

  132. if(minute==60)

  133. minute=0;

  134. }

  135. }

  136. if(j%4==3)

  137. {

  138. if(Key3==0)

  139. {

  140. Delay(10);

  141. if(Key3==0)

  142. while(!Key3);

  143. hour++;

  144. if(hour==24)

  145. hour=0;

  146. }

  147. }

  148. }

  149. /*日期按键扫描函数*/

  150. void Keyscan2()

  151. {

  152. static uChar m=0,n=0;

  153. if(Key1==0)

  154. {

  155. Delay(10);

  156. if(Key1==0)

  157. while(!Key3);

  158. m++;

  159. }

  160. if(m%2==1)

  161. {

  162. TR0=0;/*奇数次按键则关闭定时器0*/

  163. }

  164. if(m%2==0)

  165. {

  166. TR0=1;/*偶数次按键则打开定时器0*/

  167. }

  168. if(Key2==0)

  169. {

  170. Delay(10);

  171. if(Key2==0)

  172. while(!Key2);

  173. n++;

  174. }

  175. /*日期调位和日期加一功能*/

  176. if(n%4==1)

  177. {

  178. if(Key3==0)

  179. {

  180. Delay(10);

  181. if(Key3==0)

  182. while(!Key3);

  183. day++;

  184. if(day==30)

  185. day=0;

  186. }

  187. }

  188. if(n%4==2)

  189. {

  190. if(Key3==0)

  191. {

  192. Delay(10);

  193. if(Key3==0)

  194. while(!Key3);

  195. month++;

  196. if(month==12)

  197. month=0;

  198. }

  199. }

  200. if(n%4==3)

  201. {

  202. if(Key3==0)

  203. {

  204. Delay(10);

  205. if(Key3==0)

  206. while(!Key3);

  207. year++;

  208. if(year==99)

  209. year=0;

  210. }

  211. }

  212. }

  213. /************************************************/

  214. /***************主函数***************************/

  215. /************************************************/

  216. void main()

  217. {                                               

  218. TMOD=0x01;          /*定时器以方式一工作*/

  219. TH0=(65536-10000)/256;

  220. TL0=(65536-10000)%256;/*10ms计时*/

  221. EA=1;

  222. ET0=1;/*允许定时器0中断*/

  223. TR0=1;/*打开定时器0*/

  224. while(1)

  225. {

  226. static uChar h=0;

  227. /*时钟和日期切换功能*/

  228. if(Key4==0)

  229. {

  230. Delay(10);

  231. if(Key4==0)

  232. while(!Key4);

  233. h++;

  234. }

  235. if(h%2==0)/*如果按键偶数次则显示时钟*/

  236. {

  237. Dispaly1(second,minute,hour);

  238. Keyscan1();

  239. }

  240. if(h%2==1)/*如果按键奇数次则显示日期*/

  241. {

  242. Dispaly2(year,month,day);

  243. Keyscan2();

  244. }

  245. }

  246. }

  247. /**********************中断函数**************************/

  248. void time0_int(void) interrupt 1

  249. {

  250. TH0=(65536-10000)/256;

  251. TL0=(65536-10000)%256;

  252. count++;

  253. if(count==100)/*10ms??ê±£???100′??ò??o?1s*/

  254. {

  255. count=0;

  256. second++;

  257. if(second==60)

  258. {

  259. second=0;

  260. minute++;

  261. if(minute==60)

  262. {

  263. minute=0;

  264. hour++;

  265. if(hour==24)

  266. {

  267. hour=0;

  268. day++;

  269. if(day==30)

  270. {

  271. day=0;

  272. month++;

  273. if(month==12)

  274. {

  275. month=0;

  276. year++;

  277. if(year==99)

  278. {

  279. year=0;

  280. }

  281. }

  282. }

  283. }

  284. }

  285. }

  286. }

  287. /*判断整点提醒*/

  288. if(second==00&&minute==00)                                                                  

  289. Buzzer=0;

  290. else

  291. Buzzer=1;

  292. }
复制代码

————————————————

版权声明:本文为CSDN博主「MoreMbb」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/weixin_421 ... le/details/89765975

最后实现的效果:

2.png (36.36 KB, 下载次数: 0)

proteus仿真结果

3.png (38.14 KB, 下载次数: 0)

最终结果实现



数字电子钟的设计与研究.zip

340.27 KB, 下载次数: 32, 下载积分: 黑币 -5

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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