Chinaunix首页 | 论坛 | 博客
  • 博客访问: 422642
  • 博文数量: 63
  • 博客积分: 1175
  • 博客等级: 少尉
  • 技术积分: 1204
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-19 11:33
文章分类
文章存档

2015年(1)

2014年(3)

2013年(7)

2012年(52)

分类: 嵌入式

2012-05-18 10:48:55

一、任务

设计制作一个24小时制多功能数字钟。示意图如下(仅供参考):

二、要求
1
.基本要求
  (1具有时间设置(小时和分钟)、闹钟时间设置、闹钟开、闹钟关功能
  (2数字显示小时、分钟,有AMPM指示器,闹钟就绪灯,蜂鸣器。
  (3220V供电

 

 

这是我帮别人做的一个比赛。因为只用了一个下午,所以就只实现了基本要求的1和2;

电路图 单片机.DSN.txt   这是用proteus画的。

源程序如下:

自己写的一个头文件“sbit.h”

点击(此处)折叠或打开

  1. sbit RS = P0^0;
  2. sbit RW = P0^1;
  3. sbit E = P0^2;

  4. sbit AM_led = P3^0;
  5. sbit PM_led = P3^1;
  6. sbit CLOCK_led = P3^2;
  7. sbit BUZZER = P3^7;

  8. sbit set_time = P1^0;
  9. sbit set_clock = P1^1;
  10. sbit set_hour = P1^2;
  11. sbit set_min = P1^3;
  12. sbit on_clock = P1^4;
  13. sbit off_clock = P1^5;

 

主程序如下:

点击(此处)折叠或打开

  1. #include<reg51.h>
  2. #include <intrins.h>
  3. #include "sbit.h"

  4. #define uchar unsigned char

  5. uchar flag_hour = 0; //0表示AM,1表示PM
  6. uchar flag_clock = 1; //0表示开闹钟,1表示关
  7. uchar hour[] = "00"; //时钟小时
  8. uchar min[] = "00"; //时钟分钟
  9. uchar clock_hour[] = "00"; // 闹钟小时
  10. uchar clock_min[] = "00";      //闹钟分钟

  11. int num; //计时

  12. /*******************************************************************/
  13. /* */
  14. /* 延时子程序,延时ms毫秒 */
  15. /* */
  16. /*******************************************************************/

  17. void delay(int ms)
  18. {
  19.    int i,j;
  20.    for(i = 0; i < ms; i++)
  21.      for(j = 0; j < 110; j++);
  22. }

  23. /*******************************************************************/
  24. /* */
  25. /*写指令数据到LCD */
  26. /*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 */
  27. /* */
  28. /*******************************************************************/
  29. void write_com(uchar com)
  30. {
  31.         RS = 0;
  32.      P2 = com;
  33.      delay(5);
  34.      E = 1;
  35.      delay(5);
  36.      E = 0;
  37. }

  38. /*******************************************************************/
  39. /* */
  40. /*写显示数据到LCD */
  41. /*RS=H,RW=L,E=高脉冲,D0-D7=数据。 */
  42. /* */
  43. /*******************************************************************/
  44. void write_data(uchar date)
  45. {
  46.         RS = 1;
  47.      P2=date;    
  48.      delay(5);
  49.      E = 1;
  50.      delay(5);
  51.      E = 0;
  52. }

  53. /*******************************************************************/
  54. /* */
  55. /* LCD初始化设定 */
  56. /* */
  57. /*******************************************************************/
  58. void lcd_init()
  59. {
  60.     E = 0;
  61.     RW = 0;
  62.     write_com(0x38); //16*2显示,5*7点阵,8位数据
  63.     delay(5);

  64.     write_com(0x0c); //显示开,关光标
  65.     delay(5);

  66.     write_com(0x06); //写一个字符后地址指针加1
  67.     delay(5);

  68.     write_com(0x01); //清除LCD的显示内容
  69.     delay(5);
  70. }
  71. /*******************************************************************/
  72. /* */
  73. /* LCD显示 */
  74. /* */
  75. /*******************************************************************/
  76. void display(char *h, char *m)
  77. {
  78.     write_com(0x80);
  79.     write_data(h[0]);
  80.     delay(5);
  81.     write_data(h[1]);
  82.     delay(5);
  83.     write_data(':');
  84.     delay(5);
  85.     write_data(m[0]);
  86.     delay(5);
  87.     write_data(m[1]);
  88.     delay(5);
  89. }
  90. /*******************************************************************/
  91. /* */
  92. /* 按键初始化设定 */
  93. /* */
  94. /*******************************************************************/
  95. key_init()
  96. {
  97.    set_time = 1;
  98.    set_clock = 1;
  99.    set_hour = 1;
  100.    set_min = 1;
  101.    on_clock = 1;
  102.    off_clock = 1;
  103. }
  104. /*******************************************************************/
  105. /* */
  106. /* 初始化T0定时器 */
  107. /* */
  108. /*******************************************************************/
  109. void T0_init()
  110. {
  111.      TMOD = 0x01; //设置定时器0工作方式为1
  112.      TH0 = (65536 - 46080)/256;     //定时50ms
  113.      TL0 = (65536 - 46080)%256;
  114.      EA = 1;         //开总中断
  115.      ET0 = 1;                 //开定时器0中断

  116. }
  117. /*******************************************************************/
  118. /* */
  119. /* 初始化设定 */
  120. /* */
  121. /*******************************************************************/
  122. void init()
  123. {
  124.    AM_led = 0;
  125.    PM_led = 1;
  126.    CLOCK_led = 1;
  127.    BUZZER = 1;
  128.    lcd_init();     //初始化液晶
  129.    key_init(); //初始化按键
  130.    T0_init();

  131. }

  132. /*******************************************************************/
  133. /* */
  134. /* 时间设定 */
  135. /* */
  136. /*******************************************************************/
  137. void SET_time()
  138. {
  139.      while(1)
  140.      {
  141.      if(set_hour == 0) //设置小时
  142.          {
  143.          delay(10);
  144.              if(set_hour == 0)
  145.              {
  146.              hour[1] ++;
  147.              if(hour[0] == '1'&& hour[1] == '2' )
  148.              {
  149.                  hour[0] = hour[1] = '0';
  150.                      AM_led = ~AM_led;
  151.                      PM_led = ~PM_led;
  152.                  }
  153.              if(hour[0] == '0'&&hour[1] > '9')
  154.              { hour[0] = '1';
  155.                  hour[1] = '0';
  156.                  }
  157.                  display(hour,min);
  158.              while(!set_hour);
  159.              }
  160.          }

  161.          if(set_min == 0) //设置分钟
  162.          {
  163.              delay(10);
  164.             if(set_min == 0)
  165.              {
  166.              min[1]++;
  167.                 if(min[0] == '5' && min[1] > '9')
  168.                  min[0] = min[1] = '0';
  169.                 if(min[0] < '5' && min[1] > '9')
  170.                  {min[0]++; min[1] = '0';}
  171.                 display(hour,min);
  172.              while(!set_min);
  173.              }

  174.          }
  175.         
  176.          if(set_time == 0)
  177.          {
  178.          delay(10);
  179.              if(set_time == 0)
  180.              {
  181.              T0_init();
  182.                  TR0 = ~TR0;
  183.                  break;
  184.              }
  185.          }
  186.         
  187.      }
  188. }
  189. /*******************************************************************/
  190. /* */
  191. /* 闹钟设定 */
  192. /* */
  193. /*******************************************************************/
  194. void SET_clock()
  195. {
  196.     while(1)
  197.     {
  198.      if(set_hour == 0) //设置小时
  199.          {
  200.          delay(10);
  201.              if(set_hour == 0)
  202.              {
  203.              clock_hour[1] ++;
  204.              if(clock_hour[0] == '1'&& clock_hour[1] == '2' )
  205.                  clock_hour[0] = clock_hour[1] = '0';    
  206.              if(clock_hour[0] == '0'&&clock_hour[1] > '9')
  207.              { clock_hour[0] = '1';
  208.                  clock_hour[1] = '0';
  209.                  }
  210.                  display(clock_hour,clock_min);
  211.              while(!set_hour);
  212.              }
  213.          }

  214.          if(set_min == 0) //设置分钟
  215.          {
  216.              delay(10);
  217.             if(set_min == 0)
  218.              {
  219.              clock_min[1]++;
  220.                 if(clock_min[0] == '5' && clock_min[1] > '9')
  221.                  clock_min[0] = clock_min[1] = '0';
  222.                 if(clock_min[0] < '5' && clock_min[1] > '9')
  223.                  {clock_min[0]++; clock_min[1] = '0';}
  224.                 display(clock_hour,clock_min);
  225.              while(!set_min);
  226.              }

  227.          }
  228.         
  229.          if(set_time == 0)
  230.          {
  231.          delay(10);
  232.              if(set_time == 0)
  233.              {
  234.              display(hour,min);
  235.                  break;
  236.              }
  237.          }
  238.         
  239.     }
  240. }
  241. /*******************************************************************/
  242. /* */
  243. /* 主程序 */
  244. /* */
  245. /*******************************************************************/
  246. void main()
  247. {
  248.    init();
  249.    TR0 = 0;
  250.    while(1)
  251.    {
  252.        display(hour,min);
  253.     
  254.      if (flag_clock == 0) //查看是否到达闹钟时间
  255.      {
  256.      if(hour[0] == clock_hour[0] && hour[1] == clock_hour[1] && min[0] == clock_min[0] && min[1] == clock_min[1] )
  257.          {
  258.          BUZZER = 1; //蜂鸣器响
  259.              delay(10);
  260.              BUZZER = 0;
  261.          }
  262.          else
  263.          BUZZER = 1;
  264.      }
  265.      else
  266.      BUZZER = 1;
  267.     
  268.      if(on_clock == 0) //开闹钟
  269.      {
  270.           delay(10);
  271.          if(on_clock == 0)
  272.          {
  273.               flag_clock=0; //开闹钟
  274.              CLOCK_led = 0;
  275.          }
  276.      }
  277.      if(off_clock == 0) //关闹钟
  278.      {
  279.      delay(10);
  280.          if(off_clock == 0)
  281.          {
  282.              flag_clock = 1;     //关闹钟
  283.              CLOCK_led = 1;
  284.             }
  285.      }

  286.      if(set_time == 0) //设置时间
  287.      {
  288.      delay(10);
  289.          if(set_time == 0)
  290.          {
  291.          TR0 = ~TR0;
  292.              while(!set_time);
  293.          }
  294.      }
  295.        if(TR0 == 0)
  296.      {
  297.      SET_time();
  298.      }


  299.      if(set_clock == 0) //设置闹钟
  300.      {
  301.           delay(10);
  302.          if(set_clock == 0)
  303.          {
  304.               display(clock_hour,clock_min); //显示闹钟时间
  305.                 SET_clock();
  306.                 while(!set_clock);
  307.          }
  308.      }


  309.    }
  310. }
  311. /*******************************************************************/
  312. /* */
  313. /* 中断处理子程序 */
  314. /* */
  315. /*******************************************************************/
  316. void T0_timer() interrupt 1
  317. {
  318.      TH0 = (65536 - 46080)/256;     //定时50ms
  319.      TL0 = (65536 - 46080)%256;
  320.      num ++;
  321.     
  322.      if(num == 1200) //1分钟
  323.      {
  324.      num = 0;
  325.      min[1]++;
  326.      if(min[1] > '9')
  327.      {
  328.      min[1] = '0';
  329.          min[0] ++;
  330.          if (min[0] == '6')
  331.          {
  332.          min[0] = '0';
  333.              hour[1]++;
  334.              if(hour[0] == '1'&& hour[1] == '2' )
  335.              {
  336.                  hour[0] = hour[1] = '0';
  337.                      AM_led = ~AM_led;
  338.                      PM_led = ~PM_led;
  339.                  }
  340.              if(hour[0] == '0'&&hour[1] > '9')
  341.              { hour[0] = '1';
  342.                  hour[1] = '0';
  343.                  }
  344.          }
  345.      }
  346.      }
  347. }



 



阅读(1670) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~