之前一直找關于STM32的仿真找了幾個ADC的都不能用,大概率是因為是時鐘的問題然后自己調試了下目前很穩定還加了DHT11加OLED
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.gif (121.71 KB, 下載次數: 29)
下載附件
2022-5-16 04:44 上傳
無標題.png (340.09 KB, 下載次數: 25)
下載附件
2022-5-16 01:16 上傳
STM32單片機源程序如下:
#include "stm32f10x.h"
#include "LQ12864.h"
#include "adc.h"
#include "dth11.h"
#include "stdio.h"
#include "led.h"
#include "key.h"
int main(void)
{
u8 temp = 0, hum = 0;//溫度濕度
u8 motor_sta=0; //電機運行狀態
u8 key; //按鍵值
u16 ADC=0;
u16 ADC_flag=500;
u8 temp_flag=20,hum_flag=60;//閾值
u8 buf[100] = { 0 };
u8 sta_buf[20];
delay_init() ;
LCD_Init() ;
Adc_Init();
DHT11_Init();
Dc_Motor_init();
KEY_Init();//IO初始化
while(1)
{
DHT11_Read_Data(&temp, &hum);//溫濕度讀取
sprintf((char *)buf, "temp:%d----hum:%d", temp, hum);//整數轉字符串
LCD_P6x8Str(0, 0, buf);//字符顯示
ADC=Get_Adc();
sprintf((char *)buf, "adc:%d", ADC);//整數轉字符串
LCD_P6x8Str(0, 1, buf);//字符顯示
//閾值判斷控制
if(temp>temp_flag) Dc_Motor_ON();//開啟電機
else if(temp<temp_flag) Dc_Motor_OFF();//關閉電機
if(ADC>ADC_flag) LCD_P6x8Str(80, 3, "ADC:1");//字符顯示
else if(ADC<ADC_flag) LCD_P6x8Str(80, 3, "ADC:0");//字符顯示
//狀態
motor_sta =GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_5);
sprintf((char *)sta_buf, "MOTOR:%d", motor_sta);//整數轉字符串
LCD_P6x8Str(0, 3, sta_buf);//字符顯示
//溫度報警設置
key=KEY_Scan(0);
switch(key)
{
case 1: temp_flag++;break;//字符顯示//整數轉字符串break;
case 2: temp_flag--;break;
case 3:ADC_flag++;break;
case 4:ADC_flag--;break;
}
sprintf((char *)sta_buf, "TEMPFLAG:%d", temp_flag);LCD_P6x8Str(0, 5, sta_buf);
sprintf((char *)sta_buf, "ADC FLAG:%d", ADC_flag);LCD_P6x8Str(0, 6, sta_buf);
}
}
Keil5代碼與Proteus8.8仿真下載,求大神指導如何修改錯誤:
_STM32 DTH11.7z
(2.15 MB, 下載次數: 174)
2022-5-16 04:45 上傳
點擊文件名下載附件
干貨
|