找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于单片机+DHT11的孵化装置流程图+程序

[复制链接]
跳转到指定楼层
楼主
基于DHT11温湿度传感器的孵化系统供初学者练习。主要有DHT11驱动并将温湿度显示等。

单片机源程序如下:
  1. # include <reg51.h>
  2. # include <intrins.h>
  3. typedef unsigned char BYTE;
  4. typedef unsigned int WORD;
  5. unsigned char c;
  6. #define uint unsigned int
  7. #define uchar unsigned char
  8. #define MotorData P0  //步进电机控制接口定义
  9. sbit PENWU=P2^0;          //加湿器接口定义
  10. sbit FengShan1=P1^1;  //风扇1接口定义
  11. sbit FengShan2=P1^2;  // 风扇2接口定义      
  12. sbit io=P1^0;         //dht11out端接单片机的P1^0口//

  13. sbit rw=P0^6;         //以下三行是设置lcd1602的使能端//

  14. sbit rs=P0^7;

  15. sbit ep=P0^5;

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

  17. uchar data_byte;

  18. uchar RH,RL,TH,TL;
  19. uchar phasecw[4] ={0x08,0x04,0x02,0x01};//电机导通相序 D-C-B-A
  20. uchar phaseccw[4]={0x01,0x02,0x04,0x08};//反转机导通相序 A-B-C-D
  21. void Delay_xms(uint x)                  //ms延时函数
  22. {
  23. uint i,j;
  24. for(i=0;i<x;i++)
  25.   for(j=0;j<112;j++);
  26. }
  27. void MotorCW(void)                     //顺时针转动
  28. {
  29. uchar i;
  30. for(i=0;i<4;i++)
  31.   {
  32.    MotorData=phasecw[i];
  33.    Delay_xms(4);                       //转速调节
  34.   }
  35. }
  36. void MotorCCW(void)                    //逆时针转动
  37. {
  38. uchar i;
  39. for(i=0;i<4;i++)
  40.   {
  41.    MotorData=phaseccw[i];
  42.    Delay_xms(4);                       //转速调节
  43.   }
  44. }
  45. void MotorStop(void)                   //停止转动
  46. {
  47. MotorData=0x00;
  48. }
  49. //***************延时函数*************************************

  50. void delay(uchar ms) //延时模块//

  51. {

  52.   uchar i;

  53.   while(ms--)                 



  54. for(i=0;i<100;i++);

  55. }


  56. void delay1()//一个for循环大概需要8个多机器周期一个机器周期为1us晶振为12MHz也就是说本函数延时8us多此延时函数必须德稍微精确一点

  57. {

  58.   uchar i;

  59.   for(i=0;i<1;i++);

  60. }



  61. //***************************************************************  

  62. //lcd模块//

  63. BOOL lcd_bz()//测试lcd忙碌状态返回值为布尔型数值真或假'1'.'0'  

  64. {

  65. BOOL result;
  66.   rs=0;           // 读忙信号
  67.   rw=1;
  68.   ep=1;
  69.   _nop_();
  70.   _nop_();
  71.   _nop_();
  72.   _nop_();
  73.   result = (BOOL)(P2&0x80);
  74.   ep=0;
  75.   result ;

  76. }     

  77. void write_cmd(uchar cmd)//写指令//

  78. {

  79.   while (lcd_bz());
  80.   rs=0;
  81.   rw=0;
  82.   ep=0;
  83.   _nop_();
  84.   _nop_();
  85.   P2=cmd ;
  86.   _nop_();
  87.   _nop_();
  88.   _nop_();
  89.   _nop_();
  90.   ep=1;
  91.   _nop_();
  92.   _nop_();
  93.   _nop_();
  94.   _nop_();
  95.   ep=0;

  96. }



  97. void write_addr(uchar addr)//写地址//

  98. {

  99.   write_cmd(addr|0x80);//LCD第一行的首地址为0x80第二行的首地址为0x80+0x40=0xc0

  100. }



  101. void write_byte(uchar dat) //写字节//

  102. {

  103.    while (lcd_bz());
  104.   rs=1;
  105.   rw=0;
  106.   ep=0;
  107.   _nop_();
  108.   _nop_();
  109.   P2=dat ;
  110.   _nop_();
  111.   _nop_();
  112.   _nop_();
  113.   _nop_();
  114.   ep=1;
  115.   _nop_();
  116.   _nop_();
  117.   _nop_();
  118.   _nop_();
  119.   ep=0;

  120. }



  121. void lcd_init() //lcd初始化//

  122. {

  123.   write_cmd(0x38);//设置LCD两行显示一个数据由5*7点阵表示,数据由八根线传输

  124.   delay(1);

  125.   write_cmd(0x0c);//清除屏幕显示

  126.   delay(1);

  127.   write_cmd(0x06);//设定输入方式增量不移位

  128.   delay(1);

  129.   write_cmd(0x01);//开整体显示关光标不闪烁

  130.   delay(1);

  131. }



  132. void display(uchar addr,uchar q)//在某一地址上显示内容adder表示的是地址偏移量q表示显示的字符或数字//

  133. {

  134.   delay(10);   write_addr(addr);

  135.   write_byte(q);

  136.   delay(1);//修改此时间可以改变LCD上数值跳变的数度

  137. }



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

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

  140. {

  141.   io=1;

  142.   delay1();

  143.   io=0;

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

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

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

  147.   delay1();

  148.   delay1();

  149. }



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

  151. {

  152.   uchar i,temp;

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

  154.   {

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

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

  157.          delay1();

  158.         delay1();

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

  160.         if(io==1)

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

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

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

  164.          data_byte|=temp;

  165.   }

  166.   return data_byte;

  167. }



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

  169. {

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

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

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

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

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

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

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

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

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

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

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

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

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

  184.         delay1();

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

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

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

  188.         {

  189.    RH=R_H;

  190.    RL=R_L;

  191.    TH=T_H;

  192.    TL=T_L;

  193.    check=num_check;

  194.         }

  195.   }

  196. }

  197. //*****************************************************************************


  198. void FengShan1QD(void)
  199. {
  200.         FengShan1=1;
  201. }
  202. void FengShan1TZ(void)
  203. {
  204.         FengShan1=0;
  205. }
  206. void FengShan2QD(void)
  207. {
  208.         FengShan2=1;
  209. }
  210. void FengShan2TZ(void)
  211. {
  212.         FengShan2=0;
  213. }
  214. void PENWUQD(void)
  215. {
  216.         PENWU=1;
  217. }
  218. void PENWUTZ(void)
  219. {
  220.         PENWU=0;
  221. }
  222. void main()//主函数模块//

  223. {
  224.   lcd_init();//初始化LCD

  225.   while(1)

  226.   {
  227.     receive();//接收数据

  228. display(0x00,'R');//LCD的第一行显示

  229. display(0x01,':');

  230. display(0x02,RH/10+0x30); //0x30表示带字库的LCD1602中0x30的位置放有数字0RH/10+0x30即表示湿度的十位数字在字库RH/10+0x30的位置处放着

  231. display(0x03,RH%10+0x30);

  232. display(0X04,'%');

  233. display(0x40,'T');//LCD的第二行显示

  234. display(0x41,':');

  235. display(0x42,TH/10+0x30);

  236. display(0x43,TH%10+0x30);

  237. display(0x44,0xdf);//以下两个是温度单位的处理

  238. display(0x45,0x43);
  239. if(RH<65)//湿度定义
  240.                 PENWUQD();
  241.         if(RH>75)
  242.                 PENWUTZ();
  243.         if(TH>37)//温度定义
  244.                 FengShan2QD();
  245.         if(TH<34)
  246.                 FengShan2TZ();
  247.         Delay_xms(50);                        //等待系统稳定
  248. TMOD=0x01;
  249.     TH0=(65536-50000)/256;
  250.     TL0=(65536-50000)%256;
  251.     EA=1;  ET0=1;
  252.     TR0=1;
  253.         c=0;
  254.         while(1);
  255. }
  256. }
  257. void timer0() interrupt 1
  258. {         uint i;
  259. TR0=0;
  260. c++;
  261.    if(c==100) // 定时50ms    定时20次是1秒,再乘以14400是四个小时
  262.    {
  263.                 for(i=0;i<500;i++)
  264.   {
  265.    MotorCW();                          //顺时针转动
  266.   }
  267.   MotorStop();                         //停止转动
  268.   Delay_xms(500);
  269.   for(i=0;i<500;i++)
  270.   {
  271.    MotorCCW();                         //逆时针转动
  272.   }
  273.   MotorStop();                         //停止转动
  274.   Delay_xms(500);  
  275. }
  276. else
  277. MotorStop();
  278.     TH0=(65536-50000)/256;
  279.     TL0=(65536-50000)%256;
  280.         TR0=1;
  281. }
复制代码

所有资料51hei提供下载:
孵化装置.zip (40.6 KB, 下载次数: 24)


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

使用道具 举报

沙发
ID:197152 发表于 2020-4-2 13:15 | 只看该作者
代码里的p2换p0
回复

使用道具 举报

板凳
ID:738997 发表于 2020-4-27 06:40 来自手机 | 只看该作者
吴海晨o 发表于 2020-4-2 13:15
代码里的p2换p0

这个改了之后可以直接烧录使用吗?
回复

使用道具 举报

地板
ID:65237 发表于 2020-5-7 21:37 | 只看该作者
楼主上机实测过没 我上机测不行啊 没收到数据
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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