找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机LCD1602显示的定时闹钟程序

[复制链接]
跳转到指定楼层
楼主
  1. #include<reg51.h>
  2. #include<lcd1602.h>


  3. #define uchar unsigned char
  4. #define uint unsigned int


  5. sbit key0=P1^0;
  6. sbit key1=P1^1;
  7. sbit key2=P1^2;
  8. sbit key3=P1^3;


  9. sbit buzzer=P2^5;
  10. sbit relay=P2^3;//buzzer & relay均为低电平工作


  11. sbit led=P2^4;
  12. sbit lamp=P2^5;


  13. uchar code date[]="  H.I.T. CHINA  ";
  14. uchar code time[]="  ALARM  23:58  ";
  15. uchar code bell[]="  ALARM    :    ";


  16. uchar second=40,minute=58,hour=23,counter=0;
  17. uchar bellminute=0,bellhour=0;
  18. uchar buzzerflag,clockflag;//若标志为1,则工作


  19. void ledshow()//led闪烁,标示程序开始运转
  20. {
  21.   uchar i;


  22.   for(i=0;i<=100;i++)
  23.   {
  24.     led=~led;
  25.         delay(5);
  26.   }
  27. }
  28. uchar keyscan()//键盘扫描
  29. {
  30.   uchar keyvalue,temp;
  31.   
  32.   keyvalue=0;
  33.   P1=0xff;
  34.   temp=P1;
  35.   if(~(P1&temp))
  36.   {
  37.     switch(temp)
  38.         {
  39.           case 0xfe:
  40.             keyvalue=1;
  41.             break;
  42.           case 0xfd:
  43.             keyvalue=2;
  44.             break;
  45.           case 0xfb:
  46.             keyvalue=3;
  47.             break;
  48.           case 0xf7:
  49.             keyvalue=4;
  50.             break;
  51.           default:
  52.             keyvalue=0;
  53.             break;
  54.         }
  55.   }


  56.   return keyvalue;
  57. }


  58. void clock_init()//lcd时钟写入初始化
  59. {
  60.   uchar i,j;


  61.   for(i=0;i<16;i++)
  62.   {
  63.     write_data(date[i]);[/i][i]
  64.   }
  65.   write_com(0x80+0x40);
  66.   for(j=0;j<16;j++)
  67.   {
  68.     write_data(time[j]);
  69.   }
  70. }


  71. void timer0_init()//中断初始化
  72. {
  73.   EA=1;
  74.   ET0=1;
  75.   TMOD=0x01;
  76.   TH0=0xd8;//每10m中断一次
  77.   TL0=0xf0;
  78.   TR0=1;
  79. }


  80. void clock_write()//时钟实时写入
  81. {
  82.   write_sfm(0x49,hour);
  83.   write_sfm(0x4c,minute);
  84. }


  85. void key_menu()//总键盘扫描函数
  86. {
  87.   unsigned char keyvalue_menu=0,keyvalue_change=0,i,j;


  88.   keyvalue_menu=keyscan();
  89.   if(keyvalue_menu)
  90.   {
  91.     if(keyvalue_menu==1)//按键1,走时停止,开始更改时钟值
  92.         {
  93.           while(~key0);//防抖
  94.           TR0=0;
  95.           do{
  96.             keyvalue_change=keyscan();
  97.                 if(keyvalue_change==1)//按下1键,更改小时
  98.                 {
  99.                   while(~key0);
  100.                   if(hour<23)
  101.                   {
  102.                     hour++;
  103.                   }
  104.                   else
  105.                   {
  106.             hour=0;
  107.                   }
  108.                 }
  109.                 else if(keyvalue_change==2)//按下2键,更改分钟
  110.                 {
  111.                   while(~key1);
  112.                   if(minute<59)
  113.                   {
  114.                     minute++;
  115.                   }
  116.                   else
  117.                   {
  118.             minute=0;
  119.                   }
  120.                 }
  121.                 else if(keyvalue_change==4)//按下4键,更改响铃方式
  122.                 {
  123.                   while(~key3);
  124.                   buzzerflag=~buzzerflag;
  125.                   if(buzzerflag)//闹铃运转,3声
  126.               {
  127.                 buzzer=0;
  128.                     delay(100);
  129.                     buzzer=1;
  130.                     delay(100);
  131.                     buzzer=0;
  132.                     delay(100);
  133.                     buzzer=1;
  134.                     delay(100);
  135.                     buzzer=0;
  136.                     delay(100);
  137.                     buzzer=1;
  138.                     delay(100);
  139.               }
  140.               else//闹铃关闭,1声
  141.               {
  142.                 buzzer=0;
  143.                     delay(100);
  144.                     buzzer=1;
  145.                     delay(100);
  146.               }
  147.                 }
  148.                 write_sfm(0x49,hour);
  149.         write_sfm(0x4c,minute);
  150.           }while(keyvalue_change!=3);//按下3键,从新开始走时
  151.           while(~key2==0);
  152.           TR0=1;//调整时间后从新开始走时
  153.         }
  154.         else if(keyvalue_menu==2)//按键2,走时继续,显示闹钟值
  155.         {
  156.           while(~key1);//防抖
  157.           do{
  158.             for(i=0;i<16;i++)
  159.         {
  160.           write_data(date[i]);[/i][i]
  161.         }
  162.           write_com(0x80+0x40);
  163.         for(j=0;j<16;j++)
  164.         {
  165.           write_data(bell[j]);
  166.         }
  167.                 write_sfm(0x49,bellhour);
  168.         write_sfm(0x4c,bellminute);
  169.                 keyvalue_change=keyscan();
  170.             }while(keyvalue_change!=3);//未完成设置前始终显示当前闹钟
  171.                 while(~key2);
  172.         }
  173.         else if(keyvalue_menu==3)//按键3,走时继续,设置闹钟值
  174.         {
  175.           while(~key2);
  176.           do{
  177.                 if(keyvalue_change==1)//按下1键,更改小时
  178.                 {
  179.                   while(~key0);
  180.                   if(bellhour<23)
  181.                   {
  182.                     bellhour++;
  183.                   }
  184.                   else
  185.                   {
  186.             bellhour=0;
  187.                   }
  188.                 }
  189.                 else if(keyvalue_change==2)//按下2键,更改分钟
  190.                 {
  191.                   while(~key1);
  192.                   if(bellminute<59)
  193.                   {
  194.                     bellminute++;
  195.                   }
  196.                   else
  197.                   {
  198.             bellminute=0;
  199.                   }
  200.                 }
  201.                 else if(keyvalue_change==4)//按下4键,更改响铃方式
  202.                 {
  203.                   while(~key3);
  204.                   buzzerflag=~buzzerflag;
  205.                   if(buzzerflag)//闹铃运转,3声
  206.               {
  207.                 buzzer=0;
  208.                     delay(100);
  209.                     buzzer=1;
  210.                     delay(100);
  211.                     buzzer=0;
  212.                     delay(100);
  213.                     buzzer=1;
  214.                     delay(100);
  215.                     buzzer=0;
  216.                     delay(100);
  217.                     buzzer=1;
  218.                     delay(100);
  219.               }
  220.               else//闹铃关闭,1声
  221.               {
  222.                 buzzer=0;
  223.                     delay(100);
  224.                     buzzer=1;
  225.                     delay(100);
  226.               }
  227.                 }
  228.                 for(i=0;i<16;i++)  //实时显示修改结果
  229.         {
  230.           write_data(date[i]);[/i][i]
  231.         }
  232.           write_com(0x80+0x40);
  233.         for(j=0;j<16;j++)
  234.         {
  235.           write_data(bell[j]);
  236.         }
  237.                 write_sfm(0x49,bellhour);
  238.         write_sfm(0x4c,bellminute);
  239.                 keyvalue_change=keyscan();
  240.           }while(keyvalue_change!=3);//按下3键,重新开始显示走时
  241.           while(~key2);//防抖
  242.         }
  243.         else if(keyvalue_menu==4)//按键4,关闭/开启闹钟
  244.         {
  245.           while(~key2);
  246.           clockflag=!clockflag;
  247.           if(clockflag)//闹钟运转,3声
  248.           {
  249. [color=#f4a460]            buzzer=0;[/color]
  250. [color=#f4a460]                delay(100);[/color]
  251. [color=#f4a460]                buzzer=1;[/color]
  252. [color=#f4a460]                delay(100);[/color]
  253. [color=#f4a460]                buzzer=0;[/color]
  254. [color=#f4a460]                delay(100);[/color]
  255. [color=#f4a460]                buzzer=1;[/color]
  256. [color=#f4a460]                delay(100);[/color]
  257. [color=#f4a460]                buzzer=0;[/color]
  258. [color=#f4a460]                delay(100);[/color]
  259. [color=#f4a460]                buzzer=1;[/color]
  260. [color=#f4a460]                delay(100);[/color]
  261.           }
  262.           else//闹钟关闭,1声
  263.           {
  264.             buzzer=0;
  265.                 delay(100);
  266.                 buzzer=1;
  267.                 delay(100);
  268.           }
  269.         }
  270.   }
  271. }


  272. void alarm_clock()
  273. {
  274.   if((minute==bellminute)&&(hour==bellhour)&&(clockflag))//闹钟打开且达到预设时间时启动闹钟
  275.   {
  276.     if(buzzerflag)//如果闹铃打开
  277.         {
  278.           relay=0;
  279.           buzzer=0;
  280.         }
  281.         else
  282.         {
  283.           relay=0;
  284.           buzzer=1;
  285.         }
  286.   }
  287.   else
  288.   {
  289.     relay=1;
  290.         buzzer=1;
  291.   }
  292. }


  293. void main()
  294. {
  295.   ledshow();//程序启动,led闪烁
  296.   init1602();//lcd初始化
  297.   clock_init();//时钟初始化
  298.   timer0_init();//中断初始化
  299.   while(1)
  300.   {
  301.     clock_write();
  302.         key_menu();
  303.         alarm_clock();
  304.   }
  305. }


  306. void timer0() interrupt 1
  307. {
  308.   if(counter<100)  //判断时间变换问题
  309.   {
  310.     counter++;
  311.   }
  312.   else
  313.   {
  314.     counter=0;
  315.         led=~led;
  316.         if(second<59)
  317.         {
  318.           second++;
  319.         }
  320.         else
  321.         {
  322.           second=0;
  323.           if(minute<59)
  324.           {
  325.             minute++;
  326.           }
  327.           else
  328.           {
  329.             minute=0;
  330.                 if(hour<23)
  331.                 {
  332.                   hour++;
  333.                 }
  334.                 else
  335.                 {
  336.                   hour=0;
  337.                 }
  338.           }
  339.         }
  340.   }
  341.   TH0=0xd8;//重新加载中断值
  342.   TL0=0xf0;
  343.   TR0=1;
  344. }
复制代码


51hei截图20200229145150.png (57.96 KB, 下载次数: 51)

2-36 LCD显示的定时闹钟

2-36 LCD显示的定时闹钟
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:819841 发表于 2020-10-12 23:48 来自手机 | 只看该作者
程序运行出错了~
回复

使用道具 举报

板凳
ID:875201 发表于 2021-1-8 10:19 | 只看该作者
这个L1 12V的在哪里的啊,我找了一遍没看到,博主看到回复一下我呗,我们要做设计。。
回复

使用道具 举报

地板
ID:875201 发表于 2021-1-8 10:20 | 只看该作者
那个L112V的元器件在哪里啊
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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