proteus仿真
本篇文章只是电路参考、代码思路参考,不提供全部代码。
LCD1602显示,按键模拟,电机有三挡PWM0-50-100,ds18b20时间,语音控制模块集成芯片,网上有现成代码可以参考。
LCD1062显示部分
显示如图1
图1
按键部分
key1:手动模式
key2:温控模式
key3:语音控制(没加上来)
如图2
图2
电机驱动
TB6612如图3,AIN1 AIN2引脚为控制正反,本实验不做要求,L9110如图4
图3
图4
温控
DS18B20如图5,DHT11如图6
图5
图6
时间
DS1302如图7
图7
代码部分
主函数代码,仅供参考
#include <REGX52.H>
#include "Delay.h"
#include "LCD1602.h"
#include "18B20.h"
#include "stdio.h"
#include "Timer0.h"
#include "ds1302.h"
sbit Motor = P3^2;
unsigned char Counter, Compare; // 计数值和比较值,用于输出PWM
unsigned char Speed = 0; // 风扇等级
unsigned char Mode; // 模式选择变量,0表示手动模式,1表示温控模式,2表示语音识别模式
unsigned char Mode1_Flag;
unsigned char tem;
unsigned char set_time = 0;
unsigned char KeyNum ;
void main() {
LCD_Init(); // 初始化LCD1602
DS1302_Init();
Timer0_Init();
Mode = 0; // 初始模式为手动模式
LCD_ShowString(1,1," - - ");//静态字符初始化显示
LCD_ShowString(1,7," : : ");
DS1302_SetTime();//设置时间
while(1) {
DS1302_ReadTime();//读取时间
LCD_ShowNum(1,1,DS1302_Time[0],2);//显示年
LCD_ShowNum(1,4,DS1302_Time[1],2);//显示月
LCD_ShowNum(1,7,DS1302_Time[2],2);//显示日
LCD_ShowNum(1,10,DS1302_Time[3],2);//显示时
LCD_ShowNum(1,13,DS1302_Time[4],2);//显示分
LCD_ShowNum(1,15,DS1302_Time[5],2);//显示秒
KeyNum = Key(); // 获取按键键码值
// 根据按键设置模式
if (KeyNum == 1) {
Mode = 0; // 切换到手动模式
Compare = 0;
Mode1_Flag = 1;
} else if (KeyNum == 2) {
Mode = 1; // 切换到温控模式
Compare = 0;
} else if (KeyNum == 3) {
Mode = 2; // 切换到语音识别模式
Compare = 0;
Speed = 0;
}
// 根据模式选择风扇控制方式
switch(Mode) {
case 0: // 手动模式
if (KeyNum == 1) {
Mode1_Flag = 1;
Speed++; // 切换风扇等级
if(Speed > 2) {
Speed = 0;
Compare = 0;
}
switch (Speed) {
case 0:
Compare = 0; // 停止风扇
break;
case 1:
Compare = 50; // 设置不同速度
break;
case 2:
Compare = 100;
break;
}
}
break;
case 1: // 温控模式
// 根据温度设置风扇等级
if (tem > +30) { // 如果温度大于30摄氏度
Speed = 2; // 设置最高速度
} else if (tem> +25) { // 如果温度在25到30摄氏度之间
Speed = 1; // 设置中等速度
} else { // 如果温度低于25摄氏度
Speed = 0; // 设置最低速度
}
switch (Speed) {
case 0:
Compare = 0;
break;
case 1:
Compare = 50;
break;
case 2:
Compare = 100;
break;
}
break;
case 2:
Compare = 0;
// 语音识别模式
break;
}
// 更新 LCD 显示
switch(Mode) {
case 0:
LCD_ShowString(2, 1,"Mode1");
break;
case 1:
LCD_ShowString(2, 1, "Mode2");
break;
case 2:
LCD_ShowString(2, 1, "Mode3");
break;
}
LCD_ShowString(2, 7, "Speed: ");
LCD_ShowNum(2, 14, Speed, 1);
//LCD_ShowString(2, 10, "Level: ");
//LCD_ShowNum(2, 10, Compare, 3);
}
}
void Timer0_Routine() interrupt 1 {
TL0 = 0x9C; // 设置定时初值
TH0 = 0xFF; // 设置定时初值
Counter++;
Counter %= 100; // 计数值变化范围限制在0~99
// 温湿度读取放在定时器中断中
if (Counter == 0) { // 每隔一段时间读取一次温湿度数据
tem = Read_DS18B20()/100; // 获取 DS18B20 传感器数据
}
if (Counter < Compare) { // 计数值小于比较值
Motor = 1; // 输出1
} else { // 计数值大于比较值
Motor = 0; // 输出0
}
}