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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

stc52+12864液晶屏+ds1302自動顯示程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:259642 發表于 2017-12-9 23:52 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
液晶屏+ds1302自動顯示

單片機源程序如下:
  1. /*頭文件*/
  2. #include <reg52.h>      
  3. #include <intrins.h>
  4. #define uint unsigned int
  5. #define uchar unsigned char

  6. /*引腳端口定義*/
  7. sbit lcd_psb=P3^7;
  8. sbit LCD12864_RS_PORT=P3^5;  /*LCD12864引腳定義*/
  9. sbit LCD12864_RW_PORT=P3^6;
  10. sbit LCD12864_E_PORT=P3^4;
  11. #define        LCD12864_DA_PORT P0
  12. sbit dula=P2^6;     //數碼管的段選信號

  13. sbit DQ=P2^2;       //定義DS18B20通信端口
  14. sbit Beep=P2^3;     //蜂鳴器通信端口

  15. sbit T_CLK=P1^7;    /*ds1302實時時鐘時鐘線引腳 */
  16. sbit T_IO=P2^4;     /*ds1302實時時鐘數據線引腳 */
  17. sbit T_RST=P1^6;    /*ds1302實時時鐘復位線引腳 */
  18. sbit ACC0=ACC^0;    /*ds1302位尋址寄存器*/
  19. sbit ACC7=ACC^7;
  20.        
  21. uchar code num_to_char[]={"0123456789"};/*數字轉換為ASCII字符碼*/
  22. uchar code Week1_to_char[]={"一"};
  23. uchar code Week2_to_char[]={"二"};
  24. uchar code Week3_to_char[]={"三"};
  25. uchar code Week4_to_char[]={"四"};
  26. uchar code Week5_to_char[]={"五"};
  27. uchar code Week6_to_char[]={"六"}; /*星期數字轉換為漢字的ASCII碼*/
  28. uchar code Week7_to_char[]={"日"};
  29. uchar hanzi_buff1[]={"    年  月  日  "};//0-15
  30. uchar hanzi_buff2[]={"    星期        "};
  31. uchar hanzi_buff3[]={"      :  :      "};
  32. uchar hanzi_buff4[]={"當前溫度:   . 度"};
  33. uchar data time_data_buff[7]={0x00,0x00,0x12,0x01,0x12,0x06,0x17};/*格式為: 秒 分 時 日 月 星期 年 */
  34. /*1MS為單位的延時程序*/
  35. void delay_1ms(uchar x)
  36. {
  37.     uchar j;
  38.     while(x--){
  39.         for(j=0;j<125;j++)
  40.             {;}
  41.         }   
  42. }

  43. void beep()
  44. {
  45.     Beep=0;
  46.         delay_1ms(2000);
  47.     Beep=1;
  48. }
  49. ////////////////////以下是時鐘讀取程序/////////////////
  50. /********************************************************************
  51. 函 數 名:InputByte()
  52. 功    能:實時時鐘寫入一字節
  53. 說    明:往DS1302寫入1Byte數據 (內部函數)
  54. 入口參數:d 寫入的數據
  55. 返 回 值:無  
  56. ***********************************************************************/
  57. void InputByte(uchar d)
  58. {
  59.     uchar i;
  60.     ACC=d;
  61.     for(i=8;i>0;i--)
  62.     {
  63.         T_IO=ACC0;           /*相當于匯編中的 RRC */
  64.         T_CLK=1;
  65.         T_CLK=0;
  66.         ACC=ACC>>1;
  67.     }
  68. }
  69. /********************************************************************
  70. 函 數 名:OutputByte()
  71. 功    能:實時時鐘讀取一字節
  72. 說    明:從DS1302讀取1Byte數據 (內部函數)
  73. 入口參數:無  
  74. 返 回 值:ACC
  75. ***********************************************************************/
  76. uchar OutputByte()
  77. {
  78.     uchar i;
  79.     for(i=8;i>0;i--)
  80.     {
  81.         ACC=ACC>>1;         /*相當于匯編中的 RRC */
  82.         ACC7=T_IO;
  83.         T_CLK=1;
  84.         T_CLK=0;
  85.     }
  86.     return(ACC);
  87. }
  88. /********************************************************************
  89. 函 數 名:W1302()
  90. 功    能:往DS1302寫入數據
  91. 說    明:先寫地址,后寫命令/數據 (內部函數)
  92. 調    用:RTInputByte() , RTOutputByte()
  93. 入口參數:ucAddr: DS1302地址, ucData: 要寫的數據
  94. 返 回 值:無
  95. ***********************************************************************/
  96. void W1302(uchar ucAddr, uchar ucDa)//先寫命令字,再寫數據
  97. {
  98.     T_RST=0;
  99.     T_CLK=0;
  100.     T_RST=1;
  101.     InputByte(ucAddr);       /* 地址,命令 */
  102.     InputByte(ucDa);         /* 寫1Byte數據*/
  103.     T_CLK=1;
  104.     T_RST=0;
  105. }
  106. /********************************************************************
  107. 函 數 名:Set1302()
  108. 功    能:設置初始時間
  109. 說    明:先寫地址,后讀命令/數據(寄存器多字節方式)
  110. 調    用:W1302()
  111. 入口參數:pClock: 設置時鐘數據地址 格式為: 秒 分 時 日 月 星期 年
  112.                                7Byte (BCD碼)1B 1B 1B 1B 1B  1B  1B
  113. 返 回 值:無
  114. ***********************************************************************/
  115. void Set1302(uchar *pClock) //指針指向time_data_buff數組
  116. {
  117.     uchar i;
  118.     uchar ucAddr=0x80;
  119.         //EA=0;
  120.     W1302(0x8e,0x00);/*對寫保護寄存器操作,0x8e寫保護寄存器寫命令字,0x00使該寄存器最高位WP=0時間日歷寄存器可進行寫操作*/
  121.         //W1302(0x90,0xa6);
  122.     for(i=7;i>0;i--)
  123.     {
  124.         W1302(ucAddr,*pClock);  //秒 分 時 日 月 星期 年 ucAddr先為0x80,此地址為秒寄存器寫控制命令字
  125.         pClock++;
  126.         ucAddr+=2;  //每次加2分別進入分、時、日。。。年寫命令字
  127.     }
  128.     W1302(0x8e,0x80);           /* 控制命令,WP=1,寫保護,此后時鐘寄存器不斷變化*/
  129.         //EA = 1;
  130. }
  131. /********************************************************************
  132. 函 數 名:R1302()
  133. 功    能:讀取DS1302某地址的數據
  134. 說    明:先寫地址,后讀命令/數據 (內部函數)
  135. 調    用:RTInputByte() , RTOutputByte()
  136. 入口參數:ucAddr: DS1302地址
  137. 返 回 值:ucData :讀取的數據
  138. ***********************************************************************/
  139. uchar R1302(uchar ucAddr)//先寫命令字,再讀數據
  140. {
  141.     uchar ucData;
  142.     T_RST=0;
  143.     T_CLK=0;
  144.     T_RST=1;
  145.     InputByte(ucAddr);             /* 地址,命令 */
  146.     ucData=OutputByte();         /* 讀1Byte數據 */
  147.     T_CLK=1;
  148.     T_RST=0;
  149.     return(ucData);
  150. }
  151. /********************************************************************
  152. 函 數 名:Now1302()
  153. 功    能:讀取DS1302當前時間
  154. 說    明:
  155. 調    用:R1302()
  156. 入口參數:ucCurtime: 保存當前時間地址。當前時間格式為: 秒 分 時 日 月 星期 年
  157.                                         7Byte (BCD碼)   1B 1B 1B 1B 1B  1B  1B
  158. 返 回 值:無
  159. ***********************************************************************/
  160. void Now1302(uchar ucCurtime[])
  161. {
  162.     uchar i;
  163.     uchar ucAddr=0x81;
  164.         //EA=0;
  165.     for (i=0;i<7;i++)
  166.     {
  167.         ucCurtime[i]=R1302(ucAddr);/*格式為: 秒 分 時 日 月 星期 年 */
  168.         ucAddr+=2;
  169.     }
  170.         //EA=1;//考慮保持總中斷開啟
  171. }







  172. void delay(uint i)
  173. {
  174.         while(i--);
  175. }








  176. //////////////////以下是DS18B20驅動程序////////////////
  177. void Init_DS18B20()//初始化函數
  178. {
  179.         unsigned char x=0;
  180.         DQ = 1; //DQ復位
  181.         delay(8); //稍做延時
  182.         DQ = 0; //單片機將DQ拉低
  183.         delay(80); //精確延時 大于 480us
  184.         DQ = 1; //拉高總線
  185.         delay(14);
  186.         x=DQ; //稍做延時后 如果x=0則初始化成功 x=1則初始化失敗
  187.         DQ=1;
  188. }

  189. uchar ReadOneChar()//讀一個字節
  190. {
  191.         uchar i;
  192.         uchar dat=0;
  193.         for(i=8;i>0;i--)
  194.         {
  195.                 DQ=0; // 給脈沖信號
  196.                 dat>>=1;
  197.                 DQ=1; // 給脈沖信號
  198.                 if(DQ)  
  199.                 dat|=0x80; //利用0x80將溫度數據賦給dat
  200.                 delay(4);
  201.         }
  202.         return(dat);
  203. }

  204. void WriteOneChar(unsigned char dat)//寫一個字節
  205. {
  206.         uchar i=0;
  207.         for (i=8;i>0;i--){
  208.                 DQ=0;
  209.                 DQ=dat&0x01;
  210.                 delay(5);
  211.                 DQ=1;
  212.                 dat>>=1;
  213.                 }
  214. }

  215. uint ReadTemperature()//讀取溫度,注意返回值為16bit
  216. {
  217.         uchar a=0;
  218.         uchar b=0;
  219.         uint t=0;
  220.         float tt=0;
  221.         Init_DS18B20();
  222.         WriteOneChar(0xCC); // 跳過讀序號列號的操作
  223.         WriteOneChar(0x44); // 啟動溫度轉換
  224.         Init_DS18B20();
  225.         WriteOneChar(0xCC); //跳過讀序號列號的操作
  226.         WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度
  227.         a=ReadOneChar();
  228.         b=ReadOneChar();
  229.         t=b;
  230.         t<<=8;
  231.         t=t|a; //將溫度的高位與低位合并
  232.         tt=t*0.0625;
  233.         t=tt*10+0.5; //對結果進行4舍5入
  234.         return(t);
  235. }






  236. //////////////////以下是LCD12864驅動程序////////////////
  237. void LCD12864_WaitIdle()
  238. //LCD12864  忙 信號檢測
  239. {
  240.         LCD12864_DA_PORT = 0xff;
  241.         LCD12864_RS_PORT = 0;
  242.         LCD12864_RW_PORT = 1;
  243.         LCD12864_E_PORT = 1;
  244.         while((LCD12864_DA_PORT&0x80)==1); /*等待BF 不為1*/
  245.         LCD12864_E_PORT = 0;
  246. }

  247. void LCD12864_COM_Write( uchar com_da) /* 檢測忙信號寫入命令字 com_da 為待寫入的命令字*/       
  248. {
  249.         LCD12864_WaitIdle();
  250.         LCD12864_RS_PORT = 0;
  251.         LCD12864_RW_PORT = 0;
  252.         LCD12864_DA_PORT = com_da;
  253.         LCD12864_E_PORT = 1;
  254.     delay_1ms(1);
  255.         LCD12864_E_PORT = 0;       
  256. }

  257. void LCD12864_NoWaitIdle_COM_Write(uchar com) /*不檢測忙信號寫入命令字,com_da 為待寫入的命令字*/       
  258. {
  259.         LCD12864_RS_PORT=0; //0寫命令
  260.         LCD12864_RW_PORT=0;
  261.         LCD12864_E_PORT=0;
  262.         LCD12864_DA_PORT=com;
  263.     delay_1ms(1);
  264.         LCD12864_E_PORT=1;
  265.     delay_1ms(1);
  266.     LCD12864_E_PORT=0;       
  267. }

  268. void LCD12864_Data_Write(uchar da) /*數據寫入 da為待寫入8位數據*/
  269. {
  270.         LCD12864_WaitIdle(); /*檢測忙信號*/
  271.         LCD12864_RS_PORT = 1; //寫數據
  272.         LCD12864_RW_PORT = 0;
  273.         LCD12864_DA_PORT = da;
  274.         LCD12864_E_PORT = 1;
  275.     delay_1ms(1);
  276.         LCD12864_E_PORT = 0;       
  277. }

  278. void LCD12864_init()  /*LCD12864初始化*/
  279. {
  280.         lcd_psb=1;
  281.         LCD12864_NoWaitIdle_COM_Write(0x30); /*基本指令操作*/
  282.         delay_1ms(10);
  283.         LCD12864_NoWaitIdle_COM_Write(0x0c); /*顯示開及光標設置*/
  284.         delay_1ms(10);
  285.         LCD12864_NoWaitIdle_COM_Write(0x01); /*顯示清屏*/
  286.         delay_1ms(10);
  287.         LCD12864_NoWaitIdle_COM_Write(0x06); /*DDRAM的地址計數器(AC)加1*/
  288.         delay_1ms(10);       
  289. }

  290. void LCD12864_HAIZI_WRITE(uchar x,uchar y,uchar daH,uchar daL) //漢字16bit寫入 x寫入的X位置 y寫入的Y位置 daH寫入漢字高八位 daL寫入漢字低八位
  291. {
  292.         uchar xy;
  293.         if((x>=8)||(y>=4)) return; /*X位置超出顯示范圍退出*/
  294.         if(y==0)      xy=0x80+x;
  295.         else if(y==1) xy=0x90+x; /*計算轉換地址*/
  296.         else if(y==2) xy=0x88+x;
  297.         else if(y==3) xy=0x98+x;
  298.         LCD12864_COM_Write(xy); /*寫地址*/
  299.         delay_1ms(1);
  300.         LCD12864_Data_Write(daH); /*寫高八位數據*/
  301.         delay_1ms(1);
  302.         LCD12864_Data_Write(daL); /*寫低八位數據*/
  303.         delay_1ms(1);
  304. }








  305. //鍵盤掃描函數,低電位按下

  306. /*void keyscan()
  307. {
  308.         int s1num;
  309.         rd=0;
  310.         if(key1==0)
  311.         {
  312.                 delay_1ms(5);
  313.             if(key1==0)
  314.             {
  315.                      Set1302(time_data_buff);
  316.                          W1302(0x8e,0x00);
  317.                  W1302(0x80,0x80);
  318.                          W1302(0x8e,0x80);
  319.                      s1num++;
  320.                      while(!key1);
  321.                      if(s1num==1)
  322.                      {                       
  323.                     //LCD12864_COM_Write(0x81);年
  324.                              if(key2==0)
  325.                              {
  326.                                       delay_1ms(5);
  327.                                       if(key2==0)
  328.                                       {
  329.                                           while(!key2);
  330.                                               time_data_buff[6]++;
  331.                                       }
  332.                              }
  333.                      }
  334.                 /*if(s1num==2)
  335.                 {
  336.             LCD12864_COM_Write(0x83);//月
  337.                 }
  338.                 if(s1num==3)
  339.                 {
  340.                         LCD12864_COM_Write(0x85);//日
  341.                 }
  342.                 if(s1num==4)
  343.                 {
  344.                         LCD12864_COM_Write(0x8a);//時
  345.                 }
  346.                 if(s1num==5)
  347.                 {
  348.                         LCD12864_COM_Write(0x88+)/////////////////
  349.                 }
  350.                 if(s1num==6)
  351.                 {
  352.                         LCD12864_COM_Write(0x8d);//秒
  353.                 }*/
  354.         /*     if(s1num==2)
  355.                      {
  356.                                s1num=0;
  357.                                    W1302(0x8e,0x00);
  358.                                W1302(0x80,0x00);
  359.                                    W1302(0x8e,0x80);
  360.                      }
  361.         //W1302(0x80,此處應為修改的秒值);       
  362.                
  363.            }
  364.         }
  365. }
  366. */

  367. void main()//主函數
  368. {
  369.         uchar i;
  370.         uint temp_buff;

  371.         P0=0x00;//關掉數碼管位選信號。阻止數碼管受到P0口信號的影響。
  372.         dula=1;
  373.         delay_1ms(1);
  374.         dula=0;
  375.         delay_1ms(1);
  376.        
  377.         LCD12864_init(); /*LCD初始化*/

  378.         LCD12864_DA_PORT = 0xff;  /*釋放P0端口*/
  379.        
  380.         Set1302(time_data_buff);

  381.         while(1){
  382.                
  383. //                keyscan();
  384.        
  385.                 Now1302(time_data_buff);
  386.                 hanzi_buff1[2] = num_to_char[time_data_buff[6]/0x10];
  387.                 hanzi_buff1[3] = num_to_char[time_data_buff[6]%0x10]; /*年*/
  388.                 hanzi_buff1[6] = num_to_char[time_data_buff[4]/0x10];
  389.                 hanzi_buff1[7] = num_to_char[time_data_buff[4]%0x10]; /*月*/
  390.                 hanzi_buff1[10] = num_to_char[time_data_buff[3]/0x10];
  391.                 hanzi_buff1[11] = num_to_char[time_data_buff[3]%0x10]; /*日*/
  392.                 hanzi_buff3[4] = num_to_char[time_data_buff[2]/0x10];
  393.                 hanzi_buff3[5] = num_to_char[time_data_buff[2]%0x10]; /*時*/
  394.                 hanzi_buff3[7] = num_to_char[time_data_buff[1]/0x10];
  395.                 hanzi_buff3[8] = num_to_char[time_data_buff[1]%0x10]; /*分*/
  396. ……………………

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

所有資料51hei提供下載:
test_2_3.zip (40.99 KB, 下載次數: 28)


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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美看片 | 一级片视频免费 | 欧美日韩视频一区二区 | 91在线观看免费视频 | 久久一区二区三区免费 | 国产精品国产三级国产播12软件 | 2021天天干夜夜爽 | 中文字幕日韩在线观看 | 99精品电影 | 亚洲第1页 | 亚洲激情综合 | 99精品电影 | 精品久久久一区二区 | 久色| 久久久91 | 国产成人综合网 | 亚洲视频免费观看 | 免费看a| 日韩中文字幕在线观看 | 九一国产精品 | 日韩精品久久久 | 日韩中文一区二区三区 | 欧美成人高清视频 | 成人不卡 | 国产情侣一区 | 粉嫩国产精品一区二区在线观看 | 男女视频在线观看网站 | 国产在线播| av中文字幕在线播放 | 国产在线精品一区二区三区 | 亚洲色欲色欲www | 97超碰成人| 亚洲三区视频 | 久久99精品视频 | 亚洲h视频 | 国产三级精品三级在线观看四季网 | 一级片在线视频 | 国产精品99久久久久久人 | 国产日韩欧美精品一区二区 | 久久国产视频播放 | 在线观看国产视频 |