基于51单片机的气象站proteus仿真

仿真图:

在这里插入图片描述

芯片/模块的特点:

ADC0832特点:

8位分辨率:ADC0832可以将模拟输入信号转换为8位数字输出。这意味着它可以将模拟信号划分为256个不同的离散电平,提供相对较低的分辨率。

双通道输入:ADC0832具有两个模拟输入通道,使其能够同时转换两个模拟信号。这对于需要同时测量多个信号的应用非常有用。

内部参考电压源:ADC0832提供了一个内部的参考电压源,它可以用作模拟输入信号的参考电压。这样可以简化外部电路设计,并提供更稳定和准确的参考电压。

串行输出:ADC0832通过串行接口(SPI或I2C)输出转换结果。这种串行输出形式使其与微控制器或其他数字设备的通信变得更加简单和方便。

低功耗:ADC0832具有较低的功耗特性,适合在低功耗应用中使用。

可编程时钟频率:ADC0832的转换速度可以通过控制输入时钟频率进行编程。这使得可以根据应用的需求调整转换速度,并平衡转换精度和速度。

内部自校准:ADC0832具有内部自校准电路,可以降低转换误差,并提供更准确的转换结果。

DHT11特点:

温湿度测量功能:DHT11能够实时测量环境中的温度和湿度,并提供数字输出。它可以给出相对湿度(20-90% RH)和温度(0-50摄氏度)的测量结果。

数字输出信号:DHT11通过单线数字信号输出温度和湿度数据。这使得读取和解析数据变得简单方便,适用于各种微控制器和单片机系统。

低成本:DHT11是一种经济实惠的温湿度传感器,适用于低成本应用。

简单的接口和使用:DHT11只需要连接一个数据线和供电线,使用起来非常简单。它采用了专用的通信协议,可以直接与各种数字系统集成。

快速响应时间:DHT11具有快速的响应时间,可以在1-2秒内测量出温度和湿度值。这使得它适用于需要快速获得环境参数的应用。

低功耗:DHT11在工作期间能够保持较低的功耗,这使得它可以在电池供电的应用中长时间工作而不消耗太多的能量。

可靠性:DHT11具有较好的可靠性和稳定性,适用于长期稳定监测环境温湿度的应用。

主程序:

#include "main.h"

/*******************变量定义*********************/
enum _MODE_DF_ dispMode;
bit modeFlag = AUTO; //模式标记
uchar motorFlag = 0; //标记当前控制状态,=0已关闭,=1过程中,=2已打开
bit motorDir = 1;
bit alarmFlag = 0; //报警标志
char motorCnt=0;

uchar setIndex = 0;
uint humidity; //湿度
uint temperature; //温度
uint sun;    //光强
uint rain;    //雨滴
uint windSpeed; //风速

//阈值设定
uint hmMin= 25;
uint hmMax= 50;

uint tempMin = 25;
uint tempMax = 40;

uint sunMin = 30;
uint sunMax = 60;

uint rainMin = 30;
uint rainMax = 60;

uint windSpeedMin = 5;
uint windSpeedMax = 20;


bit dispFlag = 0;

char dis[16];

/********************************************************
函数名称:void mian()
函数作用:主函数
参数说明:
********************************************************/
void main()
{
    modeFlag = MANUAL;

    Timer0_Init(); //初始化定时器0

    LCD_Init();   //初始化液晶
    DelayMs(200); //延时有助于稳定
    LCD_DispStr(4, 0, "Welcome!");
    LCD_Clear();  //清屏


    BYJ48 = ((BYJ48 & 0xF0) | REV[0]); //取数据
	ULN_DQ3 = BIT3; ULN_DQ2 = BIT2; ULN_DQ1 = BIT1; ULN_DQ0 = BIT0;


    while (1) //死循环
    {
        if (dispFlag == 1)
        {
            dispFlag = 0;

            if (dispMode == NORMAL)
            {
                DispNormal();
            }
        }

        if (modeFlag == AUTO)
        {
            
            if (motorFlag == 0 || motorFlag == 1) //已关闭或关闭状态中,优先处理光强浓度高的情况
            {
                if (sun > sunMax) //光强浓度过高,打开
                {
                    motorFlag = 1;
                    motorDir = 0;
                    alarmFlag = 1; //报警标志
                    modeFlag = MANUAL; //切换至手动模式
                }
                else
                {
                    if (IR_PIN == 0) //有
                    {

                    }
                    else
                    {
                        if (rain > rainMax) //大于设定雨滴阈值
                        {

                        }
                        else
                        {
                            if (humidity > hmMax || temperature > tempMax) //温湿度过高
                            {

                            }
                            else
                            {
                                if (windSpeed > windSpeedMax) //风速过高
                                {

                                }
                                else //只有这种情况打开
                                {
                                    motorFlag = 1; //打开
                                    motorDir = 0;
                                }
                            }
                        }
                    }
                }
            }
            else if (motorFlag == 2 || motorFlag == 1) //已打开或打开状态中
            {
                if (IR_PIN == 0) //
                {
                    motorFlag = 1;
                    motorDir = 1;
                    alarmFlag = 1; //报警标志
                    modeFlag = MANUAL; //切换至手动模式
                }
                else
                {
                    if (rain > rainMax) //大于设定雨滴阈值
                    {
                        motorFlag = 1;
                        motorDir = 1;
                    }
                    else
                    {
                        if (humidity > hmMax || temperature > tempMax) //温湿度过高
                        {
                            motorFlag = 1;
                            motorDir = 1;
                        }
                        else
                        {
                            if (windSpeed > windSpeedMax) //风速过高
                            {
                                motorFlag = 1;
                                motorDir = 1;
                            }
                        }
                    }
                }
            }
        }

        if (alarmFlag == 1)
        {
            BUZZER = ON;
        }
        else
        {
            BUZZER = OFF;
        }

        KeyProcess();
    }   
}

/*------------------------------------------------
                    定时器初始化子程序
------------------------------------------------*/
void Timer0_Init(void)
{
    TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
	TL0 = 0x00;		//设置定时初始值
	TH0 = 0xDC;		//设置定时初始值 10ms
    EA = 1;  //总中断打开
    ET0 = 1; //定时器中断打开
    TR0 = 1; //定时器开关打开
}
/*------------------------------------------------
                定时器中断子程序
------------------------------------------------*/
void Timer0_Interrupt(void) interrupt 1
{
    static unsigned int time10ms  = 0;
	TL0 = 0x00;		//设置定时初始值
	TH0 = 0xDC;		//设置定时初始值 10ms
    time10ms++;

    if (time10ms > 50)
    {
        dispFlag = 1; //显示标志
        time10ms = 0;
    }

    if (motorFlag == 1 && time10ms % 25 == 0)
    {
        if (motorDir == 1) //启动关闭
        {
            motorCnt++;
            if (motorCnt >= 8)
            {
                motorCnt = 0;
            }
            BYJ48 = ((BYJ48 & 0xF0) | REV[motorCnt % 8]); //取数据
			ULN_DQ3 = BIT3; ULN_DQ2 = BIT2; ULN_DQ1 = BIT1; ULN_DQ0 = BIT0;
            if (LIMIT_SWITCH1 == 0) //触碰到限位开关1
            {
                motorFlag = 0; //已关闭
            }
        }
        else //启动打开
        {
            if (motorCnt <= 0)
            {
                motorCnt = 8;
            }
            motorCnt--;
            BYJ48 = ((BYJ48 & 0xF0) | REV[motorCnt % 8]); //取数据
			ULN_DQ3 = BIT3; ULN_DQ2 = BIT2; ULN_DQ1 = BIT1; ULN_DQ0 = BIT0;
            if (LIMIT_SWITCH2 == 0) //触碰到限位开关2
            {
                motorFlag = 2; //已打开
            }
        }
    }
}

void DispNormal(void)
{
    unsigned char sunBuf = 0;

    DHT11_0_ReadData();
    humidity = U8RH_data_H; //读取湿度
    temperature = U8T_data_H; //读取温度
    sprintf(dis, "H:%2d%% T:%2d", humidity, temperature);
    LCD_DispStr(0, 0, dis);
    LCD_DispOneChar(10, 0, 0xdf);
    LCD_DispOneChar(11, 0, 'C');
    LCD_DispOneChar(12, 0, ' ');

//    if (modeFlag == AUTO)
//    {
//        LCD_DispOneChar(13, 0, 'Z');
//    }
//    else
//    {
//        LCD_DispOneChar(13, 0, 'S');
//    }

//    if (motorFlag == 0)
//    {
//        LCD_DispOneChar(14, 0, 'G');
//    }
//    else if (motorFlag == 1)
//    {
//        LCD_DispOneChar(14, 0, 'Y');
//    }
//    else
//    {
//        LCD_DispOneChar(14, 0, 'K');
//    }
//    
    sunBuf = ReadADC(AIN1_GND);
    if (sunBuf <= 29)
    {
        sunBuf = 29;
    }
    sun = (100 * (sunBuf-29)) / 227; //光强
    
    rain = 100 - 100 * ReadADC(AIN0_GND) / 255; //读取雨滴百分比
    windSpeed = 6 * 5 * ReadADC_1(AIN1_GND) / 255; //读取风速,6m/s/V
    sprintf(dis, "S:%3d R:%3d W:%2d", sun, rain, windSpeed);
    LCD_DispStr(0, 1, dis);

}

///************************* 设置湿度阈值 *************************/
//void DispSetHm(unsigned char setIndex)
//{

//    LCD_DispStr(0, 0, "  Set Humidity  ");
//    sprintf(dis, "  H:%2d%% L:%2d%%  ", hmMax, hmMin);
//    LCD_DispStr(0, 1, dis);
//    
//    switch (setIndex)
//    {
//        case 1: LCD_SetCursor(5, 1, 1); break;
//        case 2: LCD_SetCursor(11, 1, 1); break;
//        default:;
//    } 
//}

///************************* 设置温度阈值 *************************/
//void DispSetTemp(unsigned char setIndex)
//{

//    LCD_DispStr(0, 0, "Set Temperature ");
//    sprintf(dis, "  H:%3d L:%3d  ", tempMax, tempMin);
//    LCD_DispStr(0, 1, dis);
//    
//    switch (setIndex)
//    {
//        case 1: LCD_SetCursor(6, 1, 1); break;
//        case 2: LCD_SetCursor(12, 1, 1); break;
//        default:;
//    } 
//}

///************************* 设置光强阈值 *************************/
//void DispSetsun(unsigned char setIndex)
//{

//    LCD_DispStr(0, 0, "  Set sunLimit  ");
//    sprintf(dis, "  H:%2d%% L:%2d%%  ", sunMax, sunMin);
//    LCD_DispStr(0, 1, dis);
//    
//    switch (setIndex)
//    {
//        case 1: LCD_SetCursor(5, 1, 1); break;
//        case 2: LCD_SetCursor(11, 1, 1); break;
//        default:;
//    } 
//}

///************************* 设置雨滴阈值 *************************/
//void DispSetRain(unsigned char setIndex)
//{

//    LCD_DispStr(0, 0, "  Set RainLimit ");
//    sprintf(dis, "  H:%2d%% L:%2d%%  ", rainMax, rainMin);
//    LCD_DispStr(0, 1, dis);
//    
//    switch (setIndex)
//    {
//        case 1: LCD_SetCursor(5, 1, 1); break;
//        case 2: LCD_SetCursor(11, 1, 1); break;
//        default:;
//    } 
//}

///************************* 设置风速阈值 *************************/
//void DispSetWindSpeed(unsigned char setIndex)
//{

//    LCD_DispStr(0, 0, " Set SpeedLimit ");
//    sprintf(dis, "  H:%2d  L:%2d   ", windSpeedMax, windSpeedMin);
//    LCD_DispStr(0, 1, dis);
//    
//    switch (setIndex)
//    {
//        case 1: LCD_SetCursor(5, 1, 1); break;
//        case 2: LCD_SetCursor(11, 1, 1); break;
//        default:;
//    } 
//}

设计文件:
链接:https://pan.baidu.com/s/1wAuBNGpsOoTaXv_qjHVgKQ?pwd=dt3d

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值