程序代碼: (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--; } } } |