亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码

標題: 12864液晶顯示RS485通信溫度傳輸測試穩定實物圖+源碼 [打印本頁]

作者: 冰冰潔潔    時間: 2018-11-10 07:53
標題: 12864液晶顯示RS485通信溫度傳輸測試穩定實物圖+源碼
lcd12864顯串STC89串RS485通訊溫度OK制作出來的實物圖如下:


單片機源程序如下:
  1. /*******************************************************************************
  2. *  標題:                                基于433M的無線溫度傳輸模塊                         *
  3. *                                                                              *
  4. *  實驗說明:本裝置用的是433M進行無線傳輸,理論距離在1KM左右,實際可能會短點, *
  5. 433的啟動電流在200mA,所以需要鋰電池或者USB進行供電。所以耗電量比較大。        *
  6.                                                                                *
  7. ********************************************************************************
  8. * 實驗心得:代碼中的數碼管顯示部分,在proteus中是不顯示的,因為DS18B20的溫度采 *
  9. 集在ms級別,而數碼管全顯的刷新時間是在μs級別。所以在仿真中不會成功顯示,但是按 *
  10. 照仿真焊接的實物圖可以成功顯示。如果想讓protues也成功顯示,需要將數碼管顯示或者*
  11. 溫度采集的部分放入時間中斷里面,即可成功顯示。但是實際的實物效果不好,會出現跳 *
  12. 動的情況,費眼睛                                                                                                                           *
  13.                                                                                                                                                *
  14. ********************************************************************************/
  15. #include<reg51.h>
  16. #include "ds18b20.h"

  17. unsigned char TP[2];
  18. int Temp;

  19. sbit EN = P2^0;//RS485使能  0接收, 1發送

  20. //--聲明全局函數--//
  21. void UsartConfiguration();
  22. void Delay10ms(unsigned int c);   //誤差 0us

  23. /*******************************************************************************
  24. * 函 數 名         : main
  25. * 函數功能                   : 主函數
  26. * 輸    入         : 無
  27. * 輸    出         : 無
  28. *******************************************************************************/

  29. void main()
  30. {
  31.         unsigned char i;
  32.         float tp;
  33.         UsartConfiguration();
  34.         EN = 1;//RS485使能  0接收, 1發送
  35.         while(1)
  36.         {
  37.                 Temp = Ds18b20ReadTemp();
  38.                 if(Temp< 0)                                //當溫度值為負數
  39.                   {
  40.                         Temp=Temp-1;
  41.                         tp=~Temp;
  42.                         Temp=tp*0.0625*10+0.5;       
  43.                         //留兩個小數點就*100,+0.5是四舍五入,因為C語言浮點數轉換為整型的時候把小數點
  44.                         //后面的數自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
  45.                         //算由?.5,還是在小數點后面。
  46.                         TP[0] = Temp/256;
  47.                         TP[1] = Temp%256;
  48.          
  49.                   }
  50.                   else
  51.                   {
  52.                     tp = Temp;                       
  53.                         Temp=tp*0.0625*10+0.5;       
  54.                         //留兩個小數點就*100,+0.5是四舍五入,因為C語言浮點數轉換為整型的時候把小數點
  55.                         //后面的數自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
  56.                         //算加上0.5,還是在小數點后面。
  57.                         TP[0] = Temp/256;
  58.                         TP[1] = Temp%256;
  59.                 }
  60.                 for(i=0; i<2; i++)
  61.                 {
  62.                         SBUF = TP[i];   //將要發送的數據放入到發送寄存器
  63.                         while(!TI);                  //等待發送數據完成
  64.                         TI=0;
  65.                         Delay10ms(10);                  //延時一下再發                          //清除發送完成標志位
  66.                 }
  67.        
  68.                    
  69.         }
  70. }
  71. /*******************************************************************************
  72. * 函 數 名         :UsartConfiguration()
  73. * 函數功能                   :設置串口
  74. * 輸    入         : 無
  75. * 輸    出         : 無
  76. *******************************************************************************/

  77. void UsartConfiguration()
  78. {
  79.         SCON=0X50;                        //設置為工作方式1
  80.         TMOD=0X20;                        //設置計數器工作方式2
  81.         PCON=0X00;                        //波特率加倍
  82.         TH1=0XFA;                    //計數器初始值設置,注意波特率是4800的
  83.         TL1=0XFA;
  84.         EA=1;                                                //打開總中斷
  85.         TR1=1;                                            //打開計數器
  86. }

  87. /*******************************************************************************
  88. * 函 數 名         : Delay10ms
  89. * 函數功能                   : 延時函數,延時10ms
  90. * 輸    入         : 無
  91. * 輸    出         : 無
  92. *******************************************************************************/

  93. void Delay10ms(unsigned int c)   //誤差 0us
  94. {
  95.     unsigned char a, b;

  96.         //--c已經在傳遞過來的時候已經賦值了,所以在for語句第一句就不用賦值了--//
  97.     for (;c>0;c--)
  98.         {
  99.                 for (b=38;b>0;b--)
  100.                 {
  101.                         for (a=130;a>0;a--);
  102.                 }         
  103.         }      
  104. }
復制代碼


  1. #include <reg51.h>
  2. #include "ds18b20.h"
  3. #define uchar unsigned char
  4. #define uint  unsigned int
  5. /***************************功能定義***************************/
  6. #define LCD12864_W_COM                        0xF8        //寫指令
  7. #define LCD12864_R_COM                        0xFC        //讀指令
  8. #define LCD12864_W_DAT                        0xFA        //寫數據
  9. #define LCD12864_R_DAT                        0xFE        //讀數據
  10. #ifndef __LCD12864_H__
  11. #define __LCD12864_H__
  12. #define LCD12864_COM 0        //輸入指令
  13. #define LCD12864_DAT 1        //輸入數據
  14. #define LCD12864_CLEAR                        0x01        //清除顯示
  15. #define LCD12864_CURSOR                        0x02        //位址歸位,游標回原點
  16. #define LCD12864_CURSOR_RLF                0x04        //光標左移,整體顯示不移動
  17. #define LCD12864_CURSOR_RRF                0x06        //光標右移,整體顯示不移動
  18. #define LCD12864_CURSOR_RLN                0x05        //光標左移,整體顯示移動
  19. #define LCD12864_CURSOR_RRN                0x07        //光標右移,整體顯示移動
  20. #define LCD12864_DIS_OFF                0x08        //顯示狀態全關
  21. #define LCD12864_DIS_ON                        0x0E        //顯示狀態開
  22. #define LCD12864_DIS_CUR_ON                0x0E        //游標顯示開
  23. #define LCD12864_DIS_CURS_ON        0x0F        //游標位置顯示開
  24. #define LCD12864_CURSOR_RL                0x10        //游標左移
  25. #define LCD12864_CURSOR_RR                0x14        //游標右移
  26. #define LCD12864_CURDIS_RL                0x18        //整體顯示左移,光標跟隨
  27. #define LCD12864_CURDIS_RR                0x1C        //整體顯示又移,光標跟隨
  28. #define LCD12864_COM_BASIC                0x30        //基本指令集動作
  29. #define LCD12864_COM_PLOT_ON        0x36        //擴展指令集動作,繪圖顯示ON
  30. #define LCD12864_COM_PLOT_OFF        0x34        //擴展指令集動作,繪圖顯示OFF
  31. #define LCD12864_STAND_TO                0x31        //進入待命模式
  32. #define LCD12864_PLACE_ROLL                0x03        //允許輸入卷動位址
  33. #define LCD12864_PLACE_IRAM                0x02        //允許輸入IRAM位址
  34. #define LCD12864_REVERES_13                0x04        //選擇一、三行同時作反白顯示
  35. #define LCD12864_REVERES_24                0x05        //選擇二、四行同時作反白顯示
  36. #define LCD12864_REST_ON                0x08        //進入睡眠模式
  37. #define LCD12864_REST_OFF                0x0C        //脫離睡眠模式
  38. #define LCD12864_W_COM                        0xF8        //寫指令
  39. #define LCD12864_R_COM                        0xFC        //讀指令
  40. #define LCD12864_W_DAT                        0xFA        //寫數據
  41. #define LCD12864_R_DAT                        0xFE        //讀數據
  42. //======串口模式=======
  43. sbit LCD12864_CS = P2^7;   //片選信號輸入
  44. sbit LCD12864_STD = P2^6;  //串行數據輸入
  45. sbit LCD12864_SCLK = P2^5; //串行移位脈沖輸入
  46. sbit LCD12864_PSB = P2^4;  //串并模式選擇 0:串口,1:并口
  47. sbit LCDRST  = P2^3;
  48. unsigned char code tabe[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};//查表法//0-9數字

  49. //--定義全局變量--//
  50. unsigned char TP[8];//顯示用的本地和接收溫度共8位。各個位數
  51. int Temp;
  52. int i;
  53. int j = -1;
  54. int receiveData;
  55. unsigned char receive[2];
  56. sbit EN = P2^0;//RS485使能  0接收, 1發送
  57. void UsartConfiguration();
  58. /*******************************************************************************
  59. * 函 數 名         : main
  60. * 函數功能                   : 主函數
  61. * 輸    入         : 無
  62. * 輸    出         : 無
  63. *******************************************************************************/
  64. /*****************************向12864寫入8位數據*************************************/
  65. void LCD12864_Wbyte(uchar byte)
  66. {
  67.         uchar i;

  68.         for(i=0;i<8;i++)
  69.                 {
  70.                 LCD12864_SCLK = 0;
  71.                 byte <<= 1;                         //左移待寫入數據,使最高位移至CY
  72.                 LCD12864_STD = CY;        //寫入一位數據
  73.                 LCD12864_SCLK = 1;
  74.                 LCD12864_SCLK = 0;   
  75.                 }
  76. }
  77. /***************************從12864讀出8位數據***返回:sdat************************************/
  78. uchar LCD12864_Rbyte(void)
  79. {
  80.      uchar i,sdat,temp1,temp2;
  81.      temp1 = 0;
  82.      temp2 = 0;
  83. //==========12864的串行數據輸出形式是D7-D6-D5-D4-0-0-0-0-D3-D2-D1-D0-0-0-0-0,故要度兩個八位整合==============
  84.      for(i=0;i<8;i++)
  85.                 {
  86.                 temp1=temp1 << 1;
  87.                 LCD12864_SCLK = 0;
  88.                 LCD12864_SCLK = 1;            
  89.                 LCD12864_SCLK = 0;
  90.                 if( LCD12864_STD )        temp1|=0x01;        //tempe1:D7-D6-D5-D4-0-0-0-0
  91.                 }
  92.      for(i=0;i<8;i++)
  93.                 {
  94.                 temp2=temp2 << 1;
  95.                 LCD12864_SCLK = 0;
  96.                 LCD12864_SCLK = 1;            
  97.                 LCD12864_SCLK = 0;
  98.                 if( LCD12864_STD ) temp2|=0x01;   //tempe2:D3-D2-D1-D0-0-0-0-0
  99.                 }
  100.         sdat = ((temp1 & 0xf0)|(temp2 >> 4));  //取出D7\D6\D5\D4\D3\D2\D1\D0                    
  101.         return sdat;  //返回一個值(sdat)
  102. }
  103. /****************************讀忙狀態**************************************/
  104. void LCD12864_busy( void )
  105. {
  106.         do        LCD12864_Wbyte( LCD12864_R_COM );                //LCD12864_RW=11111,RW(1),RS(0),0
  107.         while( LCD12864_Rbyte() & 0x80 );         //讀BF,直到BF == 0
  108. }
  109. /*************************dat_com=0寫指令,dat_com=1寫數據*****************************************/
  110. void LCD12864_W (bit dat_com,uchar byte)
  111. {
  112.         uchar temp;
  113.         if(dat_com == 0)         //為零,寫入指令
  114.                 temp = LCD12864_W_COM;        //11111,RS(0),RW(0),0
  115.         else                            //否則,寫入數據
  116.                 temp = LCD12864_W_DAT;        //11111,RS(1),RW(0),0
  117.         LCD12864_CS = 1;                //片選使能
  118.         LCD12864_busy();                //LCD忙檢測
  119.         LCD12864_Wbyte(temp);        //寫入模式選擇,指令還是數據
  120.         LCD12864_Wbyte(byte&0xf0);        //寫入字節
  121.         LCD12864_Wbyte((byte<<4)&0xf0);        //寫入字節
  122.     LCD12864_CS = 0;                //片選關閉
  123. }
  124. /****************************LCD12864初始化**************************************/

  125. void LCD12864_Init(void)
  126. {
  127.         LCDRST=1;
  128.         LCD12864_PSB = 0;        //選擇串口模式
  129.         LCD12864_W(LCD12864_COM,0x30);        //基本指令功能.
  130.         LCD12864_W(LCD12864_COM,0x03);        //允許輸入卷動位址
  131.         LCD12864_W(LCD12864_COM,0x0c);                //脫離隨眠狀態,顯示打開,關光標,反白關.
  132.         LCD12864_W(LCD12864_COM,0x01);                //清屏指令.
  133.         LCD12864_W(LCD12864_COM,0x06);        //AC自動加一,光標右移,整體顯示不移動   
  134. }
  135. /**************************LCD12864字符位置自定義顯示****************************************/
  136. void LCD12864_WPoss(uchar x,uchar y,uchar *buff)
  137. {
  138.         uchar addr,i=0;
  139.         switch (x)
  140.                 {
  141.                 case 0:addr=0x80;break;
  142.                 case 1:addr=0x90;break;
  143.                 case 2:addr=0x88;break;
  144.                 case 3:addr=0x98;break;
  145.                 }
  146.         addr=addr+y;

  147.         LCD12864_W(LCD12864_COM,LCD12864_COM_BASIC);        //8BitMCU,基本指令集合
  148.         LCD12864_W(LCD12864_COM,addr);                                        //顯示在自定義位置

  149.         while(buff[i]!='\0')
  150.                 {       
  151.                 LCD12864_W(LCD12864_DAT,buff[i++]);
  152.                 if(++y==16)
  153.                         {
  154.                         y=0;
  155.                         if(++x==4) x=0;

  156.                         switch (x)
  157.                                 {
  158.                                 case 0:addr=0x80;break;
  159.                                 case 1:addr=0x90;break;
  160.                                 case 2:addr=0x88;break;
  161.                                 case 3:addr=0x98;break;
  162.                                 }
  163.                         addr=addr+y;
  164.                         LCD12864_W(LCD12864_COM,addr);
  165.                         }
  166.        
  167.                 }
  168. }
  169. void Disp_img(unsigned char  *img)        //圖形方式12864顯示字模221 橫向取膜
  170. {
  171.         unsigned char i,j;
  172.         unsigned int k = 0;

  173.         LCD12864_W(0,0x36); //圖形方式
  174.         for(i=0;i<32;i++)
  175.           {
  176.                 LCD12864_W(0,0x80+i);
  177.                 LCD12864_W(0,0x80);
  178.             for(j=0;j<16;j++)
  179.                 {
  180.                         LCD12864_W(1,img[k++]);
  181.                 }
  182.           }

  183.         for(i=0;i<32;i++)
  184.           {
  185.                 LCD12864_W(0,0x80+i);
  186.                 LCD12864_W(0,0x88);
  187.             for(j=0;j<16;j++)
  188.                 {
  189.                         LCD12864_W(1,img[k++]);
  190.                   }
  191.         }
  192. }
  193. /************************顯示11************************************/

  194. void display1(long temp)
  195. {
  196.     uchar dt1,dt2,dt3,dt4,dt5,dt6,dt7,dt8;
  197.         //temp=12345678;
  198.         dt1 = temp%10;//1位
  199.         dt2 = temp%100/10;//2位
  200.         dt3 = temp%1000/100;//3位
  201.         dt4 = temp%10000/1000;//4位

  202.         dt5 = temp%100000/10000;//5位
  203.         dt6 = temp%1000000/100000;//6位
  204.         dt7 = temp%10000000/1000000;//7位
  205.         dt8 = temp/10000000;//8位             最高位  

  206.         LCD12864_WPoss(3,0,"本地溫度:");//第1行顯示表1
  207.     // LCD12864_W(0,0x80+3);//LCD12864_W ((0或1),****)  0寫指令  1寫數據

  208.      //LCD12864_W(1,tabe[dt8]);//6位
  209.      //LCD12864_W(1,tabe[dt7]);//5位
  210.      //LCD12864_W(1,tabe[dt6]);//4位
  211.      //LCD12864_W(1,tabe[dt5]);//3位
  212.          //LCD12864_W(1,0x2e);
  213.            LCD12864_W(1,tabe[dt4]);//4位
  214.      LCD12864_W(1,tabe[dt3]);//3位
  215.            LCD12864_W(1,tabe[dt2]);//4位
  216.                  LCD12864_W(1,0x2e);
  217.      LCD12864_W(1,tabe[dt1]);//3位
  218.      LCD12864_WPoss(3,7,"C");//第1行顯示表1
  219. }
  220. /************************顯示2************************************/

  221. void display2(long temp)
  222. {
  223.     uchar dt1,dt2,dt3,dt4,dt5,dt6,dt7,dt8;
  224.         //temp=12345678;
  225.         dt1 = temp%10;//1位
  226.         dt2 = temp%100/10;//2位
  227.         dt3 = temp%1000/100;//3位
  228.         dt4 = temp%10000/1000;//4位

  229.         dt5 = temp%100000/10000;//5位
  230.         dt6 = temp%1000000/100000;//6位
  231.         dt7 = temp%10000000/1000000;//7位
  232.         dt8 = temp/10000000;//8位             最高位  

  233.         LCD12864_WPoss(2,0,"接收溫度:");//第1行顯示表1
  234.     // LCD12864_W(0,0x80+3);//LCD12864_W ((0或1),****)  0寫指令  1寫數據

  235.      //LCD12864_W(1,tabe[dt8]);//6位
  236.      //LCD12864_W(1,tabe[dt7]);//5位
  237.      //LCD12864_W(1,tabe[dt6]);//4位
  238.      //LCD12864_W(1,tabe[dt5]);//3位
  239.          //LCD12864_W(1,0x2e);
  240.            LCD12864_W(1,tabe[dt4]);//4位
  241.      LCD12864_W(1,tabe[dt3]);//3位
  242.            LCD12864_W(1,tabe[dt2]);//4位
  243.                  LCD12864_W(1,0x2e);
  244.      LCD12864_W(1,tabe[dt1]);//3位
  245.      LCD12864_WPoss(2,7,"C");//第1行顯示表1
  246.                 LCD12864_WPoss(0,0,"485 串口通訊溫度");//第1行顯示表1
  247. }

  248. void main()
  249. {
  250.         float tp;
  251.         UsartConfiguration();
  252.         LCD12864_Init();        //
  253.         EN = 0;//RS485使能  0接收, 1發送
  254.         while(1)
  255.         {
  256.                 Temp = Ds18b20ReadTemp();
  257.                 if(Temp< 0)                                //當溫度值為負數
  258.                   {
  259.                         Temp=Temp-1;
  260.                         tp=~Temp;
  261.                         Temp=tp*0.0625*10+0.5;       
  262.                         //留兩個小數點就*100,+0.5是四舍五入,因為C語言浮點數轉換為整型的時候把小數點
  263.                         //后面的數自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
  264.                         //算由?.5,還是在小數點后面。
  265.                         TP[4] = (Temp%1000)/100;
  266.                         TP[5] = ((Temp%1000)%100)/10;
  267.                         TP[6] = Temp%10;
  268.                         TP[7] =  12;
  269.             display1(Temp);//顯示時間 //Ok       
  270.                   }
  271.                   else
  272.                   {
  273.                     tp = Temp;                       
  274.                         Temp=tp*0.0625*10+0.5;       
  275.                         //留兩個小數點就*100,+0.5是四舍五入,因為C語言浮點數轉換為整型的時候把小數點
  276.                         //后面的數自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
  277.                         //算加上0.5,還是在小數點后面。
  278.                         TP[4] = (Temp%1000)/100;
  279.                         TP[5] = ((Temp%1000)%100)/10;
  280.                         TP[6] = Temp%10;
  281.                         TP[7] =  12;       
  282.                         display1(Temp);//顯示時間 //Ok               
  283.                 }
  284.    
  285.                  
  286.                
  287.                
  288.                 if(RI == 1)                                //查看是否接收到數據
  289.                 {
  290.                         j++;  
  291.                         receive[j] = SBUF;        //讀取數據
  292.                         if(j==2)
  293.                         {
  294.                             j = 0;
  295.                                 receiveData = 256*receive[0]+receive[1];
  296.                                 receive[0] = SBUF;
  297.                                 TP[0] =  (receiveData%1000)/100;
  298.                                 TP[1] =  ((receiveData%1000)%100)/10;
  299.                                 TP[2] =  receiveData%10;
  300.                                 TP[3] =  12;                       
  301.                         }
  302.                         RI = 0;       
  303.                        
  304.                 }
  305.           
  306.                 display2(receiveData);//顯示時間 //Ok
  307.                

  308.         }
  309. }
  310. /*******************************************************************************
  311. * 函 數 名         :UsartConfiguration()
  312. * 函數功能                   :設置串口
  313. * 輸    入         : 無
  314. * 輸    出         : 無
  315. *******************************************************************************/

  316. void UsartConfiguration()
  317. {
  318.         SCON=0X50;                        //設置為工作方式1
  319.         TMOD=0X20;                        //設置計數器工作方式2
  320.         //PCON=0X80;                        //波特率加倍
  321.         PCON=0x00;                        //波特率未加倍
  322.         TH1=0XFA;                    //計數器初始值設置,注意波特率是4800的
  323.         TL1=0XFA;
  324.         TR1=1;                                            //打開計數器
  325. }
復制代碼


所有資料51hei提供下載:
128顯串STC89串RS485通訊溫度OK.zip (98.73 KB, 下載次數: 95)



作者: bruck    時間: 2019-1-28 01:17
好的,謝謝!
作者: fendou-奮斗    時間: 2020-6-24 23:38
感謝分享我要好好看看




歡迎光臨 (http://www.denmoz.com/bbs/) Powered by Discuz! X3.1