找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机温湿度传感器程序 LCD12864显示

[复制链接]
ID:923904 发表于 2021-5-19 15:38 | 显示全部楼层 |阅读模式
  1. #include<REG52.h>
  2. #include <intrins.h>  
  3. #define uint unsigned int  
  4. #define uchar unsigned char   
  5. sbit DATA=P1^0;//dht11data端接单片机的P1^0口//  
  6. #define LCD_data  P0             //数据口
  7. sbit LCD_RS  =  P3^5;            //寄存器选择输入
  8. sbit LCD_RW  =  P3^6;            //液晶读/写控制
  9. sbit LCD_EN  =  P3^4;            //液晶使能控制
  10. sbit LCD_PSB =  P3^7;            //串/并方式控制

  11. /*定义数字ascii编码*/
  12. unsigned char mun_char_table[]={"0123456789"};
  13. uchar code dis1[] = {"温度:"};
  14. uchar code dis2[] = {"湿度:"};
  15. uchar RHL,RHH,CL,CH;   
  16. uint m,n;
  17. //很正要的延时
  18. void delayus(uchar  n)
  19. {   
  20.         while(n--);
  21. }
  22. //很正要的延时
  23. void Delay10ms(void)//12M晶振下延时
  24. {   
  25.         uchar a,b;
  26.     for(b=249;b>0;b--)
  27.     for(a=17;a>0;a--);

  28. }
  29. //粗延时
  30. void delay_ms(uint z)
  31. {
  32. uint x,y;
  33. for(x=z;x>0;x--)
  34.   for(y=614;y>0;y--);
  35. }
  36. //起始
  37. void Start(void)
  38. {
  39.     DATA=1;   
  40.     delay_ms(10);   
  41.     DATA=0;            
  42.     Delay10ms(); //主机把总线拉低必须大于
  43.     //18msDHT11能检测到起始信号   
  44.     Delay10ms();
  45.     Delay10ms();   
  46.     DATA=1;
  47.     delay_ms(1);        
  48. }
  49. uint integer(uchar x)
  50. {  
  51.     uchar h,l;  
  52.     uint n;  
  53.     l=x&0x0f;  
  54.     h=(x&0xf0)>>4;  
  55.     n=h*16+l;  
  56.     return n;   
  57. }


  58. uchar readdht11_byte()
  59. {   
  60.     uchar i,dht;  
  61.     for(i=8;i>0;i--)  
  62.     {   
  63.         dht=dht<<1;   
  64.         while(!DATA); //等待50ms   
  65.         delayus(30); //延时29us   
  66.         if(DATA==1)   
  67.         {
  68.                 dht=dht|0x01;   
  69.                 delayus(60);
  70.         }   
  71.         else     
  72.         delayus(30); //延时29us              
  73.     }
  74.         return(dht);   
  75. }
  76. void read_dht11()
  77. {   
  78.     Start();
  79.     DATA=0;   //数据线拉低>18ms  
  80.     delay_ms(20); //延时>18ms
  81.      DATA=1;   //拉高等待  
  82.     delayus(30);  //延时29us  
  83.     DATA=1;  
  84.     if(!DATA)  
  85.     {   
  86.         while(!DATA);//  
  87.         while(DATA);   
  88.         RHH=readdht11_byte();//湿度整数数据  
  89.         RHL=readdht11_byte();//湿度小数数据  
  90.         CH=readdht11_byte();//温度整数数据  
  91.         CL=readdht11_byte();//温度小数数据      
  92.     }  
  93. }
  94. //////////////以下是LCD12864驱动程序////////////////
  95.         
  96. /*******************************************************************/
  97. /*                                                                 */
  98. /*检查LCD忙状态                                                    */
  99. /*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。      */
  100. /*                                                                 */
  101. /*******************************************************************/
  102. bit lcd_busy()
  103. {

  104.     bit result;
  105.     P0=0X00;              //关掉数码管的信号。阻止数码管受到P0口信号的影响
  106.     LCD_RS = 0;
  107.     LCD_RW = 1;
  108.     LCD_EN = 1;
  109.    delay_ms(1);
  110.     result = (bit)(P0&0x80);
  111.     LCD_EN = 0;
  112.     return(result);
  113. }
  114. /*******************************************************************/
  115. /*                                                                 */
  116. /*写指令数据到LCD                                                  */
  117. /*RS=L,RW=L,E=高脉冲,D0-D7=指令码。                             */
  118. /*                                                                 */
  119. /*******************************************************************/
  120. void lcd_wcmd(uchar cmd)
  121. {   

  122.    while(lcd_busy());
  123.     LCD_RS = 0;
  124.     LCD_RW = 0;
  125.     LCD_EN = 0;
  126.     _nop_();
  127.     _nop_();
  128.     P0 = cmd;
  129.          delay_ms(1);
  130.     LCD_EN = 1;
  131.          delay_ms(1);
  132.     LCD_EN = 0;  
  133. }
  134. /*******************************************************************/
  135. /*                                                                 */
  136. /*写显示数据到LCD                                                  */
  137. /*RS=H,RW=L,E=高脉冲,D0-D7=数据。                               */
  138. /*                                                                 */
  139. /*******************************************************************/
  140. void lcd_wdat(uchar dat)
  141. {                          
  142.    while(lcd_busy());
  143.     LCD_RS = 1;
  144.     LCD_RW = 0;
  145.     LCD_EN = 0;
  146.     P0 = dat;
  147.      delay_ms(1);
  148.     LCD_EN = 1;
  149.     delay_ms(1);
  150.     LCD_EN = 0;
  151. }
  152. /*******************************************************************/
  153. /*                                                                 */
  154. /*  LCD初始化设定                                                  */
  155. /*                                                                 */
  156. /*******************************************************************/
  157. void lcd_init()
  158. {

  159.     LCD_PSB = 1;         //并口方式

  160.     lcd_wcmd(0x34);      //扩充指令操作
  161.      delay_ms(5);
  162.     lcd_wcmd(0x30);      //基本指令操作
  163.     delay_ms(5);
  164.     lcd_wcmd(0x0C);      //显示开,关光标
  165.     delay_ms(5);
  166.     lcd_wcmd(0x01);      //清除LCD的显示内容
  167.     delay_ms(5);
  168. }
  169. /*********************************************************/
  170. /*                                                       */
  171. /* 设定显示位置                                          */
  172. /*                                                       */
  173. /*********************************************************/
  174. void lcd_pos(uchar X,uchar Y)
  175. {                          
  176.    uchar  pos;
  177.    if (X==0)
  178.      {X=0x80;}
  179.    else if (X==1)
  180.      {X=0x90;}
  181.    else if (X==2)
  182.      {X=0x88;}
  183.    else if (X==3)
  184.      {X=0x98;}
  185.    pos = X+Y ;  
  186.    lcd_wcmd(pos);     //显示地址
  187. }
  188. //////////////////以上是LCD12864驱动程序////////////////

  189. void main()//主函数模块//   
  190. {      
  191.     uchar i=0;
  192.         lcd_init();
  193.     delay_ms(1500);
  194.         lcd_pos(0,0);             //设置显示位置为第一行的第1个字符
  195.     i = 0;
  196.     while(dis1[i] != '\0')
  197.     {                         //显示字符
  198.             lcd_wdat(dis1[i]);
  199.         i++;
  200.     }
  201.         lcd_pos(1,0);             //设置显示位置为第一行的第1个字符
  202.     i = 0;
  203.     while(dis2[i] != '\0')
  204.     {                         //显示字符
  205.             lcd_wdat(dis2[i]);
  206.         i++;
  207.     }

  208.     while(1)     
  209.     {     
  210.                 delay_ms(1500);  
  211.         read_dht11();
  212.         m=integer(RHH);
  213.                 delay_ms(1);   
  214.         n=integer(CH);
  215.                 lcd_pos(0,3);   
  216.                 lcd_wdat(mun_char_table[n/10]);
  217.                 lcd_wdat(mun_char_table[n%10]);
  218.                 lcd_pos(1,3);
  219.                 lcd_wdat(mun_char_table[m/10]);
  220.                 lcd_wdat(mun_char_table[m%10]);

  221.     }  
  222. }
复制代码
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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