电 气 学 院 创 新 设 计 说 明 书
}
#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\
#include\#include\#include\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--) {
16 / 22
电 气 学 院 创 新 设 计 说 明 书
count_1=2;
while((!DHT11_DQ_IN)&&count_1++); //等待传送数据开始50us低电平结束并记录所用时间count_1 count_2=2;
while((DHT11_DQ_IN)&&count_2++) ;//等待\或\高电平结束并记录所用
时间count_2
if(count_2>(count_1)) //比较count_2与count_1来判断输入是\还是\ { 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\
#include\#include\
17 / 22
电 气 学 院 创 新 设 计 说 明 书
#include\
/************************************************************/ 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)
18 / 22
电 气 学 院 创 新 设 计 说 明 书
{
Dispaly_GPIO_INPUT();//GPIOD_PIN_0推挽输出
GPIO_WriteLow(GPIO_PORT,GPIO_PIN_0);//输入数据为\ } else {
Dispaly_GPIO_INPUT();//GPIOD_PIN_0推挽输出
GPIO_WriteHigh(GPIO_PORT,GPIO_PIN_0);//输入数据为\ }
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); //对应位选的段全部清除显示 } }
19 / 22
电 气 学 院 创 新 设 计 说 明 书
/*********************温度显示***************************************/ 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\#include\
void Delay_ms(u32 nCount) {
for(char i=0;i<10;i++) { while (nCount != 0) { nCount--; } } }
/*微秒延时函数*/
void Delay_us(u32 nCount)
20 / 22