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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3919|回復: 3
打印 上一主題 下一主題
收起左側

單片機可調電子鐘proteus仿真

[復制鏈接]
跳轉到指定樓層
樓主
電子鐘仿真原理圖



所有資料下載:
電子鐘.rar (84.98 KB, 下載次數: 36)

單片機源碼預覽:
  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit lcdrs=P2^0;  //定義1602液晶RS端
  5. sbit lcden=P2^1;//定義1602液晶LCDEN端
  6. sbit lcdrw=P2^4; //定義1602液晶RW端
  7. sbit s1=P3^0;   //定義按鍵--功能鍵
  8. sbit s2=P3^1;        //定義按鍵--增加鍵
  9. sbit s3=P3^2;        //定義按鍵--減小鍵
  10. sbit s4=P3^3;        //定義按鍵--鬧鐘鍵
  11. sbit beep=P2^2; //定義蜂鳴器端
  12. sbit led=P2^3;  //定義LED燈端
  13. uchar count,s1num,s4num;
  14. char year,month,day,week,miao,shi,fen,pshi;
  15. uchar code table[]=" 20  -  -   ";//定義初始上電時液晶默認顯示狀態
  16. void delay(uint z)  //延時函數
  17. {
  18.         uint x,y;
  19.         for(x=z;x>0;x--)
  20.                 for(y=110;y>0;y--);
  21. }
  22. void zhuanhuan()
  23. {
  24.         if(shi==0)
  25.             pshi=12;
  26.         if(shi<=12&&shi>=1)
  27.             pshi=shi;
  28.     if(shi>12)
  29.             pshi=shi-12;                                          
  30. }                                                                                     
  31. void di()//蜂鳴器發聲函數
  32. {
  33.         beep=0;
  34.         delay(300);
  35.         beep=1;
  36.         delay(300);
  37. }
  38. void write_com(uchar com)//液晶寫命令函數
  39. {
  40.         lcdrs=0;
  41.         lcdrw=0;
  42.         P0=com;
  43.         delay(5);
  44.         lcden=1;
  45.         delay(5);
  46.         lcden=0;       
  47. }
  48. void write_date(uchar date)//液晶寫數據函數
  49. {
  50.         lcdrs=1;
  51.         lcdrw=0;
  52.         P0=date;
  53.         delay(5);
  54.         lcden=1;
  55.         delay(5);
  56.         lcden=0;       
  57. }
  58. void _shi()        //寫"AM"、"PM"函數
  59. {
  60.    if(shi>=12)
  61.    {
  62.          write_com(0x80+0x40+1);//寫出"PM"
  63.          write_date('P');
  64.          write_date('M');
  65.    }
  66.    else
  67.    {
  68.          write_com(0x80+0x40+1);//寫出"AM"
  69.          write_date('A');
  70.          write_date('M');
  71.    }
  72. }
  73. void write_ymd(uchar add1,uchar date1)//寫年月日函數
  74. {
  75.         uchar shi,ge;
  76.         shi=date1/10;//分解一個2位數的十位和個位
  77.         ge=date1%10;
  78.         write_com(0x80+add1);//設置顯示位置
  79.         write_date(0x30+shi);//送去液晶顯示十位
  80.         write_date(0x30+ge); //送去液晶顯示個位
  81. }
  82. void write_sfm(uchar add,uchar date)//寫時分秒函數
  83. {
  84.         uchar shi,ge;
  85.         shi=date/10;//分解一個2位數的十位和個位
  86.         ge=date%10;
  87.         write_com(0x80+0x40+add);//設置顯示位置
  88.         write_date(0x30+shi);//送去液晶顯示十位
  89.         write_date(0x30+ge); //送去液晶顯示個位
  90. }
  91. void write_week(char week)           //寫液晶星期顯示函數
  92. {
  93.         write_com(0x80+12);
  94.         switch(week)
  95.         {
  96.                 case 1:        write_date('M');delay(5);
  97.                                 write_date('O');delay(5);
  98.                                 write_date('N');
  99.                                 break;
  100.                 case 2:        write_date('T');delay(5);
  101.                                 write_date('U');delay(5);
  102.                                 write_date('E');
  103.                                 break;
  104.                 case 3:        write_date('W');delay(5);
  105.                                 write_date('E');delay(5);
  106.                                 write_date('D');
  107.                                 break;
  108.                 case 4:        write_date('T');delay(5);
  109.                                 write_date('H');delay(5);
  110.                                 write_date('U');
  111.                                 break;
  112.                 case 5:        write_date('F');delay(5);
  113.                                 write_date('R');delay(5);
  114.                                 write_date('I');
  115.                                 break;
  116.                 case 6:        write_date('S');delay(5);
  117.                                 write_date('A');delay(5);
  118.                                 write_date('T');
  119.                                 break;
  120.                 case 7:        write_date('S');delay(5);
  121.                                 write_date('U');delay(5);
  122.                                 write_date('N');
  123.                                 break;
  124.         }
  125. }
  126. void writeym()
  127. {
  128.    day=1;
  129.    month++;
  130.    if(month==13)
  131.    {
  132.          month=1;
  133.          year++;
  134.          if(year==100)
  135.             year=0;
  136.          write_ymd(3,year);//年若變化則重新寫入
  137.         }
  138.         write_ymd(6,month);//月若變化則重新寫入
  139. }
  140. void init()//初始化函數
  141. {
  142.     uchar num;
  143.         lcden=0;
  144.         year=15;//初始化種變量值
  145.         month=6;
  146.         day=27;
  147.         week=6;
  148.         shi=13;
  149.         fen=59;
  150.         miao=58;
  151.         count=0;
  152.         s1num=0;
  153.         s4num=0;
  154.         write_com(0x38);//初始化1602液晶
  155.         write_com(0x0c);//設置開顯示,不顯示光標
  156.         write_com(0x06); //寫一個字符后地址加1
  157.         write_com(0x01);   //顯示清0,數據指針清0
  158.         write_com(0x80);//設置顯示初始坐標
  159.         for(num=0;num<15;num++)//顯示年月日星期
  160.         {
  161.                 write_date(table[num]);
  162.                 delay(5);
  163.         }
  164.                 delay(5);
  165.                 write_com(0x80+0x40+6);//寫出時間顯示部分的兩個":"
  166.                 write_date(':');
  167.                 delay(5);
  168.                 write_com(0x80+0x40+9);
  169.                 write_date(':');
  170.                 delay(5);
  171.         write_week(week);
  172.         write_ymd(3,year);//分別送去液晶顯示
  173.         write_ymd(6,month);
  174.         write_ymd(9,day);
  175.         write_sfm(10,miao);//分別送去液晶顯示
  176.         write_sfm(7,fen);
  177.         write_sfm(4,shi);
  178.         TMOD=0x01;//設置定時器0工作模式1
  179.         TH0=(65536-50000)/256;//定時器裝初值
  180.         TL0=(65536-50000)%256;
  181.         EA=1;        //開總中斷
  182.         ET0=1;        //開定時器0中斷
  183.         TR0=1;        //啟動定時器0
  184. }
  185. void keyscan()//按鍵掃描函數
  186. {
  187.         if(s1==0)       
  188.         {
  189.                 delay(5);
  190.                 if(s1==0)//確認功能鍵被按下
  191.                 {       
  192.                     s1num++;//功能鍵按下次數記錄
  193.                         while(!s1);//釋放確認                       
  194.                         if(s1num==1)//第一次被按下時
  195.                         {
  196.                             TR0=0;  //關閉定時器
  197.                                 write_com(0x80+3);//光標定位到年位置
  198.                                 write_com(0x0f); //光標開始閃爍
  199.                         }
  200.                         if(s1num==2)//第二次按下光標閃爍定位到月位置
  201.                         {
  202.                                 write_com(0x80+6);
  203.                         }
  204.                         if(s1num==3)//第三次按下光標閃爍定位到日位置
  205.                         {
  206.                                 write_com(0x80+9);
  207.                         }
  208.                         if(s1num==4)//第四次按下光標閃爍定位到星期位置
  209.                         {
  210.                                 write_com(0x80+12);
  211.                         }
  212.                         if(s1num==7)//第七次被按下時光標定位到秒位置
  213.                         {
  214.                                 write_com(0x80+0x40+10);
  215.                         }
  216.                         if(s1num==6)//第六次按下光標閃爍定位到分位置
  217.                         {
  218.                                 write_com(0x80+0x40+7);
  219.                         }
  220.                         if(s1num==5)//第五次按下光標閃爍定位到時位置
  221.                         {
  222.                                 write_com(0x80+0x40+4);
  223.                         }
  224.                         if(s1num==8)//第七次按下
  225.                         {
  226.                                 s1num=0;//記錄按鍵數清零
  227.                                 write_com(0x0c);//取消光標閃爍
  228.                                 TR0=1;        //啟動定時器使時鐘開始走
  229.                         }               
  230.                 }
  231.         }
  232.         if(s1num!=0)//只有功能鍵被按下后,增加和減小鍵才有效
  233.         {
  234.                 if(s2==0)
  235.                 {
  236.                         delay(5);
  237.                         if(s2==0)//增加鍵確認被按下
  238.                         {
  239.                                 while(!s2);//按鍵釋放
  240.                                 if(s1num==1)//若功能鍵第一次按下
  241.                                 {
  242.                                         year++; //則調整年加1
  243.                                         if(year==100)//若滿100后將清零
  244.                                                 year=0;
  245.                                         write_ymd(3,year);//每調節一次送液晶顯示一下
  246.                                         write_com(0x80+3);//顯示位置重新回到調節處
  247.                                 }
  248.                                 if(s1num==2)//若功能鍵第二次按下
  249.                                 {
  250.                                         month++;//則調整月加1
  251.                                         if(month==13)//若滿12后將置一
  252.                                                 month=1;
  253.                                         write_ymd(6,month);//每調節一次送液晶顯示一下
  254.                                         write_com(0x80+6);//顯示位置重新回到調節處
  255.                                 }
  256.                                 if(s1num==3)//若功能鍵第三次按下
  257.                                 {
  258.                                         day++;//則調整日加1
  259.                                         if(year%4==0&&month==2)
  260.                                         {
  261.                                             if(day==30)//若滿29后將置一
  262.                                                 day=1;
  263.                                          }
  264.                                          if(year%4!=0&&month==2)
  265.                                         {
  266.                                             if(day==29)//若滿28后將置一
  267.                                                 day=1;
  268.                                          }
  269.                                          if(month!=2&&month!=4&&month!=6&&month!=9&&month!=11)
  270.                                          {
  271.                                             if(day==32)//若滿31后將置一
  272.                                                 day=1;
  273.                                          }
  274.                                          if(month==4||month==6||month==9||month==11)
  275.                                          {         
  276.                                                 if(day==31)//若滿30后將置一
  277.                                                 day=1;
  278.                                          }
  279.                                         write_ymd(9,day);;//每調節一次送液晶顯示一下
  280.                                         write_com(0x80+9);//顯示位置重新回到調節處
  281.                                 }
  282.                                 if(s1num==4)//若功能鍵第四次按下
  283.                                 {
  284.                                         week++;//則調整星期加1
  285.                                         if(week==8)//若滿8后將置一
  286.                                                 week=1;
  287.                                         write_week(week);//每調節一次送液晶顯示一下
  288.                                         write_com(0x80+12);//顯示位置重新回到調節處
  289.                                 }
  290.                                 if(s1num==7)//若功能鍵第七次按下
  291.                                 {
  292.                                         miao++; //則調整秒加1
  293.                                         if(miao==60)//若滿60后將清零
  294.                                                 miao=0;
  295.                                         write_sfm(10,miao);//每調節一次送液晶顯示一下
  296.                                         write_com(0x80+0x40+10);//顯示位置重新回到調節處
  297.                                 }
  298.                                 if(s1num==6)//若功能鍵第二次按下
  299.                                 {
  300.                                         fen++;//則調整分鐘加1
  301.                                         if(fen==60)//若滿60后將清零
  302.                                                 fen=0;
  303.                                         write_sfm(7,fen);//每調節一次送液晶顯示一下
  304.                                         write_com(0x80+0x40+7);//顯示位置重新回到調節處
  305.                                 }
  306.                                 if(s1num==5)//若功能鍵第五次按下
  307.                                 {                                       
  308.                                         shi++;
  309.                                         if(shi==24)//若滿24后將清零
  310.                             {
  311.                                            shi=0;
  312.                                         }
  313.                                            if(s4num==0)
  314.                                            {                                                                                      
  315.                                               write_sfm(4,shi);;//每調節一次送液晶顯示一下
  316.                                               write_com(0x80+0x40+4);//顯示位置重新回到調節處
  317.                                            }                                          
  318.                                            if(s4num==1)
  319.                                            {
  320.                                                      zhuanhuan();
  321.                                               _shi();
  322.                                               write_sfm(4,pshi);;//每調節一次送液晶顯示一下
  323.                                               write_com(0x80+0x40+4);//顯示位置重新回到調節處
  324.                                        }                                       
  325.                               }
  326.                         }
  327.                 }
  328.         }
  329.                 if(s3==0)
  330.                 {
  331.                         delay(5);
  332.                         if(s3==0)//確認減小鍵被按下
  333.                         {
  334.                                 while(!s3);//按鍵釋放
  335.                                 if(s1num==1)//若功能鍵第一次按下
  336.                                 {
  337.                                         year--;//則調整秒減1
  338.                                         if(year==-1)//若減到負數則將其重新設置為99
  339.                                                 year=99;
  340.                                         write_ymd(3,year);//每調節一次送液晶顯示一下
  341.                                         write_com(0x80+3);//顯示位置重新回到調節處
  342.                                 }
  343.                                 if(s1num==2)//若功能鍵第二次按下
  344.                                 {
  345.                                         month--;//則調整分鐘減1
  346.                                         if(month==0)//若減到負數則將其重新設置為59
  347.                                                 month=12;
  348.                                         write_ymd(6,month);//每調節一次送液晶顯示一下
  349.                                         write_com(0x80+6);//顯示位置重新回到調節處
  350.                                 }
  351.                                 if(s1num==3)//若功能鍵第二次按下
  352.                                 {
  353.                                         day--;//則調整日加1
  354.                                         if(year%4==0&&month==2)
  355.                                         {
  356.                                             if(day==0)//若滿29后將置一
  357.                                                 day=29;
  358.                                          }
  359.                                          if(year%4!=0&&month==2)
  360.                                         {
  361.                                             if(day==0)//若滿28后將置一
  362.                                                 day=28;
  363.                                          }
  364.                                          if(month!=2&&month!=4&&month!=6&&month!=9&&month!=11)
  365.                                          {
  366.                                             if(day==0)//若滿31后將置一
  367.                                                 day=31;
  368.                                          }
  369.                                          if(month==4||month==6||month==9||month==11)
  370.                                          {         
  371.                                                 if(day==0)//若滿30后將置一
  372.                                                 day=30;
  373.                                          }
  374.                                         write_ymd(9,day);;//每調節一次送液晶顯示一下
  375.                                         write_com(0x80+9);//顯示位置重新回到調節處
  376.                                 }
  377.                                 if(s1num==4)//若功能鍵第二次按下
  378.                                 {
  379.                                         week--;//則調整小時減1
  380.                                         if(week==0)//若減到負數則將其重新設置為23
  381.                                                 week=7;
  382.                                         write_week(week);//每調節一次送液晶顯示一下
  383.                                         write_com(0x80+12);//顯示位置重新回到調節處
  384.                                 }
  385.                                 if(s1num==7)//若功能鍵第一次按下
  386.                                 {
  387.                                         miao--;//則調整秒減1
  388.                                         if(miao==-1)//若減到負數則將其重新設置為59
  389.                                                 miao=59;
  390.                                         write_sfm(10,miao);//每調節一次送液晶顯示一下
  391.                                         write_com(0x80+0x40+10);//顯示位置重新回到調節處
  392.                                 }
  393.                                 if(s1num==6)//若功能鍵第二次按下
  394.                                 {
  395.                                         fen--;//則調整分鐘減1
  396.                                         if(fen==-1)//若減到負數則將其重新設置為59
  397.                                                 fen=59;
  398.                                         write_sfm(7,fen);//每調節一次送液晶顯示一下
  399.                                         write_com(0x80+0x40+7);//顯示位置重新回到調節處
  400.                                 }
  401.                                 if(s1num==5)//若功能鍵第二次按下
  402.                                 {
  403.                                         shi--;
  404.                                         if(shi==-1)//若滿24后將清零
  405.                                            shi=23;
  406.                                            if(s4num==0)
  407.                                            {                                                                                   
  408.                                               write_sfm(4,shi);;//每調節一次送液晶顯示一下
  409.                                               write_com(0x80+0x40+4);//顯示位置重新回到調節處                                                    
  410.                                            }
  411.                                            if(s4num==1)
  412.                                            {                                          
  413.                               zhuanhuan();
  414.                                               _shi();
  415.                                               write_sfm(4,pshi);;//每調節一次送液晶顯示一下
  416.                                               write_com(0x80+0x40+4);//顯示位置重新回到調節處
  417.                                        }                                       
  418.                              }
  419.                 }
  420.         }
  421.         if(s1num==0)
  422.         {
  423.           if(s4==0)       
  424.           {
  425.                 delay(5);
  426.                 if(s4==0)//確認功能鍵被按下
  427.                 {       
  428.                     s4num++;//功能鍵按下次數記錄
  429.                         while(!s4);//釋放確認                       
  430.                         if(s4num==1)//第一次被按下時
  431.                         {
  432.                             zhuanhuan();
  433.                                 _shi();
  434.                                 write_sfm(4,pshi);
  435.                         }                       
  436.                         if(s4num==2)//第二次按下
  437.                         {
  438.                                 s4num=0;//記錄按鍵數清零
  439.                                 write_com(0x80+0x40+1);
  440.                                 write_date(' ');
  441.                                 write_date(' ');
  442.                                 write_sfm(4,shi);
  443.                         }               
  444.                 }
  445.       }
  446.         }   
  447. }
  448. void main()//主函數
  449. {
  450.         init();//首先初始化各數據               
  451.         while(1)//進入主程序大循環
  452.         {
  453.                 keyscan();//不停的檢測按鍵是否被按下
  454.                 if(s1num!=0)
  455.                    led=0;
  456.                 else           
  457.                    led=miao%2;       
  458.                 if((shi>7&&shi<23)&&(fen==0)&&(miao==0))
  459.                 {
  460.                  di();                 
  461.                  }                               
  462.         }
  463. }
  464. void timer0() interrupt 1//定時器0中斷服務程序
  465. {
  466.         TH0=(65536-50000)/256;//再次裝定時器初值
  467.         TL0=(65536-50000)%256;
  468.         count++;                //中斷次數累加
  469.         if(count==20) //20次50毫秒為1秒
  470.         {
  471.                 count=0;
  472.                 miao++;
  473.                 if(miao==60)//秒加到60則進位分鐘
  474.                 {
  475.                         miao=0;//同時秒數清零
  476.                         fen++;
  477.                         if(fen==60)//分鐘加到60則進位小時
  478.                         {
  479.                                 fen=0;//同時分鐘數清零
  480.                                 shi++;                               
  481.                                 if(shi==24)//小時加到24則小時清零
  482.                                 {
  483.                                         shi=0;
  484.                                         week++;
  485.                                            if(week==8)
  486.                                            {
  487.                                                week=1;
  488.                                            }
  489.                                            write_week(week);//星期若變化則重新寫入
  490.                                         day++;
  491.                                            if(year%4==0&&month==2)//判斷是否為閏年的2月
  492.                                            {
  493.                                               if(day==30)
  494.                                                   {
  495.                                                      writeym();                                                                                                                                                          
  496.                                                   }
  497.                                                   write_ymd(9,day);//日若變化則重新寫入
  498.                                            }
  499.                                            if(year%4!=0&&month==2)//判斷是否為平年的2月
  500.                                            {
  501.                                               if(day==29)
  502.                                                   {
  503.                                                      writeym();                                                                                                  
  504.                                                   }
  505.                                                   write_ymd(9,day);//日若變化則重新寫入
  506.                                            }
  507.                                            if(month!=2&&month!=4&&month!=6&&month!=9&&month!=11)
  508.                                            {
  509.                                               if(day==32)
  510.                                                   {
  511.                                                      writeym();                                                                                                  
  512.                                                   }
  513.                                                   write_ymd(9,day);//日若變化則重新寫入
  514.                                            }
  515.                                            if(month==4||month==6||month==9||month==11)
  516.                                            {
  517.                                               if(day==31)
  518.                                                   {
  519.                                                      writeym();                                                                                                  
  520.                                                   }
  521.                                                   write_ymd(9,day);//日若變化則重新寫入
  522.                                            }
  523.                                 }
  524.                                 if(s4num==1)
  525.                                   {
  526.                                      zhuanhuan();
  527.                                          _shi();                                 
  528.                                      write_sfm(4,pshi);//12小時制小時若變化則重新寫入
  529.                                   }
  530.                                 else write_sfm(4,shi);//24小時制小時若變化則重新寫入                               
  531.                         }
  532.                         write_sfm(7,fen);//分鐘若變化則重新寫入
  533.                 }
  534.                 write_sfm(10,miao);//秒若變化則重新寫入       
  535.         }       
  536. }
復制代碼


評分

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

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
ID:1 發表于 2017-1-3 22:13 | 只看該作者
51黑有你更精彩!!!
回復

使用道具 舉報

板凳
ID:505337 發表于 2019-4-28 22:14 來自手機 | 只看該作者
謝謝樓主,已下
回復

使用道具 舉報

地板
ID:505337 發表于 2019-5-5 08:07 來自手機 | 只看該作者
不能定時呀
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: a国产一区二区免费入口 | 日本在线免费看最新的电影 | 久久精品国产99国产精品亚洲 | 日本特黄a级高清免费大片 特黄色一级毛片 | 精品91久久| 亚洲综合在 | 日韩在线观看网站 | 日韩一二区在线观看 | 午夜精品一区二区三区免费视频 | 91视频进入 | 91精品国产91久久久久青草 | 色网站视频 | 亚洲人久久 | 精品国产精品一区二区夜夜嗨 | 91视频在线 | 亚洲欧美日韩精品久久亚洲区 | 亚洲少妇综合网 | 欧美精品一区免费 | 男女午夜激情视频 | 国产一区二区影院 | 91精品国产91久久久久久最新 | 丁香婷婷在线视频 | 亚洲第一在线 | 超碰免费观看 | 国产伦精品一区二区三毛 | 亚洲网站在线观看 | 永久看片 | 欧美一区二区免费 | 欧美日韩精品一区 | 一区二区三区高清 | 日韩一区二区三区av | 国产91在线播放精品91 | 国产91av视频在线观看 | 欧美日韩大陆 | 久久久久9999亚洲精品 | 亚洲系列第一页 | 精品亚洲永久免费精品 | 亚洲国产免费 | 亚洲三区在线观看 | 亚洲免费视频在线观看 | 最新国产精品精品视频 |