找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于DHT11的温度传输系统程序(51单片机)

[复制链接]
跳转到指定楼层
楼主
ID:217773 发表于 2017-7-7 09:45 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
           课程设计自己调试成功的一个DHT11的温湿度传输程序,用到了串口通讯,加入了算法,可以在上位机上显示。
下载:
DHT11程序.docx (13.48 KB, 下载次数: 7)


  1. //****************************************************************//
  2. // DHT11使用范例
  3. //单片机 : AT89S52 或 STC89C52RC
  4. // 功能 :串口发送温湿度数据 波特率 9600
  5. //硬件连接: P2.0口为通讯口连接DHT11,DHT11的电源和地连接单片机的电源和地,单片机串口加MAX232连接电脑
  6. #include <reg51.h>
  7. #include <intrins.h>
  8. //
  9. typedef unsigned char U8; /* defined for unsigned 8-bits integer variable 无符号8位整型变量 */
  10. typedef signed char S8; /* defined for signed 8-bits integer variable 有符号8位整型变量 */
  11. typedef unsigned int U16; /* defined for unsigned 16-bits integer variable 无符号16位整型变量 */
  12. typedef signed int S16; /* defined for signed 16-bits integer variable 有符号16位整型变量 */
  13. typedef unsigned long U32; /* defined for unsigned 32-bits integer variable 无符号32位整型变量 */
  14. typedef signed long S32; /* defined for signed 32-bits integer variable 有符号32位整型变量 */
  15. typedef float F32; /* single precision floating point variable (32bits) 单精度浮点数(32位长度) */
  16. typedef double F64; /* double precision floating point variable (64bits) 双精度浮点数(64位长度) */
  17. //
  18. #define uchar unsigned char
  19. #define uint unsigned int
  20. #define Data_0_time 4
  21. //--------------- --------------------//
  22. //----------------IO口定义区--------------------//
  23. //-------------- --------------------------//
  24. sbit P2_0 = P2^0 ;//DATA
  25. sbit P2_1 = P2^1 ;
  26. sbit P2_2 = P2^2 ;
  27. sbit P2_3 = P2^3 ;
  28. //--------- ------------------------------------//
  29. //----------------定义区--------------------//
  30. //--------------------- -----------------------//
  31. U8 U8FLAG,k;
  32. U8 U8count,U8temp;
  33. U8 U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
  34. U8 U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
  35. U8 U8comdata;
  36. U8 outdata[5]; //定义发送的字节数
  37. U8 indata[5];
  38. U8 count, count_r=0;
  39. U8 str[5]={"RS232"};
  40. U16 U16temp1,U16temp2;
  41. SendData(U8 *a)
  42. {
  43. outdata[0] = a[0];
  44. outdata[1] = a[1];
  45. outdata[2] = a[2];
  46. outdata[3] = a[3];
  47. outdata[4] = a[4];
  48. count = 1;
  49. SBUF=outdata[0];
  50. }
  51. void Delay(U16 j)
  52. { U8 i;
  53. for(;j>0;j--)
  54. {
  55. for(i=0;i<27;i++);
  56. }
  57. }
  58. void Delay_10us(void)
  59. {
  60. U8 i;
  61. i--;
  62. i--;
  63. i--;
  64. i--;
  65. i--;
  66. i--;
  67. }
  68. void COM(void)
  69. {
  70. U8 i;
  71. for(i=0;i<8;i++)
  72. {
  73. U8FLAG=2;
  74. //----------------------
  75. P2_1=0 ; //T
  76. P2_1=1 ; //T
  77. //----------------------
  78. while((!P2_0)&&U8FLAG++);
  79. Delay_10us();
  80. Delay_10us();
  81. // Delay_10us();
  82. U8temp=0;
  83. if(P2_0)U8temp=1;
  84. U8FLAG=2;
  85. while((P2_0)&&U8FLAG++);
  86. //----------------------
  87. P2_1=0 ; //T
  88. P2_1=1 ; //T
  89. //----------------------
  90. //超时则跳出for循环
  91. if(U8FLAG==1)break;
  92. //判断数据位是0还是1
  93. // 如果高电平高过预定0高电平值则数据位为 1
  94. U8comdata<<=1;
  95. U8comdata|=U8temp; //0
  96. }//rof
  97. }
  98. //------------  --------------------
  99. //-----湿度读取子程序 ------------
  100. //----------------------  ----------
  101. //----以下变量均为全局变量--------
  102. //----温度高8位== U8T_data_H------
  103. //----温度低8位== U8T_data_L------
  104. //----湿度高8位== U8RH_data_H-----
  105. //----湿度低8位== U8RH_data_L-----
  106. //----校验 8位 == U8checkdata-----
  107. //----调用相关子程序如下----------
  108. //---- Delay();, Delay_10us();COM();
  109. //---------------------    -----------
  110. void RH(void)
  111. {
  112. //主机拉低18ms
  113. P2_0=0;
  114. Delay(180);
  115. P2_0=1;
  116. //总线由上拉电阻拉高 主机延时20us
  117. Delay_10us();
  118. Delay_10us();
  119. Delay_10us();
  120. Delay_10us();
  121. //主机设为输入 判断从机响应信号
  122. P2_0=1;
  123. //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行
  124. if(!P2_0) //T !
  125. {
  126. U8FLAG=2;
  127. //判断从机是否发出 80us 的低电平响应信号是否结束
  128. while((!P2_0)&&U8FLAG++);
  129. U8FLAG=2;
  130. //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
  131. while((P2_0)&&U8FLAG++);
  132. //数据接收状态
  133. COM();
  134. U8RH_data_H_temp=U8comdata;
  135. COM();
  136. U8RH_data_L_temp=U8comdata;
  137. COM();
  138. U8T_data_H_temp=U8comdata;
  139. COM();
  140. U8T_data_L_temp=U8comdata;
  141. COM();
  142. U8checkdata_temp=U8comdata;
  143. P2_0=1;
  144. //数据校验
  145. U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
  146. if(U8temp==U8checkdata_temp)
  147. {
  148. U8RH_data_H=U8RH_data_H_temp;
  149. U8RH_data_L=U8RH_data_L_temp;
  150. U8T_data_H=U8T_data_H_temp;
  151. U8T_data_L=U8T_data_L_temp;
  152. U8checkdata=U8checkdata_temp;
  153. }//fi
  154. }//fi
  155. }

  156. //---------------------------------------
  157. //main()功能描述: AT89C51 11.0592MHz 串口发
  158. //送温湿度数据,波特率 9600

  159. //----------------------------------------------
  160. void main()
  161. {
  162. //U8 i,j;
  163. //uchar str[6]={"RS232"};
  164. /* 系统初始化 */
  165. TMOD = 0x20; //定时器T1使用工作方式2
  166. TH1 = 253; // 设置初值
  167. TL1 = 253;
  168. TR1 = 1; // 开始计时
  169. SCON = 0x50; //工作方式1,波特率9600bps,允许接收
  170. ES = 1;
  171. EA = 1; // 打开所以中断
  172. TI = 0;
  173. RI = 0;
  174. SendData(str) ; //发送到串口
  175. Delay(1); //延时100US(12M晶振)
  176. while(1)
  177. {
  178. //------------------------
  179. //调用温湿度读取子程序
  180. RH();
  181. //串口显示程序
  182. //--------------------------
  183. str[0]=U8RH_data_H;
  184. str[1]=U8RH_data_L;
  185. str[2]=U8T_data_H;
  186. str[3]=U8T_data_L;
  187. str[4]=U8checkdata;
  188. SendData(str) ; //发送到串口
  189. //读取模块数据周期不易小于 2S
  190. Delay(20000);
  191. }//elihw
  192. }// main
  193. void RSINTR() interrupt 4 using 2
  194. {
  195. U8 InPut3;
  196. if(TI==1) //发送中断
  197. {
  198. TI=0;
  199. if(count!=5) //发送完5位数据
  200. {
  201. SBUF= outdata[count];
  202. count++;
  203. }
  204. }
  205. if(RI==1) //接收中断
  206. {
  207. InPut3=SBUF;
  208. indata[count_r]=InPut3;
  209. count_r++;
  210. RI=0;
  211. if (count_r==5)//接收完4位数据
  212. {
  213. //数据接收完毕处理。
  214. count_r=0;
  215. str[0]=indata[0];
  216. str[1]=indata[1];
  217. str[2]=indata[2];
  218. str[3]=indata[3];
  219. str[4]=indata[4];
  220. P0=0;
  221. }
  222. }
  223. }
复制代码


评分

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

查看全部评分

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

使用道具 举报

沙发
ID:780711 发表于 2020-6-16 21:24 | 只看该作者
请问一下显示的结果是什么样子的呀
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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