久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3494|回復: 1
收起左側

基于stm8單片機的DHT11溫濕度測量儀程序

[復制鏈接]
ID:438219 發表于 2018-12-3 11:00 | 顯示全部樓層 |閱讀模式
程序代碼
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--;
    }
  }
}
回復

使用道具 舉報

ID:1 發表于 2018-12-4 04:35 | 顯示全部樓層
補全原理圖或者詳細說明一下電路連接即可獲得100+黑幣
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91日日| 成人影院在线 | 91久久久久 | 日韩在线欧美 | 国产精品美女久久久久久不卡 | 91精品国产乱码久久久 | 国产精品123区 | 国产精品一区二区久久精品爱微奶 | 黄页网址在线观看 | 国产传媒毛片精品视频第一次 | 91色综合| 亚洲综合99| 免费久 | 影音先锋中文字幕在线观看 | 91精品国产一区二区三区 | 国产精品毛片av | 99热在线免费 | 美女一级毛片 | 999久久久久久久久6666 | 性生生活大片免费看视频 | 久久久久9999亚洲精品 | 91在线视频免费观看 | 天堂网中文| 国产人成精品一区二区三 | 日韩精品在线网站 | 巨大荫蒂视频欧美另类大 | 黄色在线观看网站 | 天天综合网天天综合色 | 日韩在线一区二区三区 | 黄色国产在线播放 | 羞羞视频网站在线观看 | 亚洲第一色站 | 91精品国产色综合久久 | 涩涩视频网站在线观看 | 四虎影院新网址 | 国产乡下妇女做爰 | 99精品在线 | 亚洲乱码一区二区三区在线观看 | 日韩在线视频免费观看 | 国产区一区二区三区 | a毛片|