电 气 学 院 创 新 设 计 说 明 书
第四章·软件程序设计
4.1 软件设计实现的功能
系统单片机代码采用C语言编写,以IAR Embedded Workbench为开发环
100境。系统软件实现功能: 80(1)通过DHT11温湿度传感器采集温湿度数据 60东部(2)通过MAX7219显示温湿度数据 40(3)比较检测到的温湿度数值与报警值,发现超过上限蜂鸣器立即报警 北部20(4)通过独立按键中断切换显示温湿度 04.2 软件程序主流程图 第一季度第三季度西部开 始
启动DHT11
时钟HIS 定时器TIM2 按键 初始化
否 DHT11是否有响应? 从DHT11取数据 是
初始化7219
显示温度数据 是 蜂鸣器报警 数据是否超出上限? 否 关闭蜂鸣器 否 按键按下? 是
显示湿度数据 11 / 22
电 气 学 院 创 新 设 计 说 明 书
定时器中断服务子程序流程图
计时2秒时间到
转到中断服务
函数
响应DHT11
向DHT11取数据更新数据
4.3程序代码:
(1)函数声明、变量定义代码: Wsdcl_main.h文件: #include\
#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\
#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)//拉高电平
12 / 22
电 气 学 院 创 新 设 计 说 明 书
#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\
#include\/*定义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\
#include\
/************************************************************/ void Delay_ms(u32 ms); void Delay_us(u32 us); (2)主函数代码: Wsdcl_main.c文件: #include\
#include\#include\#include\#include\
13 / 22
电 气 学 院 创 新 设 计 说 明 书
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]; temp_4=Table_Data[3]/10; temp_5=Table_Data[3]; /*取湿度数据各个位数值*/ humi_1=Table_Data[0]/10; humi_2=Table_Data[0]; humi_4=Table_Data[1]/10; humi_5=Table_Data[1];
/*按键切换显示温湿度*/ if(_Turn>0)
Display_Temp(); else
Display_Humi(); } } }
/*蜂鸣器报警函数*/ void Alarm_Beep() {
GPIO_Init(GPIOD, GPIO_PIN_4, GPIO_MODE_OUT_PP_LOW_FAST);
14 / 22
电 气 学 院 创 新 设 计 说 明 书
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;
15 / 22