找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3096|回復: 2
收起左側

基于LCD1602的萬年歷單片機源碼 帶鬧鐘

[復制鏈接]
ID:279910 發(fā)表于 2018-1-26 12:35 | 顯示全部樓層 |閱讀模式
基于LCD1602的萬年歷,帶鬧鐘

單片機源程序如下:
  1.   #include <reg52.h>                         
  2. #define uint unsigned int          
  3. #define uchar unsigned char

  4. sbit lcd_rs=P2^6;        //rs為寄存器選擇 高電平時選擇數(shù)據(jù)寄存器,低電平選擇指令寄存器
  5. sbit lcd_rw=P2^5;        //R/W 為讀寫信號線,高電平時進行讀操作,低電平進行寫操作
  6.                     //當 RS 和 R/W 共同為低電平時,可以寫入指令或顯示地址
  7. sbit lcd_en=P2^7; //液晶控制端
  8. sbit key_set=P1^4;//設置鍵
  9. sbit key_up=P1^5;        //加鍵同時也是鬧鐘能夠停止按鈕
  10. sbit key_down=P1^6; //  減鍵同時也是翻屏按鈕
  11. sbit key_out=P1^7;  //鍵 盤控制端口
  12. uchar count;      //定時器計數(shù)變量
  13. uchar hour,min,sec,hour1,hour2,sec1,sec2,min1,min2;    //時間變量
  14. uchar  yue, ri,nian1, nian2, nian3, nian4, yue1, yue2, ri1, ri2;  //月日變量
  15. uint  nian; // 年變量
  16. uchar nao1=0, nao2=0, nao3=0, nao11, nao12, nao21, nao22;  //設置鬧鐘變量
  17. uchar count1;  // 星期計數(shù)變量
  18. uchar ww=0,qq=0,nao=1,flag;  //計數(shù)變量鍵盤設置端口,鬧鐘時間是否設置標志量,鬧鐘標志變量,設置鍵標志量
  19. uchar code table[]={
  20.    0x00,0x04,0x0E,0x0E,0x0E,0x0E,0x1F,0x1F,
  21.    0x04,0x08,0x00,0x1E,0x00,0x08,0x04,0x00
  22. };//設置鬧鐘圖片

  23. void lcd_delay(uint m)          //延時函數(shù) (字符型變量m定義)
  24. {
  25.                 while(m--);                                                                  //無限循環(huán)體
  26. }

  27. void read1602()                //忙檢測 作用防止亂碼
  28. {
  29.         uchar i;
  30.                 i=254;
  31.                 P0=0xff;  //
  32.                 lcd_rs=0; //讀寫命令
  33.                 lcd_rw=1; //讀命令/數(shù)據(jù)
  34.                 lcd_en=1; //液晶模塊執(zhí)行命令
  35.                 while(i--);//若一段時間以后仍低,則認為是不忙
  36.                 lcd_en=0;
  37. }

  38. void write1602(uchar wdata,bit rw)//向LCD1602寫數(shù)據(jù)(rw=1)或者命令(rw=0)
  39. {      
  40.         read1602();        //防止數(shù)據(jù)丟失
  41.                 lcd_rs=rw;                     
  42.                 P0=wdata;
  43.         lcd_rw=0;
  44.                 lcd_delay(1);           
  45.                 lcd_en=1;
  46.                 lcd_delay(1);
  47.                 lcd_en=0;
  48. }

  49. void lcd_init()           //LCD1602液晶的初始化
  50. {
  51.                
  52.                 lcd_delay(1500);
  53.                
  54.             write1602(0x38,0);         //置功能,8位數(shù)據(jù),2行顯示,5x7字符(指令6)
  55.        
  56.                 write1602(0x0c,0);         //只打開屏顯 (指令4)
  57.        
  58.                 write1602(0x06,0);         //左到右顯示,自加1  (指令3)
  59.        
  60.             write1602(0x01,0);         //清屏         (指令1)
  61.         
  62.                 write1602(0x80,0);           //(指令8)

  63. }

  64. void init()                                                //定時器初始化
  65. {
  66.         count=0;
  67.         hour=23; //小時初值
  68.         min=59;  //分鐘初值
  69.         sec=50;  //秒初值                                                                                                                                                                          
  70.         nian=2018; //年初值
  71.         yue=01;  //月初值
  72.         ri=01;   //日初值
  73.         count1=1;//星期初值
  74.         TMOD=0x01; //中斷T0工作方式,方式1,16位定時器
  75.         TH0=(65536-50000)/256;
  76.         TL0=(65536-50000)%256; //計數(shù)器初值,為50ms進入一次中斷子程序
  77.         TR0=1; //允許T0計數(shù)
  78.         ET0=1; //定時器T0溢出中斷允許
  79.         EA=1; //開中斷
  80. }

  81. void lcd_printf(uchar *str)//顯示字符串
  82. {   read1602();
  83.         while(*str!='\0')  
  84.         {
  85.                 write1602(*str,1);          //寫入數(shù)據(jù)
  86.                 str++;
  87.                 lcd_delay(1);
  88.         }
  89. }

  90. void lcd_moveto(uchar x,uchar y)//指定顯示的行列坐標
  91. {
  92.         if(x==0)
  93.                 write1602(0x80|y,0);   
  94.         if(x==1)
  95.                 write1602(0xc0|y,0);
  96. }

  97. void fengjie1(uchar a,uchar b, uchar c )//將時分秒兩位數(shù)分解為兩個數(shù)
  98. {
  99.             hour1=a/10;
  100.                         hour2=a%10;
  101.                         min1=b/10;
  102.                         min2=b%10;
  103.                         sec1=c/10;
  104.                         sec2=c%10;       
  105. }

  106. void fengjie2(uint a,uchar b, uchar c ) //將年月日分解為兩個數(shù)
  107. {
  108.             nian4=a%10;
  109.             a=(a-nian4)/10;
  110.             nian3=a%10;
  111.             a=(a-nian3)/10;
  112.             nian2=a%10;
  113.             nian1=a/10;
  114.                         yue1=b/10;
  115.                         yue2=b%10;
  116.                         ri1=c/10;
  117.                         ri2=c%10;
  118. }
  119. void fengjie3(uchar a, uchar b )//將鬧鐘分解為兩個數(shù)
  120. {
  121.             nao11=a/10;
  122.                         nao12=a%10;
  123.                         nao21=b/10;
  124.                         nao22=b%10;
  125. }
  126. void display1(uchar hour1,uchar hour2,uchar min1,uchar min2,uchar sec1,uchar sec2)         //顯示時間程序
  127. {
  128.        
  129.     lcd_moveto(1,0); //定位在第二行第一列
  130.         write1602(hour1+48,1);                   //字符0-9對應十進制48-57
  131.         write1602(hour2+48,1);
  132.         lcd_printf(":");
  133.         write1602(min1+48,1);
  134.         write1602(min2+48,1);
  135.         lcd_printf(":");
  136.         write1602(sec1+48,1);
  137.         write1602(sec2+48,1);

  138. }

  139. void display2(uchar nian1,uchar nian2,uchar nian3,uchar nian4,uchar yue1,uchar yue2, uchar ri1, uchar ri2 )  //顯示日期程序
  140. {
  141.     lcd_moveto(0,0); //定位在第一行第一列
  142.         write1602(nian1+48,1);
  143.         write1602(nian2+48,1);
  144.         write1602(nian3+48,1);
  145.         write1602(nian4+48,1);
  146.         lcd_printf("-");
  147.         write1602(yue1+48,1);
  148.         write1602(yue2+48,1);
  149.         lcd_printf("-");
  150.         write1602(ri1+48,1);
  151.         write1602(ri2+48,1);
  152. }

  153. void display3(uchar we)                 //星期送顯示
  154. {
  155.         lcd_moveto(0,12);
  156.         switch(we)
  157.         {
  158.                 case 1: lcd_printf("M");
  159.                                 lcd_printf("0");
  160.                                  lcd_printf("N");
  161.                                  break;
  162.                 case 2: lcd_printf("T");
  163.                                 lcd_printf("U");
  164.                                  lcd_printf("E");
  165.                                  break;
  166.                 case 3: lcd_printf("W");
  167.                                 lcd_printf("E");
  168.                                  lcd_printf("D");
  169.                                  break;
  170.                 case 4: lcd_printf("T");
  171.                                 lcd_printf("H");
  172.                                  lcd_printf("U");
  173.                                  break;       
  174.                 case 5: lcd_printf("F");
  175.                                 lcd_printf("R");
  176.                                  lcd_printf("T");
  177.                                  break;
  178.                 case 6: lcd_printf("S");
  179.                                 lcd_printf("A");
  180.                                  lcd_printf("T");
  181.                                  break;
  182.                 case 7: lcd_printf("S");
  183.                                 lcd_printf("U");
  184.                                  lcd_printf("N");
  185.                                  break;                                                                                                                  
  186.         }       
  187. }

  188. void display4(uchar nao11,uchar nao12,uchar nao21, uchar nao22) //顯示鬧鐘時刻
  189. {
  190.     lcd_moveto(1,6); //定位在第二行第6列
  191.     if(nao==1)        //打開鬧鐘
  192.         {write1602(nao11+48,1);//顯示鬧鐘時間
  193.         write1602(nao12+48,1);
  194.         lcd_printf(":");
  195.         write1602(nao21+48,1);
  196.         write1602(nao22+48,1);
  197.         }
  198.         if(nao==0)         //關閉鬧鐘
  199.         {lcd_printf("N");
  200.         lcd_printf("O");
  201.     lcd_printf(":");
  202.     lcd_printf("N");
  203.         lcd_printf("O");
  204.         }
  205. }

  206. void display5()          //顯示鬧鐘圖片
  207. {
  208. lcd_moveto(1,13);
  209.         if(nao==1)//如果鬧鐘打開顯示鬧鐘圖片
  210.         {
  211.   write1602(0x00,1); //
  212.         write1602(0x01,1); //?
  213.         }
  214.         if(nao==0)
  215.         {
  216.          lcd_printf(" ");
  217.          lcd_printf(" ");
  218.         }
  219. }
  220. void zimo()         //字模顯示
  221. {
  222.                 uint i;
  223.                 write1602(0x40,0); //寫圖片的指令
  224.                 for(i=0;i<16;i++)
  225.                 {
  226.                 write1602(table[i],1);                                                  
  227.                 }
  228. }
  229. void key()  //鍵盤程序
  230. {

  231.      if(key_set==0)
  232.      {
  233.          flag=1;
  234.      ww++;
  235.          if(ww==8)
  236.          ww=0;
  237.          while(!key_set);
  238.          }
  239.          switch(ww)
  240.         {
  241.         case 0:  //        清零
  242.                if(key_up==0)
  243.                {
  244.            while(!key_up);
  245.                     if(qq==1)
  246.                                          {
  247.                                                  qq=0;
  248.                                          }
  249.                                          else
  250.                                          {
  251.                    nao=!nao;   //開關鬧鐘的作用
  252.                    } }
  253.                break;
  254.         case 1:  //鍵盤調整年
  255.            lcd_delay(1000);
  256.                lcd_moveto(0,3);
  257.            lcd_printf("-");
  258.            lcd_delay(1000);
  259.                if(key_up==0)
  260.                    {
  261.            while(!key_up);        //按鍵是否抬起
  262.                    nian++;
  263.                    }
  264.                    if(key_down==0)
  265.                    {
  266.            while(!key_down);
  267.                    nian--;
  268.                    }
  269.                break;
  270.                           
  271.     case 2:  //鍵盤調整月
  272.                lcd_delay(1000);
  273.                lcd_moveto(0,6);
  274.            lcd_printf("-");
  275.            lcd_delay(1000);
  276.            if(key_up==0)
  277.                    {
  278.            while(!key_up);
  279.                    yue++;
  280.                    if(yue>12)
  281.                    yue=1;
  282.                    }
  283.                    if(key_down==0)
  284.                    {
  285.            while(!key_down);
  286.                    if(yue==1)
  287.                    yue=12;
  288.                    else
  289.                    yue--;
  290.                    }
  291.                break;

  292.     case 3: //鍵盤調節(jié)日期
  293.            lcd_delay(1000);
  294.                lcd_moveto(0,9);
  295.            lcd_printf("-");
  296.            lcd_delay(1000);
  297.                if(key_up==0)
  298.                    {
  299.            while(!key_up);
  300.                    ri++;
  301.                    if(ri>31)
  302.                    ri=1;
  303.                    }
  304.                    if(key_down==0)
  305.                    {
  306.            while(!key_down);
  307.                    if(ri==1)
  308.                    ri=31;
  309.                    else
  310.                    ri--;
  311.                    }
  312.                break;

  313.     case 4:  //鍵盤調整星期
  314.            lcd_delay(1000);
  315.                lcd_moveto(0,12);
  316.            lcd_printf("-");
  317.            lcd_printf("-");
  318.            lcd_printf("-");
  319.            lcd_delay(1000);

  320.                if(key_up==0)
  321.                    {
  322.            while(!key_up);
  323.                    count1++;
  324.                    if(count1>7)
  325.                    count1=1;
  326.                    }
  327.                    if(key_down==0)
  328.                    {
  329.            while(!key_down);
  330.                    if(count1==1)
  331.                    count1=7;
  332.                    else
  333.                    count1--;
  334.                    }
  335.                break;
  336.     case 5: //鍵盤調整時
  337.            lcd_delay(1000);
  338.                lcd_moveto(1,1);
  339.            lcd_printf("-");
  340.            lcd_delay(1000);
  341.            if(key_up==0)
  342.                    {
  343.            while(!key_up);
  344.                    hour++;
  345.                    if( hour>23)
  346.                     hour=0;
  347.                    }
  348.                    if(key_down==0)
  349.                    {
  350.            while(!key_down);
  351.                    if( hour==0)
  352.                     hour=23;
  353.                    else
  354.                     hour--;
  355.                    }
  356.                break;
  357.         case 6: //鍵盤調整分
  358.           lcd_delay(1000);
  359.                lcd_moveto(1,4);
  360.            lcd_printf("-");
  361.            lcd_delay(1000);
  362.            if(key_up==0)
  363.                    {
  364.            while(!key_up);
  365.                    min++;
  366.                    if( min>59)
  367.                     min=0;
  368.                    }
  369.                    if(key_down==0)
  370.                    {
  371.            while(!key_down);
  372.                    if( min==0)
  373.                     min=59;
  374.                    else
  375.                     min--;
  376.                    }
  377.                break;
  378.     case 7: //鍵盤調整秒

  379.            lcd_delay(1000);
  380.                lcd_moveto(1,7);
  381.            lcd_printf("-");
  382.            lcd_delay(1000);
  383.            if(key_up==0)
  384.                    {
  385.            while(!key_up);
  386.                    sec++;
  387.                    if( sec>59)
  388.                    sec=0;
  389.                    }
  390.                    if(key_down==0)
  391.                    {
  392.            while(!key_down);
  393.                    if(sec==0)
  394.                     sec=59;
  395.                    else
  396.                     sec--;
  397.                    }
  398.                break;
  399.                    }
  400.         if(key_out==0)
  401.         {
  402.      while(!key_out);
  403.                 flag=0;
  404.          ww=0;
  405.         }
  406. }
  407. void key1()  //        調整鬧鐘時間
  408. {
  409.      if(key_set==0)
  410.      {
  411.                          flag=1;
  412.      ww++;
  413.          if(ww==3)
  414.          ww=0;
  415.          while(!key_set);
  416.          }
  417.          switch(ww)
  418.         {
  419.                    case 0:  //退出設置
  420.                if(key_up==0)
  421.                {
  422.            while(!key_up);
  423.                    nao=!nao;   //如果鬧鐘開按下后則關,反之同理
  424.                    }
  425.                if(key_down==0)
  426.                {
  427.            while(!key_down);
  428.                qq=0; //
  429.                }
  430.                break;
  431.                 case 1: // 調試鬧鐘的時
  432.           lcd_delay(1000);                       
  433.                lcd_moveto(1,7);
  434.            lcd_printf("-");
  435.            lcd_delay(1000);
  436.          
  437.                if(nao==1)
  438.            {if(key_up==0)
  439.                    {
  440.            while(!key_up);
  441.                    nao1++;
  442.                    if( nao1>23)
  443.                     nao1=0;
  444.                    }
  445.                    if(key_down==0)
  446.                    {
  447.            while(!key_down);
  448.                    if( nao1==0)
  449.                     nao1=23;
  450.                    else
  451.                     nao1--;
  452.                    }
  453.                break;
  454.                    }
  455.                    else break;

  456.     case 2: // 調試鬧鐘的分
  457.          lcd_delay(1000);
  458.                lcd_moveto(1,10);
  459.            lcd_printf("-");
  460.            lcd_delay(1000);
  461.                if(nao==1)
  462.            {if(key_up==0)
  463.                    {
  464.            while(!key_up);
  465.                    nao2++;
  466.                    if( nao2>59)
  467.                     nao2=0;
  468.                    }
  469.                    if(key_down==0)
  470.                    {
  471.            while(!key_down);
  472.                    if( nao2==0)
  473.                     nao2=59;
  474.                    else
  475.                     nao2--;
  476.                    }
  477.                break;
  478.                    }
  479.                    else break;
  480.                   
  481.            default:break;
  482.         }
  483.         if(key_out==0)
  484.         {
  485.      while(!key_out);
  486.                 flag=0;
  487.          ww=0;
  488.         }
  489. }

  490. void count0(void) interrupt 1  //中斷函數(shù),進行時期的累加  12m晶振
  491. {
  492.         TH0=(65536-50000)/256;
  493.         TL0=(65536-50000)%256;
  494.         count++;
  495.         if(count==20) //計時到達一秒
  496.          {
  497.                  count=0;
  498.                  sec++;
  499.                   if(sec==60) //計時到達一分
  500.                   {
  501.                         sec=0;
  502.                         min++;
  503.                          if(min==60) //計時到達一小時
  504.                          {
  505.                                 min=0;
  506.                                 hour++;
  507.                                  if(hour==24) //計時到達一天
  508.                                         {
  509.                                                   hour=0;
  510.                                                 ri++;
  511.                                                 count1++;
  512.                                                 if(count1==8) //計時到達一周
  513.                                                 {
  514.                          count1=1;
  515.                                                 }
  516.                                                 if(yue==1|yue==3|yue==5|yue==7|yue==8|yue==10|yue==12)
  517.                                                 {
  518.                          if(ri>31) //計時到達一個月31天
  519.                                                  {
  520.                                                  ri=1;
  521.                                                  yue++;
  522.                                                  if(yue>12) //計時到達一年
  523.                                                  {
  524.                                                  yue=1;
  525.                                                  nian++;
  526.                                                  }
  527.                                                  }
  528.                                                 }
  529.                                                 if(yue==4|yue==6|yue==9|yue==11)
  530.                                                 {
  531.                                                 if(ri>30) //計時到達一個月30天
  532.                                                  {
  533.                                                  ri=1;
  534.                                                  yue++;
  535.                                                  if(yue>12) //計時到達一年
  536.                                                  {
  537.                                                  yue=1;
  538.                                                  nian++;
  539.                                                  }
  540.                                                  }
  541.                                                 }
  542.                                                 if(yue==2)
  543.                                                 {
  544.                                                 if(nian%4==0)
  545.                                                 {
  546.                                                 if(ri>29)//計時到達一個月29天
  547.                                                  {
  548.                                                  ri=1;
  549.                                                  yue++;
  550.                                                  if(yue>12)
  551.                                                  {
  552.                                                  yue=1;
  553.                                                  nian++;
  554.                                                  }
  555.                                                  }
  556.                                                 }
  557.                                                 else
  558.                                                 {
  559.                                                 if(ri>28) //計時到達一個月28天
  560.                                                  {
  561.                                                  ri=1;
  562.                                                  yue++;
  563.                                                  if(yue>12)
  564.                                                  {
  565.                                                  yue=1;
  566.                                                  nian++;
  567.                                                  }
  568.                                                  }
  569.                                                 }

  570.                                                 }
  571.                                         }
  572.                          }
  573.                   }

  574.          }
  575. }

  576. void linsheng()  //鬧鐘發(fā)生器
  577. {    if(nao==1)
  578.      {if(hour==nao1&min==nao2&sec==nao3)//滿足時間?
  579.          qq=1;//是否設置鬧鐘時間
  580.          if(qq==1)
  581.          {
  582.       key_out=0;
  583.       lcd_delay(10000);
  584.           key_out=1;
  585.           lcd_delay(1000);
  586.          }
  587.          }
  588. }
  589. void main()
  590. ……………………

  591. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
新建文件夾.rar (47.06 KB, 下載次數(shù): 44)


回復

使用道具 舉報

ID:684165 發(fā)表于 2020-1-11 16:33 | 顯示全部樓層
這個鬧鐘訂好時間后,好像不響啊!
回復

使用道具 舉報

ID:684165 發(fā)表于 2020-1-11 16:34 | 顯示全部樓層
鬧鐘定好時間后,好像不響。 難受&#128555;
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表