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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于C51單片機芯片和LCD1602液晶顯示的萬年歷+電子時鐘

[復制鏈接]
跳轉到指定樓層
樓主
當調整萬年歷日期時,星期會進行自動調整;每月分大小月,每年二月分閏月和平月;基本完美實現了萬年歷和電子時鐘的功能。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機源程序如下:
  1. #include<reg52.h>//lcd1602 數字鐘 可調整時間和日期
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. //lcd_data=P0
  5. //位定義
  6. sbit lcdrs=P2^2;
  7. sbit lcdrw=P2^1;
  8. sbit lcden=P2^0;
  9. sbit k1=P3^3;//mod
  10. sbit k2=P3^2;//+
  11. sbit k3=P3^1;//-
  12. //函數聲明
  13. uchar i,t=0,k1num=0;//t為中斷次數計數,k1num為k1按下的次數
  14. uint year=2008;//year年
  15. char h=9,m=9,s=0,w=5,month=2,day=28;//h時,m分,s秒,w星期,year年,month月,day日

  16. char CC,YY,MM,DD,WW;  //CC為世紀數-1;YY為年份后兩個數字;MM為月份,DD是日數,1月和2月要按上一年的13月和14月來算,這時C和y均按上一年取值。

  17. uchar code table1[]={" 2008-02-28 THU "};//日期
  18. uchar code table2[]={"    09:09:00    "};//時間
  19. //延時z ms
  20. void delay(uchar z)
  21. {
  22.         uchar x,y;
  23.         for(x=z;x>0;x--)
  24.                 for(y=110;y>0;y--);
  25. }
  26. void write_com(uchar com)
  27. {
  28.         lcdrs=0;
  29.         lcdrw=0;
  30.         P0=com;
  31.         delay(10);
  32.         lcden=1;
  33.         delay(10);
  34.         lcden=0;
  35. }
  36. //lcd寫數據
  37. void write_dat(uchar dat)
  38. {
  39.         lcdrs=1;
  40.         lcdrw=0;
  41.         P0=dat;
  42.         delay(10);
  43.         lcden=1;
  44.         delay(10);
  45.         lcden=0;
  46. }
  47. void Monday(void)
  48. {
  49.         write_dat('M');
  50.         write_dat('O');
  51.         write_dat('N');
  52. }
  53. void Tuesday(void)
  54. {
  55.         write_dat('T');
  56.         write_dat('U');
  57.         write_dat('E');
  58. }
  59. void Wednesday(void)
  60. {
  61.         write_dat('W');
  62.         write_dat('E');
  63.         write_dat('D');
  64. }
  65. void Thursday(void)
  66. {
  67.         write_dat('T');
  68.         write_dat('H');
  69.         write_dat('U');
  70. }
  71. void Friday(void)
  72. {
  73.         write_dat('F');
  74.         write_dat('R');
  75.         write_dat('I');
  76. }
  77. void Saturday(void)
  78. {
  79.         write_dat('S');
  80.         write_dat('A');
  81.         write_dat('T');
  82. }
  83. void Sunday(void)
  84. {       
  85.         write_dat('S');
  86.         write_dat('U');
  87.         write_dat('N');
  88. }
  89. void display_week(uchar week)//星期顯示
  90. {       
  91.     write_com(0x80+12);
  92.         switch(week)
  93.         {
  94.         case 1:Monday();break;
  95.         case 2:Tuesday();break;
  96.         case 3:Wednesday();break;
  97.         case 4:Thursday();break;
  98.         case 5:Friday();break;
  99.         case 6:Saturday();break;
  100.         case 7:Sunday();break;
  101.         }
  102. }

  103. void change_week(uint year,uchar month,uchar day)
  104. {
  105. CC=year/100-1;
  106. YY=year%100;
  107. MM=month;
  108. if(month==1)
  109. {
  110.            MM=13;
  111.          YY--;
  112. }
  113. if(month==2)
  114. {
  115.            MM=14;
  116.          YY--;
  117. }
  118. DD=day;
  119. WW=(CC/4) - 2*CC + YY + (YY/4) + (13 * (MM+1) / 5) + DD - 1;
  120. w=WW%7;
  121. if(w==0)
  122.     w=7;
  123. w--;
  124. if(w==0)
  125.     w=7;
  126. display_week(w);  
  127. }

  128. //lcd初始設置
  129. void init(void)
  130. {
  131.         lcden=0;
  132.         write_com(0x38);  //8位數據接口,16x2行顯示,5x10點陣字符
  133.         write_com(0x0c);  //顯示開,光標關,閃爍關
  134.         write_com(0x06);  //當讀或寫一個字符后,地址指針加一且光標加
  135.         write_com(0x01);  //清屏
  136.         write_com(0x80);  //0x80-1000 0000因為寫入顯示地址時要求最高位D7恒定為高電平1
  137.         TMOD=0x01;      //選擇T0計數器工作在方式1,65535個脈沖
  138.         TH0=0x3c;TL0=0xb0;//50ms   裝初值
  139.         EA=1;  ET0=1;    //CPU開啟總中斷  允許T0定時器
  140.     TR0=1;        //啟動定時器T0工作
  141.         write_com(0x80);//第一行
  142.         for(i=0;i<15;i++)
  143.                 {write_dat(table1[i]);delay(5);}
  144.         write_com(0x80+0x40);//第二行
  145.         for(i=0;i<11;i++)
  146.                 {write_dat(table2[i]);delay(5);}       
  147. }


  148. void display_time(uchar ad,uchar time)//兩位的時間顯示(時分秒)
  149. {
  150.         uchar a,b;
  151.         a=time/10;b=time%10;
  152.         write_com(0x80+0x40+ad);    //數據第二行開頭                 
  153.         write_dat(0x30+a);
  154.         write_dat(0x30+b);
  155. }

  156. void display_date1(uchar ad,uchar time)//兩位的時間顯示(月日)
  157. {
  158.         uchar a,b;
  159.         a=time/10;b=time%10;
  160.         write_com(0x80+ad);    //數據第一行開頭                 
  161.         write_dat(0x30+a);
  162.         write_dat(0x30+b);
  163. }

  164. void display_date(uint nian)//日期顯示
  165. {
  166.         uint y1,y2,y3,y4;     //四位顯示年份
  167.         y1=nian/1000;         //千位
  168.         y2=nian%1000/100;     //百位
  169.         y3=nian%1000%100/10;  //十位
  170.         y4=nian%1000%100%10;  //個位
  171.         write_com(0x80+1);
  172.         write_dat(0x30+y1);          
  173.         write_dat(0x30+y2);
  174.         write_dat(0x30+y3);
  175.         write_dat(0x30+y4);
  176. }


  177. void keyscan(void)//按鍵掃描
  178. {
  179.         if(k1==0)         //按下調整按鍵
  180.         {
  181.                 delay(10);
  182.                         k1num++;t=0;        //關閉T0定時器       
  183.                         while(!k1);  //k1不彈起來,則死循環
  184.                         if(k1num==1)
  185.                         {TR0=0; write_com(0x80+0x40+11);write_com(0x0f);}//s
  186.                         if(k1num==2)
  187.                         {write_com(0x80+0x40+8);}//m
  188.                         if(k1num==3)
  189.                         {write_com(0x80+0x40+5);}//h
  190.                         if(k1num==4)
  191.                         {write_com(0x80+14);}//week
  192.                         if(k1num==5)
  193.                         {write_com(0x80+10);}//day
  194.                         if(k1num==6)
  195.                         {write_com(0x80+7);} //光標開始閃爍}//month
  196.                         if(k1num==7)
  197.                         {write_com(0x80+4);}//year
  198.                         if(k1num==8)
  199.                         {k1num=0;write_com(0x0c);TR0=1;}               
  200.         }
  201.         if(k1num!=0)
  202.         {
  203.                 if(k2==0)         //加+    P2.2接口
  204.                 {
  205.                         delay(5);
  206.                         if(k2==0)
  207.                         {
  208.                                 while(!k2);
  209.                                 if(k1num==1)
  210.                                 {
  211.                                           s++;
  212.                                         if(s==60)
  213.                                         s=0;
  214.                                         display_time(10,s);
  215.                                         write_com(0x80+0x40+11);
  216.                                        
  217.                                 }
  218.                                 if(k1num==2)
  219.                                 {
  220.                                         m++;
  221.                                         if(m==60)
  222.                                         m=0;
  223.                                         display_time(7,m);
  224.                                         write_com(0x80+0x40+8);
  225.                                
  226.                                 }
  227.                                 if(k1num==3)
  228.                                 {
  229.                                         h++;
  230.                                         if(h==24)
  231.                                         h=0;
  232.                                         display_time(4,h);
  233.                                         write_com(0x80+0x40+5);
  234.                                 }
  235.                                 if(k1num==4)
  236.                                 {
  237.                                         w++;
  238.                                         if(w==8)
  239.                                         w=1;
  240.                     change_week(year,month,day);
  241.                                         write_com(0x80+14);
  242.                                 }
  243.                                 if(k1num==5)
  244.                                 {
  245.                                         day++;
  246.                                         if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)    //大月(31天)
  247.                                         {
  248.                                                if(day==32)
  249.                                                                    day=1;
  250.                                         }

  251.                                         if(month==4||month==6||month==9||month==11)    //小月(30天)
  252.                                         {
  253.                                                if(day==31)
  254.                                                                    day=1;
  255.                                         }

  256.                                         if(month==2&&(year%4==0&&year%100!=0))    //閏年(29天)(能被4整除,不能被100整除)
  257.                                         {
  258.                                                if(day==30)
  259.                                                                    day=1;
  260.                                         }

  261.                                         if(month==2&&(year%4==0&&year%100!=0)==0)    //非閏年(28天)(能被4整除,不能被100整除)
  262.                                         {
  263.                                                if(day==29)
  264.                                                                    day=1;
  265.                                         }
  266.                                         change_week(year,month,day);
  267.                                         display_date1(9,day);
  268.                                         write_com(0x80+10);
  269.                                 }
  270.                                 if(k1num==6)
  271.                                 {
  272.                                         month++;
  273.                                         if(month==13)
  274.                                         month=1;
  275.                                         change_week(year,month,day);
  276.                                         display_date1(6,month);
  277.                                         write_com(0x80+7);
  278.                                 }
  279.                                 if(k1num==7)
  280.                                 {
  281.                                         year++;
  282.                                         change_week(year,month,day);
  283.                                         display_date(year);
  284.                                         write_com(0x80+4);
  285.                                 }
  286.                         }
  287.                 }
  288.                 if(k3==0)   //減-    P2.1接口
  289.                 {
  290.                         delay(10);
  291.                         if(k3==0)
  292.                         {
  293.                                 while(!k3);
  294.                                 if(k1num==1)
  295.                                 {
  296.                                         s--;
  297.                                         if(s==-1)
  298.                                         s=59;
  299.                                         display_time(10,s);
  300.                                         write_com(0x80+0x40+11);
  301.                                 }
  302.                                 if(k1num==2)
  303.                                 {
  304.                                         m--;
  305.                                         if(m==-1)
  306.                                         m=59;
  307.                                         display_time(7,m);
  308.                                         write_com(0x80+0x40+8);
  309.                                 }
  310.                                 if(k1num==3)
  311.                                 {
  312.                                         h--;
  313.                                         if(h==-1)
  314.                                         h=23;
  315.                                         display_time(4,h);
  316.                                         write_com(0x80+0x40+5);
  317.                                 }
  318.                                 if(k1num==4)
  319.                                 {
  320.                                         w--;
  321.                                         if(w==0)
  322.                                         w=7;
  323.                                         change_week(year,month,day);
  324.                                         write_com(0x80+14);
  325.                                 }
  326.                                 if(k1num==5)
  327.                                 {
  328.                                         day--;
  329.                                         if(day==0)
  330.                                         {
  331.                                                     if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)    //大月(31天)
  332.                                         {                                            
  333.                                                                    day=31;
  334.                                         }

  335.                                                     if(month==4||month==6||month==9||month==11)    //小月(30天)
  336.                                         {                                             
  337.                                                                    day=30;
  338.                                         }

  339.                                                     if(month==2&&(year%4==0&&year%100!=0))    //閏年(29天)(能被4整除,不能被100整除)
  340.                                         {
  341.                                                                    day=29;
  342.                                         }

  343.                                                 if(month==2&&(year%4==0&&year%100!=0)==0)    //非閏年(28天)(能被4整除,不能被100整除)
  344.                                         {
  345.                                                                    day=28;
  346.                                         }
  347.                                         }
  348.                                         change_week(year,month,day);
  349.                                         display_date1(9,day);
  350.                                         write_com(0x80+10);
  351.                                        
  352.                                 }
  353.                                 if(k1num==6)
  354.                                 {
  355.                                         month--;
  356.                                         if(month==0)
  357.                                         month=12;
  358.                                         change_week(year,month,day);
  359.                                         display_date1(6,month);
  360.                                         write_com(0x80+7);
  361.                                 }
  362.                                 if(k1num==7)
  363.                                 {
  364.                                         year--;
  365.                                         change_week(year,month,day);
  366.                                         display_date(year);
  367.                                         write_com(0x80+4);
  368.                                 }
  369.                         }
  370.                 }
  371.         }
  372.     if(k1num==0)
  373.         {
  374.             display_time(10,s);//s
  375.                 display_time(7,m);//m
  376.                 display_time(4,h);//h
  377.                 change_week(year,month,day);//week
  378.                 display_date1(9,day);//day
  379.                 display_date1(6,month);//month
  380.                 display_date(year);//year
  381.         }   
  382. }

  383. void main(void)//主函數
  384. {
  385.         init();
  386.         while(1)
  387.         {
  388.                 keyscan();
  389.         }
  390. }

  391. void timer0() interrupt 1//定時器T0中斷函數
  392. {
  393.         t++;
  394.         TH0=0x3c;TL0=0xb0;//50ms
  395.         if(t==20)
  396.         {s++;t=0;}
  397.         if(s==60)
  398.         {m++;s=0;}
  399.         if(m==60)
  400.         {h++;m=0;}
  401.         if(h==24)
  402.         {w++;day++;h=0;}
  403.         if(w==8)
  404.         {w=1;}
  405.         if(day==32||day==31||day==30||day==29)
  406.         {
  407.                         if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)    //大月(31天)
  408.                                         {
  409.                                                                    day=1;
  410.                                                                                            month++;
  411.                                         }

  412.                                         if(month==4||month==6||month==9||month==11)    //小月(30天)
  413.                                         {
  414.                                                                    day=1;
  415.                                                                                            month++;
  416.                                         }

  417.                                         if(month==2&&(year%4==0&&year%100!=0))    //閏年(29天)(能被4整除,不能被100整除)
  418.                                         {
  419.                                                                    day=1;
  420.                                                                                            month++;
  421.                                         }

  422.                                         if(month==2&&(year%4==0&&year%100!=0)==0)    //非閏年(28天)(能被4整除,不能被100整除)
  423.                                         {
  424.                                                                    day=1;
  425.                                                                                            month++;
  426.                                         }
  427.         }
  428.         if(month==13)
  429.     {
  430.              year++;
  431.                  month=1;
  432.         }



  433. }
復制代碼


所有資料51hei提供下載:
電子時鐘.rar (40.17 KB, 下載次數: 142)



評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:405670 發表于 2018-10-26 15:05 來自手機 | 只看該作者
感謝樓主
回復

使用道具 舉報

板凳
ID:422741 發表于 2018-11-8 22:10 | 只看該作者
加個鬧鐘的程序進去怎么加,求答
回復

使用道具 舉報

地板
ID:459719 發表于 2019-1-2 09:18 | 只看該作者
1412m 發表于 2018-11-8 22:10
加個鬧鐘的程序進去怎么加,求答

嘿嘿   不會
回復

使用道具 舉報

5#
ID:490020 發表于 2019-3-14 14:02 | 只看該作者

感謝樓主
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人免费视频网站在线观看 | 天天色天天射天天干 | 亚洲一区导航 | 久久久福利 | 久久国产婷婷国产香蕉 | 一区二区三区电影在线观看 | 精品自拍视频在线观看 | 精品美女在线观看视频在线观看 | 97成人免费| 日韩精品专区在线影院重磅 | 亚洲第一av网站 | 亚洲巨乳自拍在线视频 | 91在线播 | 国产高清免费 | 精品一二区 | 久草热视频 | 网络毛片 | 99视频在线免费观看 | 国产羞羞视频在线观看 | 国产婷婷色综合av蜜臀av | 一区二区三区四区五区在线视频 | 久久这里有精品 | 午夜影院在线观看免费 | 久久亚洲欧美日韩精品专区 | 欧美国产亚洲一区二区 | 中文字幕一区二区三区精彩视频 | 亚av在线 | 国产精品久久久久久久午夜片 | 亚洲a视频 | 久草中文在线观看 | 国产精品污www在线观看 | 亚洲精品视频一区 | 97avcc| 国产一区精品 | 拍拍无遮挡人做人爱视频免费观看 | 久久婷婷国产 | 久久久久国产一区二区三区四区 | 91精品久久久久久久久久小网站 | 国产精品国产成人国产三级 | 日韩高清在线观看 | 亚洲午夜一区二区 |