找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1087|回复: 2
打印 上一主题 下一主题
收起左侧

搞不懂这是啥情况了,来几个老哥帮忙瞅瞅,程序在下边,总是出现照片里的问题

[复制链接]
跳转到指定楼层
楼主
ID:850868 发表于 2021-4-2 18:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <reg52.h>
#include <intrins.h>
#include <math.h>
#ifndef __DELAY_H__
#define __DELAY_H__
#ifndef __DHT11_H__
#define __DHT11_H__
#ifndef __LCD1602_H__
#define __LCD1602_H__
#define uchar unsigned char
#define uint  unsigned int
#define LCD_PINDATA P0          //数据端口定义
sbit CS   = P1^2;
sbit Clk  = P1^1;
sbit DATI = P1^0;
sbit DATO = P1^0;                  //ADC0832串口
sbit RS  =  P1^4;                  //RS
sbit RW  =  P1^5;                  //RW
sbit E   =  P1^6;                  
sbit vled  = P1^7;
sbit DHT11_DQ1 = P3^7;          //DHT11数据传输口
sbit DHT11_DQ2 = P3^7;          //DHT11数据传输口
sbit BUZZER = P1^3;         //蜂鸣器驱动端口==P1^3
sbit Reduc  = P3^2;         //按键键输入端口==P3^2
sbit Add = P3^3;         //按键加输入端口==P3^3
sbit Mode = P3^4;         //按键加输入端口==P3^4
uchar Rx_buf[4],Rxnum=0;
uchar T1L=15,T1H=35,R1L=30,R1H=80;
uchar U8count,U8temp,U8FLAG,U8comdata;
extern void          _nop_     (void);
void InitUART(void)                         //串口的基本配置,配置他的波特率是9600
{
    TMOD = 0x20;
    SCON = 0x50;
    TH1 = 0xFD;
    TL1 = TH1;
    PCON = 0x00;
    EA = 1;
    ES = 1;
    TR1 = 1;
}
//------UART 发送一字节------//
void UART_send_byte(char dat)
{
        SBUF = dat;
        while (TI == 0);
        TI = 0;
}
//------UART 发送字符串------//
void UART_send_string(unsigned char *buf)
{
        while (*buf != '\0')
        {
                UART_send_byte(*buf++);
        }
}
void Delay1us(uint t)               
{
        while(t--)_nop_();
}
void Delay(uint T)
{
    uchar i;
    for(T;T>0;T--)
        for(i=200;i>0;i--);
}
//--#endif--//
//------DHT11模块------//
void Delay_10us(void)
{
        uchar i;
        i--;
        i--;
        i--;
        i--;
        i--;
        i--;
}
void COM(uchar n)
{   
        uchar i;
    for(i=0;i<8;i++)   
    {
            U8FLAG=2;  
            if(n){while((!DHT11_DQ1)&&U8FLAG++);}
                else {while((!DHT11_DQ2)&&U8FLAG++);}
            Delay_10us();
            Delay_10us();
              U8temp=0;
              if(n){if(DHT11_DQ1)U8temp=1;}
                else {if(DHT11_DQ2)U8temp=1;}
              U8FLAG=2;
                   if(n){while((DHT11_DQ1)&&U8FLAG++);}
                else {while((DHT11_DQ2)&&U8FLAG++);}        
            if(U8FLAG==1)break;
             U8comdata<<=1;
        U8comdata|=U8temp;        
        }
}
uchar Read_TRH(uchar ch,uchar n)
{
        uchar TRH_data=0;
        static uchar U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
        static uchar U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
    if(n)DHT11_DQ1=0;
        else DHT11_DQ2=0;
    Delay(24);
    if(n)DHT11_DQ1=1;
        else DHT11_DQ2=1;
    Delay_10us();
    Delay_10us();
    Delay_10us();
    Delay_10us();
    if(n)DHT11_DQ1=1;
        else DHT11_DQ2=1;
    if(!DHT11_DQ1 || !DHT11_DQ2)   
    {
            U8FLAG=2;
            if(n){while((!DHT11_DQ1)&&U8FLAG++);}
                else {while((!DHT11_DQ2)&&U8FLAG++);}
            U8FLAG=2;
            if(n){while((DHT11_DQ1)&&U8FLAG++);}
                else {while((DHT11_DQ2)&&U8FLAG++);}
            COM(n);U8RH_data_H_temp=U8comdata;
            COM(n);U8RH_data_L_temp=U8comdata;
            COM(n);U8T_data_H_temp=U8comdata;
            COM(n);U8T_data_L_temp=U8comdata;
            COM(n);U8checkdata_temp=U8comdata;
            if(n)DHT11_DQ1=1;
                else DHT11_DQ2=1;
            U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
            if(U8temp==U8checkdata_temp)
            {
                       U8RH_data_H=U8RH_data_H_temp;
                       U8RH_data_L=U8RH_data_L_temp;
                    U8T_data_H=U8T_data_H_temp;
                       U8T_data_L=U8T_data_L_temp;
                       U8checkdata=U8checkdata_temp;
            }
    }
        if(ch)TRH_data=U8RH_data_H;
        else TRH_data=U8T_data_H;
        return TRH_data;
}
//---#endif---//
//------ADC0832转换模块------//
unsigned char adc0832(unsigned char CH)
{
        unsigned char dat = 0x00;      //AD值
    unsigned char i,test,adval;
    adval = 0x00;
    test = 0x00;
    Clk = 0;       //初始化
    DATI = 1;
    _nop_();
    CS = 0;
    _nop_();
    Clk = 1;
   _nop_();
        if ( CH == 0x00 )      //通道选择
           {
            Clk = 0;
               DATI = 1;      //通道0的第一位
               _nop_();
              Clk = 1;
        _nop_();
        Clk = 0;
              DATI = 0;      //通道0的第二位
              _nop_();
              Clk = 1;
      _nop_();
    }        
    else
    {
       Clk = 0;
              DATI = 1;      //通道1的第一位
       _nop_();
       Clk = 1;
       _nop_();
              Clk = 0;
              DATI = 1;      //通道1的第二位
            _nop_();
             Clk = 1;
             _nop_();
    }
    Clk = 0;
    DATI = 1;
    for( i = 0;i < 8;i++ )      //读取前8位的值
    {
              _nop_();
               adval <<= 1;
               Clk = 1;
               _nop_();
               Clk = 0;
               if (DATO)
                  adval |= 0x01;
              else
                  adval |= 0x00;
    }
    for (i = 0; i < 8; i++)      //读取后8位的值
    {
        test >>= 1;
        if (DATO)
                   test |= 0x80;
        else
            test |= 0x00;
        _nop_();
        Clk = 1;
               _nop_();
        Clk = 0;
     }
     if (adval == test)      //比较前8位与后8位的值,如果不相同舍去。若一直出现显示为零,请将该行去掉
          dat = test;
      _nop_();
      CS = 1;        //释放ADC0832
      DATO = 1;
      Clk = 1;
      return dat;
}
uint read_data(uchar N)
{
        uint val=0;
        vled=0;
        Delay1us(20);
        val=adc0832(N);
        vled=1;
        Delay1us(400);       
        return val;
}
//------lcd1602------//
void WriteCOMDATA(uchar LCD_DATA,uchar N)
{
        Delay(5);
        E=1;
        RW=0;
        RS=N;
        LCD_PINDATA=LCD_DATA;
        E=0;
}
void LCD_Init(void)
{
    WriteCOMDATA(0x01,0);
        Delay(500);
        WriteCOMDATA(0x38,0);
        Delay(10);
        WriteCOMDATA(0x06,0);
        Delay(10);
        WriteCOMDATA(0x0C,0);
        Delay(10);
}
void WriteChar(uchar Row,uchar Col,uchar Num,uchar *pBuffer)
{
        uchar i;
        if(Row==1)Row=0x80+Col;
        else Row=0xC0+Col;
        WriteCOMDATA(Row,0);
        for(i=Num;i!=0;i--)
        {       
                WriteCOMDATA(*pBuffer,1);       
                pBuffer++;
        }
}
//----#endif------//
void main(void)
{
        double PM,pm1,pm2;
        int PMVAL=0,HPM=200,PM_count=0,pm1_count=0;
        uchar T1_data=0,R1_data=0,T2_data=0,R2_data=0;//温度、湿度变量
        uchar shezhi_flag=1,Mode_flag=1,n=1;//设置变量
        uchar bueezr_flag=0,count=0,buzzer_time=9;//蜂鸣器报警变量
        uint Mode_count=0;
        uchar disp[16]  ={"PM2.5:0000ug/m3 "};
        uchar disp1[16]= {"T :00C    RH:00%"};
        uchar Tx_Buf[15];
        InitUART();                        //初始化串口                                          
        LCD_Init();
    WriteChar(1,0,16,disp); //在第一行显示‘内容’
        WriteChar(2,0,16,disp1); //在第二行显示‘内容’
        while(1)
        {
               
                T1_data=Read_TRH(0,0);//温度
                disp1[3]=T1_data/10+0x30;//十位
                disp1[4]=T1_data%10+0x30;//个位

                R1_data=Read_TRH(1,0);//湿度
                disp1[13]=R1_data/10+0x30;//十位
                disp1[14]=R1_data%10+0x30;//个位
                                                                         
                pm1+=read_data(1);
                if(++PM_count>=20)
                {
                          PM_count=0;
                           pm1=pm1/20;
                        pm2+=pm1;
                        pm1=0;
                        if(++pm1_count>=5)
                        {
                                pm1_count=0;
                                PM=pm2/5;
                                PM=PM*50/255;
                                PM-=4;
                            PM/=5;
                                PM*=1000;
                                PMVAL=PM;
                                PMVAL+=235;        PMVAL=PMVAL/9;
                                if(PMVAL>=9999)PMVAL=9999;
                                WriteCOMDATA(0x86,0);
                                if(PMVAL<0)//PMVAL=0;
                                {WriteCOMDATA(0+0x30,1);PMVAL=abs(PMVAL);}
                                else WriteCOMDATA(PMVAL/1000+0x30,1);
                                WriteCOMDATA(PMVAL/100%10+0x30,1);
                                WriteCOMDATA(PMVAL/10%10+0x30,1);
                                WriteCOMDATA(PMVAL%10+0x30,1);
                                PM=pm1=pm2=0;
                        }
                }

                /*调用报警函数,温湿度是否在设定范围内*/
                //温度值与报警值比较
                if(T1_data<T1L)
                {
                        bueezr_flag=1;//报警标志位置1
                }
                else if(T1_data>T1H)
                {
                        bueezr_flag=1;//报警标志位置1
                }
                //湿度值与报警值比较
                if(R1_data<R1L)
                {
                        bueezr_flag=1;//报警标志位置1
                }
                else if(R1_data>R1H)
                {
                        bueezr_flag=1;//报警标志位置1
                }
                //PM值与报警值比较
                if(PMVAL>HPM)
                {       
                        bueezr_flag=1;
                }
                if(T1_data>T1L&&T1_data<T1H  && R1_data>R1L&&R1_data<R1H  &&  PMVAL<HPM)
                {
                        bueezr_flag=0;
                        BUZZER=1;
                }
                /*******蜂鸣器报警********/
                count++;if(count>buzzer_time*10)count=buzzer_time+1;
                if(count%buzzer_time==0 && bueezr_flag)
                {
                        BUZZER=~BUZZER;//蜂鸣器取反  发出声音提示
               
                }
               
                /*******Mode键设置报警参数********/
                if(Mode==0 && Mode_flag)
                {         
                        WriteCOMDATA(0x0F,0);//LCD显示光标
                        Delay(100);
                        if(Mode==0)
                        {
                                BUZZER=1;
                                bueezr_flag=0;

                                Mode_flag=0;
                                shezhi_flag=1;
                                n=1;
                                while(1)                  
                                {                                                                        
                                        switch(shezhi_flag)
                                        {
                                                case 1:
                                                if(n)
                                                {
                                                        n=0;
                                                        WriteChar(1,0,16,"T1L:00C  T1H:00C");//在第一行显示内容                                 
                                                        WriteChar(2,0,16,"R1L:00%  R1H:00%");//在第二行显示内容
                                                        WriteCOMDATA(0x8D,0);WriteCOMDATA(T1H/10+0x30,1);
                                                        WriteCOMDATA(0x8E,0);WriteCOMDATA(T1H%10+0x30,1);
                                                        WriteCOMDATA(0xC4,0);WriteCOMDATA(R1L/10+0x30,1);
                                                        WriteCOMDATA(0xC5,0);WriteCOMDATA(R1L%10+0x30,1);
                                                        WriteCOMDATA(0xCD,0);WriteCOMDATA(R1H/10+0x30,1);
                                                        WriteCOMDATA(0xCE,0);WriteCOMDATA(R1H%10+0x30,1);
                                                }
                                                        WriteCOMDATA(0x84,0);WriteCOMDATA(T1L/10+0x30,1);
                                                        WriteCOMDATA(0x85,0);WriteCOMDATA(T1L%10+0x30,1);
                                                        WriteCOMDATA(0x85,0);
                                                break;
                                                case 2:
                                                        WriteCOMDATA(0x8D,0);WriteCOMDATA(T1H/10+0x30,1);
                                                        WriteCOMDATA(0x8E,0);WriteCOMDATA(T1H%10+0x30,1);
                                                        WriteCOMDATA(0x8E,0);
                                                break;
                                                case 3:
                                                        WriteCOMDATA(0xC4,0);WriteCOMDATA(R1L/10+0x30,1);
                                                        WriteCOMDATA(0xC5,0);WriteCOMDATA(R1L%10+0x30,1);
                                                        WriteCOMDATA(0xC5,0);
                                                break;
                                                case 4:
                                                        WriteCOMDATA(0xCD,0);WriteCOMDATA(R1H/10+0x30,1);
                                                        WriteCOMDATA(0xCE,0);WriteCOMDATA(R1H%10+0x30,1);
                                                        WriteCOMDATA(0xCE,0);
                                                break;

                                                case 5:
                                                if(n)
                                                {
                                                        n=0;
                                                        WriteChar(1,0,16,"    PM2.5 SET   ");//在第一行显示内容                                 
                                                        WriteChar(2,0,16,"HPM2.5:    ug/m3");//在第二行显示内容                                                       
                                                }
                                                WriteCOMDATA(0xC7,0);
                                                WriteCOMDATA(HPM/1000+0x30,1);
                                                WriteCOMDATA(HPM/100%10+0x30,1);
                                                WriteCOMDATA(HPM/10%10+0x30,1);
                                                WriteCOMDATA(HPM%10+0x30,1);
                                                WriteCOMDATA(0xCA,0);
                                                break;                                               
                                        }
                                        Delay(200);
                                        //加
                                        if(Reduc==0)
                                        {
                                                Delay(200);
                                                //while(Reduc==0);
                                                switch(shezhi_flag)
                                                {         
                                                        case 1:T1L+=1;break;
                                                        case 2:T1H+=1;break;
                                                        case 3:R1L+=1;break;
                                                        case 4:R1H+=1;break;
                                                        case 5:HPM+=1;break;
                                                }               
                                        }
                                        //减
                                        if(Add==0)
                                        {
                                                Delay(200);
                                                //while(Add==0);
                                                switch(shezhi_flag)
                                                {
                                                        case 1:T1L-=1;break;
                                                        case 2:T1H-=1;break;
                                                        case 3:R1L-=1;break;
                                                        case 4:R1H-=1;break;
                                                        case 5:HPM-=1;break;
                                                }               
                                        }
                                        //短按切换设置项目   长按退出设置页面
                                        if(Mode==0)
                                        {
                                                Delay(300);
                                                while(Mode==0)
                                                {
                                                        Delay(300);
                                                        Mode_count++;
                                                        if(Mode_count>6)
                                                        {
                                                            WriteChar(1,0,16,"PM2.5:0000ug/m3 ");//在第一行显示内容
                                                                WriteCOMDATA(0x86,0);
                                                if(PMVAL<0)//PMVAL=0;
                                               {WriteCOMDATA(0+0x30,1);PMVAL=abs(PMVAL);}
                                               else WriteCOMDATA(PMVAL/1000+0x30,1);
                                               WriteCOMDATA(PMVAL/100%10+0x30,1);
                                               WriteCOMDATA(PMVAL/10%10+0x30,1);
                                               WriteCOMDATA(PMVAL%10+0x30,1);
                                                                WriteChar(2,0,16,disp1); //在第二行显示内容
                                                        }
                                                }
                                                if(Mode_count>6)
                                                {
                                                        Mode_count=0;shezhi_flag=0;
                                                        //当下限值大于上限值时,蜂鸣器鸣叫1S提示,参数设置有误
                                                        if(T1L>T1H || R1L>R1H)
                                                        {
                                                                BUZZER=0;Delay(1000);BUZZER=1;
                                                        }
                                                        //否则退出设置页面,返回主页面
                                                        else
                                                        {               

                                                                WriteCOMDATA(0x0C,0);//关闭LCD光标
                                                                Delay(10);
                                                                n=0;
                                                                break;                                               
                                                        }
                                                }
                                                else Mode_count=0;
                                                shezhi_flag++;
                                                if(shezhi_flag>5)shezhi_flag=1;
                                                if(shezhi_flag==1 || shezhi_flag==5)n=1;
                pm1+=read_data(1);
                if(++PM_count>=20)
                {
                          PM_count=0;
                           pm1=pm1/20;
                        pm2+=pm1;
                        pm1=0;
                        if(++pm1_count>=15)
                        {
                                pm1_count=0;
                                PM=pm2/15;
                                PM=PM*50/255;
                                PM-=4;
                            PM/=5;
                                PM*=1000;
                                PMVAL=PM;
                                PMVAL-=480;        PMVAL=PMVAL/3;
                                if(PMVAL>=9999)PMVAL=9999;
                                PM=pm1=pm2=0;
                        }
                }               
                                        }
                                }       
                        }
                }               

        }
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:52586 发表于 2021-4-2 19:33 | 只看该作者
出现照片里的问题? 没看到照片呀
回复

使用道具 举报

板凳
ID:850868 发表于 2021-4-6 16:14 | 只看该作者
聆烟雨 发表于 2021-4-2 19:33
出现照片里的问题? 没看到照片呀

已经解决了老哥,因为软件的问题
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表