找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机数字钟计时倒计时准点报时程序

[复制链接]
跳转到指定楼层
楼主


  1. #include "reg51.h"   
  2. typedef unsigned int u16;   
  3. typedef unsigned char u8;
  4. //
  5. sbit naodeng=P2^0;  
  6. sbit K1=P3^0;   
  7. sbit K2=P3^2;  
  8. sbit K3=P3^3;  
  9. sbit K4=P2^3;   
  10. sbit K5=P2^4;  
  11. sbit K6=P2^5;
  12. sbit K7=P2^6;
  13. sbit beep=P2^7;   
  14. //
  15. void shijian();   
  16. void Timer0Init();  
  17. void Timer1Init();
  18. void DigDisplay();      
  19. void alarm();           
  20. void tiao_nao();        
  21. void moshi();           
  22. void delay(u16 i);      
  23. //
  24. bit nao;  
  25. bit ji;
  26. u8 a=0;               
  27. u8 display[]={0,0,0,0,0,0};   
  28. u8 ssec,sec,min,hour,nao_hour=0,nao_min=0;ji_hour=0,ji_min=0;ji_sec=0;
  29. //
  30. void delay(u16 i)
  31. {
  32. while(i--);
  33. }
  34. //定时器中断初始化  
  35. void Timer0Init()
  36. {
  37. TMOD|=0X01;
  38. EX0=1;
  39. IT0=1;     
  40. PX0=1;
  41. EX1=1;
  42. IT1=0;   
  43. TH0=0Xd8;
  44. TL0=0Xf0;
  45. ET0=1;      
  46. EA=1;      
  47. TR0=1;   
  48. }
  49. void Timer1Init()
  50. {
  51. ET0=0;
  52. TMOD|=0X10;
  53. EX0=1;
  54. IT0=1;     
  55. PX0=1;
  56. EX1=1;
  57. IT1=0;   
  58. TH0=0Xd8;
  59. TL0=0Xf0;
  60. ET1=1;      
  61. EA=1;      
  62. TR1=1;   
  63. }
  64. //6位LED显示
  65. void DigDisplay()
  66. {
  67.   u8  i,j,m,temp;
  68.   u8  led[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  69.         
  70.      temp=0x01;
  71.      for(i=0;i<6;i++)
  72.   {
  73.      P1=0x00;         
  74.      j=display[i];
  75.       P1=led[j];      
  76.       P0=~temp;        
  77.        temp<<=1;
  78.        for(m=0;m<100;m++);   
  79.        }
  80. }
  81. //报警函数
  82. void alarm()
  83. {
  84.    if(nao_hour==hour&&nao_min==min&&sec>=0&&sec<20&&nao==1)
  85.    {
  86.   beep=1;
  87.   delay(5);
  88.   beep=0;
  89.   delay(5);
  90.    
  91. }
  92. }
  93. //整点
  94. void bee()
  95. {
  96.    if(min==0&&sec>=0&&sec<2)
  97.    {
  98.   beep=1;
  99.   delay(5);
  100.   beep=0;
  101.   delay(5);
  102.    
  103. }
  104. }
  105. //闹钟时间调节
  106. void tiao_nao()
  107. {
  108.     IT0=0;      
  109.   EX1=0;     
  110.   EX0=0;     
  111.   delay(10);
  112.   while(K1)      
  113.   {
  114.   if(K2==0)      
  115.       {delay(10);if(K2==0)nao_hour++;while(!K2);}
  116.      if(nao_hour>=24)nao_hour=0;   
  117.   if(K3==0)     
  118.     {delay(10);if(K3==0)nao_min++;while(!K3); }
  119.   if(nao_min>=60)nao_min=0;     
  120.     display[5]=0;      
  121.   display[4]=0;
  122.   display[3]=nao_min%10;
  123.   display[2]=nao_min/10;
  124.   display[1]=nao_hour%10;
  125.   display[0]=nao_hour/10;
  126.   DigDisplay();         
  127.   }
  128.   IT0=1;
  129.   EX1=1;
  130.   EX0=1;
  131.   ET0=1;
  132.   ET1=0;
  133.   nao=1;            
  134. }
  135. //闹钟功能
  136. void moshi()
  137. {
  138.    if(K1==0)
  139. {
  140.   delay(100);
  141.   if(K1==0)
  142.   {
  143.    a++;     
  144.    if(a>=2)a=0;
  145.    while(!K1);
  146.    switch(a)
  147.    {
  148.     case(0):nao=~nao;break;     
  149.     case(1):tiao_nao();break;     
  150.    }     
  151.   }
  152. } while(!K1);
  153. }
  154. //时间显示
  155. void shijian()
  156. {
  157.   display[5]=sec%10;
  158.   display[4]=sec/10;     
  159.   display[3]=min%10;
  160.   display[2]=min/10;
  161.   display[1]=hour%10;
  162.   display[0]=hour/10;
  163.   DigDisplay();
  164. }
  165. //计时
  166. void tiao_ji()
  167. {
  168.     IT0=0;      
  169.   EX1=0;     
  170.   EX0=0;     
  171.   delay(10);
  172.   while(K4)      
  173.   {
  174.   if(K5==0)      
  175.       {delay(10);if(K5==0)ji_hour++;while(!K5);}
  176.      if(ji_hour>=24)ji_hour=0;   
  177.   if(K6==0)     
  178.     {delay(10);if(K6==0)ji_min++;while(!K6); }
  179.   if(ji_min>=60)ji_min=0;   
  180.    if(K7==0)     
  181.     {delay(10);if(K7==0)ji_sec++;while(!K7); }
  182.   if(ji_sec>=60)ji_sec=0;  
  183.     display[5]=ji_sec%10;      
  184.   display[4]=ji_sec/10;
  185.   display[3]=ji_min%10;
  186.   display[2]=ji_hour/10;
  187.   display[1]=ji_hour%10;
  188.   display[0]=ji_hour/10;
  189.   DigDisplay();         
  190.   }
  191.   IT1=1;
  192.   EX1=1;
  193.   EX0=1;
  194.   ET0=0;
  195.   ET1=1;
  196.   ji=1;  
  197.    hour=ji_hour;
  198.   min=ji_min;
  199.   sec=ji_sec;
  200. }
  201. //计时功能
  202. void jishi()
  203. {
  204.    if(K4==0)
  205. {
  206.   delay(100);
  207.   if(K4==0)
  208.   {
  209.    
  210.    
  211.       Timer1Init();
  212.    a++;     
  213.    if(a>=3)a=0;
  214.    while(!K4);
  215.    switch(a)
  216.    {
  217.     case(0):ji=~ji;EA=1;  ET0=1;ET1=0; break;     
  218.     case(1):tiao_ji(); break;
  219.     case(2):; break;
  220.    }     
  221.   }
  222. } while(!K4);
  223. }
  224. //
  225. void shiji()
  226. {
  227.   display[5]=sec%10;
  228.   display[4]=sec/10;     
  229.   display[3]=min%10;
  230.   display[2]=min/10;
  231.   display[1]=hour%10;
  232.   display[0]=hour/10;
  233.   DigDisplay();
  234. }
  235. //T0中断
  236. void Timer0() interrupt 1
  237. {
  238. TH0=0Xd8;
  239. TL0=0Xf0;
  240. ssec++;
  241. if(ssec>=100)  
  242. {
  243.   ssec=0;
  244.   sec++;
  245.   if(sec>=60)
  246.   {
  247.    sec=0;
  248.    min++;
  249.    if(min>=60)
  250.    {
  251.     min=0;
  252.     hour++;
  253.     if(hour>=24)
  254.     {hour=0;
  255.     }
  256.    }
  257.   }
  258. }
  259. }
  260. void Timer1() interrupt 3
  261. {
  262. TH0=0Xd8;
  263. TL0=0Xf0;
  264. ssec++;
  265. if(ssec>=100)  
  266. {
  267.   ssec=0;
  268.   sec--;
  269.   if(sec<=0)
  270.   {
  271.    if(min>0)
  272.    {
  273.      min--;
  274.     sec=60;
  275.    }
  276.    else
  277.    {
  278.     if(hour>0)
  279.    {
  280.     hour--;
  281.     min=60;
  282.     sec=60;
  283.    }
  284.    else
  285.     {sec=0;
  286.      beep=1;
  287.     delay(5);
  288.    }
  289.    
  290. }
  291. }
  292. }
  293. }
  294. //外部中断0
  295. void int0() interrupt 0
  296. {  
  297.   delay(10);  
  298.   hour++;
  299.   if(hour>=24)hour=0;     
  300. }
  301. //外部中断1
  302. void int1() interrupt 2
  303. {  
  304.     min++;      
  305. if(min==60) min=0;
  306. while(!K3);      
  307. }
  308. //main函数
  309. void main()
  310. {
  311.     Timer0Init();
  312. while(1)
  313. {
  314.   if(nao==1)naodeng=0;
  315.   else naodeng=1;
  316.   shijian();
  317.     shiji();  
  318.   moshi();   
  319.   alarm();
  320.     bee();
  321.     jishi();  
  322. }
  323. }
复制代码

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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