标题: 基于stm8单片机的DHT11温湿度测量仪程序 [打印本页]
作者: ABBA1222 时间: 2018-12-3 11:00
标题: 基于stm8单片机的DHT11温湿度测量仪程序
程序代码:
(1)函数声明、变量定义代码:
Wsdcl_main.h文件:
#include"stm8s.h"
#define u8 unsigned char
#define u16 unsigned char
#define u32 unsigned long
#define KEY_PORT GPIOE
#define KEY_PIN GPIO_PIN_0
extern unsigned int temp_1,temp_2, temp_4,temp_5;
extern unsigned int humi_1, humi_2, humi_4, humi_5;
/************************************************************/
void CLK_Configuration(void);
void GPIO_Configuration(void);
void KEY_Init(void);
void TIM2_Configuration();
void ceshi_on(void);
void Alarm_Beep();
void ceshi_off(void);
DHT11.h文件:
#include"stm8s.h"
#define DHT11_IO_IN GPIO_Init(GPIOE, GPIO_PIN_6, GPIO_MODE_IN_PU_NO_IT)//输入模式
#define DHT11_IO_OUT GPIO_Init(GPIOE, GPIO_PIN_6, GPIO_MODE_OUT_PP_LOW_FAST)//输出模式
#define GPIO_PIN_UP GPIO_WriteHigh(GPIOE, GPIO_PIN_6)//拉高电平
#define GPIO_PIN_DOWN GPIO_WriteLow(GPIOE, GPIO_PIN_6)//拉低电平
#define DHT11_DQ_IN GPIO_ReadInputPin(GPIOE, GPIO_PIN_6) //读取引脚信号
/************************************************************/
extern unsigned char Table_Data[4];
unsigned char DHT11_Get_Data(void);
int start_DHT11(void);
unsigned char DHT11_Get_Data(void);
7219.h文件:
#include"stm8s.h"
#include"wsdcl_main.h"
/*定义7219各个地址*/
#define MSB 0x80
#define LSB 0x01
#define DECODE_MODE 0x09
#define INTENSITY 0x0A
#define SCAN_LIMIT 0x0B
#define SHUT_DOWN 0x0C
#define DISPLAY_TEST 0x0F
#define GPIO_PORT GPIOD
/************************************************************/
void Init_Max7219();
void clear_7219();
void Write_Max7219(unsigned char address,unsigned char dat);
void Display_Error(void);
void Display_Temp(void);
void Display_Humi(void);
Delay.h文件:
#include"stm8s.h"
#include"wsdcl_main.h"
/************************************************************/
void Delay_ms(u32 ms);
void Delay_us(u32 us);
(2)主函数代码:
Wsdcl_main.c文件:
#include"stm8s.h"
#include"wsdcl_main.h"
#include"7219.h"
#include"Delay.h"
#include"DHT11.h"
int _Turn;
int main()
{ _Turn=1; //先显示温度
CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1); //时钟配置16MHz
KEY_Init(); //按键切换显示初始化
TIM2_Configuration();//TIM2时钟配置
if(start_DHT11()==1)//检测是否有响应,结果有响应往下执行
{
DHT11_Get_Data(); //从DHT11取数据
while(1)
{
/*设置温湿度警戒 蜂鸣器报警*/
if((Table_Data[2]>30)|(Table_Data[0]>60))
Alarm_Beep();
else GPIO_WriteLow(GPIOD,GPIO_PIN_4);
Init_Max7219(); //初始化Max7219
/*取温度数据各个位数值*/
temp_1=Table_Data[2]/10;
temp_2=Table_Data[2]%10;
temp_4=Table_Data[3]/10;
temp_5=Table_Data[3]%10;
/*取湿度数据各个位数值*/
humi_1=Table_Data[0]/10;
humi_2=Table_Data[0]%10;
humi_4=Table_Data[1]/10;
humi_5=Table_Data[1]%10;
/*按键切换显示温湿度*/
if(_Turn>0)
Display_Temp();
else
Display_Humi();
}
}
}
/*蜂鸣器报警函数*/
void Alarm_Beep()
{
GPIO_Init(GPIOD, GPIO_PIN_4, GPIO_MODE_OUT_PP_LOW_FAST);
BEEP_DeInit();
BEEP_Init(BEEP_FREQUENCY_1KHZ);
BEEP_LSICalibrationConfig(12800);
BEEP_Cmd(ENABLE);
GPIO_WriteHigh(GPIOD,GPIO_PIN_4);//蜂鸣器响
}
void ceshi_on(void)//用LED灯来测试程序运行情况
{
GPIO_Init(GPIOE, GPIO_PIN_5, GPIO_MODE_OUT_PP_LOW_FAST);
GPIO_WriteLow(GPIOE, GPIO_PIN_5);
}
void ceshi_off(void)
{
GPIO_WriteHigh(GPIOE, GPIO_PIN_5);
}
/*********************TIM2配置*****************************/
void TIM2_Configuration()
{
TIM2_DeInit();
TIM2_ClearITPendingBit(TIM2_IT_UPDATE);
TIM2_TimeBaseInit(TIM2_PRESCALER_8192,0xF42);//2秒产生一次中断
TIM2_ITConfig(TIM2_IT_UPDATE, ENABLE);
TIM2_Cmd(ENABLE);//启动定时器2
enableInterrupts();//开总中断
}
/*********************按键配置*****************************/
void KEY_Init(void)
{
GPIO_Init(KEY_PORT,KEY_PIN,GPIO_MODE_IN_PU_IT);
EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOE, EXTI_SENSITIVITY_FALL_ONLY);//只有下降沿触发
enableInterrupts();
}
/*********************中断服务函数*****************************/
#pragma vector=9
__interrupt void EXTI_PORTE_IRQHandler(void)//按键中断切换显示服务函数
{
_Turn=-_Turn;
}
#pragma vector=15
__interrupt void TIM2_UPD_OVF_BRK_IRQHandler(void)//定时中断更新数据服务函数
{
TIM2_ClearITPendingBit(TIM2_IT_UPDATE);
start_DHT11();
DHT11_Get_Data();//更新温湿度数据
}
(3)DHT11温湿度传感器模块代码:
DHT11.c文件:
#include"stm8s.h"
#include"wsdcl_main.h"
#include"DHT11.h"
#include"Delay.h"
int count_1,count_2;
unsigned char sbuf;
unsigned char Table_Data[4];
/**********************唤起DHT11**************************************/
int start_DHT11(void)
{
GPIO_Init(GPIOE, GPIO_PIN_6, GPIO_MODE_OUT_PP_LOW_FAST);
GPIO_WriteLow(GPIOE, GPIO_PIN_6);//拉低18ms以上
Delay_ms(10000);//Delay_ms(18);
GPIO_WriteHigh(GPIOE, GPIO_PIN_6);
Delay_us(30); //拉高20~40us
GPIO_Init(GPIOE, GPIO_PIN_6, GPIO_MODE_IN_PU_NO_IT); ceshi_on();
while(!DHT11_DQ_IN);//等待80us低电平结束
while(DHT11_DQ_IN); ceshi_off();//等待80us高电平结束
return(1); //应答成功返回1
}
/************************读取8位字节***********************************/
void com(void)
{
u8 i;
sbuf=0;
for(i=8;i>0;i--)
{
count_1=2;
while((!DHT11_DQ_IN)&&count_1++); //等待传送数据开始50us低电平结束并记录所用时间count_1
count_2=2;
while((DHT11_DQ_IN)&&count_2++) ;//等待"1"或"0"高电平结束并记录所用时间count_2
if(count_2>(count_1)) //比较count_2与count_1来判断输入是"1"还是"0"
{ sbuf<<=1;
sbuf|=0x01;
}
else
{ sbuf<<=1;
sbuf|=0x00;
}
}
}
/**********************读取数据**************************************/
unsigned char DHT11_Get_Data()
{ u32 check,sum;
com();
Table_Data[0]=sbuf;//湿度8位整数
com();
Table_Data[1]=sbuf;//湿度小数部分
com();
Table_Data[2]=sbuf;//温度整数部分
com();
Table_Data[3]=sbuf;//温度小数部分
com();
check = sbuf;//校验部分
sum =(Table_Data[0]+Table_Data[1]+Table_Data[2]+Table_Data[3]);
if(check == sum)//校验正确则返回1
return(1);
else return (0);
}
(4)MAX7219显示模块程序代码:
7219.c文件:
#include"stm8s.h"
#include"wsdcl_main.h"
#include"DHT11.h"
#include"7219.h"
/************************************************************/
unsigned int temp_1,temp_2,temp_4,temp_5;
unsigned int humi_1, humi_2, humi_4, humi_5;
u8 LEDcode[10]={0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b};
/**********************IO口配置************************************/
void Dispaly_GPIO_LoadOn()
{
GPIO_Init(GPIO_PORT, GPIO_PIN_1, GPIO_MODE_OUT_PP_LOW_FAST);
GPIO_WriteHigh(GPIO_PORT,GPIO_PIN_1);
}
void Dispaly_GPIO_LoadOff()
{
GPIO_Init(GPIO_PORT,GPIO_PIN_1, GPIO_MODE_OUT_PP_LOW_FAST);
GPIO_WriteLow(GPIO_PORT,GPIO_PIN_1);
}
void Dispaly_GPIO_ClkOn()
{
GPIO_Init(GPIO_PORT,GPIO_PIN_2, GPIO_MODE_OUT_PP_LOW_FAST);
GPIO_WriteHigh(GPIO_PORT,GPIO_PIN_2);
}
void Dispaly_GPIO_ClkOff()
{
GPIO_Init(GPIO_PORT,GPIO_PIN_2, GPIO_MODE_OUT_PP_LOW_FAST);
GPIO_WriteLow(GPIO_PORT,GPIO_PIN_2);
}
void Dispaly_GPIO_INPUT()//载入数据
{
GPIO_Init(GPIO_PORT,GPIO_PIN_0,GPIO_MODE_OUT_PP_LOW_FAST);
}
/*******************向Max7219写入8位数据************************/
void Write_Max7219_byte(unsigned char temp)
{
unsigned char i,x;
for (i=0;i<8;i++)
{
Dispaly_GPIO_ClkOff();//GPIOD_PIN_2推挽输出,写低电平
x=temp&MSB;
if(x==0)
{
Dispaly_GPIO_INPUT();//GPIOD_PIN_0推挽输出
GPIO_WriteLow(GPIO_PORT,GPIO_PIN_0);//输入数据为"0"
}
else
{
Dispaly_GPIO_INPUT();//GPIOD_PIN_0推挽输出
GPIO_WriteHigh(GPIO_PORT,GPIO_PIN_0);//输入数据为"1"
}
temp<<=1;
Dispaly_GPIO_ClkOn();//GPIOD_PIN_2推挽输出,写高电平,数据载入16位移位寄存器
}
}
/***********************向7219写入16位数据*************************/
void Write_Max7219(unsigned char address,unsigned char dat)
{
Dispaly_GPIO_LoadOff();//GPIOD_PIN_1推挽输出,写低电平
Write_Max7219_byte(address);
Write_Max7219_byte(dat);
Dispaly_GPIO_LoadOn(); //GPIOD_PIN_1推挽输出,写高电平,锁存16位数据
}
/***********************初始化Max7219***************************/
void Init_Max7219(void)
{
Write_Max7219(SHUT_DOWN, 0x01); //正常操作模式
Write_Max7219(DISPLAY_TEST, 0x00); //正常显示
Write_Max7219(DECODE_MODE, 0x00); //不采用B译码模式
Write_Max7219(SCAN_LIMIT, 0x07); //设置显示的数据位数
Write_Max7219(INTENSITY, 0x0A); //设置显示的亮度
}
/**************************清除显示******************************/
void clear_7219(void)
{
unsigned char i; //变量i,用来选择数码管位选
for(i=8;i>0;i--) //i自减,选择完所有的8位
{ Write_Max7219(i,0x00); //对应位选的段全部清除显示
}
}
/*********************温度显示***************************************/
void Display_Temp(void)
{
Init_Max7219();//MAX7219初始化
clear_7219(); //MAX7219清除显示,免去干扰
Write_Max7219(0x01,0x4e);//显示摄氏度符号℃
Write_Max7219(0x02,0x63);
Write_Max7219(0x03,LEDcode[temp_5]);
Write_Max7219(0x04,LEDcode[temp_4]);
Write_Max7219(0x05,LEDcode[temp_2]|0x80);
Write_Max7219(0x06,LEDcode[temp_1]);
}
/************************湿度显示************************************/
void Display_Humi(void)
{
Write_Max7219(0x01,0x37);//显示湿度符号RH
Write_Max7219(0x02,0x77);
Write_Max7219(0x03,LEDcode[humi_5]);
Write_Max7219(0x04,LEDcode[humi_4]);
Write_Max7219(0x05,LEDcode[humi_2]|0x80);
Write_Max7219(0x06,LEDcode[humi_1]);
}
(5)延时函数程序代码:
#include"stm8s.h"
#include"Delay.h"
void Delay_ms(u32 nCount)
{
for(char i=0;i<10;i++)
{ while (nCount != 0)
{ nCount--;
}
}
}
/*微秒延时函数*/
void Delay_us(u32 nCount)
{ for(char i=0;i<5;i++)
{ while (nCount != 0)
{ nCount--;
}
}
}
作者: admin 时间: 2018-12-4 04:35
补全原理图或者详细说明一下电路连接即可获得100+黑币
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |