知识类型

长 度

值 域

unsigned char

单八位位组

0~255

signed char

单八位位组

-128~+127

unsigned int

双八位位组

0~65535

signed int

双八位位组

-32768~+32767

unsigned long

四八位位组

0~4294967295

signed long

四八位位组

-2147483648~+2147483647

float

四八位位组

±~±

*

1~3八位位组

瞄准的地址

bit

0或1

sfr

单八位位组

0~255

sfr16

双八位位组

0~65535

sbit

0或1


一、        踢向与盘问
加工温湿度实时显示零碎,回答时期把持在1秒摆布。,探查可以放在一任一某一向径约10公分的判例中。。
二、        任务规律
运用AT89S52作为零碎的把持单元,感触器官采取DHT90(即SHT10封装成第四基准销,大连优德娱乐场代劳的价钱为50元/片),显示模块为LCD1602。。单片机从DHT90接纳温湿度知识,因此用软件举行线性的使合身,经受住,发送到1602,每隔1秒显示和修复一次知识。。
三、        规律图

四、        计算机硬件设计
电源一部分采取 5V开关电源集成模块,做完DHT90和AT89S52单片机的供电盘问。。该零碎布线设计复杂。,软件构图调试努力地。
五、        软件设计
流程图


软件调试审阅及体验
向因此零碎,率先,我调试了1602的显示顺序。,重音逮捕序列图。对计算机硬件有清晰的的熟人,相干顺序涉及,构图本身的基准顺序。因此,DHT90知识通信工具余地调试,在SHT11(DHT90/SHT10也属于完全相同的事物一系列)例程中,显示功用是运用seria向征服发送知识。,在PC上显示气温和湿度。因而,此一部分已从我的顺序中切除。。异样,DHT90顺序的秘诀亦序列图。,熟人序列图,您可以快进入节目调试阶段。。
六、     零碎自然的图


图2 单片机把持及显示一部分


七、     雏鸟小结
两个多月后,我一向在详述因此气温和湿度测零碎。,现时卒受胎初步的发生。。在这学时,我学到了很多。,比如焊技术(自然仍然比较地菜),下载线加工附加物。我觉得最重要的相当多的是使坚定了本身的实施产量率。嗯,很多东西难与不难就看你做没做过。呵呵,套用毛主席他老人家的总而言之执意:无实施就无说话。初期的,做下载线,我感触很难很难,但现时回想一下。,这是个小成绩。。
经过因此零碎的产量,我从一任一某一梦想的电扇变得了一任一某一适用的电扇。。从消受电子产品的福气到消受福气,它一向在升华。,DIY很棒。。经受住总而言之是激起性欲有DIY爱好者。
经受住,迎将交流沉思,给我开炮和改正!

附加源顺序(调试成版本):

  1. /***********************************************************************************  
  2. ;功用阐明:DHT90与LCD1602的温湿度显示  
  3. ;文件名:     
  4.   
  5. ;微处理器:AT89S52
  6. ;编辑外界:Keil uVision V2.38a
  7.   
  8. ;作    者:
  9. ;版    权:(c)
  10. ;修正阐明:添加了一任一某一LCD_disp_str()行使职责
  11. ;***********************************************************************************/
  12. /*************界说摇动********************
  13.          P0——DB0~DB7  (LCD1602)      
  14.                (LCD1602)
  15.                (LCD1602)
  16.                 (LCD1602)
  17.                       (DHT90)
  18.                      (DHT90)
  19. *****************************************/
  20. #include  
  21. #include   
  22. #include     //Keil library   
  23. #include    //Keil library  
  24. //*********************第一位一部分LCD1602设置 START****************************************
  25. #define LCD_DB        P0
  26.         sbit         LCD_RS=P2^0;  p2^0是什么意思;液晶余地及其等效的性,对LCD_RS 读写,它是向观察和使安定的。 其优点是液晶余地的卷入很复杂。,假如你写更多的顺序,你就会认识必要
  27.         sbit         LCD_RW=P2^1;  p2^1是什么意思
  28.         sbit         LCD_E=P2^2;    p2^2是什么意思
  29. /******界说行使职责****************/
  30. #define uchar unsigned char
  31. #define uint unsigned int
  32. void LCD_init(void);                          //设定初值行使职责
  33. void LCD_write_command(uchar 命令)    写讲授功用
  34. void LCD_write_data(uchar DAT)             研究知识行使职责
  35. void LCD_disp_char(uchar x,uchar y,uchar dat;//在庇护位显示刻,X(0-15),y(1-2)
  36. void LCD_disp_str(uchar x,uchar y,uchar STR) LCD1602显示刻串行使职责
  37. void delay_n10us(uint n);                     //延时行使职责
  38. /*————————————–  
  39. 模块术语:LCD_init
  40. ;功    CAN:设定初值LCD1602
  41. ;占有率资源:–
  42. ;参量阐明:–
  43. ;创办日期:  
  44. ;版    本:(功用版) 版本)
  45. ;修正日期:–
  46. ;修正阐明:–
  47. ;————————————-*/  
  48. void LCD_init(void)
  49. {
  50. delay_n10us(10);
  51. lcd_write_command(0x38);//设置8位体式,2行,5×7
  52. delay_n10us(10);
  53. LCD_write_command(0x0c);//总效果显示,关广,不闪烁
  54. delay_n10us(10);
  55. lcd_write_command(0x06);//设置输入模仿,增量移位
  56. delay_n10us(10);
  57. lcd_write_command(0x01);//通便庇护显示
  58. delay_n10us(100);       推延清筛,延时行使职责,推延时期约为10us
  59. }
  60. /*————————————–  
  61. 模块术语:LCD写命令
  62. ;功    CAN:LCD1602研究讲授功用
  63. ;占有率资源: –RS(LCD_RS),(LCD_RW),(LCD_E).
  64. 参量周转:DAT是用于研究命令的参量
  65. ;创办日期:  
  66. ;版    本:(功用版) 版本)
  67. ;修正日期:–
  68. ;修正阐明:–
  69. ;————————————-*/  
  70. void LCD_write_command(uchar DAT)
  71. {
  72. delay_n10us(10);
  73. LCD_RS=0;         //讲授
  74. LCD_RW=0;         //研究
  75. LCD_E=1;          //容许
  76. LCD_DB=dat;
  77. delay us(10);//适用作证,在我的LCD 1602上,普通的填写讲授可以用for圈子应验一次。
  78. LCD_E=0;
  79. delay us(10);//适用作证,在我的LCD 1602上,普通的填写讲授可以用for圈子应验一次。
  80. }
  81. /*————————————–  
  82. 模块术语:LCD研究知识
  83. ;功    CAN:LCD1602研究知识功用
  84. ;占有率资源: –RS(LCD_RS),(LCD_RW),(LCD_E).
  85. 参量周转:dat是一任一某一用于研究的知识参量
  86. ;创办日期:  
  87. ;版    本:(功用版) 版本)
  88. ;修正日期:–
  89. ;修正阐明:–
  90. ;————————————-*/
  91. void LCD_write_data(uchar DAT)
  92. {
  93. delay_n10us(10);
  94. LCD_RS=1;          //知识
  95. LCD_RW=0;          //研究
  96. LCD_E=1;           //容许
  97. LCD_DB=dat;
  98. delay_n10us(10);
  99. LCD_E=0;
  100. delay_n10us(10);
  101. }
  102. /*————————————–  
  103. 模块术语:LCD显示刻
  104. ;功    CAN:LCD1602显示刻功用,在庇护位显示刻,X(0-15),y(1-2)。
  105. ;占有率资源:–
  106. ;参量阐明:X为1602的列值(取值延伸是0-15),Y 1602的行值(延伸1-2),dat是与要显示的刻对立应的地址参量。。
  107. ;创办日期:  
  108. ;版    本:(功用版) 版本)
  109. ;修正日期:–
  110. ;修正阐明:–
  111. ;————————————-*/
  112. void LCD_disp_char(uchar x,uchar y,uchar DAT)
  113. {
  114.   uchar address;
  115.   if(y==1)
  116.          address=0x80+x;
  117.   else
  118.          address=0xc0+x;
  119.   LCD_write_command(address);
  120.   LCD_write_data(DAT);
  121. }
  122. /*————————————–  
  123. 模块术语:LCD余地
  124. ;功    CAN:LCD1602显示刻串功用,在庇护开端处x(0-15),Y(1-2)显示刻串。
  125. ;占有率资源:–
  126. ;参量阐明:X为1602的列值(取值延伸是0-15),Y 1602的行值(延伸1-2),str为所要显示刻串对应的手参量。
  127. ;创办日期:  
  128. ;版    本:(功用版) 版本)
  129. ;修正日期:–
  130. ;修正阐明:–  
  131. ;————————————-*/
  132. void LCD_disp_str(uchar x,uchar y,uchar STR)
  133. {
  134.   uchar address;
  135.   if(y==1)
  136.          address=0x80+x;
  137.   else
  138.          address=0xc0+x;
  139.   LCD_write_command(address);
  140. (*)!=””)
  141.   {  
  142.     LCD_write_data(STR)   
  143.     str++;
  144.   }
  145. }
  146. /*————————————–  
  147. 课程术语:Delay us
  148. ;功    精力:推延行使职责,推延时期约为10us
  149. ;占有率资源:–
  150. ;参量阐明:–
  151. ;创办日期:  
  152. ;版    本:(功用版) 版本)
  153. ;修正日期:
  154. 修正阐明:修正为更要求的推延行使职责
  155. ;————————————-*/
  156. void delay_n10us(uint n)
  157. {        
  158.         uint i;            
  159.         for(i=n;i>0;i–)
  160.         {
  161.         _nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); 延时10us@12米晶体振荡器
  162.                 }
  163. }                                    
  164. //*********************第一位一部分LCD1602设置 END****************************************
  165. //*********************以第二位一部分DHT90设置   START****************************************  
  166. sbit SCK  = P2^6;     界说通信工具秒表左转舵
  167. sbit DATA = P2^7;     界说通信工具知识左转舵
  168. typedef union   
  169. { unsigned int i;     交流两个界说
  170.   float f;  
  171. } value;  
  172. enum {气温,HUMI};      //TEMP=0,HUMI=1
  173.   
  174. #define noACK 0             用于决定倘若断流器通信工具
  175. #define ACK   1             完毕知识传输
  176.                             ADR命令R/W
  177. #define STATUS_REG_W 0x06   //000   0011    0  
  178. #define STATUS_REG_R 0x07   //000   0011    1  
  179. #define MEASURE_TEMP 0x03   //000   0001    1  
  180. #define MEASURE_HUMI 0x05   //000   0010    1  
  181. #define RESET        0x1e   //000   1111    0  
  182. /****************界说行使职责****************/
  183. void s_transstart(void);              启动传递行使职责
  184. void s_connectionreset(void);          衔接取代功用
  185. char s_write_byte(unsigned char value;//dht90写行使职责
  186. char s_read_byte(unsigned char ACK) DHT90读取功用
  187. char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char 模仿;//测温湿度功用
  188. void calc_dht90(float *p_humidity ,float p_temperature;//温湿度赔偿
  189. /*————————————–  
  190. 课程术语:S transstart
  191. ;功    CAN:启动替换功用
  192. ;占有率资源:–
  193. ;参量阐明:–
  194. ;创办日期:  
  195. ;版    本:(功用版) 版本)
  196. ;修正日期:–
  197. ;修正阐明:–
  198. ;————————————-*/   
  199. void s_transstart(void)  
  200. // generates a transmission start   
  201. //       _____         ________  
  202. // DATA:      |_______|  
  203. //           ___     ___  
  204. // SCK : ___|   |___|   |______  
  205. {   
  206.    DATA=1; SCK=0;                   //Initial state  
  207.    _nop_();  
  208.    SCK=1;  
  209.    _nop_();  
  210.    DATA=0;  
  211.    _nop_();  
  212.    SCK=0;   
  213.    _nop_();_nop_();_nop_();  
  214.    SCK=1;  
  215.    _nop_();  
  216.    DATA=1;         
  217.    _nop_();  
  218.    SCK=0;         
  219. }  
  220. /*————————————–  
  221. 模块术语:S_衔接重新安置
  222. ;功    CAN:衔接取代功用
  223. ;占有率资源:–
  224. ;参量阐明:–
  225. ;创办日期:  
  226. ;版    本:(功用版) 版本)
  227. ;修正日期:–
  228. ;修正阐明:–
  229. ;————————————-*/  
  230. void s_connectionreset(void)  
  231. // communication reset: DATA-line=1 and at least 9 SCK cycles followed by transstart  
  232. //       _____________________________________________________         ________  
  233. // DATA:                                                      |_______|  
  234. //          _    _    _    _    _    _    _    _    _        ___     ___  
  235. // SCK : __| |__| |__| |__| |__| |__| |__| |__| |__| |______|   |___|   |______  
  236. {   
  237.   unsigned char i;   
  238.   DATA=1; SCK=0;                    //Initial state  
  239. (I=0;I)<9;i++)                  //9 SCK cycles  
  240.   {  
  241.     SCK=1;
  242.     SCK=0;  
  243.   }  
  244.   s_transstart();                   //transmission start  
  245. }  
  246. /*————————————–  
  247. 模块术语:s_write_byte
  248. ;功    can:dht90研究行使职责
  249. ;占有率资源:–
  250. ;参量阐明:–
  251. ;创办日期:  
  252. ;版    本:(功用版) 版本)
  253. ;修正日期:–
  254. ;修正阐明:–
  255. ;————————————-*/  
  256. char s_write_byte(unsigned char value)  
  257. //———————————————————————————-  
  258. // writes a byte on the Sensibus and checks the acknowledge   
  259. {   
  260.   unsigned char i,error=0;   
  261.   for (i=0x80;i>0;i/=2)             //shift bit for masking  
  262.   {   
  263.     if (i & value) DATA=1;          //masking value with i , write to SENSI-BUS  
  264.     else DATA=0;                          
  265.     SCK=1;                          //clk for SENSI-BUS  
  266.     _nop_();_nop_();_nop_();        //pulswith 大概。 5 us      
  267.     SCK=0;  
  268.   }  
  269.   DATA=1;                           //release DATA-line  
  270.   SCK=1;                            //clk #9 for ack   
  271.   error=DATA;                       //check ack (DATA will be pulled down by DHT90),DATA在第9个占领沿将被DHT90志愿地下拉为低电平。  
  272.   _nop_();_nop_();_nop_();
  273.   SCK=0;
  274.   DATA=1;                           //release DATA-line  
  275.   return error;                     //error=1 in case of no acknowledge //循环:0成,1舍弃
  276. }  
  277.   
  278. /*————————————–  
  279. ;模块术语:s_read_byte();  
  280. ;功    CAN:DHT90读取功用
  281. ;占有率资源:–
  282. ;参量阐明:–
  283. ;创办日期:  
  284. ;版    本:(功用版) 版本)
  285. ;修正日期:–
  286. ;修正阐明:–
  287. ;————————————-*/  
  288. char s_read_byte(unsigned char ACK)  
  289. // reads a byte form the Sensibus and gives an acknowledge in case of “ack=1”   
  290. {   
  291.   unsigned char i,val=0;  
  292.   DATA=1;                           //release DATA-line  
  293.   for (i=0x80;i>0;i/=2)             //shift bit for masking  
  294.   { SCK=1;                          //clk for SENSI-BUS  
  295.     if (知识) val=(val | i);        //read bit   
  296.         _nop_();_nop_();_nop_();        //pulswith 大概。 5 us
  297.     SCK=0;               
  298.   }  
  299.   if(ack==1)DATA=0;                 //in case of “ack==1” pull down DATA-Line  
  300.   else DATA=1;                      //假如是查核(ack==0),读取完后完毕交流
  301.   _nop_();_nop_();_nop_();          //pulswith 大概。 5 us  
  302.   SCK=1;                            //clk #9 for ack  
  303.   _nop_();_nop_();_nop_();          //pulswith 大概。 5 us   
  304.   SCK=0;                  
  305.   _nop_();_nop_();_nop_();          //pulswith 大概。 5 us  
  306.   DATA=1;                           //release DATA-line  
  307.   return val;  
  308. }  
  309.   
  310.   
  311. /*————————————–  
  312. ;模块术语:s_measure();  
  313. ;功    能:测温湿度行使职责
  314. ;占有率资源:–
  315. ;参量阐明:–
  316. ;创办日期:  
  317. ;版    本:(功用版) 版本)
  318. ;修正日期:–
  319. ;修正阐明:–
  320. ;————————————-*/  
  321. char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode)  
  322. // makes a measurement (humidity/temperature) with checksum  
  323. {   
  324.   unsigned error=0;  
  325.   unsigned int i;  
  326.   
  327.   s_transstart();                   //transmission start  
  328.   switch(mode){                     //send command to sensor  
  329.     case TEMP  : error+=s_write_byte(MEASURE_TEMP); break;  
  330.     case HUMI  : error+=s_write_byte(MEASURE_HUMI); break;  
  331.     default     : break;     
  332.   }  
  333.   for (i=0;i<65535;i++) if(DATA==0) break; //wait until sensor has finished the measurement  
  334.   if(知识) error+=1;                // or timeout (~2 sec.) is reached  
  335.   *(p_value)  =s_read_byte(ACK);    //read the first byte (MSB)
  336.   *(p_value+1)=s_read_byte(ACK);    //read the second byte (LSB)
  337.   *p_checksum 读八位位组(noack);//读 checksum  
  338.   return error;  
  339. }  
  340.   
  341. /*————————————–  
  342. 课程术语:Calc_Dht90
  343. ;功    精力:温湿度赔偿功用
  344. ;占有率资源:–
  345. ;参量阐明:–
  346. ;创办日期:  
  347. ;版    本:(功用版) 版本)
  348. ;修正日期:–
  349. ;修正阐明:–
  350. ;————————————-*/  
  351. void calc_dht90(float *p_humidity ,float *p_temperature)
  352. // calculates temperature [C] and humidity RH]  
  353. // input :  humi [蜱类] (12 bit)  
  354. //          temp [蜱类] (14 bit)
  355. // output:  humi RH]
  356. //          temp [C]
  357. { const float C1=              // for 12 Bit
  358.   const float C2=+           // for 12 Bit
  359.   const float C3=        // for 12 Bit
  360.   const float T1=+             // for 14 Bit @ 5V
  361.   const float T2=+           // for 14 Bit @ 5V  
  362.   float rh=*p_humidity;             // rh:      Humidity [蜱类] 12 Bit  
  363.   float t=*p_temperature;           // t:       Temperature [蜱类] 14 Bit
  364.   float rh_lin;                     // rh_lin:  Humidity linear
  365.   float rh_true;                    // rh_true: Temperature compensated humidity
  366.   float t_C;                        // t_C   :  Temperature [C]
  367.   t_C=t*0.01 – 40;                 钙 temperature from ticks to [C]
  368.   rh_lin=C3*rh*rh + C2*rh + C1;    钙 humidity from ticks to RH]
  369.   rh_true=(t_C-25)*(T1+T2*rh)+rh_lin;  钙 temperature compensated humidity RH]
  370.   if(rh_true>100)rh_true=100;       //cut if the value is outside of
  371.   if(rh_true<)rh_true=;       //the physical possible range
  372.   *p_temperature=t_C;               //return temperature [C]
  373.   *p_humidity=rh_true;              //return humidityRH]
  374. }
  375. //*********************以第二位一部分DHT90设置   END****************************************
  376. //*********主行使职责*****************
  377. void 主(空)
  378. {
  379.                 value humi_val,temp_val;
  380.         unsigned char error,checksum;  
  381.         unsigned int wendu,shidu;
  382.         LCD_init();         
  383.         s_connectionreset();  
  384.         LCD_disp_str(0,1,TE
  385.                 LCD_disp_str(0,2,RH
  386. 设定初值气温显示区
  387.         LCD_disp_str(2,1,””);
  388. 设定初值湿度显示区
  389.         LCD_disp_str(2,2,””);
  390.         delay_n10us(20000);     //延时
  391.      (1)
  392.         { error=0;  
  393.           error+=s_measure((unsigned char*) &);  //measure humidity  
  394.           error+=s_measure((unsigned char*) &);  //measure temperature  
  395.           中频(过失)!=0) s_connectionreset();                 //in case of an error: connection reset  
  396.           else  
  397.           { (浮标)                  //converts integer to float 添加温湿度比较地顺序
  398.             (浮标)                  //converts integer to float 比较地输入把持用动作示意
  399.             calc_dht90(&);            //calculate humidity, temperature
  400.                         wendu=10*
  401.                         LCD_disp_char(2,1,wendu/1000+”0”);           显示气温100位
  402.             LCD_disp_char(3,1,(wendu%1000)/100+”0”);     显示气温10位
  403.             LCD_disp_char(4,1,(wendu%100)/10+”0”);          显示气温位
  404.                         LCD_disp_char(6,1,(wendu%10)+”0”);           显示气温的第一位任一某一十进位的
  405.                         shidu=10*
  406.                         LCD_disp_char(2,2,shidu/1000+”0”);              显示湿度100位
  407. …………仅限于本文的上浆 其余者密码请从51黑色下载附件。…………

准备排印的书面材料密码

完全的知识下载(包罗论文和密码):

发表评论

电子邮件地址不会被公开。 必填项已用*标注