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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7176|回復: 15
收起左側

單片機+LCD12864顯示溫度曲線程序

  [復制鏈接]
ID:1030230 發表于 2022-5-27 17:43 | 顯示全部樓層 |閱讀模式
本實驗適51單片機開發板,需要接上帶字庫的LCD12864才能正常顯示,如果接上后沒有顯示,請調節LCD12864背后的小  電位器進行對比度調節。

另外除A2、A3、A4和V2.0開發板以外的51開發板,還需要另外在溫度模塊輸出管腳接線到P37。程序初始化較慢,下載完程序后需要稍等才能顯示,屬于正常現象。

程序還有許多可以優化或添加功能的地方,大家可以自行研究學習。
制作出來的實物圖如下:
網頁捕獲_27-5-2022_17403_prechin.net.jpeg
這里給出完整代碼供參考。

單片機源程序如下:

  1. #include<12864.h>
  2. void delay(uint i)        //延時函數
  3. {
  4.         while(--i);
  5. }
  6. void Read_busy()        //LCD12864忙檢測
  7. {
  8.         RS=0;
  9.         RW=1;
  10.         EN=1;
  11.         LCD_databus=0xFF;
  12.         while(LCD_databus & 0x80);        //判斷最高位,1---busy,0---Nobusy
  13.         EN=0;
  14. }
  15. void write_LCD_command(uchar value)//寫指令
  16. {
  17.         RS=0;
  18.         RW=0;
  19.         delay(40);
  20.         EN=1;
  21.         LCD_databus=value;
  22.         delay(40);
  23.         EN=0;
  24. }
  25. void write_LCD_data(uchar value)//寫數據
  26. {
  27.         RS=1;
  28.         RW=0;
  29.         delay(40);
  30.         EN=1;
  31.         LCD_databus=value;
  32.         delay(40);
  33.         EN=0;
  34. }
  35. void init_LCD()                //初始化LCD
  36. {
  37.         write_LCD_command(0x30);        //8位數,基本指令
  38.         delay(100);
  39.         write_LCD_command(0x30);
  40.         delay(37);
  41.         write_LCD_command(0x0C);        //開顯示,不顯示光標,光標不閃爍
  42.         delay(100);
  43.         write_LCD_command(0x01);        //清屏指令
  44.         delay(100);
  45.         write_LCD_command(0x06);        //沒寫入數據,地址指針加1
  46. }
  47. <p style="line-height: 30px; text-indent: 2em;">void Clear_GDRAM()                //清楚GDRAM
  48. {
  49.         uchar x,y;
  50.         for(y=0;y<64;y++)
  51.         {
  52.                 for(x=0;x<16;x++)
  53.                 {
  54.                         write_LCD_command(0x34);
  55.                         write_LCD_command(y+0x80);        //先送垂直地址
  56.                         write_LCD_command(x+0x80);        //后送水平地址
  57.                         write_LCD_command(0x30);        //基本指令
  58.                         write_LCD_data(0x00);                //寫入數據0
  59.                         write_LCD_data(0x00);
  60.                 }
  61.         }
  62. }
  63. <p style="line-height: 30px; text-indent: 2em;">uchar ReadByte()        //讀LCD
  64. {
  65.         uchar Read_value;
  66.         Read_busy();
  67.         RS=1;
  68.         RW=1;
  69.         EN=0;
  70.         EN=1;
  71.         Read_value=LCD_databus;        
  72.         EN=0;
  73.         
  74.         return Read_value;
  75. }
  76. void display_BMP(uchar *address)//顯示圖片
  77. {
  78.         uchar i,j;
  79.         for(i=16;i<32;i++)
  80.         {
  81.                 write_LCD_command(0x80+i);        //先送垂直地址
  82.                 write_LCD_command(0x80);        //再送水平地址
  83.                 for(j=0;j<16;j++)
  84.                 {
  85.                         write_LCD_data(*address);//寫入數據
  86.                         address++;
  87.                 }
  88.         }
  89.         
  90.         for(i=0;i<32;i++)
  91.         {
  92.                 write_LCD_command(0x80+i);//先送垂直地址
  93.                 write_LCD_command(0x88);        //再送水平地址
  94.                 for(j=0;j<16;j++)
  95.                 {
  96.                         write_LCD_data(*address);
  97.                         address++;
  98.                 }
  99.         }
  100.         
  101. }
  102. /********************************************************
  103. 畫點函數說明:增加LCD讀函數,目的是使不打點的地方數據保持
  104. 不變:方法是先讀出不打點位置的數據,打完點后將讀到的數據寫
  105. 入原來的位置,只有這樣才會顯示打點的曲線。
  106. *********************************************************/
  107. void Draw_dots(uchar x,uchar y,uchar color)
  108. {
  109.         uchar ROW,xlabel,xlabel_bit;
  110.         uchar Read_H,Read_L;
  111.         write_LCD_command(0x34);
  112.         write_LCD_command(0x36);
  113.         xlabel=x>>4;
  114.         xlabel_bit=x & 0x0F;
  115.         
  116.         if(y<32)
  117.         {
  118.                 ROW=y;
  119.         }
  120.         else
  121.         {
  122.                 ROW=y-32;
  123.                 xlabel+=8;
  124.         }
  125.         write_LCD_command(ROW+0x80);
  126.         write_LCD_command(xlabel+0x80);
  127.         ReadByte();        //讀取當前GDRAM數據前要進行一次空讀,接下來就可以讀出數據了
  128.         Read_H=ReadByte();
  129.         Read_L=ReadByte();
  130.         
  131.         write_LCD_command(ROW+0x80);
  132.         write_LCD_command(xlabel+0x80);
  133.         
  134.         if(xlabel_bit<8)
  135.         {
  136.                 switch(color)
  137.                 {
  138.                         case 0:Read_H &= (~(0x01<<(7-xlabel_bit)));//若變白
  139.                         break;
  140.                         case 1:Read_H |= (0x01<<(7-xlabel_bit));//若涂黑
  141.                         break;
  142.                         case 2:Read_H ^= (0x01<<(7-xlabel_bit));//若反轉
  143.                         break;        
  144.                         default:break;
  145.                 }
  146.                 write_LCD_data(Read_H);//將數據寫入GDRAM
  147.                 write_LCD_data(Read_L);//先寫高位,再寫低位(地址指針順序)
  148.         }
  149.         else
  150.         {
  151.                 switch(color)//color設置
  152.                 {
  153.                         case 0: Read_L &= (~(0x01<<(15-xlabel_bit)));//若變白
  154.                         break;
  155.                         case 1: Read_L |= (0x01<<(15-xlabel_bit));//若涂黑
  156.                         break;
  157.                         case 2: Read_L ^= (0x01<<(15-xlabel_bit));//若反轉
  158.                         break;
  159.                         default:break;
  160.                 }
  161.                 write_LCD_data(Read_H);
  162.                 write_LCD_data(Read_L);//寫入數據
  163.         }
  164.         
  165.         write_LCD_command(0x30);//回到普通模式
  166. }
復制代碼
  1. #include<ds18b20.h>

  2. uchar HZ1[]="溫度曲線";
  3. uchar code table[]={0x00,0x00,0x00,0x00,0x30,0x00,0x48,0x00,0x48,
  4. 0x70,0x30,0x88,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x00,0x80,
  5. 0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //自定義字符:顯示℃

  6. void delay_us(uchar i)        //精確延時---- T=2*i+5 單位:us
  7. {
  8.         while(--i);                        
  9. }

  10. void Reset_DS18B20()        //復位DS18B20
  11. {
  12.         DQ=1;
  13.         DQ=0;
  14.         delay_us(494);                //低電平至少保持480——960us
  15.         DQ=1;                                //釋放總線,準備接收存在脈沖---低電平
  16.         delay_us(200);        
  17. }

  18. void write_DS18B20(uchar value)        //寫DS18B20指令
  19. {
  20.         uchar i = 0;
  21.         for(i = 0; i < 8; i ++)
  22.                 {
  23.                         DQ = 1;
  24.                         DQ = 0;
  25.                         delay_us(10);                        
  26.                         DQ = value & 0x01;
  27.                         delay_us(40);
  28.                         DQ = 1;
  29.                         value >>= 1;         
  30.                 }
  31. }

  32. uchar Read_DS18B20(void)        //讀DS18b20
  33. {
  34.         uchar i=0;
  35.         uchar value=0;
  36.         for(i=0;i<8;i++)
  37.                 {
  38.                         DQ=1;
  39.                         DQ=0;
  40.                         delay_us(10);                        
  41.                         DQ=1;                //將總線釋放,以便讀取數值
  42.                         delay_us(2);
  43.                         value>>=1;
  44.                         if(DQ)                                                                        
  45.                                 value |=0x80;        //先讀MSB,后讀LSB
  46.                         delay_us(34);//在60us內完成讀取                                
  47.                 }
  48.         return value;
  49. }

  50. uchar Read_temp()
  51. {
  52.         uchar temp;
  53.         uchar temp_L,temp_H;
  54.         Reset_DS18B20();
  55.         write_DS18B20(0xCC);
  56.         write_DS18B20(0x44);
  57.         Reset_DS18B20();
  58.         write_DS18B20(0xCC);
  59.         write_DS18B20(0xBE);
  60.         temp_L=Read_DS18B20();        //讀溫度的低8位
  61.         temp_H=Read_DS18B20();        //再讀溫度高8位
  62.         
  63.         temp=(temp_H*256+temp_L)/16;//將十六進制轉化為10進制

  64.         return temp;        //返回當前溫度的值
  65. /**注:沒對復位度進行處理**/
  66. }
復制代碼


  1. #include"temp.h"


  2. uchar code table_[]={0x00,0x00,0x00,0x00,0x30,0x00,0x48,0x00,0x48,
  3. 0x70,0x30,0x88,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x00,0x80,
  4. 0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //自定義字符:顯示℃


  5. uchar HZ[]="溫度曲線";
  6. /*******************************************************************************
  7. * 函數名         : Delay1ms
  8. * 函數功能                   : 延時函數
  9. * 輸入           : 無
  10. * 輸出                  : 無
  11. *******************************************************************************/

  12. void Delay1ms(unsigned int y)
  13. {
  14.         unsigned int x;
  15.         for(y;y>0;y--)
  16.                 for(x=110;x>0;x--);
  17. }
  18. /*******************************************************************************
  19. * 函數名         : Ds18b20Init
  20. * 函數功能                   : 初始化
  21. * 輸入           : 無
  22. * 輸出                  : 初始化成功返回1,失敗返回0
  23. *******************************************************************************/

  24. unsigned char Ds18b20Init()
  25. {
  26.         unsigned int i;
  27.         DSPORT=0;                         //將總線拉低480us~960us
  28.         i=70;        
  29.         while(i--);//延時642us
  30.         DSPORT=1;                        //然后拉高總線,如果DS18B20做出反應會將在15us~60us后總線拉低
  31.         i=0;
  32.         while(DSPORT)        //等待DS18B20拉低總線
  33.         {
  34.                 i++;
  35.                 if(i>5000)//等待>5MS
  36.                         return 0;//初始化失敗        
  37.         }
  38.         return 1;//初始化成功
  39. }

  40. /*******************************************************************************
  41. * 函數名         : Ds18b20WriteByte
  42. * 函數功能                   : 向18B20寫入一個字節
  43. * 輸入           : com
  44. * 輸出                  : 無
  45. *******************************************************************************/

  46. void Ds18b20WriteByte(unsigned char dat)
  47. {
  48.         unsigned int i,j;
  49.         for(j=0;j<8;j++)
  50.         {
  51.                 DSPORT=0;                        //每寫入一位數據之前先把總線拉低1us
  52.                 i++;
  53.                 DSPORT=dat&0x01; //然后寫入一個數據,從最低位開始
  54.                 i=6;
  55.                 while(i--); //延時68us,持續時間最少60us
  56.                 DSPORT=1;        //然后釋放總線,至少1us給總線恢復時間才能接著寫入第二個數值
  57.                 dat>>=1;
  58.         }
  59. }
  60. /*******************************************************************************
  61. * 函數名         : Ds18b20ReadByte
  62. * 函數功能                   : 讀取一個字節
  63. * 輸入           : com
  64. * 輸出                  : 無
  65. *******************************************************************************/


  66. unsigned char Ds18b20ReadByte()
  67. {
  68.         unsigned char byte,bi;
  69.         unsigned int i,j;        
  70.         for(j=8;j>0;j--)
  71.         {
  72.                 DSPORT=0;//先將總線拉低1us
  73.                 i++;
  74.                 DSPORT=1;//然后釋放總線
  75.                 i++;
  76.                 i++;//延時6us等待數據穩定
  77.                 bi=DSPORT;         //讀取數據,從最低位開始讀取
  78.                 /*將byte左移一位,然后與上右移7位后的bi,注意移動之后移掉那位補0。*/
  79.                 byte=(byte>>1)|(bi<<7);                                                  
  80.                 i=4;                //讀取完之后等待48us再接著讀取下一個數
  81.                 while(i--);
  82.         }                                
  83.         return byte;
  84. }
  85. /*******************************************************************************
  86. * 函數名         : Ds18b20ChangTemp
  87. * 函數功能                   : 讓18b20開始轉換溫度
  88. * 輸入           : com
  89. * 輸出                  : 無
  90. *******************************************************************************/

  91. void  Ds18b20ChangTemp()
  92. {
  93.         Ds18b20Init();
  94.         Delay1ms(1);
  95.         Ds18b20WriteByte(0xcc);                //跳過ROM操作命令                 
  96.         Ds18b20WriteByte(0x44);            //溫度轉換命令
  97. //        Delay1ms(100);        //等待轉換成功,而如果你是一直刷著的話,就不用這個延時了
  98.    
  99. }
  100. /*******************************************************************************
  101. * 函數名         : Ds18b20ReadTempCom
  102. * 函數功能                   : 發送讀取溫度命令
  103. * 輸入           : com
  104. * 輸出                  : 無
  105. *******************************************************************************/

  106. void  Ds18b20ReadTempCom()
  107. {        

  108.         Ds18b20Init();
  109.         Delay1ms(1);
  110.         Ds18b20WriteByte(0xcc);         //跳過ROM操作命令
  111.         Ds18b20WriteByte(0xbe);         //發送讀取溫度命令
  112. }
  113. /*******************************************************************************
  114. * 函數名         : Ds18b20ReadTemp
  115. * 函數功能                   : 讀取溫度
  116. * 輸入           : com
  117. * 輸出                  : 無
  118. *******************************************************************************/

  119. //int Ds18b20ReadTemp()
  120. //{
  121. //        int temp=0;
  122. //        unsigned char tmh,tml;
  123. //        Ds18b20ChangTemp();                                 //先寫入轉換命令
  124. //        Ds18b20ReadTempCom();                        //然后等待轉換完后發送讀取溫度命令
  125. //        tml=Ds18b20ReadByte();                //讀取溫度值共16位,先讀低字節
  126. //        tmh=Ds18b20ReadByte();                //再讀高字節
  127. //        temp=tmh;
  128. //        temp<<=8;
  129. //        temp|=tml;
  130. //        return temp;
  131. //}

  132. int Ds18b20ReadTemp()
  133. {
  134.         int temp=0;
  135.         float tp;
  136.         unsigned char tmh,tml;
  137.         Ds18b20ChangTemp();                                 //先寫入轉換命令
  138.         Ds18b20ReadTempCom();                        //然后等待轉換完后發送讀取溫度命令
  139.         tml=Ds18b20ReadByte();                //讀取溫度值共16位,先讀低字節
  140.         tmh=Ds18b20ReadByte();                //再讀高字節
  141.         temp=tmh;
  142.         temp<<=8;
  143.         temp |=tml;

  144.         if(temp < 0)
  145.         {
  146.                 temp=temp-1;
  147.                 temp=~temp;
  148.                 tp=temp;
  149.                 temp=tp*0.0625*100+0.5;        
  150.         }
  151.         else
  152.         {
  153.                 tp=temp;
  154.                 temp=tp*0.0625*100+0.5;        
  155.         }

  156.         return temp/100;
  157. }
復制代碼
  1. /***********************************************************
  2. 功能:12864顯示溫度曲線
  3. 接線:DS18B20輸出管腳接到P37
  4. ************************************************************/
  5. #include"bmp.h"
  6. #include"12864.h"
  7. #include"temp.h"


  8. void main()
  9. {
  10.         uchar i,j,color=1,num;
  11.         init_LCD();
  12.         while(1)
  13.         {
  14.                 write_LCD_command(0x30);
  15.                 write_LCD_command(0x80);//基本指令,顯示漢字
  16.                 for(i=0;i<8;i++)
  17.                 {
  18.                         write_LCD_data(HZ[i]);
  19.                 }
  20.                 Clear_GDRAM();        //清楚GDRAM區的內容
  21.                 write_LCD_command(0x36);//擴展指令,繪圖打開  
  22.                 display_BMP(ZB);//顯示坐標                        
  23.                 for(i=13;i<128;i++)        //打點
  24.                 {
  25.                         j=70-Ds18b20ReadTemp();
  26.                         Draw_dots(i,j,1);
  27.                         delay(40000);
  28.                         delay(40000);
  29.                         write_LCD_command(0x30);
  30.                         write_LCD_command(0x84);        //切換到基本指令顯示字符
  31.                         write_LCD_data(':');
  32.                         write_LCD_data(Ds18b20ReadTemp()/100+0x30);
  33.                         write_LCD_data(Ds18b20ReadTemp()/10+0x30);
  34.                         write_LCD_data(Ds18b20ReadTemp()%10+0x30);//顯示溫度的值
  35.                         
  36.                         write_LCD_command(0x40);        //自定義第一個CGRAM,編碼為0000
  37.                         for(num=0;num<32;num++)
  38.                         {
  39.                                 write_LCD_data(table_[num]);
  40.                         }
  41.                         write_LCD_command(0x86);        //規定CGRAM字符顯示位置
  42.                         write_LCD_data(0x00);
  43.                         write_LCD_data(0x00);
  44.                 }

  45.         }
  46.         
  47. }
復制代碼

Keil代碼下載:   
12864液晶顯示溫度.zip (57.24 KB, 下載次數: 229)

評分

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

查看全部評分

回復

使用道具 舉報

ID:278457 發表于 2022-6-1 17:18 | 顯示全部樓層
向你學習,很強
回復

使用道具 舉報

ID:1038309 發表于 2022-7-6 09:14 | 顯示全部樓層

這個代碼可以顯示出來嗎
回復

使用道具 舉報

ID:863362 發表于 2022-7-7 08:37 | 顯示全部樓層
大還不錯就是 發表于 2022-7-6 09:14
這個代碼可以顯示出來嗎

可以顯示出來
回復

使用道具 舉報

ID:292359 發表于 2022-7-7 11:59 | 顯示全部樓層
厲害!我一直是用ADT75+數碼管顯示溫度就完事了,有想串口送出數據搞成曲線在電腦上用MFC寫個程序顯示出來,也想用LCD顯示顯示曲線,但懶得弄,學習了。
回復

使用道具 舉報

ID:366877 發表于 2022-8-20 14:08 | 顯示全部樓層
a4umi001 發表于 2022-7-7 11:59
厲害!我一直是用ADT75+數碼管顯示溫度就完事了,有想串口送出數據搞成曲線在電腦上用MFC寫個程序顯示出來 ...

請問坐標圖片能發一份嗎?
回復

使用道具 舉報

ID:388477 發表于 2022-11-11 15:12 | 顯示全部樓層
可以顯示,非常好!
回復

使用道具 舉報

ID:981391 發表于 2022-11-16 16:19 | 顯示全部樓層
這個代碼可以用,非常好!
回復

使用道具 舉報

ID:433219 發表于 2022-11-16 17:27 | 顯示全部樓層
并行液晶,太浪費io了 ,,,建議改 st7920的12864 就2個io驅動,
回復

使用道具 舉報

ID:1067121 發表于 2023-3-19 11:10 | 顯示全部樓層
只能顯示坐標軸沒有曲線是為什么,溫度讀取是沒問題的
回復

使用道具 舉報

ID:216265 發表于 2023-3-22 19:52 | 顯示全部樓層
多謝,正好研究下
回復

使用道具 舉報

ID:53978 發表于 2023-3-23 09:07 | 顯示全部樓層
加個k型熱電偶啊 這樣就更實用了。
回復

使用道具 舉報

ID:1105394 發表于 2023-12-20 16:55 | 顯示全部樓層
很好的代碼,好好研究一下,最近正好用到
回復

使用道具 舉報

ID:433219 發表于 2023-12-21 08:39 | 顯示全部樓層
一看  RS=0;       RW=1;       EN=1; 就知道是并行接法,完全浪費了st7920類2線液晶的優勢   
回復

使用道具 舉報

ID:1064915 發表于 2023-12-21 15:21 | 顯示全部樓層
能否改成ks0108的
回復

使用道具 舉報

ID:1141744 發表于 2024-12-28 17:19 | 顯示全部樓層
那個坐標的數組可以看一下嗎
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产分类视频 | 黑人巨大精品欧美黑白配亚洲 | 一区二区激情 | 日本一区二区视频 | 亚洲激情在线 | 青青艹在线视频 | 国产日韩精品一区二区三区 | 浮生影院免费观看中文版 | 国产资源在线播放 | 国产激情在线观看视频 | 男女国产视频 | 色婷婷综合成人av | 久久久久久久一区二区 | 日日夜夜免费精品视频 | 午夜播放器在线观看 | 久在线 | 国产亚洲精品一区二区三区 | 欧美区日韩区 | 国产午夜一级 | 亚洲国产黄 | 国产视频1区2区 | 蜜桃一区二区三区 | 成人影院免费视频 | 午夜三级视频 | 国产一区二区精品 | 国产视频久久 | 亚洲国产精品va在线看黑人 | 欧美亚洲国产一区二区三区 | 中文字幕高清 | 久久最新网址 | 久久久青草婷婷精品综合日韩 | 99热.com| 亚洲福利一区二区 | 日本一区二区在线视频 | 日韩在线看片 | 国产午夜精品一区二区三区四区 | 高清人人天天夜夜曰狠狠狠狠 | 亚州一区二区三区 | 欧州一区| 国产成人a亚洲精品 | 免费在线播放黄色 |