51单片机课程设计:基于DHT11的温湿度报警器

本程序适用于51系列单片机,主要用于读取DHT11温湿度模块数值,显示在数码管上,同时还具备温湿度报警功能,当超出预设值,蜂鸣器报警,可在吉林农业大学单片机开发板上完美运行,其他朋友可以修改部分代码移植的其他型号的开发板上。工程文件以及开发板电路图可到附件下载,同时DHT11部分资料在附件也可以下载。

关于粘贴复制乱码的问题:如果程序复制到Keil编译器上出现注释乱码,可以先建一个.c文件,也就是说不在keil里面编辑,然后用记事本打开.c文件,将源码复制进去,再在keil中添加文件即可。

/************************************说明***************************************
程序运行时 会对模块进行预热 保证读取第一个数值的精确
预热时间大概为4秒左右
程序初始化时将会提示你设置最大温湿度
H1  最高温度   L1   最低温度
H2  最高湿度   L2   最低湿度
按钮K1温度加    按钮K2温度减
设置完成后  按K3   即确定按钮 开始监控报警   (适用于吉农51单片机开发板)2016-12-29----------------------------SWorld
********************************************************************************/
#include <reg52.h>
#define OK 1
#define ERROR 0
#define NUMBER  20
#define SIZE  5
/*-----------------------------显示部分接线方法-------------------------------*/
#define GPIO_DIG P0
sbit WEC=P2^3;              //段选
sbit DUC=P2^2;  //位选
/*----------------------------模块引脚连接-------------------------------------*/
sbit dht11 = P2^0;  //dht 接口    只要接一个就行   接dht11   data0接口  NC不用管
/*-----------------------------按键引脚方法------------------------------------*/
sbit add=P2^5;//增加    连接K2
sbit sub=P2^4;//减少    连接K1
sbit ok=P2^6;//确定    连接K3
/*----------------------------报警引脚连接-------------------------------------*/
sbit bell=P2^7;//蜂鸣器接口  连接蜂鸣器
/*------------------------------全局变量---------------------------------------*/
unsigned char flag;
/*---------------分别代表数码管上的0~9共10位数以及字母L、H----------------------*/
unsigned char code array[12]= { 0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f,0x38,0x76//L  H};
unsigned char DisplayData[8]; //用来存放要显示的8位数的值
unsigned int HTemp,LTemp,HHumi,LHumi,setok;          //用来存放最大温湿度  以及是否设置好温湿度
int temp_value, humi_value;                                //温湿度数值存放
unsigned char status;
unsigned char value_array[5]; /*------------------------------函数声明---------------------------------------*/
void Delay_1ms(unsigned int ms);
unsigned char ReadTempAndHumi(void);
void InitTime(void);
void Delay_1ms(unsigned int ms);
void SMG_Display(unsigned int value,unsigned int way ) ;       //显示部分
unsigned char ReadValue(void); /*------------------------------延时函数延时1ms---------------------------------------*/
void Delay_1ms(unsigned int ms)
{ unsigned int x, y; for(x = ms; x > 0; x--) { for(y = 124; y > 0; y--); }
}
/*------------------------------延时函数延时10ns
---------------------------------------*/
void  Delay_10us(void)
{ unsigned char  i; i--; i--; i--; i--; i--; i--;
}
/*------------------------------读取模块数值
---------------------------------------*/
unsigned char ReadValue(void)
{ unsigned char count, value = 0, i; status = OK;   for(i = 8; i > 0; i--) { value <<= 1; count = 0; while(dht11 == 0 && count++ < NUMBER); if(count >= NUMBER) { status = ERROR;return 0;    } Delay_10us(); Delay_10us(); Delay_10us(); if(dht11 != 0) { value++; while(dht11 != 0 && count++ < NUMBER) { dht11 = 1; } if(count >= NUMBER) { status = ERROR;  return 0; }  } }  return (value);
} /*------------------------------获取模块温湿度
---------------------------------------*/
unsigned char ReadTempAndHumi(void)
{  unsigned char i = 0, check_value = 0,count = 0; EA = 0; dht11 = 0;     Delay_1ms(20);   dht11 = 1;     Delay_10us(); Delay_10us(); Delay_10us(); Delay_10us();  if(dht11 != 0)    { EA = 1; return ERROR; } else { while(dht11 == 0 && count++ < NUMBER);   if(count >= NUMBER)  { dht11 = 1; EA = 1; return ERROR;   } count = 0; dht11 = 1;while(dht11 != 0 && count++ < NUMBER); if(count >= NUMBER) { dht11 = 1; EA = 1; return ERROR;  }  for(i = 0; i < SIZE; i++) { value_array[i] = ReadValue(); if(status == ERROR){ dht11 = 1; EA = 1;    return ERROR;  } if(i != SIZE - 1)  { check_value += value_array[i];  } }if(check_value == value_array[SIZE - 1]) { humi_value = value_array[0] * 10; temp_value = value_array[2] * 10; dht11 = 1; EA = 1; return OK;   } else { EA = 1; return ERROR; } }
}
/**************************************************************
键盘扫描子程序
**************************************************************/
unsigned char Key_Scan()
{unsigned char keyValue = 0 , i; //保存键值//--检测按键1--//if (ok != 1)//检测按键K3是否按下{Delay_1ms(10);//消除抖动if (ok != 1)//再次检测按键是否按下{keyValue = 3;i = 0;while ((i<50) && (ok != 1)) //检测按键是否松开{Delay_1ms(10);i++;}}}//--检测按键1--//if (add != 1)//检测按键K1是否按下{Delay_1ms(10);//消除抖动if (add!= 1)//再次检测按键是否按下{keyValue = 2;i = 0;while ((i<50) && (add != 1)) //检测按键是否松开{Delay_1ms(10);i++;}}}//--检测按键1--//if (sub != 1)//检测按键K2是否按下{Delay_1ms(10);//消除抖动if (sub!= 1)//再次检测按键是否按下{keyValue = 1;i = 0;while ((i<50) && (sub != 1)) //检测按键是否松开{Delay_1ms(10);i++;}}}return keyValue;   //将读取到键值的值返回
}
/*******************************************************************************
* 函 数 名         : DigDisplay
* 函数功能     : 使用数码管显示
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void DigDisplay()
{unsigned char i;unsigned int j;for(i=0;i<8;i++){WEC=1;DUC=0;switch(i) //位选,选择点亮的数码管,{case(0):GPIO_DIG=0x7F; break;//显示第0位case(1):GPIO_DIG=0xBF; break;//显示第1位case(2):GPIO_DIG=0xDF; break;//显示第2位case(3):GPIO_DIG=0xEF; break;//显示第3位case(4):GPIO_DIG=0xF7; break;//显示第4位case(5):GPIO_DIG=0xFB; break;//显示第5位case(6):GPIO_DIG=0xFD; break;//显示第6位case(7):GPIO_DIG=0xFE; break;//显示第7位}WEC=0;DUC=1;GPIO_DIG=DisplayData[i];//发送段码j=50; //扫描间隔时间设定while(j--);GPIO_DIG=0x00;//消隐}
}
/*------------------------------主函数
主函数共分为5部分,有switch语句执行相关操作
case 1:设置最高温度,完成设置后跳到下一循环
case 2:设置最低温度,完成设置后跳到下一循环
case 3:设置最高湿度,完成设置后跳到下一循环
case 4:设置最低湿度,完成设置后跳到下一循环
case 5:温湿度监控主循环,当低于后者超过预设值,
触发警报。所读取的数值同时显示于数码管
---------------------------------------*/
void main(void)
{ unsigned char mark = 0; Delay_1ms(1000); ReadTempAndHumi(); Delay_1ms(3000); InitTime(); WEC=0;DUC=0;HTemp=30,LTemp=20;HHumi=100,LHumi=20;bell=1,setok=1;while(1) { switch(setok){case 1:DisplayData[7]=array[11];DisplayData[6]=array[1];DisplayData[4]=array[HTemp/10];DisplayData[3]=array[HTemp%10];switch(Key_Scan()){case 1:HTemp-=2;break;case 2:HTemp+=2;break;case 3:setok=2;break;}break;case 2:DisplayData[7]=array[10];DisplayData[6]=array[1];DisplayData[4]=array[LTemp/10];DisplayData[3]=array[LTemp%10];switch(Key_Scan()){case 1:LTemp-=2;break;case 2:LTemp+=2;break;case 3:setok=3;break;}break;case 3:DisplayData[7]=array[11];DisplayData[6]=array[2];DisplayData[4]=array[HHumi/100];DisplayData[3]=array[HHumi%100/10];DisplayData[2]=array[HHumi%10];switch(Key_Scan()){case 1:HHumi-=2;break;case 2:HHumi+=2;break;case 3:setok=4;break;}break;case 4:DisplayData[7]=array[10];DisplayData[6]=array[2];DisplayData[4]=array[LHumi/100];DisplayData[3]=array[LHumi%100/10];DisplayData[2]=array[LHumi%10];switch(Key_Scan()){case 1:LHumi-=2;break;case 2:LHumi+=2;break;case 3:setok=5;break;}break;case 5:DisplayData[4]=0x00;if(flag == 30) { flag = 0; mark++; ReadTempAndHumi(); if(temp_value<LTemp*10||temp_value>HTemp*10||humi_value<LHumi*10||humi_value>HHumi*10){bell=0;}else{bell=1;}} SMG_Display(temp_value,0); SMG_Display(humi_value,1); break;}DigDisplay();}
}
/*------------------------------定时器初始化
---------------------------------------*/
void InitTime(void)
{ TH0 = (unsigned char)((65535U - 50000) >> 8); TL0 = (unsigned char)(65535U - 50000) ; TMOD = 0X01; TR0 = 1; ET0 = 1; EA = 1;
}
/*------------------------------数值转换
将读取到的数值转换为数码管可显示的数值
---------------------------------------*/
void SMG_Display(unsigned int value,unsigned int way )
{ unsigned char ge, bai, shi; ge = value % 10; shi = value % 100 / 10; bai = value % 1000 / 100; if(way==0){ DisplayData[7]=array[bai];DisplayData[6]=array[shi]|0x80;DisplayData[5]=array[ge];}else{DisplayData[3]=array[bai];DisplayData[2]=array[shi]|0x80;DisplayData[1]=array[ge];}
}
/*------------------------------定时器0
---------------------------------------*/
void timer(void) interrupt 1
{ TH0 = (unsigned char)((65535 - 50000) >> 8);  TL0 = (unsigned char)(65535 - 50000); flag++;
}

转载于:https://blog.51cto.com/970076933/1887477

51单片机课程设计:基于DHT11的温湿度报警器相关推荐

  1. 51单片机课程设计 || 基于AS608模块的指纹锁

    知乎:Fragtex CSDN: 川明_Fragtex 代码 代码速览: 源码 [闲鱼]https://m.tb.cn/h.U1SDh0Z?tk=npyX2Dqp114 CZ0001 「我在闲鱼发布了 ...

  2. 温度报警程序c语言设计,51单片机课程设计:基于DS18B20的温度报警器

    51单片机课程设计:基于DS18B20的温度报警器 本程序用于读取DS18B20温度,同时具备报警功能,工程分为3个文件,main.c.temp.c.temp.h,经本人修改部分代码,适用于吉林农业大 ...

  3. 8155与单片机c语言设计,51单片机课程设计报告-基于8155的8LED显示电子码表设计.doc...

    51单片机课程设计报告 --基于8155的8LED显示电子码表设计 实验目的 本次课程设计是基于51单片机在理论课程的基础上,通过电路设计.理论计算.实际编程.调试.测试.分析查找故障,解决在实际设计 ...

  4. 51单片机课程设计《三路步进电机控制》

    说明:最近抽出了几天时间完成了单片机的课程设计,用了51单片机做了三路步进电机控制器,美名其曰3d打印机控制器(其实是瞎搞的,与3D打印机毫无关系),因为单片机课程设计是在大四上学期,与考研复习时间冲 ...

  5. 单片机课程设计-基于单片机直流电机控制器设计

    本科单片机课程设计,附Proteus仿真效果图 要求: 思路很简单,使用定时器0控制单片机IO口输出不同占空比的触发脉冲即可控制转速 代码参考: #include <reg52.h>#de ...

  6. 单片机课程设计——基于51单片机温湿度检测系统的设计与实现

    本文主要介绍了怎么使用51单片机最小系统板和温湿度传感器制作一个温湿度检测系统. 本次设计主要涉及了温湿度的测量.显示以及实现简单控制.硬件方面有五个模块,即STC89C52单片机主控模块.传感器模块 ...

  7. 51单片机课程设计——利用51单片机的定时器设计一个时钟论文

    计科在读,分享自己做过的作业,欢迎指正,有需要课程设计论文的可以私信我 摘要 单片机是一种数字集成电路芯片,是指集成在一块芯片上的微型计算机.一个比较完整的单片机应该包括微处理器(CPU). 存储器( ...

  8. 51单片机开发设计 基于52单片机的电子琴

    一.系统设计 8个按键可以弹奏8个音符,蜂鸣器可以播放按键弹奏的音乐,数码管会显示相应的音符,通过无线模块可以将按下的音阶数据上传到上位机端并进行显示,可以按照乐谱进行音乐演奏,在与上位机进行通信时会 ...

  9. 单片机课程设计——《基于AT89S52单片机和DS1302时钟芯片的电子时钟(可蓝牙校准)》...

    引言 本设计以AT89S52单片机为控制核心,时钟芯片DS1302提供时钟源,配合LCD1602液晶显示模块,组成基本硬件系统,同时利用HC-05嵌入式蓝牙串口通讯模块,可在手机端进行日期.时间的校准 ...

最新文章

  1. 【Intellij IDEA系列】IDEA使用git提交代码流程
  2. OpenCV形态学变换函数morphologyEx()黑帽运算的使用
  3. 什么是野指针和内存泄露?如何避免野指针
  4. lintcode :Integer to Roman 整数转罗马数字
  5. Flutter1.12与原生Android交互(kotlin)
  6. Java中break、continue及标签等跳转语句的使用[下]
  7. Linux开发_退格符的花样用法
  8. mac m1搭建java opencv 环境(遇到的坑记录)
  9. 一款度盘高速下载工具
  10. 云安全七大核心要素解析
  11. 订单系统设计,消息队列幂等处理思路
  12. 韩顺平老师php从入门到精通149讲
  13. 解决华为手机Android系统10.0不能隐藏桌面图标问题,全网唯一
  14. WPF流程图制作系列相关基础一
  15. docker容器化部署nginx前端项目
  16. 单独上线音乐直播APP,“LOOK直播”能给网易云音乐带来什么?
  17. 使用TL-WDN5200H无线网卡
  18. 23 SpringBoot @Qualifier注解
  19. 小程序微信小程序设计登录页面
  20. 华南理工计算机应用在线答题,华南理工大学计算机应用基础随堂练习题目及答案...

热门文章

  1. java.awt.FontFormatException: Unsupported sfnt C:\Windows\Fonts\mstmc.ttf
  2. 面向对象第二单元学习体会与总结
  3. time.After巧妙的超时控制
  4. iMeta | 国际标准刊号ISSN在线版正式确认
  5. 20201124-文献管理入门之Mendeley
  6. lol哪个服务器有无限乱斗,《LOL》无限乱斗模式什么时候上线 无限乱斗模式上线时间一览...
  7. pytorch 使用GPU计算f1_score
  8. 一年365天,初始水平值为1.0,每工作一天水平增加N,不工作时水平不下降,一周连续工作4天
  9. unity Gizmos
  10. Unity之Gizmos类