3251|4

10

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

看别人写的多功能电子钟,觉得不错,分享 [复制链接]


1,可以用来做电子钟
2,可以用做报警器(按P3.2时,用做报警)
3,可以用做闹钟(按P1.6时,用做闹钟)
4,可以显示星期
程序如下:
  1. #include <AT89X51.H>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. uchar code dispcode[]={0x81,0x9f,0xa4,0x8c,0x9a,0xc8,0xc0,0x9d,0x80,0x88};
  5. uchar code DATA[]={0xfc,0x92,0x98,0xac,0x89,0x01,0x5c,0x80,0x88};
  6. uchar dispbitcode[]={0xfe,0xfd,0xfb,0xf7};
  7. uchar dispbuf[8]={0,0,0,0};
  8. uchar dispbitcnt;
  9. uchar second,minite,hour,day;
  10. uchar clockhour,clockminite;
  11. uint tcnt;
  12. uchar mstcnt;
  13. uchar t;
  14. uint a;
  15. //上面的是定义各个变量和数码管缓存
  16. void yanshi(uint t)
  17. {
  18. for(;t>0;t--);
  19. }//延时子程序
  20. void beep()
  21. {
  22. while(hour<clockhour){
  23. for(a=0;a<1000;a++)
  24. {yanshi(5);
  25. P1_4=~P1_4;}
  26. for(a=0;a<1000;a++)
  27. {yanshi(5);
  28. P1_4=~P1_4;}
  29. for(a=0;a<5000;a++)
  30. {yanshi(6);
  31. P1_4=~P1_4;}
  32. if(P3_6==0){break;}}
  33. while(minite<clockminite){
  34. for(a=0;a<1000;a++)
  35. {yanshi(5);
  36. P1_4=~P1_4;}
  37. for(a=0;a<1000;a++)
  38. {yanshi(5);
  39. P1_4=~P1_4;}
  40. for(a=0;a<5000;a++)
  41. {yanshi(6);
  42. P1_4=~P1_4;}
  43. if(P3_6==0){break;}}}//报警子程序(P1.4接的是BEEP,P3.6为O时跳出)
  44. void baojing()
  45. {
  46. if(P1_7==0){
  47. yanshi(500);
  48. if(P1_7==0){
  49. while(1){
  50. if(P1_7==1){
  51. while(1){
  52. beep();
  53. if(P3_6==0)
  54. {break;}}}
  55. if(P3_6==0){break;}}}}}//报警执行子程序(用P1.7做信号检测脚,同样当P3.6为0时跳出)
  56. void clock()
  57. {
  58. if(P3_3==0){yanshi(500);
  59. if(P3_3==0){clockminite++;
  60. if(clockminite==60)
  61. {clockminite=0;}
  62. dispbuf[3]=clockminite%10;
  63. dispbuf[2]=clockminite/10;              
  64. while(P3_3==0);}}
  65. if(P3_6==0){yanshi(500);
  66. if(P3_6==0){clockhour++;
  67. if(clockhour==24){clockhour=0;}
  68. dispbuf[1]=clockhour%10;
  69. dispbuf[0]=clockhour/10;
  70. while(P3_6==0);}}}//设定闹钟子程序
  71. void key()
  72. {
  73. if(P3_6==0){yanshi(500);
  74. if(P3_6==0){second++;
  75. if(second==60){second=0;}            
  76. while(P3_6==0);}}
  77. if(P3_5==0){yanshi(1000);
  78. if(P3_5==0){minite++;
  79. if(minite==60){minite=0;}
  80. dispbuf[3]=minite%10;
  81. dispbuf[2]=minite/10;
  82. while(P3_5==0);}}
  83. if(P3_7==0){yanshi(500);
  84. if(P3_7==0){hour++;
  85. if(hour==24){hour=0;}
  86. dispbuf[1]=hour%10;
  87. dispbuf[0]=hour/10;
  88. while(P3_7==0);}}
  89. if(P3_4==0){yanshi(500);
  90. if(P3_4==0){day++;
  91. if(day==7){day=0; }
  92. P2=DATA[day];
  93. while(P3_4==0);}}
  94. }//设定时间子程序
  95. void laozhong()
  96. {
  97. if(hour==clockhour){
  98. if(minite==clockminite){
  99. for(a=0;a<1000;a++)
  100. {yanshi(5);
  101. P1_4=~P1_4;}
  102. for(a=0;a<1000;a++)
  103. {yanshi(5);
  104. P1_4=~P1_4;}
  105. for(a=0;a<5000;a++)
  106. {yanshi(6);
  107. P1_4=~P1_4;}}}}//闹钟子程序
  108. void display()
  109. {
  110. dispbuf[3]=minite%10;
  111. dispbuf[2]=minite/10;
  112. dispbuf[1]=hour%10;
  113. dispbuf[0]=hour/10;
  114. P2=DATA[day];
  115. }//显示子程序
  116. void displayclock()
  117. {
  118. dispbuf[7]=clockminite%10;
  119. dispbuf[6]=clockminite/10;
  120. dispbuf[5]=clockhour%10;
  121. dispbuf[4]=clockhour/10;
  122. }//闹钟显示子程序
  123. void time()
  124. {
  125. tcnt++;
  126. if(tcnt==4000){tcnt=0;
  127. second++;
  128. if(second==60){second=0;
  129. minite++;
  130. if(minite==60){minite=0;
  131. hour++;
  132. if(hour==24){hour=0;
  133. day++;
  134. if(day==7){day=0;}}}}
  135. display();}}//时间子程序
  136. void t0(void) interrupt 1 using 0
  137. {
  138. mstcnt++;
  139. if(mstcnt==4){mstcnt=0;
  140. P0=dispcode[dispbuf[dispbitcnt]];
  141. P1=dispbitcode[dispbitcnt];
  142. P2=DATA[day];
  143. dispbitcnt++;}
  144. if(dispbitcnt==4){dispbitcnt=0;}
  145. time();displayclock();}//中断
  146. void main(void)
  147. {
  148. TMOD=0x02;
  149. TH0=0x06;
  150. TL0=0x06;
  151. TR0=1;
  152. ET0=1;
  153. EA=1;
  154. while(1)
  155. {
  156. key();clock();
  157. if(P1_6==0)
  158. {while(1){laozhong();
  159. if(P3_6==0){break;}}}
  160. if(P3_2==0){yanshi(10000);
  161. if(P3_2==0){while(1)
  162. {baojing();
  163. if(P3_6==0)
  164. {break;}
  165. }}}}}
  166. //S1:启动报警器(P3.2)
  167. //S2: clock minite 加(P3.3)
  168. //S3: 星期加(P3.4)
  169. //S4:time minite 加(P3.5)
  170. //S5: clock hour 加/退出报警器(P3.6)
  171. //S6:time hour 加(P3.7)
  172. //P1-7为信号检测脚
复制代码


此帖出自51单片机论坛

最新回复

电路图呢和程序分享一下吧  详情 回复 发表于 2016-10-30 20:47

赞赏

1

查看全部赞赏

点赞 关注(3)
 

回复
举报

2886

帖子

0

TA的资源

五彩晶圆(初级)

沙发
 
感谢分享
此帖出自51单片机论坛
 
个人签名昵称:灰小子
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
感谢分享
此帖出自51单片机论坛
 
 
 

回复

154

帖子

2

TA的资源

一粒金砂(中级)

4
 
多谢分享,有用,mark
此帖出自51单片机论坛
 
 
 

回复

943

帖子

25

TA的资源

一粒金砂(中级)

5
 
电路图呢和程序分享一下吧
此帖出自51单片机论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表