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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 10373|回復: 15
打印 上一主題 下一主題
收起左側

基于STM32的室內環境監控系統Proteus仿真程序設計

  [復制鏈接]
跳轉到指定樓層
樓主
我的嵌入式學習作品,算是學習STM32后的總結,如有可改進的地方,歡迎討論。
1. 功能描述
開機默認溫度設定值為25°C,設定濕度設定值為35%LCD界面顯示測得溫濕度如下。當溫濕度傳感器讀到溫度或濕度有一個值大于設定值時,則風機打開,在溫度大于36度或濕度大于80%時,則風機100%全開,當溫度和濕度都小于設定值時,則風機關閉,當溫度在溫度設定值到36°之間,濕度在濕度設定值到80%之間,則風機按線性比例以1%~99%占空比輸出。另外,根據光照強度,當光敏傳感器值小于0.7 v則打開繼電器,反之則關閉繼電器。
  
各按鍵功能如下:
·       mode按鍵:模式設定,按一下進入設定模式,再按一下進入正常運行模式,設定模式下LCD顯示如下圖:

·       select按鍵:選擇鍵,在設定模式按一下select按鍵,選中設置濕度(H),再按一下選中設置溫度(T),若選中H,則H閃爍,若選擇T,則T閃爍。在正常工作模式下,此按鍵沒作用。
·       +按鍵:在設置模式下,如果選中H狀態下,則每按下+按鍵,濕度設置值+1,同樣,選中T狀態,則溫度設定值+1。在正常工作模式下,此按鍵沒作用。
·       -按鍵:作用和按鍵3類似,選中H狀態下,則每按下-鍵,濕度是定值-1,選中T狀態下,則每按下-鍵,溫度設定值-1。在正常工作模式下,此按鍵沒作用。
·       enter鍵:為確定鍵,在設定模式下,按下enter鍵,則退出設定模式,進入正常工作模式,按照新的設定值進行工作。在正常工作模式下,此按鍵沒作用。

2.Proteus仿真原理圖如下:

3.部分源碼如下:代碼比較簡單,所以注釋比較少)
光照AD采集
voidget_ADValue(void)
{
              HAL_ADC_Start(&hadc1);
              HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,GPIO_PIN_RESET);
              HAL_Delay(100);
              if(HAL_ADC_PollForConversion(&hadc1,50)== HAL_OK)
              {
                     adc_value =HAL_ADC_GetValue(&hadc1);
                     voltage =adc_value*330/4096;

//                  printf("光敏AD值 :%d\n\r",adc_value);
//                  printf("光敏電壓 :%d.%d%dV\n\r",voltage/100,voltage/10,voltage%10);
              }
              HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,GPIO_PIN_SET);
              HAL_ADC_Stop(&hadc1);
              if(voltage<70)//控制繼電器開關
              {
                     HAL_GPIO_WritePin(LED4_GPIO_Port,LED4_Pin,GPIO_PIN_RESET);
              }
              else
              {
                     HAL_GPIO_WritePin(LED4_GPIO_Port,LED4_Pin,GPIO_PIN_SET);
              }
              HAL_Delay(500);

}
按鍵掃描系統
uint8_tkeyscan(uint8_t kk)
{
       static uint8_t keyflag = 1;
       if(kk) keyflag = 1;
       if(keyflag &&(KEY0==0||KEY1==0||KEY2==0||KEY3==0||KEY4==0))
       {
              HAL_Delay(5);
              keyflag = 0;
              if(KEY0==0)     return 1;
              else if(KEY1==0) return 2;
              else if(KEY2==0) return 3;
              else if(KEY3==0) return 4;
              else if(KEY4==0) return 5;
       }
       elseif(KEY0==1&&KEY1==1&&KEY2==1&&KEY3==1&&KEY4==1)keyflag = 1;
       return 0;
}

voidkey_system(void)
{
       key_num=keyscan(0);
       switch(key_num)
       {
              case 1:
                     mode1++;//模式標志位
                     flag=1;//設定模式下更新屏幕顯示的標志位 可減少閃屏
                     LCD1602_WriteCmd(0x01);//清屏
                     if(mode1>1)
                     {
                            mode1 = 0;
                            menu = 0;
                            LCD1602_WriteCmd(0x0c);//關光標關閃爍
                     }
                     break;
              case 2:
                     if(mode1==0) break;
                     else
                     {
                            flag=1;
                            menu++;//設置對象選擇標志位
                            if(menu>1) menu =0;
                     }
                     break;
              case 3:
                     if(mode1==0) break;
                     flag=1;
                     if(menu==0) humi++;
                     else              temp++;
                     break;
              case 4:
                     if(mode1==0) break;
                     flag=1;
                     if(menu==0) humi--;
                     else              temp--;
                     break;
              case 5:
                     if(mode1==0) break;
                     else
                     {
                            mode1 = 0;
                            menu = 0;
                            LCD1602_WriteCmd(0x01);
                            LCD1602_WriteCmd(0x0c);
                     }
                     break;
              default: break;
       }
}
風機PWM調速控制
uint8_tMAX(uint8_t x,uint8_t y)//較大值判斷
{
       uint8_t max;
       if(x>y) max=x;
       else max=y;
       return max;
}

uint16_tFAN_control(void)
{
       uint16_t pwm;
       if(temperature<temp &&humidity<humi)  pwm=0;
       if(temperature>36 &&temperature>temp) pwm=100;
       if(humidity>80 &&humidity>humi)       pwm=100;
       if(temperature>=temp ||humidity>=humi)
       {
              if(humidity<=80 &&humidity>=humi)
              {
                     num1=(uint8_t)humidity-humi;
                     num2=80-humi;
                     pwmh=num1*100/num2;
              }
              if(temperature<=36 &&temperature>=temp)
              {
                     num1=(uint8_t)temperature-temp;
                     num2=36-temp;
                     pwmh=num1*100/num2;
              }
              pwm=MAX(pwmh,pwmt);
       }
       if(temperature>36 &&temperature>temp) pwm=100;
       if(humidity>80 &&humidity>humi)       pwm=100;
       return pwm;
}
主程序
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
LCD1602_Init();
LCD1602_ShowStr(0,0,"INT...",6);
MX_TIM4_Init();
MX_ADC1_Init();
MX_USART1_UART_Init();
HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_3);
HAL_Delay(100);  while (1)
  {
              DHT11_Show_Data();//調用溫濕度檢測子程序
              get_ADValue();//調用光強AD值子程序
              do//這里用do循環先執行,再判斷模式標志位值,為1時只執行循環體內程序,可減少軟件仿真時卡頓,未測試單片機運行
              {
                     key_system();
                     if(mode1==0)
                     {
                            LCD1602_ShowStr(0,0,"H  T   FAN    ",15);
                            LCD1602_ShowChar(0,1,(uint8_t)humidity/10+0x30);
                            LCD1602_ShowChar(1,1,(uint8_t)humidity%10+0x30);
                            LCD1602_ShowChar(4,1,(uint8_t)temperature/10+0x30);
                            LCD1602_ShowChar(5,1,(uint8_t)temperature%10+0x30);
                            if(pwm_value==0) LCD1602_ShowStr(8,1,"OFF",3);
                            else                      LCD1602_ShowStr(8,1,"ON",3);
                     }
                     else
                     {
                            if(menu==0&&flag==1)//標志位為1時更新顯示
                            {
                                   LCD1602_ShowStr(0,0,"SET  H   T",11);
                                   LCD1602_ShowChar(6,1,humi/10+0x30);
                                   LCD1602_ShowChar(7,1,humi%10+0x30);
                                   LCD1602_ShowChar(10,1,temp/10+0x30);
                                   LCD1602_ShowChar(11,1,temp%10+0x30);
                                   write_guanbiao(6,0,1);
                                   flag=0;//標志位置0
                                   HAL_Delay(200);
                            }
                            else if(flag==1)
                            {
                                   LCD1602_ShowStr(0,0,"SET  H   T",11);
                                   LCD1602_ShowChar(6,1,humi/10+0x30);
                                   LCD1602_ShowChar(7,1,humi%10+0x30);
                                   LCD1602_ShowChar(10,1,temp/10+0x30);
                                   LCD1602_ShowChar(11,1,temp%10+0x30);
                                   write_guanbiao(10,0,1);
                                   flag=0;
                                   HAL_Delay(200);
                            }
                     }
              }while(mode1==1);
              pwm_value=FAN_control();
              __HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_3,pwm_value);
              HAL_Delay(10);
  }
}


仿真原理圖及源工程文件下載:
程序+仿真.7z (517.58 KB, 下載次數: 429)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏18 分享淘帖 頂3 踩
回復

使用道具 舉報

沙發
ID:785236 發表于 2020-6-20 22:33 | 只看該作者
想問問我怎么打開就是各個數值都是0
回復

使用道具 舉報

板凳
ID:572551 發表于 2020-6-21 11:56 來自手機 | 只看該作者
本帖最后由 昔影 于 2020-6-21 18:05 編輯
啥也不會羅小白 發表于 2020-6-20 22:33
想問問我怎么打開就是各個數值都是0

可能是Proteus仿真的問題
回復

使用道具 舉報

地板
ID:572551 發表于 2020-6-21 14:51 | 只看該作者
啥也不會羅小白 發表于 2020-6-20 22:33
想問問我怎么打開就是各個數值都是0

我這邊仿真沒問題,如果你也用的仿真,可能是因為DHT11時序未完成就執行顯示代碼了,可以試試在do循環前加個短的延時
回復

使用道具 舉報

5#
ID:725124 發表于 2020-6-21 18:44 | 只看該作者
請問有硬件原理圖嗎
回復

使用道具 舉報

6#
ID:572551 發表于 2020-6-21 22:47 | 只看該作者
奈克y 發表于 2020-6-21 18:44
請問有硬件原理圖嗎

還沒有用單片機運行,根據仿真原理圖做應該不難,我這有個Arduino板子準備試試
回復

使用道具 舉報

7#
ID:634955 發表于 2020-6-22 10:25 | 只看該作者
可以,感覺和煙霧報警的差不多,沒有本質區別。
回復

使用道具 舉報

8#
ID:790463 發表于 2020-6-27 15:12 | 只看該作者
請問為什么我運行一段時間之后就自動關閉工程了?
回復

使用道具 舉報

9#
ID:572551 發表于 2020-6-28 17:39 來自手機 | 只看該作者
WSP666 發表于 2020-6-27 15:12
請問為什么我運行一段時間之后就自動關閉工程了?

應該是仿真軟件的問題,proteus對stm32F4適配支持不太好
回復

使用道具 舉報

10#
ID:904379 發表于 2021-4-21 02:12 來自手機 | 只看該作者
能把光照改成PM2.5嗎
回復

使用道具 舉報

11#
ID:574661 發表于 2021-5-17 20:56 | 只看該作者
proteus小白,請問debug.elf not found是什么問題呢?
回復

使用道具 舉報

12#
ID:574661 發表于 2021-5-17 20:58 | 只看該作者
請問debug.elf not found是什么問題呢
回復

使用道具 舉報

13#
ID:572551 發表于 2021-6-15 07:40 來自手機 | 只看該作者
he1415926 發表于 2021-5-17 20:58
請問debug.elf not found是什么問題呢

試一下用hex文件導入
回復

使用道具 舉報

14#
ID:440028 發表于 2021-12-3 15:56 | 只看該作者
改成煙霧報警系統是不是要加延遲
回復

使用道具 舉報

15#
ID:1023206 發表于 2022-5-16 08:50 | 只看該作者
兩個hex文件都怎么用啊
回復

使用道具 舉報

16#
ID:228452 發表于 2022-5-16 20:52 | 只看該作者


use project666.hex
or
pwm_key1.hex
cant use both in same time..


回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日本不卡一区二区三区在线观看 | 中文在线а√在线8 | 日韩高清中文字幕 | 久久精品av麻豆的观看方式 | 欧美一级欧美三级在线观看 | 天天干天天草 | 亚洲精品电影网在线观看 | 久久久激情 | 欧美一级片在线看 | 欧洲亚洲精品久久久久 | 成人午夜精品 | 最新国产福利在线 | 求个av网址| 美国一级片在线观看 | 久久久久久99 | 国产精品一区二区av | 日韩精品免费 | 久久久久久91香蕉国产 | 韩国av网站在线观看 | 久久国产精品免费一区二区三区 | 色偷偷888欧美精品久久久 | 青娱乐av | 九九久久国产精品 | 免费在线观看毛片 | 激情 婷婷 | 国产精品成人一区 | 欧美精品在欧美一区二区少妇 | 91国产在线播放 | 国产一二三区在线 | 91麻豆精品国产91久久久久久久久 | 一区二区三区四区免费视频 | 久久久久av | 日韩精品免费在线观看 | www狠狠干 | 激情五月婷婷在线 | 精品日韩| 狠狠躁夜夜躁人人爽天天高潮 | 毛片站| 中文字幕在线观看一区二区 | 91精品国产91久久久久久 | 91高清视频在线观看 |