之前一直找关于STM32的仿真找了几个ADC的都不能用,大概率是因为是时钟的问题然后自己调试了下目前很稳定还加了DHT11加OLED
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
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)
|