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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

12864+單片機程序只顯示溫度,但是濕度沒法顯示 求幫助

[復制鏈接]
跳轉到指定樓層
樓主


單片機源程序如下:
  1. #include <reg51.h>
  2. #include <word.h>
  3. #include <NumDisplay.h>
  4. #include <12864.h>
  5. sbit ds=P3^7;       //18b20信號線

  6. unsigned char data disdata[5];
  7. unsigned int temp;          //定義整形的溫度數據
  8. float f_temp;        //定義浮點型的溫度數據
  9. unsigned char tflag;//溫度正負標志

  10. void dsreset(void)  //DS18B20初始化函數
  11. {
  12.         unsigned int i;
  13.         ds=0;
  14.         i=103;
  15.         while(i>0)i--;
  16.         ds=1;
  17.         i=4;
  18.         while(i>0)i--;
  19. }
  20. bit tempreadbit(void)  //讀1位數據函數
  21. {
  22.         unsigned int i;
  23.         bit dat;
  24.         ds=0;
  25.         i++;
  26.         ds=1;
  27.         i++;i++;
  28.         dat=ds;
  29.         i=8;while(i>0)i--;
  30.         return(dat);
  31. }
  32. unsigned char tempread(void)
  33. {
  34.         unsigned char i,j,dat;
  35.         dat=0;
  36.         for(i=1;i<=8;i++)
  37.         {
  38.                 j=tempreadbit();
  39.                 dat=(j<<7)|(dat>>1); //讀出的數據最低位在最前面,這樣剛好一個字節在dat里
  40.         }
  41.         return(dat);
  42. }
  43. void tempwritebyte(unsigned char dat)
  44. {
  45.         unsigned int i;
  46.         unsigned char j;
  47.         bit testb;
  48.         for(j=1;j<=8;j++)
  49.         {
  50.                 testb=dat&0x01;
  51.                 dat=dat>>1;
  52.                 if(testb) //寫1
  53.                 {
  54.                         ds=0;
  55.                         i++;i++;
  56.                         ds=1;
  57.                         i=8;while(i>0)i--;
  58.                 }
  59.                 else
  60.                 {
  61.                         ds=0;
  62.                         i=8;while(i>0)i--;
  63.                         ds=1;
  64.                         i++;i++;
  65.                 }
  66.         }
  67. }
  68. void tempchange(void)    //DS18B20開始獲取溫度并轉換
  69. {
  70.         dsreset();
  71.         delay(1);
  72.         tempwritebyte(0xcc);//寫跳過讀ROM指令
  73.         tempwritebyte(0x44);//寫溫度轉換指令
  74. }

  75. /*DS18B20溫度測量*/
  76. unsigned int get_temp()
  77. {
  78.         unsigned char a,b;
  79.         dsreset();
  80.         delay(1);
  81.         tempwritebyte(0xcc);
  82.         tempwritebyte(0xbe);
  83.         a=tempread();//讀低8位
  84.         b=tempread();//讀高8位
  85.         temp=b;
  86.         temp<<=8;//兩個字節組合為1個字
  87.         temp=temp|a;
  88.         if(temp<0x0fff)
  89.                    tflag=0;
  90.     else
  91.    {        
  92.                 temp=~temp+1;
  93.                 tflag=1;
  94.    }
  95.         f_temp=temp*0.0625;                //溫度在寄存器中位12位,分辨率為0.0625
  96.         temp=f_temp*10+0.5;                //乘以10表示小數點后面只取一位,加入0.5是四舍五入
  97.         f_temp=f_temp+0.05;
  98.         return temp;//temp是整型
  99. }


  100. void dis_temp(unsigned int tvalue)
  101. {
  102.            disdata[0]=tvalue/1000+0x30;//百位數                 加上0x30就是要顯示數字字符
  103.     disdata[1]=tvalue%1000/100+0x30;//十位數
  104.     disdata[2]=tvalue%100/10+0x30;//個位數
  105.     disdata[3]=tvalue%10+0x30;//小數位
  106.    
  107.     if(tflag==0)
  108.                 vShowOneChar(0,40,uca_zheng);
  109.     else
  110.                 vShowOneChar(0,40,uca_fu);
  111.         trans(0,disdata[0],48);
  112.         trans(0,disdata[1],56);
  113.         trans(0,disdata[2],64);
  114.         vShowOneChar(0,72,uca_dian); //小數點
  115.         trans(0,disdata[3],80);
  116. }
復制代碼
上面DS18B20的結果能在12864上面正常顯示,但是下面DHT11的值一直不顯示
  1. #include <reg51.h>
  2. #include <word.h>
  3. #include <NumDisplay.h>
  4. #include <12864.h>

  5. #define uchar unsigned char        
  6. #define uint unsigned int
  7. sbit Data = P3^6;//定義數據線
  8. unsigned char data dis1[4];   //用于顯示的接收數據數組
  9. uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;


  10. /*------------------------------------------------
  11.               DHT11延時函數
  12. ------------------------------------------------*/
  13. void DHT11_delay_us(uchar n)
  14. {
  15.     while(--n);
  16. }

  17. void DHT11_delay_ms(uint z)
  18. {
  19.    uint i,j;
  20.    for(i=z;i>0;i--)
  21.       for(j=110;j>0;j--);
  22. }
  23. /*------------------------------------------------
  24.               DHT11開始信號
  25. ------------------------------------------------*/
  26. void DHT11_start()
  27. {
  28.    Data=1;
  29.    DHT11_delay_us(2);
  30.    Data=0;
  31.    DHT11_delay_ms(20);   //延時18ms以上
  32.    Data=1;
  33.    DHT11_delay_us(30);
  34. }
  35. /*------------------------------------------------
  36.               接收八位二進制
  37. ------------------------------------------------*/
  38. uchar DHT11_rec_byte()      //接收一個字節
  39. {
  40.    uchar i,dat=0;
  41.   for(i=0;i<8;i++)    //從高到低依次接收8位數據
  42.    {         
  43.       while(!Data);   ////等待50us低電平過去
  44.       DHT11_delay_us(8);     //延時60us,如果還為高則數據為1,否則為0
  45.       dat<<=1;           //移位使正確接收8位數據,數據為0時直接移位
  46.       if(Data==1)    //數據為1時,使dat加1來接收數據1
  47.          dat+=1;
  48.       while(Data);  //等待數據線拉低   
  49.     }  
  50.     return dat;
  51. }
  52. /*------------------------------------------------
  53.               接收40bit數據
  54. ------------------------------------------------*/
  55. void DHT11_receive()      //接收40位的數據
  56. {
  57.     DHT11_start();

  58.     if(Data==0)
  59.     {
  60.         
  61.         while(Data==0);   //等待拉高     
  62.                
  63.         DHT11_delay_us(40);  //拉高后延時80us
  64.         R_H=DHT11_rec_byte();    //接收濕度高八位  
  65.         R_L=DHT11_rec_byte();    //接收濕度低八位  
  66.         T_H=DHT11_rec_byte();    //接收溫度高八位  
  67.         T_L=DHT11_rec_byte();    //接收溫度低八位
  68.         revise=DHT11_rec_byte(); //接收校正位
  69.                         
  70.         DHT11_delay_us(25);    //結束

  71.         if((R_H+R_L+T_H+T_L)==revise)      //校正
  72.         {
  73.             RH=R_H;
  74.             RL=R_L;
  75.             TH=T_H;
  76.             TL=T_L;
  77.         }
  78.     }
  79. }
  80. void display()
  81. {
  82.         
  83.     dis1[0]=RH/10%10+0x30;
  84.     dis1[1]=RH%10+0x30;
  85.     //dis1[2]=TH/10%10+0x30;
  86.     //dis1[3]=TH%10+0x30;
  87.         trans(2,dis1[0],48);
  88.         trans(2,dis1[1],56);
  89.     vShowOneChar(2,64,uca_bfh); //小數點                                               
  90. }
復制代碼
  1. //這是12864的代碼
  2. #include <reg51.h>
  3. #define LCDLCDDisp_Off   0x3e
  4. #define LCDLCDDisp_On    0x3f
  5. #define Page_Add       0xb8//頁地址
  6. #define LCDCol_Add     0x40//列地址
  7. #define Start_Line     0xC0//行地址
  8. /*****液晶顯示器的端口定義*****/
  9. #define data_ora P0 /*液晶數據總線*/
  10. sbit CS1=P2^4 ;    /*片選1*/         
  11. sbit CS2=P2^3 ;    /*片選2*/
  12. sbit RESET=P2^3 ;  /*復位信號*/
  13. sbit LCDDi=P2^2 ;     /*數據/指令 選擇*/
  14. sbit LCDRW=P2^1 ;     /*讀/寫 選擇*/
  15. sbit LCDEnable=P2^0 ;     /*讀/寫 使能*/

  16. /****************************************************************************
  17. 函數功能:延時程序
  18. 入口參數:t
  19. 出口參數:
  20. ****************************************************************************/
  21. void delay(unsigned int t)
  22. {
  23.         unsigned int i,j;
  24.         for(i=0;i<t;i++);
  25.         for(j=0;j<10;j++);
  26. }

  27. /****************************************************************************
  28. 狀態檢查,LCD是否忙


  29. *****************************************************************************/
  30. void CheckState()               
  31. {
  32.    unsigned char dat,DATA;//狀態信息(判斷是否忙)
  33.    LCDDi=0; // 數據\指令選擇,D/I(RS)="L" ,表示 DB7∽DB0 為顯示指令數據
  34.    LCDRW=1; //R/W="H" ,E="H"數據被讀到DB7∽DB0
  35.    do
  36.    {
  37.       DATA=0x00;
  38.       LCDEnable=1;        //EN下降源
  39.           delay(2);//延時
  40.           dat=DATA;
  41.       LCDEnable=0;
  42.       dat=0x80 & dat; //僅當第7位為0時才可操作(判別busy信號)
  43.     }
  44.     while(!(dat==0x00));
  45. }
  46. /*****************************************************************************
  47. 函數功能:寫命令到LCD程序,RS(DI)=L,RW=L,EN=H,即來一個脈沖寫一次
  48. 入口參數:cmdcode
  49. 出口參數:
  50. *****************************************************************************/
  51. void write_com(unsigned char cmdcode)
  52. {
  53.     CheckState();//檢測LCD是否忙
  54.         LCDDi=0;
  55.         LCDRW=0;
  56.         P0=cmdcode;               
  57.         delay(2);
  58.         LCDEnable=1;
  59.         delay(2);
  60.         LCDEnable=0;
  61. }
  62. /*****************************************************************************
  63. 函數功能:LCD初始化程序
  64. 入口參數:
  65. 出口參數:
  66. *****************************************************************************/
  67. void init_lcd()
  68. {
  69.         delay(100);        
  70.         CS1=1;//剛開始關閉兩屏
  71.         CS2=1;
  72.         delay(100);
  73.         write_com(LCDLCDDisp_Off);         //寫初始化命令
  74.         write_com(Page_Add+0);
  75.         write_com(Start_Line+0);
  76.         write_com(LCDCol_Add+0);
  77.         write_com(LCDLCDDisp_On);
  78. }
  79. /*****************************************************************************
  80. 函數功能:寫數據到LCD程序,RS(DI)=H,RW=L,EN=H,即來一個脈沖寫一次
  81. 入口參數:LCDDispdata
  82. 出口參數:
  83. *****************************************************************************/
  84. void write_data(unsigned char LCDDispdata)
  85. {
  86.     CheckState();//檢測LCD是否忙
  87.         LCDDi=1;
  88.         LCDRW=0;
  89.         P0=LCDDispdata;
  90.         delay(2);
  91.         LCDEnable=1;
  92.         delay(2);
  93.         LCDEnable=0;
  94. }
  95. /*****************************************************************************
  96. 函數功能:清除LCD內存程序
  97. 入口參數:pag,col,hzk
  98. 出口參數:
  99. *****************************************************************************/
  100. void Clr_Scr()
  101. {
  102.         unsigned char j,k;
  103.         CS1=0; //左、右屏均開顯示
  104.         CS2=0;
  105.          write_com(Page_Add+0);
  106.          write_com(LCDCol_Add+0);
  107.          for(k=0;k<8;k++)//控制頁數0-7,共8頁
  108.          {
  109.                 write_com(Page_Add+k); //每頁每頁進行寫
  110.                   for(j=0;j<64;j++)  //每頁最多可寫32個中文文字或64個ASCII字符
  111.                 {
  112.                       write_com(LCDCol_Add+j);
  113.                         write_data(0x00);//控制列數0-63,共64列,寫點內容,列地址自動加1
  114.                 }
  115.         }
  116. }
  117. //顯示自定義行
  118. //在8×128的格子里顯示自定義長度的一行
  119. void vShowCustomRow(unsigned char ucPage,unsigned char ucLine,unsigned char ucWidth,unsigned char *ucaRow)
  120. {
  121.         unsigned char ucCount;                                   //取值范圍:ucPage:0~7;ucLine:0~127;
  122.         if(ucLine<64)                                                   //ucWidth:0~127;ucLine+ucWidth<1128。
  123.         {
  124.                 CS1=0;           //左半屏
  125.                 CS2=1;
  126.                 write_com(Page_Add+ucPage);
  127.                 write_com(LCDCol_Add+ucLine);
  128.                 if((ucLine+ucWidth)<=64)
  129.                 {
  130.                         for(ucCount=0;ucCount<ucWidth;ucCount++)
  131.                                 write_data(*(ucaRow+ucCount));
  132.                 }

  133.         }
  134.         else
  135.         {
  136.                 CS1=1;
  137.                 CS2=0;
  138.                 write_com(Page_Add+ucPage);
  139.                 write_com(LCDCol_Add+ucLine-64);
  140.                 for(ucCount=0;ucCount<ucWidth;ucCount++)
  141.                         write_data(*(ucaRow+ucCount));
  142.         }
  143. }

  144. //漢字顯示函數
  145. //此函數將16×16漢字顯示在8×128的格子里。
  146. void vShowOneChin(unsigned char ucPage,unsigned char ucLine,unsigned char *ucaChinMap)
  147. {
  148.         vShowCustomRow(ucPage,ucLine,16,ucaChinMap);
  149.         vShowCustomRow(ucPage+1,ucLine,16,ucaChinMap+16);
  150. }

  151. //字符顯示函數
  152. //此函數將8×16字符顯示在8×128的格子里。
  153. void vShowOneChar(unsigned char ucPage,unsigned char ucLine,unsigned char *ucaCharMap)
  154. {
  155.         vShowCustomRow(ucPage,ucLine,8,ucaCharMap);
  156.         vShowCustomRow(ucPage+1,ucLine,8,ucaCharMap+8);
  157. }
復制代碼
  1. #include <reg51.h>
  2. #include <12864.h>
  3. #include <word.h>
  4. //根據輸入的tem在12864的第1行的pos位置顯示相應的0~9
  5. void trans(unsigned char hang,unsigned char tem,unsigned int pos)
  6. {
  7.         switch(tem)
  8.         {
  9.                 case '0':vShowOneChar(hang,pos,uca_0);break;
  10.                 case '1':vShowOneChar(hang,pos,uca_1);break;
  11.                 case '2':vShowOneChar(hang,pos,uca_2);break;
  12.                 case '3':vShowOneChar(hang,pos,uca_3);break;
  13.                 case '4':vShowOneChar(hang,pos,uca_4);break;
  14.                 case '5':vShowOneChar(hang,pos,uca_5);break;
  15.                 case '6':vShowOneChar(hang,pos,uca_6);break;
  16.                 case '7':vShowOneChar(hang,pos,uca_7);break;
  17.                 case '8':vShowOneChar(hang,pos,uca_8);break;
  18.                 case '9':vShowOneChar(hang,pos,uca_9);break;
  19.                 default: vShowOneChin(hang,pos,uca_du);break;
  20.         }
  21. }
復制代碼
全部資料51hei下載地址:
溫濕度測量.rar (117.93 KB, 下載次數: 11)

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久亚洲精品久久国产一区二区 | 亚洲欧美中文字幕在线观看 | 免费观看成人鲁鲁鲁鲁鲁视频 | 成人精品在线观看 | 播放一级黄色片 | 欧美激情一区二区三区 | av一级久久| 日韩中文字幕在线视频观看 | 永久www成人看片 | 日韩中文字幕在线视频观看 | 九色网址 | 99久久国产免费 | 久久人人爽人人爽人人片av免费 | 91久久精品日日躁夜夜躁欧美 | 日韩精品免费 | 午夜视频免费在线观看 | 91欧美精品成人综合在线观看 | 成人激情免费视频 | 国产在线精品一区二区三区 | 国产欧美日韩综合精品一 | 国产欧美精品区一区二区三区 | 色.com| 亚洲免费人成在线视频观看 | 蜜月aⅴ国产精品 | 一级黄色日本片 | 日本超碰 | 中文字幕日韩欧美一区二区三区 | va在线 | 日韩福利视频 | 狠狠色狠狠色综合系列 | 先锋资源网 | 九热在线| 国产欧美精品一区二区 | 中文字幕日韩一区 | 成人在线中文字幕 | 男人的天堂久久 | 秋霞在线一区 | 日韩免费一区二区 | 91视频在线 | 三级免费av| 一区二区三区在线 |