找回密码
 立即注册

QQ登录

只需一步,快速开始

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

1602液晶时间闹钟显示仿真+单片机源码

[复制链接]
ID:289258 发表于 2018-10-28 16:04 | 显示全部楼层 |阅读模式
采用定时器做时钟,可调整时间和设定闹钟
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
1602时间显示.png

单片机源程序如下:
  1. #include <reg52.h>
  2. #include "LCD.h"
  3. #include <intrins.h>
  4. #define uint unsigned int
  5. #define uchar unsigned char

  6. sbit LCD_RS = P2^0;
  7. sbit LCD_RW = P2^1;
  8. sbit LCD_EN = P2^2;
  9. sbit Buzzer = P2^3;
  10. sbit Start = P3^0;
  11. sbit Channg = P3^1;
  12. sbit Up                 = P3^2;
  13. sbit Down         = P3^3;
  14. uchar Cursor;
  15. uint Year=2018,Mon=8,Day=8,Hour = 8,Min = 8,Sec = 8;
  16. uint Clock_Year,Clock_Mon,Clock_Day,Clock_Hour,Clock_Min,Clock_Sec;                //闹钟时间设定
  17. uint Count;
  18. bit Clock_Flag=0;
  19. bit Buzzer_Flag;
  20. bit Screen_Flag = 1;

  21. void Timer0Init(void)                //10毫秒@12.000MHz
  22. {
  23.         TMOD &= 0xF0;                //设置定时器模式
  24.         TMOD |= 0x01;                //设置定时器模式
  25.         TL0 = 0xF0;                //设置定时初值
  26.         TH0 = 0xD8;                //设置定时初值
  27.         TF0 = 0;                //清除TF0标志
  28.         ET0 = 1;
  29.         EA = 1;
  30.         TR0 = 1;
  31. }

  32. void SysInit()
  33. {
  34.         LcdInit();
  35.                 Timer0Init();
  36.         LcdWriteStr(1,3,"Current Time");
  37.         LcdWriteStr(2,1,"2018-10-01-12-15");
  38. }

  39. void Display_Screen_1(uint Year_1,uint Mon_1,uint Day_1,uint Hour_1,uint Min_1)
  40. {
  41.         LcdWriteStr(2,1,"0000-00-00-00-00");
  42.         LcdWriteNum(2,1,Year_1);
  43.         LcdWriteNum(2,6,Mon_1);
  44.         LcdWriteNum(2,9,Day_1);                                               
  45.         LcdWriteNum(2,12,Hour_1);
  46.         LcdWriteNum(2,15,Min_1);
  47. }
  48. bit Set_Time()
  49. {
  50.         LcdClear();
  51.         LcdWriteStr(1,3,"Set Time");
  52.         LcdWriteStr(2,1,"2018-08-12-08-08");
  53.         LcdWriteCom(0xc0);
  54.         Lcd1602_Delay1ms(10);
  55.         LcdWriteCom(0x0f);                //光标闪烁
  56.         Cursor = 1;
  57.         while(1)
  58.         {
  59.                 if(Up == 0)
  60.                 {
  61.                         Lcd1602_Delay1ms(10);
  62.                         if(Up == 0)
  63.                         {
  64.                                 while(Up ==0);
  65.                                 if(Cursor == 1)
  66.                                 {
  67.                                         Year++;
  68.                                         LcdWriteNum(2,1,Year);       
  69.                                         Lcd1602_Delay1ms(10);
  70.                                         LcdWriteCom(0xc0+0);                                       
  71.                                 }
  72.                                 if(Cursor == 2)
  73.                                 {
  74.                                         Mon++;
  75.                                         if(Mon == 13)Mon=12;
  76.                                         LcdWriteNum(2,6,Mon);       
  77.                                         Lcd1602_Delay1ms(10);
  78.                                         LcdWriteCom(0xc0+5);                                       
  79.                                 }
  80.                                 if(Cursor == 3)
  81.                                 {
  82.                                         Day++;
  83.                                         if(Day == 32)Day=31;
  84.                                         LcdWriteNum(2,9,Day);       
  85.                                         Lcd1602_Delay1ms(10);
  86.                                         LcdWriteCom(0xc0+8);                                       
  87.                                 }
  88.                                 if(Cursor == 4)
  89.                                 {
  90.                                         Hour++;
  91.                                         if(Hour == 25)Hour=24;
  92.                                         LcdWriteNum(2,12,Hour);       
  93.                                         Lcd1602_Delay1ms(10);
  94.                                         LcdWriteCom(0xc0+11);                                       
  95.                                 }
  96.                                 if(Cursor == 5)
  97.                                 {
  98.                                         Min++;
  99.                                         if(Min == 60)Min=59;
  100.                                         LcdWriteNum(2,15,Min);       
  101.                                         Lcd1602_Delay1ms(10);
  102.                                         LcdWriteCom(0xc+14);                                       
  103.                                 }
  104.                         }
  105.                 }
  106.                 if(Down == 0)
  107.                 {
  108.                         Lcd1602_Delay1ms(10);
  109.                         if(Down == 0)
  110.                         {
  111.                                 while(Down ==0);
  112.                                 if(Cursor == 1)
  113.                                 {
  114.                                         Year--;
  115.                                         LcdWriteNum(2,1,Year);       
  116.                                         Lcd1602_Delay1ms(10);
  117.                                         LcdWriteCom(0xc0+0);                                       
  118.                                 }
  119.                                 if(Cursor == 2)
  120.                                 {
  121.                                         Mon--;
  122.                                         if(Mon == 0)Mon=1;
  123.                                         LcdWriteNum(2,6,Mon);       
  124.                                         Lcd1602_Delay1ms(10);
  125.                                         LcdWriteCom(0xc0+5);                                       
  126.                                 }
  127.                                 if(Cursor == 3)
  128.                                 {
  129.                                         Day--;
  130.                                         if(Day == 0)Day=1;
  131.                                         LcdWriteNum(2,9,Day);       
  132.                                         Lcd1602_Delay1ms(10);
  133.                                         LcdWriteCom(0xc0+8);                                       
  134.                                 }
  135.                                 if(Cursor == 4)
  136.                                 {
  137.                                        
  138.                                         if(Hour>0)Hour--;
  139.                                         else Hour = 0;
  140.                                         LcdWriteNum(2,12,Hour);       
  141.                                         Lcd1602_Delay1ms(10);
  142.                                         LcdWriteCom(0xc0+11);                                       
  143.                                 }
  144.                                 if(Cursor == 5)
  145.                                 {
  146.                                         if(Min>0)Min--;
  147.                                         else Min = 0;
  148.                                         LcdWriteNum(2,15,Min);       
  149.                                         Lcd1602_Delay1ms(10);
  150.                                         LcdWriteCom(0xc+14);                                       
  151.                                 }
  152.                         }
  153.                 }
  154.                         if(Channg == 0)
  155.                         {
  156.                                 Lcd1602_Delay1ms(10);
  157.                                 if(Channg == 0)
  158.                                 {
  159.                                         while(Channg == 0);                                       
  160.                                         Cursor++;
  161.                                         if(Cursor == 6)Cursor = 1;
  162.                                         if(Cursor == 1)LcdWriteCom(0xc0+0);
  163.                                         if(Cursor == 2)LcdWriteCom(0xc0+5);
  164.                                         if(Cursor == 3)LcdWriteCom(0xc0+8);
  165.                                         if(Cursor == 4)LcdWriteCom(0xc0+11);
  166.                                         if(Cursor == 5)LcdWriteCom(0xc0+14);
  167.                                         Lcd1602_Delay1ms(10);
  168.                                 }       
  169.                         }
  170.                         if(Start == 0)
  171.                         {
  172.                                 Lcd1602_Delay1ms(10);
  173.                                 if(Start == 0)
  174.                                 {
  175.                                         while(Start == 0);
  176.                                         LcdWriteCom(0x0C);                //关闭光标闪烁
  177.                                         return 1;                               
  178.                                 }
  179.                                
  180.                         }
  181.                
  182.         }
  183. }

  184. bit Set_Clock()
  185. {
  186.         LcdClear();
  187.         LcdWriteStr(1,3,"Set Clock  ON");
  188.         LcdWriteStr(2,1,"2018-08-12-08-08");
  189.         Display_Screen_1(Clock_Year,Clock_Mon,Clock_Day,Clock_Hour,Clock_Min);
  190.         LcdWriteCom(0xc0);
  191.         Lcd1602_Delay1ms(10);
  192.         LcdWriteCom(0x0f);                //光标闪烁
  193.         Cursor = 1;
  194.         while(1)
  195.         {
  196.                 if(Up == 0)
  197.                 {
  198.                         Lcd1602_Delay1ms(10);
  199.                         if(Up == 0)
  200.                         {
  201.                                 while(Up ==0);
  202.                                 if(Cursor == 1)
  203.                                 {
  204.                                         Clock_Year++;
  205.                                         LcdWriteNum(2,1,Clock_Year);       
  206.                                         Lcd1602_Delay1ms(10);
  207.                                         LcdWriteCom(0xc0+0);                                       
  208.                                 }
  209.                                 if(Cursor == 2)
  210.                                 {
  211.                                         Clock_Mon++;
  212.                                         if(Mon == 13)Clock_Mon=12;
  213.                                         LcdWriteNum(2,6,Clock_Mon);       
  214.                                         Lcd1602_Delay1ms(10);
  215.                                         LcdWriteCom(0xc0+5);                                       
  216.                                 }
  217.                                 if(Cursor == 3)
  218.                                 {
  219.                                         Clock_Day++;
  220.                                         if(Clock_Day == 32)Clock_Day=31;
  221.                                         LcdWriteNum(2,9,Clock_Day);       
  222.                                         Lcd1602_Delay1ms(10);
  223.                                         LcdWriteCom(0xc0+8);                                       
  224.                                 }
  225.                                 if(Cursor == 4)
  226.                                 {
  227.                                         Clock_Hour++;
  228.                                         if(Clock_Hour == 25)Clock_Hour=24;
  229.                                         LcdWriteNum(2,12,Clock_Hour);       
  230.                                         Lcd1602_Delay1ms(10);
  231.                                         LcdWriteCom(0xc0+11);                                       
  232.                                 }
  233.                                 if(Cursor == 5)
  234.                                 {
  235.                                         Clock_Min++;
  236.                                         if(Clock_Min == 60)Clock_Min=59;
  237.                                         LcdWriteNum(2,15,Clock_Min);       
  238.                                         Lcd1602_Delay1ms(10);
  239.                                         LcdWriteCom(0xc+14);                                       
  240.                                 }
  241.                                 if(Cursor == 6)
  242.                                 {
  243.                                         Clock_Flag = 1;
  244.                                         LcdWriteStr(1,14,"ON ");
  245.                                         LcdWriteCom(0x80+13);
  246.                                 }
  247.                         }
  248.                 }
  249.                 if(Down == 0)
  250.                 {
  251.                         Lcd1602_Delay1ms(10);
  252.                         if(Down == 0)
  253.                         {
  254.                                 while(Down ==0);
  255.                                 if(Cursor == 1)
  256.                                 {
  257.                                         Clock_Year--;
  258.                                         LcdWriteNum(2,1,Clock_Year);       
  259.                                         Lcd1602_Delay1ms(10);
  260.                                         LcdWriteCom(0xc0+0);                                       
  261.                                 }
  262.                                 if(Cursor == 2)
  263.                                 {
  264.                                         Clock_Mon--;
  265.                                         if(Clock_Mon == 0)Clock_Mon=1;
  266.                                         LcdWriteNum(2,6,Clock_Mon);       
  267.                                         Lcd1602_Delay1ms(10);
  268.                                         LcdWriteCom(0xc0+5);                                       
  269.                                 }
  270.                                 if(Cursor == 3)
  271.                                 {
  272.                                         Clock_Day--;
  273.                                         if(Clock_Day == 0)Clock_Day=1;
  274.                                         LcdWriteNum(2,9,Clock_Day);       
  275.                                         Lcd1602_Delay1ms(10);
  276.                                         LcdWriteCom(0xc0+8);                                       
  277.                                 }
  278.                                 if(Cursor == 4)
  279.                                 {
  280.                                        
  281.                                         if(Clock_Hour>0)Clock_Hour--;
  282.                                         else Clock_Hour = 0;
  283.                                         LcdWriteNum(2,12,Clock_Hour);       
  284.                                         Lcd1602_Delay1ms(10);
  285.                                         LcdWriteCom(0xc0+11);                                       
  286.                                 }
  287.                                 if(Cursor == 5)
  288.                                 {
  289.                                         if(Clock_Min>0)Clock_Min--;
  290.                                         else Clock_Min = 0;
  291.                                         LcdWriteNum(2,15,Clock_Min);       
  292.                                         Lcd1602_Delay1ms(10);
  293.                                         LcdWriteCom(0xc+14);                                       
  294.                                 }
  295.                                 if(Cursor == 6)
  296.                                 {
  297.                                         Clock_Flag = 0;
  298.                                         LcdWriteStr(1,14,"OFF");
  299.                                         LcdWriteCom(0x80+13);
  300.                                 }
  301.                         }
  302.                 }
  303.                         if(Channg == 0)
  304.                         {
  305.                                 Lcd1602_Delay1ms(10);
  306.                                 if(Channg == 0)
  307.                                 {
  308.                                         while(Channg == 0);                                       
  309.                                         Cursor++;
  310.                                         if(Cursor == 7)Cursor = 1;
  311.                                         if(Cursor == 1)LcdWriteCom(0xc0+0);
  312.                                         if(Cursor == 2)LcdWriteCom(0xc0+5);
  313.                                         if(Cursor == 3)LcdWriteCom(0xc0+8);
  314.                                         if(Cursor == 4)LcdWriteCom(0xc0+11);
  315.                                         if(Cursor == 5)LcdWriteCom(0xc0+14);
  316.                                         if(Cursor == 6)LcdWriteCom(0x80+13);                //闹钟开关显示
  317.                                         Lcd1602_Delay1ms(10);
  318.                                 }       
  319.                         }
  320.                         if(Start == 0)
  321.                         {
  322.                                 Lcd1602_Delay1ms(10);
  323.                                 if(Start == 0)
  324.                                 {
  325.                                         while(Start == 0);
  326.                                         return 1;                               
  327.                                 }                       
  328.                         }       
  329.         }
  330. }

  331. void Scan()
  332. {
  333.         if(Start == 0)
  334.         {
  335.                 Lcd1602_Delay1ms(10);
  336.                 if(Start == 0)
  337.                 {
  338.                         Screen_Flag = 0;                //关闭定时器显示时间
  339.                         Cursor = 1;                //设置光标
  340.                         while(Start ==0);
  341.                         LcdClear();
  342.                         LcdWriteStr(1,1,">");
  343.                         LcdWriteStr(1,3,"Set Time");
  344.                         LcdWriteStr(2,3,"Set Clock");
  345.                         while(1)
  346.                         {
  347.                                 if(Channg == 0)
  348.                                 {
  349.                                         Lcd1602_Delay1ms(10);
  350.                                         if(Channg == 0)
  351.                                         {       
  352.                                                 while(Channg == 0);                                               
  353.                                                 Cursor++;
  354.                                                 if(Cursor==3)Cursor=1;
  355.                                                 if(Cursor == 1)
  356.                                                 {
  357.                                                         LcdWriteStr(1,1,">");
  358.                                                         LcdWriteStr(2,1," ");                                                       
  359.                                                 }
  360.                                                 if(Cursor == 2)
  361.                                                 {
  362.                                                         LcdWriteStr(1,1," ");
  363.                                                         LcdWriteStr(2,1,">");                                                       
  364.                                                 }
  365.                                                        
  366.                                         }
  367.                                 }
  368.                                 if(Start == 0)
  369.                                 {
  370.                                         Lcd1602_Delay1ms(10);
  371.                                         if(Start == 0)
  372.                                         {
  373.                                                 while(Start == 0);
  374.                                                 if(Cursor == 1)
  375.                                                 {
  376.                                                         if(Set_Time())
  377.                                                         {
  378.                                                                 LcdWriteCom(0x0C);                //关闭光标闪烁
  379.                                                                 Screen_Flag = 1;                //打开定时器时间显示
  380.                                                                 LcdClear();
  381.                                                                 LcdWriteStr(1,3,"Current Time");
  382.                                                                 Display_Screen_1(Year,Mon,Day,Hour,Min);
  383.                                                                 return;
  384.                                                         }
  385.                                                        
  386.                                                 }
  387.                                                 else
  388.                                                 {
  389.                                                         if(Set_Clock())
  390.                                                         {
  391.                                                                 LcdWriteCom(0x0C);                //关闭光标闪烁
  392.                                                                 Screen_Flag = 1;                //打开定时器时间显示
  393.                                                                 LcdClear();
  394.                                                                 LcdWriteStr(1,3,"Current Time");
  395.                                                                 Display_Screen_1(Year,Mon,Day,Hour,Min);
  396.                                                                 return;
  397.                                                         }
  398.                                                        
  399.                                                 }
  400.                                         }
  401.                                        
  402.                                 }
  403.                                
  404.                         }
  405.                        
  406.                 }
  407.                        
  408.         }
  409.         if(Channg == 0)
  410.         {
  411.                 Lcd1602_Delay1ms(10);
  412.                 if(Channg = 0)
  413.                 {
  414.                                 while(Channg ==0);
  415.                                 Buzzer_Flag = 0;
  416.                        
  417.                 }
  418.         }

  419. }

  420. void main()
  421. {
  422.         SysInit();
  423.         while(1)
  424.         {
  425.                 Scan();
  426.         }

  427. }

  428. void Time0()                interrupt 1                //10毫秒@11.0592MHz
  429. {
  430.         TL0 = 0xF0;                //设置定时初值
  431.         TH0 = 0xD8;                //设置定时初值
  432.         Count++;
  433.         if(Count == 100)
  434.         {
  435.                 Count = 0;
  436.                 Sec++;
  437.                 if(Sec == 60)
  438.                 {
  439.                         Sec = 0;
  440.                         Min++;
  441.                         if(Min == 60)
  442.                         {
  443.                                 Min = 0;
  444.                                 Hour++;
  445.                                 if(Hour == 25)
  446.                                 {
  447.                                         Hour = 0;
  448.                                         Day++;
  449.                                         if(Day == 32)
  450.                                         {
  451.                                                 Day = 1;
  452.                                                 Mon++;
  453.                                                 if(Mon == 32)
  454.                                                 {
  455.                                                         Mon = 1;
  456.                                                         Year++;                                                       
  457.                                                 }
  458.                                         }
  459.                                 }
  460.                         }
  461.                         if(Screen_Flag)Display_Screen_1(Year,Mon,Day,Hour,Min);
  462.                 }
  463.         }
  464.         if(Clock_Flag)
  465.         {
  466.                 if(Clock_Min == Min)
  467.                 {
  468.                                 if(Clock_Hour == Hour)
  469.                                 {
  470.                                         if(Buzzer_Flag == 1)
  471.                                         {
  472.                                                 Buzzer = 0;
  473.                                         }
  474.                                         else
  475.                                                 Buzzer = 1;
  476.                                 }                       
  477.                 }
  478.                 else
  479.                         Buzzer_Flag = 1;
  480.         }
  481. }
复制代码

所有资料51hei提供下载:
1602时间闹钟显示.zip (101.22 KB, 下载次数: 92)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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