久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 500|回復(fù): 3
收起左側(cè)

基于51單片機(jī)的多功能萬年歷(定時器實(shí)現(xiàn))仿真程序

[復(fù)制鏈接]
ID:986591 發(fā)表于 2025-3-26 10:15 | 顯示全部樓層 |閱讀模式
要求:在LCD1602上實(shí)現(xiàn)年月日,時間的顯示;一個鬧鐘蜂鳴器提醒功能;一個倒計(jì)時功能
附件:keil程序+proteus 8.13 仿真
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.gif

仿真

仿真

單片機(jī)源程序如下:
  1. #include <reg52.h>
  2. #include "LCD1602.h" //LCD顯示文件

  3. #define uchar unsigned char
  4. #define uint  unsigned int
  5. #define ulong  unsigned long

  6. sbit BEEP=P1^0;//蜂鳴器
  7. sbit K1=P2^3;//設(shè)置時間按鍵
  8. sbit K2=P2^4;//+
  9. sbit K3=P2^5;//-
  10. sbit K4=P2^6;//設(shè)置鬧鐘按鍵
  11. sbit K5=P2^7;//倒計(jì)時按鍵

  12. int  year=2025;
  13. char month=3,day=17,h=8,min=29,s=50;//正常走時年月日時分秒
  14. char nh=23,nmin=30,ns=0;//鬧鐘 時分秒
  15. char dmin=1,ds=0;//倒計(jì)時 分秒

  16. uchar run;//平年閏年標(biāo)志 0為平年,1為閏年
  17. uchar count,tiaoJ;//中斷計(jì)數(shù)器與調(diào)節(jié)計(jì)數(shù)器
  18. uchar daymax;//每月最大天數(shù)
  19. uchar mode;//模式
  20. uchar count1;//作為倒計(jì)時進(jìn)入 開始 退出標(biāo)志
  21. bit stop;//倒計(jì)時停止標(biāo)志位

  22. void delay(uint x)//延時函數(shù)
  23. {
  24.     uchar i,j;
  25.     for(i=0;i++;i<x)
  26.         for(j=0;j++;j<256);
  27. }


  28. void travel_time()//走時函數(shù),包括平年閏年的計(jì)算
  29. {
  30.     if((year/4)==0 && (year)/100!=0 || (year)/400==0 )//閏年:能被4整除且不能被100整除,或能被400整除。
  31.     {
  32.         run=1;
  33.     }
  34.     else
  35.     {
  36.         run=0;
  37.     }
  38.     switch(month)
  39.     {
  40.         case 1 : daymax=31;  break;
  41.         case 2 : if(run==1) {daymax=29;}else {daymax=28;} break;
  42.         case 3 : daymax=31;  break;
  43.         case 4 : daymax=30;  break;
  44.         case 5 : daymax=31;  break;
  45.         case 6 : daymax=30;  break;
  46.         case 7 : daymax=31;  break;
  47.         case 8 : daymax=31;  break;
  48.         case 9 : daymax=30;  break;
  49.         case 10 :daymax=31;  break;
  50.         case 11 :daymax=30;  break;
  51.         case 12 :daymax=31;  break;
  52.     }
  53.     if(s==60)//走時限制
  54.     {
  55.         s=0;
  56.         min++;
  57.         if(min==60)
  58.         {
  59.             h++;
  60.             if(h==24)
  61.             {
  62.                 h=0;
  63.                 day++;
  64.                 if(day>daymax)
  65.                 {
  66.                    day=1;
  67.                    month++;
  68.                    if(month==13)
  69.                    {
  70.                        month=1;
  71.                        year++;
  72.                    }
  73.                 }
  74.             }
  75.         }
  76.     }
  77.     //規(guī)范非零值
  78.     if(s<0)
  79.     {
  80.         s=59;
  81.     }
  82.     if(min<0)
  83.     {
  84.         min=59;
  85.     }
  86.     if(h<0)
  87.     {
  88.         h=23;
  89.     }
  90.     if(day<0)
  91.     {
  92.       day=daymax;
  93.     }
  94.     if(month<0)
  95.     {
  96.         month=12;
  97.     }
  98.     if(year<0)
  99.     {
  100.         year=2025;
  101.     }
  102. }

  103. void Countdown_time()//倒計(jì)時走時
  104. {
  105.     if(ds<0)
  106.     {
  107.         if(dmin!=0 && ds<0)
  108.                 {
  109.             if(stop==0)
  110.             {
  111.                 ds=59;
  112.                 LCD_ShowChar(2,12,' ');
  113.                 dmin--;   
  114.             }
  115.                         if(dmin<0 && stop==1)
  116.                         {
  117.                 dmin=0;
  118.                         }
  119.                 }
  120.         }
  121. }


  122. void keyscanf()
  123. {
  124.     if(K1==0)
  125.     {
  126.         delay(5);//消抖
  127.         if(K1==0)
  128.         {
  129.            switch(mode)
  130.            {
  131.                case 0 :{TR0=0;count=0;tiaoJ++;}break;
  132.                default:{tiaoJ++;}break;
  133.            }
  134.         }
  135.         while(K1==0);//松手檢測
  136.     }
  137.     if(K2==0)
  138.     {
  139.         delay(5);//消抖
  140.         if(K2==0)
  141.         {
  142.            if(mode==0)//正常走時模式
  143.            {
  144.                 switch(tiaoJ)
  145.                 {
  146.                     case 1 : s++;if(s>59)s=0; break;
  147.                     case 2 : min++;if(min>59)min=0;break;
  148.                     case 3 : h++; if(h>23)h=0;break;
  149.                     case 4 : day++;if(day>daymax)day=1; break;
  150.                     case 5 : month++;if(month>12)month=1;break;
  151.                     case 6 : year++; break;
  152.                 }
  153.             }
  154.            if(mode==1)//鬧鐘設(shè)置模式
  155.            {
  156.                switch(tiaoJ)
  157.                 {
  158.                     case 1 : ns++;if(ns>59)ns=0; break;
  159.                     case 2 : nmin++;if(nmin>59)nmin=0;break;
  160.                     case 3 : nh++; if(nh>23)nh=0;break;
  161.                 }
  162.            }
  163.            if(mode==2)//倒計(jì)時設(shè)置模式
  164.            {
  165.                switch(tiaoJ)
  166.                 {
  167.                     case 1 : ds++;if(ds>59)ds=0; break;
  168.                     case 2 : dmin++;if(dmin>59)dmin=0;break;
  169.                 }
  170.            }
  171.         }
  172.         while(K2==0);//松手檢測
  173.     }
  174.     if(K3==0)
  175.     {
  176.         delay(5);//消抖
  177.         if(K3==0)
  178.         {
  179.            if(mode==0)//正常走時模式
  180.            {
  181.                switch(tiaoJ)
  182.                {
  183.                    case 1 : s--;if(s<0)s=59; break;
  184.                    case 2 : min--;if(min<0)min=59; break;
  185.                    case 3 : h--;if(h<0)h=23; break;
  186.                    case 4 : day--;if(day<0)day=daymax; break;
  187.                    case 5 : month--;if(month<0)month=12; break;
  188.                    case 6 : year--;if(year<0)year=2025; break;
  189.                }
  190.            }
  191.            if(mode==1)//鬧鐘設(shè)置模式
  192.            {
  193.                switch(tiaoJ)
  194.                {
  195.                    case 1 : ns--;if(ns<0)ns=59; break;
  196.                    case 2 : nmin--;if(nmin<0)nmin=59; break;
  197.                    case 3 : nh--;if(nh<0)nh=23; break;
  198.                }
  199.            }
  200.            if(mode==2)//鬧鐘設(shè)置模式
  201.            {
  202.                switch(tiaoJ)
  203.                {
  204.                    case 1 : ds--;if(ds<0)ds=59; break;
  205.                    case 2 : dmin--;if(dmin<0)dmin=59; break;
  206.                }
  207.            }
  208.         }
  209.         while(K3==0);//松手檢測
  210.     }
  211.     if(K4==0)
  212.     {
  213.         delay(5);//消抖
  214.         if(K4==0)
  215.         {
  216.            mode=!mode;
  217.            BEEP=1;
  218.            tiaoJ=0;
  219.         }
  220.         while(K4==0);//松手檢測
  221.     }
  222.     if(K5==0)
  223.     {
  224.         delay(5);//消抖
  225.         if(K5==0)
  226.         {
  227.            count1++;
  228.            tiaoJ=0;
  229.            count=0;
  230.            switch(count1)
  231.            {
  232.                case 1 : mode=2;TR0=0;dmin=1;ds=0;break;//進(jìn)入
  233.                case 2 : TR0=1;break;                   //開始
  234.                case 3 : mode=0;count=0;stop=0;count1=0;break;//退出
  235.            }
  236.         }
  237.         while(K5==0);//松手檢測
  238.     }
  239. }

  240. void Sans_Pd()//閃爍位置判斷,與調(diào)節(jié)時間標(biāo)志清除
  241. {
  242.     if(nmin==min && nh==h && mode==0)//鬧鐘判斷
  243.     {
  244.         BEEP=0;//蜂鳴器鳴叫,不管就是一分鐘后自動關(guān)閉,提前關(guān)閉按K4進(jìn)入設(shè)置改時間
  245.     }
  246.     else
  247.     {
  248.         BEEP=1;
  249.     }
  250.     if(mode==0)
  251.     {
  252.         switch(tiaoJ)//閃爍位置設(shè)置
  253.         {
  254.             case 1 : LCD_ShowString(2,10,"  ");delay(2000); break;
  255.             case 2 : LCD_ShowString(2,7,"  ");delay(2000); break;
  256.             case 3 : LCD_ShowString(2,4,"  ");delay(2000); break;
  257.             case 4 : LCD_ShowString(1,11,"  ");delay(2000); break;
  258.             case 5 : LCD_ShowString(1,8,"  ");delay(2000);break;
  259.             case 6 : LCD_ShowString(1,3,"    ");delay(2000); break;
  260.         }
  261.         if(tiaoJ==7)
  262.         {
  263.             tiaoJ=0;
  264.             TR0=1;//打開定時器
  265.         }
  266.     }
  267.     if(mode==1)//鬧鐘設(shè)置時間時閃爍條件
  268.     {
  269.         switch(tiaoJ)//閃爍位置設(shè)置
  270.         {
  271.             case 1 : LCD_ShowString(2,10,"  ");delay(2000); break;
  272.             case 2 : LCD_ShowString(2,7,"  ");delay(2000); break;
  273.             case 3 : LCD_ShowString(2,4,"  ");delay(2000); break;
  274.         }
  275.         if(tiaoJ==4)
  276.         {
  277.             tiaoJ=1;
  278.         }
  279.     }
  280.     if(mode==2)//倒計(jì)時設(shè)置時間時閃爍條件
  281.     {
  282.         switch(tiaoJ)//閃爍位置設(shè)置
  283.         {
  284.             case 1 : LCD_ShowString(2,10,"  ");delay(2000); break;
  285.             case 2 : LCD_ShowString(2,7,"  ");delay(2000); break;
  286.         }
  287.         if(tiaoJ==3)
  288.         {
  289.             tiaoJ=1;
  290.         }  
  291.     }
  292. }

  293. void LCD_GUI1()//萬年歷時間顯示函數(shù)
  294. {
  295.     //第一行,年月日
  296.     LCD_ShowSignedNum(1,3,year,4);
  297.     LCD_ShowChar(1,7,'/');
  298.     LCD_ShowSignedNum(1,8,month,2);
  299.     LCD_ShowChar(1,10,'/');
  300.     LCD_ShowSignedNum(1,11,day,2);
  301.     LCD_ShowString(1,13,"    ");
  302.     //第二行,時分秒
  303.     LCD_ShowSignedNum(2,4,h,2);
  304.     LCD_ShowChar(2,6,':');
  305.     LCD_ShowSignedNum(2,7,min,2);
  306.     LCD_ShowChar(2,9,':');
  307.     LCD_ShowSignedNum(2,10,s,2);
  308.    
  309. }


  310. void LCD_GUI2()//鬧鐘模式下的顯示函數(shù)
  311. {
  312.     //第一行,年月日
  313.     LCD_ShowString(1,3,"Alarm mode:");
  314.     //第二行,時分秒 nh,nmin,ns;
  315.     LCD_ShowSignedNum(2,4,nh,2);
  316.     LCD_ShowChar(2,6,':');
  317.     LCD_ShowSignedNum(2,7,nmin,2);
  318.     LCD_ShowChar(2,9,':');
  319.     LCD_ShowSignedNum(2,10,ns,2);
  320. }

  321. void LCD_GUI3()//鬧鐘模式下的顯示函數(shù)
  322. {
  323.     //第一行,年月日
  324.     LCD_ShowString(1,3,"Countdown mode:");
  325.     //第二行,時分秒 nh,nmin,ns;
  326.     LCD_ShowString(2,4,"   ");
  327.     LCD_ShowSignedNum(2,7,dmin,2);
  328.     LCD_ShowChar(2,9,':');
  329.     LCD_ShowSignedNum(2,10,ds,2);
  330. }
  331. void Timer0_Init()//定時器0初始化
  332. {
  333.         TMOD=0x01;
  334.         //50ms進(jìn)中斷
  335.         TH0=(65535-50000)/256;
  336.         TL0=(65535-50000)%256;
  337.         TR0=1;
  338.         EA=1;
  339.         ET0=1;
  340. }

  341. void main()
  342. {        
  343.     LCD_Init();//讓LCD1602準(zhǔn)備工作起來
  344.     Timer0_Init();//打開中斷,使能時鐘,設(shè)置隔多久進(jìn)一次中斷 服務(wù)函數(shù)
  345.     BEEP=1;//蜂鳴器不叫
  346.         while(1)
  347.         {         
  348.         keyscanf();//按鍵掃描
  349.         Sans_Pd();//閃爍判定
  350.         //萬年歷模式下
  351.         switch(mode)
  352.         {
  353.             case 0 : {travel_time();LCD_GUI1();delay(2000);}break;
  354.             case 1 : {LCD_GUI2();}break;
  355.             case 2 : {Countdown_time();LCD_GUI3();}break;
  356.         }
  357.     }
  358. }

  359. void Timer0_Routine() interrupt 1 //定時器0,中斷服務(wù)函數(shù)
  360. {
  361.     count++;
  362.     if(count==20)//1s
  363.     {
  364.         count=0;
  365.         if(mode==0)//正常走時
  366.             s++;
  367.         if(mode==2)//倒計(jì)時
  368.             if(dmin!=0 || ds!=0)
  369.                 ds--;
  370.             else
  371.             {
  372.                 stop=1;
  373.             }
  374.     }
  375. }
復(fù)制代碼

下載: C51_數(shù)字電子鐘.7z (224.42 KB, 下載次數(shù): 0)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復(fù)

使用道具 舉報(bào)

ID:60656 發(fā)表于 2025-4-4 17:34 | 顯示全部樓層
樓主,  8.13版顯示漢字亂碼你是怎么設(shè)置正常的
回復(fù)

使用道具 舉報(bào)

ID:1147156 發(fā)表于 2025-4-5 16:39 | 顯示全部樓層
keil怎么讓中文和英文字體分別設(shè)置?
回復(fù)

使用道具 舉報(bào)

ID:3802 發(fā)表于 2025-4-6 07:19 | 顯示全部樓層

keil怎么讓中文和英文字體分別設(shè)置?
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 超碰人人人 | 久久久久久久久国产成人免费 | 欧美精品在线一区 | 高清一区二区三区 | 免费一区二区三区 | 中文字幕一区在线 | 最新91在线 | 亚洲精品在线国产 | 国产一区二区三区在线看 | 亚洲一一在线 | 久久99久久| 国产精品久久久久久久久久了 | 天天久久 | 丝袜天堂 | 亚洲精选久久 | 免费国产一区二区 | 日韩网站在线观看 | 精品videossex高潮汇编 | 精品一区二区观看 | 久久久国产视频 | 欧美综合精品 | 91精品国产手机 | 日本午夜网| 精品视频一区二区三区 | 在线播放中文字幕 | 成人特级毛片 | 91视视频在线观看入口直接观看 | 久久噜噜噜精品国产亚洲综合 | 国产精品九九九 | 成年人视频在线免费观看 | 亚洲一区二区三区四区五区中文 | 成人一区二区三区在线观看 | av久久| 欧美一级片在线 | 亚洲三区在线观看 | 久久不射电影网 | av天天干 | 伊人久久免费 | 久久精品亚洲精品国产欧美 | 91在线精品视频 | 国产成人亚洲精品 |