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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機萬年歷 LCD12864串行模式顯示,DS1302讀取時間年月份

[復制鏈接]
跳轉到指定樓層
樓主
ID:234206 發表于 2019-6-28 18:01 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. /***************************************************************
  2. 系統名稱:電子萬年歷
  3. 功能描述:LCD12864串行模式顯示,DS1302讀取時間年月份,
  4. 18B20 讀取溫度
  5. ****************************************************************/
  6. #include <reg51.h>
  7. #include <intrins.h>
  8. #include <stdio.h>
  9. #define uchar unsigned char
  10. #define uint unsigned int
  11. /*------------LCD12864相關聲明-----------------------------*/
  12. #define com 0
  13. #define dat 1
  14. sbit cs =P1^6;
  15. sbit sid=P1^4;
  16. sbit sck=P1^2;
  17. uchar code TAB1[]={"電字鐘w418781840"};//第一行初始化.
  18. uchar code TAB2[]={"20 年 月 日"}; //第二行
  19. uchar code TAB3[]={"星期 : : "}; //第三行
  20. uchar code TAB4[]={"室溫: ℃"}; //第四行
  21. /*----------------------DS1302相關聲明-------------------------*/
  22. char TAB_1302[]={ 0x00,0x29,0x02, //秒:分:時.
  23.                   0x18,0x06,0x06,0x08}; //日:月:星期:年.
  24. uchar code TAB_XQ[]={"一二三四五六日"};//把DS1302數字日期轉換為中文字符.
  25. sbit T_CLK=P2^4; /* 實時時鐘的時鐘線引腳*/
  26. sbit T_IO=P2^5; /* 實時時鐘的數據線*/
  27. sbit T_RST=P2^6; /* 實時時鐘的復位線引腳*/
  28. uchar bdata datbyte;
  29. sbit datbyte0=datbyte^0;
  30. sbit datbyte7=datbyte^7;
  31. /*--------------18B20相關聲明-------------------------------*/
  32. uchar dis1[16];
  33. sbit DQ=P1^0; /*DS18B20溫度檢測*/
  34. /*----------鍵盤相關聲明-------------------------------------*/
  35. sbit key=P3^2; //功能鍵
  36. sbit key1=P3^3; //只有加1鍵
  37. uchar sum,keyflag=0; //調用時,分,秒,標志,調用鍵盤處理標志.
  38. /*--------------以下為LCD12864相關函數--------------------------*/
  39. /**************************************************************
  40. 函數名稱:void delay1ms(uint x)
  41. 函數功能: 延時1MS
  42. ***************************************************************/
  43. void delay1ms(uint x)
  44. {
  45.     uint i,j;
  46.     for(i=0;i<x;i++)
  47.        for(j=0;j<120;j++);
  48. }
  49. /**************************************************************
  50. 函數名稱:void w_12864byte(uchar byte)
  51. 函數功能: 寫字節
  52. **************************************************************/
  53. void w_12864byte(uchar byte)
  54. {
  55.    uchar i;
  56.    for(i=0;i<8;i++)
  57.    {
  58.        sck=0;
  59.        byte<<=1;
  60.        sid=CY;
  61.        sck=1;
  62.    }
  63. }
  64. /**************************************************************
  65. 函數名稱:uchar r_12864byte(void)
  66. 函數功能: 讀字節
  67. ***************************************************************/
  68. uchar r_12864byte(void)
  69. {
  70.       uchar i,temp1,temp2;
  71.       temp1 = 0;
  72.       temp2 = 0;
  73.       for(i=0;i<8;i++)
  74.       {
  75.            temp1=temp1<<1;
  76.            sck = 0;
  77.            sck = 1;
  78.            sck = 0;
  79.            if(sid)
  80.                temp1++;
  81.       }
  82.       for(i=0;i<8;i++)
  83.       {
  84.            temp2=temp2<<1;
  85.            sck = 0;
  86.            sck = 1;
  87.            sck = 0;
  88.            if(sid)
  89.                       temp2++;
  90.       }
  91.       return ((0xf0&temp1)+(0x0f&temp2));
  92. }
  93. /**************************************************************
  94. 函數名稱:void c_12864busy( void )
  95. 函數功能: 檢測忙函數
  96. **************************************************************/
  97. void c_12864busy( void )
  98. {
  99.     do
  100.        w_12864byte(0xfc); //11111,RW(1),RS(0),0
  101.     while(0x80&r_12864byte());
  102. }
  103. /**************************************************************
  104. 函數名稱:void w_12864(bit dat_com,uchar byt)
  105. 函數功能: 寫入函數
  106. ***************************************************************/
  107. void w_12864(bit dat_com,uchar byt)
  108. {
  109.       uchar temp;
  110.       if(dat_com==0) //為零,寫入指令
  111.           temp=0xf8; //11111,RS(0),RW(0),0
  112.       else //否則,寫入數據
  113.           temp=0xfa; //11111,RS(1),RW(0),0
  114.       cs=1;
  115.       c_12864busy();
  116.       w_12864byte(temp);
  117.       w_12864byte(byt&0xf0); //寫入高四位
  118.       w_12864byte(byt<<4); //寫入低四位
  119.       cs=0;
  120. }
  121. /**************************************************************
  122. 函數名稱:void init_12864(void)
  123. 函數功能:初始化12864
  124. ***************************************************************/
  125. void init_12864(void)
  126. {
  127.      w_12864(com,0x30); //基本指令功能.
  128.      w_12864(com,0x0c); //顯示打開,關光標,反白關.
  129.      w_12864(com,0x01); //清屏指令.
  130.      w_12864(com,0x06); //AC自動加一
  131. }
  132. /*----------------以下為DS1302相關函數-------------------------*/
  133. /**************************************************************
  134. 函數名稱:void w_1302byte(uchar date)
  135. 函數功能:寫一個字節(上升沿)
  136. ***************************************************************/
  137. void w_1302byte(uchar date)
  138. {
  139.      uchar i;
  140.      datbyte=date;
  141.      for(i=0;i<8;i++)
  142.      {
  143.          T_IO=datbyte0; //寫最低位
  144.          T_CLK=0;
  145.          T_CLK=1;
  146.          datbyte>>=1;
  147.      }
  148. }
  149. /**************************************************************
  150. 函數名稱:uchar r_1302byte(void)
  151. 函數功能:讀一個字節(下降沿)
  152. ***************************************************************/
  153. uchar r_1302byte(void)
  154. {
  155.      uchar i;
  156.      datbyte=0;
  157.      for(i=0;i<8;i++)
  158.      {
  159.          datbyte7=T_IO; //讀最低位
  160.          T_CLK=1;
  161.          T_CLK=0;
  162.          datbyte>>=1;
  163.      }
  164.      return(datbyte);
  165. }
  166. /***************************************************************
  167. 函數名稱:void write_1302(uchar addr,uchar date)
  168. 函數功能: 指定位置寫數據
  169. ****************************************************************/
  170. void write_1302(uchar addr,uchar date)
  171. {
  172.      T_RST=0;
  173.      T_CLK=0;
  174.      T_RST=1;
  175.      w_1302byte(addr);
  176.      w_1302byte(date);
  177.      T_CLK=0;
  178.      T_RST=0;
  179. }
  180. /**************************************************************
  181. 函數名稱:uchar read_1302(uchar addr)
  182. 函數功能: 指定位置讀數據
  183. ****************************************************************/
  184. uchar read_1302(uchar addr)
  185. {
  186.       uchar dat1,dat2,temp;
  187.       T_RST=0;
  188.       T_CLK=0;
  189.       T_RST=1;
  190.       w_1302byte(addr);
  191.       temp=r_1302byte();
  192.       T_RST=0;
  193.       T_CLK=0;
  194.       dat1=temp/16;
  195.       dat2=temp%16;
  196.       temp=dat1*10+dat2;
  197.       return(temp);
  198. }
  199. /***************************************************************
  200. 函數名稱:void init_1302(void)
  201. 函數功能: 初始化
  202. *****************************************************************/
  203. void init_1302(void)
  204. {
  205.      uchar i;
  206.      uchar addr=0x80;
  207.      write_1302(0x8e,0x00);
  208.      for(i=0;i<7;i++)
  209.      {
  210.          write_1302(addr,TAB_1302[i]);
  211.          addr+=2;
  212.      }
  213.      write_1302(0x8e,0x80);
  214. }
  215. /****************************************************************
  216. 函數名稱:void get_1302(void)
  217. 功能說明:讀取DS1302時鐘信息.
  218. *****************************************************************/
  219. void get_1302(void)
  220. {
  221.      uchar i,addr=0x81;
  222.      for(i=0;i<7;i++)
  223.      {
  224.           TAB_1302[i]=read_1302(addr);
  225.           addr+=2;
  226.      }
  227. }
  228. /*---------------以下為18B20相關函數-----------------------------*/
  229. /******************************************************************
  230. 函數名稱:void delay (uint x)
  231. 功能說明:若機器周期為1us,則本延時程序為延時 4*x(us)
  232. ******************************************************************/
  233. void delay (uint x) //本板延時8us
  234. {
  235.      while (--x);
  236. }

  237. /*****************************************************************
  238. 函數名稱:uchar bus_rest(void)
  239. 功能說明:產生單總線系統信號的總線復位信號,并返回
  240. 總線上是否存在單總線器件信息
  241. ******************************************************************/
  242. uchar bus_rest(void)
  243. {
  244.      uchar presence;
  245.      DQ=0; //將DQ信號線拉低
  246.      delay(29); //持續48US
  247.      DQ=1; //釋放總線
  248.      delay(3); //等待從設備將總線拉低
  249.      presence=DQ; //保存當前總線狀態
  250.      delay(25); //等待總線初始化過程結束
  251.      return presence;//返回是否有從設備將總線拉低

  252. }

  253. /****************************************************************
  254. 函數名稱:uchar r_1820BYTE(void)
  255. 功能說明:向單總線讀取一個數據字節
  256. *****************************************************************/
  257. uchar r_1820BYTE(void)
  258. {
  259.       uchar i=0;
  260.       uchar date = 0;
  261.       for (i=8;i>0;i--)
  262.       {
  263.           DQ = 0; // 將DQ信號線拉低啟動讀時隙
  264.           DQ=1;// 釋放總線,等待從機動車輛返回數據位
  265.           delay(1); //越接近15us越好; 準備采樣總線上的信號
  266.           date>>=1 ;
  267.           if (DQ)
  268.                date=date|0x80;
  269.           delay(6);
  270.        }
  271.        return(date);
  272. }

  273. /*****************************************************************
  274. 函數名稱:void w_1280Byte(uchar bytevalue)
  275. 功能說明:向單總線寫一個數據字節
  276. ******************************************************************/
  277. void w_1280Byte(uchar bytevalue)
  278. {
  279.      uchar i;
  280.      for(i=0;i<8;i++)
  281.      {
  282.          DQ=0; // 將DQ信號線拉低啟動讀時隙
  283.          DQ=bytevalue&0x01; //
  284.          delay(5);//等待寫時隙結束
  285.          DQ=1; //釋放
  286.          bytevalue>>=1;
  287.      }
  288.      delay(5); ////等待寫時隙結束
  289. }
  290. /*****************************************************************
  291. 函數名稱:uint read_T(void)
  292. 功能說明:讀取1820溫度
  293. *******************************************************************/
  294. uint read_T(void)
  295. {
  296.      uchar a=0;
  297.      uchar b=0;
  298.      uint t=0;
  299.      bus_rest();
  300.      w_1280Byte(0xCC); // 跳過讀序號列號的操作 ;
  301.      w_1280Byte(0x44); // 啟動溫度轉換,模數轉化;
  302.      bus_rest();
  303.      w_1280Byte(0xCC); //跳過讀序號列號的操作 ;
  304.      w_1280Byte(0xBE); //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度 ;
  305.      a=r_1820BYTE();// 低8位
  306.      b=r_1820BYTE();// 高8位
  307.      t=(b*256)+a;
  308.      return(t);
  309. }
  310. /**************************************************************
  311. 函數名稱:void show_T(uint temp)
  312. 函數功能:顯示溫度
  313. **************************************************************/
  314. void show_T(uint temp)
  315. {
  316.      int i;
  317.      float ftemp;
  318.      ftemp = temp* 0.0625;
  319.      sprintf(dis1,"%f",ftemp);//把溫度值寫入數組內存
  320.      w_12864(com,0x98+3);
  321.      for(i=0;i<5;i++)
  322.      w_12864(dat,dis1[i]); //寫入溫度
  323. }
  324. /*---------------以下為顯示相關函數--------------------------*/
  325. /******************************
  326. 函數名稱: void fenli(uchar x,uchar y,uchar val)
  327. 功能描述: 指定位置寫入數據
  328. ********************************/
  329. void fenli(uchar x,uchar y,uchar val)
  330. {
  331.      uchar ge,shi,addr,i=0;
  332.      if(val==5)//這里把星期數字顯示的轉換為中文
  333.      {
  334.            w_12864(com,0x88+2);
  335.            for(i=0;i<2;i++)                           //一個漢字寫兩次
  336.            {
  337.                          if(TAB_1302[5]==0)w_12864(dat,TAB_XQ[i]);
  338.                  if(TAB_1302[5]==1)w_12864(dat,TAB_XQ[2+i]); //
  339.                  if(TAB_1302[5]==2)w_12864(dat,TAB_XQ[3+i]); //!!??星期三顯示沒規律,不知咋回事.
  340.                  if(TAB_1302[5]==3)w_12864(dat,TAB_XQ[5+i]);
  341.                  if(TAB_1302[5]==4)w_12864(dat,TAB_XQ[7+i]);
  342.                  if(TAB_1302[5]==5)w_12864(dat,TAB_XQ[9+i]);
  343.                  if(TAB_1302[5]==6)w_12864(dat,TAB_XQ[11+i]);
  344.            }
  345.      }
  346.      else
  347.      {
  348.             shi=TAB_1302[val]/10;//分離十位
  349.             ge=TAB_1302[val]%10;
  350.             if(x==1)x=0x80;
  351.             if(x==2)x=0x90;
  352.             if(x==3)x=0x88;
  353.             if(x==4)x=0x98;
  354.             addr=x+y;
  355.             w_12864(com,addr);//指定位置
  356.             w_12864(dat,0x30+shi);//寫入
  357.             w_12864(dat,0x30+ge);
  358.      }
  359. }
  360. /*************************************************************
  361. 函數名稱:void display(void)
  362. 功能描述: 顯示函數
  363. **************************************************************/
  364. void display(void)
  365. {
  366.         get_1302(); //讀1302
  367.         fenli(3,7,0); //讀秒
  368.         fenli(3,5,1); //讀分
  369.         fenli(3,3,2); //讀時
  370.         fenli(2,5,3); //讀日
  371.         fenli(2,3,4); //讀月
  372.         fenli(3,2,5); //讀星期
  373.         fenli(2,1,6); //讀年
  374. }
  375. /*---------------按鍵處理相關函數--------------------------*/
  376. /************************************************************
  377. 函數名稱:void scanner()
  378. 功能描述: 按鍵函數
  379. *************************************************************/
  380. void scanner()
  381. {
  382.       uchar i,j;
  383.       if(!key) //功能鍵按下
  384.       {
  385.            delay1ms(500); //延時500MS
  386.            if(!key) //還按下,退出時間調整
  387.            {
  388.                keyflag=0; //標志位為0
  389.                sum=0; //清0
  390.                w_12864(com,0x0c);//清閃爍
  391.                for(i=0;i<7;i++)//十進制轉十六進制
  392.                {
  393.                      j=TAB_1302[i]/10;
  394.                      TAB_1302[i]=TAB_1302[i]%10;
  395.                      TAB_1302[i]=TAB_1302[i]+16*j;
  396.                }
  397.                init_1302(); //寫入1302
  398.                while(!key); //等待釋放
  399.                delay1ms(10); //延時消抖
  400.            }
  401.            else //500MS內放開
  402.            {
  403.                keyflag=1; //標志為1,進行時間調整
  404.                sum++; //功能鍵加1
  405.                if(sum==8)
  406.                    sum=0;
  407.                switch(sum)
  408.                {
  409.                      case 1: //
  410.                      {
  411.                              w_12864(com,0x98+7);
  412.                              w_12864(com,0x0f);
  413.                              break;
  414.                      }
  415.                      case 2: //為2,年閃爍
  416.                              w_12864(com,0x90+1);
  417.                              break;
  418.                      case 3: //月閃爍
  419.                              w_12864(com,0x90+3);
  420.                              break;
  421.                      case 4: //日閃爍
  422.                              w_12864(com,0x90+5);
  423.                              break;
  424.                      case 5: //星期閃爍
  425.                              w_12864(com,0x88+2);
  426.                              break;
  427.                      case 6: //分閃爍
  428.                              w_12864(com,0x88+5);
  429.                              break;
  430.                      case 7: //時閃爍
  431.                              w_12864(com,0x88+3);
  432.                              break;
  433.                }
  434.          }
  435.      }
  436.      if(sum) //功能鍵按下
  437.      {
  438.           if(!key1)
  439.           {
  440.                delay1ms(10);
  441.                if(!key1)
  442.                {
  443.                        while(!key1);//等待加1鍵釋放
  444.                        delay1ms(10);
  445.                        if(sum==1)
  446.                        { //備用
  447.                        }
  448.                        if(sum==2)
  449.                        {
  450.                              TAB_1302[6]++;
  451.                              if(TAB_1302[6]==100)
  452.                              TAB_1302[6]=0;
  453.                              fenli(2,1,6);
  454.                              w_12864(com,0x90+1);//閃爍歸位
  455.                        }
  456.                        if(sum==3)
  457.                        {
  458.                             TAB_1302[4]++;
  459.                             if(TAB_1302[4]==13)
  460.                                  TAB_1302[4]=1;
  461.                             fenli(2,3,4);
  462.                             w_12864(com,0x90+3);
  463.                        }
  464.                        if(sum==4)
  465.                        {
  466.                             TAB_1302[3]++;
  467.                             if(TAB_1302[3]==32)
  468.                                  TAB_1302[3]=1;
  469.                             fenli(2,5,3);
  470.                             w_12864(com,0x90+5);
  471.                        }
  472.                        if(sum==5)
  473.                        {
  474.                             TAB_1302[5]++;
  475.                             if(TAB_1302[5]==7)
  476.                                 TAB_1302[5]=0;
  477.                             fenli(3,2,5);
  478.                             w_12864(com,0x88+2);
  479.                        }
  480.                        if(sum==6)
  481.                        {
  482.                             TAB_1302[1]++;
  483.                             if(TAB_1302[1]==60)
  484.                                  TAB_1302[1]=0;
  485.                             fenli(3,5,1);
  486.                             w_12864(com,0x88+5);
  487.                        }
  488.                        if(sum==7)
  489.                        {
  490.                             TAB_1302[2]++;
  491.                             if(TAB_1302[2]==24)
  492.                             TAB_1302[2]=0;
  493.                             fenli(3,3,2);
  494.                             w_12864(com,0x88+3);
  495.                        }
  496.                }
  497.          }
  498.     }
  499. }
  500. //=============================================================
  501. void init(void)
  502. {
  503.       uchar i;
  504.       init_12864();
  505.       init_1302();
  506.       while(TAB1[i]!='\0')
  507.       {
  508.            w_12864(dat,TAB1[i]);
  509.            i++;
  510.       }
  511.       i=0;
  512.       w_12864(com,0x90);
  513.       while(TAB2[i]!='\0')
  514.       {
  515.            w_12864(dat,TAB2[i]);
  516.            i++;
  517.       }
  518.       i=0;
  519.       w_12864(com,0x88);
  520.       while(TAB3[i]!='\0')
  521.       {
  522.            w_12864(dat,TAB3[i]);
  523.            i++;
  524.       }
  525.       i=0;
  526.       w_12864(com,0x98);
  527.       while(TAB4[i]!='\0')
  528.       {
  529.            w_12864(dat,TAB4[i]);
  530.            i++;
  531.       }
  532. }
  533. /*************************************************************
  534. 函數名稱:主函數
  535. 函數功能:
  536. **************************************************************/
  537. main()
  538. {
  539.        init();
  540.        while(1)
  541.        {
  542.             scanner(); //檢測鍵盤
  543.             if(!keyflag) //標志為0
  544.             {
  545.                    display(); //調用顯示
  546.                    show_T(read_T()); //顯示溫度
  547.                    delay1ms(500);
  548.             }
  549.        }
  550. }
復制代碼

萬年歷.zip

50.78 KB, 下載次數: 93, 下載積分: 黑幣 -5

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

使用道具 舉報

沙發
ID:59151 發表于 2020-1-23 00:26 | 只看該作者
正在在學習,謝謝分享!
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美一二三四成人免费视频 | 国产你懂的在线观看 | 亚洲日日操 | 美女三区| 日韩成人一区 | 男女啪啪高潮无遮挡免费动态 | 成人在线视频观看 | 午夜视频一区二区三区 | 国产福利在线播放 | 久久精品无码一区二区三区 | 欧美xxxx色视频在线观看免费 | 91毛片在线看| 在线日韩欧美 | 天天爽天天干 | 黄色毛片在线播放 | 综合成人在线 | 欧美精品综合在线 | 一区天堂| 蜜桃视频在线观看免费视频网站www | 久久久久久久久久久久亚洲 | 天天躁日日躁狠狠很躁 | 成人精品一区二区三区中文字幕 | 国精产品一品二品国精在线观看 | 日韩视频一区二区三区 | 国产精品国产a | 521av网站| 九九热这里 | 久久久久成人精品免费播放动漫 | 亚洲一区视频在线 | 国产精品欧美一区二区 | 五月天婷婷狠狠 | 国产高清一区二区三区 | 国产精品三级 | 日韩中文在线视频 | 亚洲一区二区免费电影 | 免费观看一级毛片 | av中文在线| 成人免费看黄网站在线观看 | a级黄色毛片免费播放视频 国产精品视频在线观看 | 欧美精品一区久久 | 精品日本久久久久久久久久 |