鱼C论坛

 找回密码
 立即注册
查看: 7840|回复: 1

[技术交流] DHT11温湿度传感器在12864LCD上显示

[复制链接]
发表于 2012-6-2 20:36:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 猫礼 于 2012-6-2 20:43 编辑

DHT11温湿度传感器在12864LCD上显示
本程序经过测试,可以用。有图。程序并非完全自己写。网上类似的很多,12864DHT11的参数以及原理就不发了,网上遍地都是。这个只是在LCD上显示,准备在做个和电脑通讯,把温湿度在电脑上实时显示出来。程序中有一段void clear_gcrom(),子函数,已经注释掉。我也是刚学,还没连接DHT11的时候,如果不清除gcromLCD屏幕会一闪一闪的,不知道你们是否出现这种问题。但是连接DHT11后,且DNT11模块的程序写完后,在运行的时候,大概10几秒才能刷新一次温湿度。最终检查出来,执行一次clear_gcrom()需要12(晶振11.0592M)。注释掉后,正常刷新温湿度。程序中大部分代码都以注释,应该能看懂了。不说了,上图:
YP20120601191209.jpg



  1. /**********************DHT11与12864LCD************************/
  2. /*                   DHT11总线接P1^0                         */
  3. /*                                                           */
  4. /*************************************************************/#include <reg52.h>
  5. #define uchar unsigned char
  6. #define uint unsigned intuchar   lcd_x,lcd_y,data_byte=0,count;
  7. uint TH_data,TL_data,RH_data,RL_data,CK_data;
  8. uint TH_temp,TL_temp,RH_temp,RL_temp,CK_temp;
  9. uchar num;sbit RS = P2^0;//并行指令,数据选择信号
  10. sbit RW = P2^1;//读写信号
  11. sbit EN = P2^2;//并行使能信号
  12. sbit PSB = P2^3;//并串口选择信号
  13. sbit RST = P2^5;//复位信号
  14. sbit io = P1^0;//DHT11总线void read_io();//开始信号,读数据并校验
  15. void delay(uint a);//延时函数
  16. void LCD_init();//LCD初始化程序
  17. void write_cmd(uchar cmd);//写指令
  18. void write_data(uchar dat);//写数据
  19. bit check_busy();//检测LCD忙信号
  20. //void clear_gcrom();//清除GCROM
  21. void delay1();//10us延时
  22. void lcd_dis_code(uint cmd_addr,uchar num,uchar dis[]);//显示函数
  23. void lcd_pos(unsigned char X,unsigned char Y);//LCD显示位置计算uchar code lcd[]={"温湿度检测系统 "};
  24. uchar code lcd1[]={"  温度:"};
  25. uchar code lcd2[]={"  湿度:"};
  26. uchar code lcd3[]={"℃"};
  27. uchar code lcd4[]={"%RH"};uchar str1[]={" "};
  28. uchar str2[]={" "};

  29. void main()
  30. {
  31. uchar k,j;
  32. LCD_init();
  33. lcd_dis_code(0x80,16,lcd);
  34. lcd_dis_code(0x88,9,lcd1);
  35. lcd_dis_code(0x98,9,lcd2);
  36. lcd_dis_code(0x8e,2,lcd3);
  37. lcd_dis_code(0x9e,5,lcd4);
  38. while(1)
  39. {
  40.   read_io();//读取温湿度数据
  41.   //clear_gcrom();
  42.   //湿度
  43.   for(k=0; k<2; k++)
  44.   {
  45.    lcd_pos(4,k+4);
  46.    write_data(str1[k]);  
  47.   }
  48.   //clear_gcrom();
  49.   //温度
  50.   for(j=0; j<2; j++)
  51.   {
  52.    lcd_pos(3,j+4);
  53.    write_data(str2[j]);  
  54.   }  delay(500);
  55. }  
  56. }
  57. void delay1()//延时10us
  58. {
  59. unsigned char i;
  60. for(i=0; i<3; i++);
  61. }void lcd_pos(unsigned char X,unsigned char Y)
  62. {
  63. unsigned char pos;
  64. if ( X == 1 )
  65.      { pos = 0x80 ; }
  66.     else if ( X == 2 )
  67.   { pos = 0x90 ; }
  68. else if ( X == 3 )
  69.      { pos = 0x88 ; }
  70.     else
  71.   { pos = 0x98 ; }
  72.         
  73. write_cmd(Y | pos); //数据指针=80+地址变量
  74. }/**********************DHT11模块**********************/
  75. uchar receive_byte()//接收一个字节
  76. {
  77. uchar i,temp;
  78. for(i=0;i<8; i++)
  79. {
  80.   count = 2;
  81.   while((!io) && count++)//等待50us低电平结束,并防止死循环
  82.   temp = 0;
  83.   delay1();
  84.   delay1();
  85.   delay1();
  86.   if (io==1)
  87.   {
  88.    temp = 1;
  89.    count = 2;
  90.    while(io && count++);
  91.   }
  92.   else
  93.    temp = 0;
  94.    data_byte<<=1;
  95.    data_byte|=temp;   
  96. }
  97. return (data_byte);
  98. }void read_io()//开始信号,读数据并校验
  99. {
  100. io = 0;
  101. delay(18);//主机拉低18ms
  102. io = 1;//DATA总线由上拉电阻拉高 主机延时20us
  103. delay1();
  104. delay1();
  105. delay1();
  106. delay1();
  107. io = 1;//主机设置为输入高电平,判断从机响应信号
  108. if(!io)
  109. {
  110.   count = 2;
  111.   while((!io)&&count++);//判断DHT11发出80us低电平响应信号是否结束
  112.   count = 2;
  113.   while(io && count++);//判断DHT11拉高总线80us高电平是否结束
  114.   RH_temp = receive_byte();
  115.   RL_temp = receive_byte();
  116.   TH_temp = receive_byte();
  117.   TL_temp = receive_byte();
  118.   CK_temp = receive_byte();
  119.   io = 1;
  120.   num = (RH_temp + RL_temp + TH_temp + TL_temp);//数据校验  if(num == CK_temp)
  121.   {
  122.    RH_data = RH_temp;
  123.          RL_data = RL_temp;
  124.    TH_data = TH_temp;
  125.          TL_data = TL_temp;
  126.          CK_data = CK_temp;
  127.   }
  128. }
  129. //湿度整数部分
  130. str1[0] = (char)(0x30 + RH_data/10);
  131. str1[1] = (char)(0x30 + RH_data%10);
  132. //温度整数部分
  133. str2[0] = (char)(0x30 + TH_data/10);
  134. str2[1] = (char)(0x30 + TH_data%10);
  135. }
  136. /**********************E N D**********************//**********************12864模块程序**********************/
  137. /*void clear_gcrom()
  138. {
  139. uchar i,j,k;
  140. lcd_x = 0x80;
  141. lcd_y = 0x80;
  142. write_cmd(0x34); for(i = 0 ; i < 2 ; i++) //上下两屏幕
  143. {
  144.   for(j = 0 ; j < 32 ; j++)
  145.   {
  146.    write_cmd(lcd_y+j);
  147.    write_cmd(lcd_x);   
  148.    for(k = 0 ; k < 16 ; k++)
  149.    {
  150.     write_data(0x00);
  151.    }
  152.   }
  153.   lcd_x = 0x88;
  154. }
  155. write_cmd(0x36);
  156. write_cmd(0x30);
  157. }*/  void lcd_dis_code(uint cmd_addr,uchar num,uchar dis[])
  158. {
  159. uint i;
  160. write_cmd(cmd_addr);
  161. for(i=0; i<num; i++)
  162.   write_data(dis[i]);
  163. }void LCD_init()
  164. {
  165. PSB = 1;
  166. RST = 0;
  167. delay(5);
  168. RST = 1;
  169. delay(5);
  170. write_cmd(0x34);//扩充指令
  171. delay(5);
  172. write_cmd(0x30);//基本指令
  173. delay(5);
  174. write_cmd(0x0c);//显示开关光标
  175. delay(5);
  176. write_cmd(0x01);//清屏
  177. delay(5);}bit check_busy()
  178. {
  179. bit temp;
  180. RS = 0;
  181. RW = 1;
  182. EN = 1;
  183. delay(5);
  184. temp = (bit)(P0&0x80); //按位与操作
  185. EN = 0;
  186. return (temp);
  187. }void write_cmd(uchar cmd)
  188. {
  189. while(check_busy());
  190. RS = 0;
  191. RW = 0;
  192. EN = 0;
  193. delay(5);
  194. P0 = cmd;
  195. delay(5);
  196. EN = 1;
  197. delay(5);
  198. EN = 0;
  199. }void write_data(uchar dat)
  200. {
  201. while(check_busy());
  202. RS = 1;
  203. RW = 0;
  204. EN = 0;
  205. P0 = dat;
  206. delay(5);
  207. EN = 1;
  208. delay(5);
  209. EN = 0;
  210. }void delay(uint a)
  211. {
  212. uchar i;
  213. while(a--)
  214. {
  215.   for(i=0; i<113; i++);
  216. }
  217. }
  218. /**********************E N D**********************/
复制代码




想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-5-16 16:24:54 | 显示全部楼层
无回帖,不论坛,这才是人道。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-20 10:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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