proteus仿真-基于stc89c52的智能风扇,手动(按键)控制、温控(DS18B20/DHT11)、语音控制。L9110/TB6612驱动DC电机

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
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值