找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1620|回复: 0
收起左侧

12864+单片机程序只显示温度,但是湿度没法显示 求帮助

[复制链接]
ID:661492 发表于 2020-1-7 19:55 | 显示全部楼层 |阅读模式
51hei截图20200107195355.png 51hei截图20200107195251.png

单片机源程序如下:
  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)

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表