找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1535|回复: 0
打印 上一主题 下一主题
收起左侧

基于15w系列单片机的温湿度传感器DHT11程序

[复制链接]
跳转到指定楼层
楼主
亲测可行。头文件网上随便搜都有。LCD  数据口是P4端口。


单片机源程序如下:
  1. #include<15w.H>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit RS = P5^5;   //定义端口
  6. sbit RW = P5^4;
  7. sbit EN = P5^3;



  8. sbit io=P1^0;//dht11data端接单片机的P1^0口//

  9. typedef bit BOOL;//此声明一个布尔型变量即真或假//

  10. uchar data_byte;

  11. uchar RH,RL,TH,TL;






  12. void Delay25ms()                //@11.0592MHz
  13. {
  14.         unsigned char i, j, k;

  15.         _nop_();
  16.         _nop_();
  17.         i = 2;
  18.         j = 13;
  19.         k = 237;
  20.         do
  21.         {
  22.                 do
  23.                 {
  24.                         while (--k);
  25.                 } while (--j);
  26.         } while (--i);
  27. }


  28. void Delay8us()                //@11.0592MHz
  29. {
  30.         unsigned char i;

  31.         _nop_();
  32.         _nop_();
  33.         i = 19;
  34.         while (--i);
  35. }


  36. void Delay27us()                //@11.0592MHz
  37. {
  38.         unsigned char i;

  39.         _nop_();
  40.         i = 72;
  41.         while (--i);
  42. }

  43. /**************************dht11测试某块*************************************/

  44. void start()//开始信号

  45. {

  46.   io=1;

  47. Delay8us();

  48.   io=0;

  49. Delay25ms();// 主机把总线拉低必须大于18ms保证DHT11能检测到起始信号

  50.   io=1;    //发送开始信号结束后拉高电平延时20-40us

  51. Delay8us();//以下三个延时函数差不多为24us符合要求

  52.   Delay8us();

  53.   Delay8us();

  54. }



  55. uchar receive_byte()//接收一个字节//

  56. {

  57.   uchar i,temp;

  58.   for(i=0;i<8;i++)//接收8bit的数据

  59.   {

  60.         while(!io);//等待50us的低电平开始信号结束

  61. Delay27us();//开始信号结束之后延时26us-28us以下三个延时函数





  62.         temp=0;//时间为26us-28us表示接收的为数据'0'

  63.         if(io==1)

  64.          temp=1; //如果26us-28us之后还为高电平则表示接收的数据为'1'

  65.     while(io);//等待数据信号高电平'0'为26us-28us'1'为70us

  66.         data_byte<<=1;//接收的数据为高位在前右移

  67.          data_byte|=temp;

  68.   }

  69.   return data_byte;

  70. }

  71.    

  72. void receive()//接收数据//

  73. {

  74.   uchar T_H,T_L,R_H,R_L,check,num_check,i;

  75.   start();//开始信号//

  76.   io=1;   //主机设为输入判断从机DHT11响应信号

  77.   if(!io)//判断从机是否有低电平响应信号//

  78.   {  
  79.         while(!io);//判断从机发出 80us 的低电平响应信号是否结束//

  80.         while(io);//判断从机发出 80us 的高电平是否结束如结束则主机进入数据接收状态

  81.         R_H=receive_byte();//湿度高位

  82.         R_L=receive_byte();//湿度低位

  83.         T_H=receive_byte();//温度高位

  84.         T_L=receive_byte();//温度低位

  85.         check=receive_byte();//校验位

  86.         io=0; //当最后一bit数据接完毕后从机拉低电平50us//

  87.         for(i=0;i<7;i++)//差不多50us的延时

  88.      Delay8us();

  89.         io=1;//总线由上拉电阻拉高进入空闲状态

  90.         num_check=R_H+R_L+T_H+T_L;

  91.         if(num_check==check)//判断读到的四个数据之和是否与校验位相同

  92.         {

  93.    RH=R_H;

  94.    RL=R_L;

  95.    TH=T_H;

  96.    TL=T_L;

  97.    check=num_check;

  98.         }

  99.   }

  100. }

  101. /*------------------------------------------------
  102. uS延时函数,含有输入参数 unsigned char t,无返回值
  103. unsigned char 是定义无符号字符变量,其值的范围是
  104. 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
  105. 长度如下 T=tx2+5 uS
  106. ------------------------------------------------*/
  107. void DelayUs2x(unsigned char t)
  108. {   
  109. while(--t);
  110. }
  111. /*------------------------------------------------
  112. mS延时函数,含有输入参数 unsigned char t,无返回值
  113. unsigned char 是定义无符号字符变量,其值的范围是
  114. 0~255 这里使用晶振12M,精确延时请使用汇编
  115. ------------------------------------------------*/
  116. void DelayMs(unsigned char t)
  117. {
  118.      
  119. while(t--)
  120. {
  121.      //大致延时1mS
  122.      DelayUs2x(245);
  123.          DelayUs2x(245);
  124. }
  125. }
  126. /*------------------------------------------------
  127.               判忙函数
  128. ------------------------------------------------*/
  129. bit LCD_Check_Busy(void)
  130. {
  131. P4= 0xFF;
  132. RS=0;
  133. RW=1;
  134. EN=0;
  135. _nop_();
  136. EN=1;
  137. return (bit)(P4 & 0x80);
  138. }
  139. /*------------------------------------------------
  140.               写入命令函数
  141. ------------------------------------------------*/
  142. void LCD_Write_Com(unsigned char com)
  143. {  
  144. while(LCD_Check_Busy()); //忙则等待
  145. RS=0;
  146. RW=0;
  147. EN=1;
  148. P4= com;
  149. _nop_();
  150. EN=0;
  151. }
  152. /*------------------------------------------------
  153.               写入数据函数
  154. ------------------------------------------------*/
  155. void LCD_Write_Data(unsigned char Data)
  156. {
  157. while(LCD_Check_Busy()); //忙则等待
  158. RS=1;
  159. RW=0;
  160. EN=1;
  161. P4= Data;
  162. _nop_();
  163. EN=0;
  164. }

  165. /*------------------------------------------------
  166.                 清屏函数
  167. ------------------------------------------------*/
  168. void LCD_Clear(void)
  169. {
  170. LCD_Write_Com(0x01);
  171. DelayMs(5);
  172. }
  173. /*------------------------------------------------
  174.               写入字符串函数
  175. ------------------------------------------------*/
  176. void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
  177. {     
  178. if (y == 0)
  179.         {     
  180.          LCD_Write_Com(0x80 + x);     //表示第一行
  181.         }
  182. else
  183.         {      
  184.         LCD_Write_Com(0xC0 + x);      //表示第二行
  185.         }        
  186. while (*s)
  187.         {     
  188. LCD_Write_Data( *s);     
  189. s ++;     
  190.         }
  191. }
  192. /*------------------------------------------------
  193.               写入字符函数
  194. ------------------------------------------------*/
  195. void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data)
  196. {     
  197. if (y == 0)
  198.         {     
  199.         LCD_Write_Com(0x80 + x);     
  200.         }   
  201. else
  202.         {     
  203.         LCD_Write_Com(0xC0 + x);     
  204.         }        
  205. LCD_Write_Data( Data);  
  206. }
  207. /*------------------------------------------------
  208.               初始化函数
  209. ------------------------------------------------*/
  210. void LCD_Init(void)
  211. {
  212.    LCD_Write_Com(0x38);    /*显示模式设置*/
  213.    DelayMs(5);
  214.    LCD_Write_Com(0x38);
  215.    DelayMs(5);
  216.    LCD_Write_Com(0x38);
  217.    DelayMs(5);
  218.    LCD_Write_Com(0x38);  
  219.    LCD_Write_Com(0x08);    /*显示关闭*/
  220.    LCD_Write_Com(0x01);    /*显示清屏*/
  221.    LCD_Write_Com(0x06);    /*显示光标移动设置*/
  222.    DelayMs(5);
  223.    LCD_Write_Com(0x0C);    /*显示开及光标设置*/
  224.    }



  225. void main()                                       
  226. {

  227.     P0M0 = 0x00;
  228.     P0M1 = 0x00;
  229. ……………………

  230. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

全部资料51hei下载地址:
DHT11.rar (25.27 KB, 下载次数: 14)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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