谁用这板子写过检测pm2.5的代码

2019-08-14 19:39发布

求大神指点,我有一个别人用51写的程序,但不会转换到stm代码中。#include <reg52.h>
#define        uchar        unsigned        char
#define        uint        unsigned        int
sbit        rs=P2^5;                    //LCD的RS,WR,E的端口
sbit        wr=P2^6;
sbit        e=P2^7;                  
sbit         key_yi=P3^5;                 //报警值整定键端口
sbit         key_er=P3^6;               
sbit    key_san=P3^7;
sbit        GP2Y_LED=P1^3;                 //传感器驱动端口
sbit        beep=P1^4;                         //蜂鸣器驱动端口
uchar yi,er,san;                         //变量定义
uint b,time_num1,set_count,PM_dat=0;
/*****************************************************
    功能:将模拟信号转换成数字信号
***************************************************/
sbit ADC0832_CS=P1^2;
sbit ADC0832_CLK=P1^0;
sbit ADC0832_DIO=P1^1;
void        write_com(uchar        com);
void        write_data(uchar dat);
unsigned int  A_D(bit flag)
{
   unsigned char i;
   unsigned char dat;
   ADC0832_CS=1;   //一个转换周期开始
  ADC0832_CLK=0;  //为第一个脉冲作准备
   ADC0832_CS=0;  //CS置0,片选有效

   ADC0832_DIO=1;    //DIO置1,规定的起始信号  
  ADC0832_CLK=1;   //第一个脉冲
   ADC0832_CLK=0;   //第一个脉冲的下降沿,此前DIO必须是高电平
   ADC0832_DIO=1;   //DIO置1, 通道选择信号  
   ADC0832_CLK=1;   //第二个脉冲,第2、3个脉冲下沉之前,DI必须跟别输入两位数据用于选择通道,这里选通道CH0
   ADC0832_CLK=0;   //第二个脉冲下降沿
   if(!flag)
  ADC0832_DIO=0;   //DI置0,选择通道0
  else
ADC0832_DIO=1;   //DI置1,选择通道1
   ADC0832_CLK=1;    //第三个脉冲
   ADC0832_CLK=0;    //第三个脉冲下降沿
   ADC0832_DIO=1;    //第三个脉冲下沉之后,输入端DIO失去作用,应置1
   ADC0832_CLK=1;    //第四个脉冲
   for(i=0;i<8;i++)  //高位在前
    {
      ADC0832_CLK=1;         //第四个脉冲
      ADC0832_CLK=0;
      dat<<=1;       //将下面储存的低位数据向右移
                dat|=(unsigned char)ADC0832_DIO;          //将输出数据DIO通过或运算储存在dat最低位
    }                                  
    ADC0832_CS=1;          //片选无效
        return dat;         //将读书的数据返回     
  }       
void        delay(uchar u)
{        int x,y;
        for(x=u;x>0;x--)
                for(y=110;y>0;y--);
}
void        delay1(uchar u)
{        uint        x,y;
        for(x=u;x>0;x--)
                for(y=1;y>0;y--); }
void        init()                   //初始化函数
{         yi=1;
     er=0;
         san=0;
        TMOD=0X02;
        TH0=216;        //每40us进一次中断
        TL0=216;
        ET0=1;
        TR0=0;
        GP2Y_LED=0;
        EA=1;         
//开总中断,定时器0开
}

//---------------------------独立键盘扫描程序------设定报警值-------------------//
void keyscan1()                                                                                                          //键盘扫描
{         
        if(key_yi==0)                                                                          //第一个按键按下
        {   delay(1);                                                                               //延时消除按键抖动
                if(key_yi==0)                                                                  //确认按键按下
                { yi++;if(yi>=10)yi=0;}                        
          while(!key_yi);                                                                                                      
        }
        if(key_er==0)                                                                           //第二个按键按下
    {  delay(1);                                                                               //延时消除按键抖动
          if(key_er==0)                                                                                 //确认按键按下
                { er++;if(er>=10)er=0;}         
          while(!key_er);                                 
        }                                                                                               //第二个按键按下
         if(key_san==0)                                                                        
    {  delay(1);                                                                               //延时消除按键抖动
          if(key_san==0)                                                                         //确认按键按下
          { san++;if(san>=10)san=0;}         
      while(!key_san);                                 
        }
}
//------------------------LCD1602显示程序----------------------------//
void        write_com(uchar        com)                                                           //写命令
{  rs=0;wr=00=com;delay(5);e=1;delay(5);e=0;        }
void        write_data(uchar dat)                                                             //写数据
{  rs=1;wr=00=dat;delay1(5);e=1;delay1(5);e=0;}
void  initlcd()                                                                                           //液晶初始化
{  rs=0;
   wr=0;
   e=0;
   write_com(0x38);                                                                            //16x2
   write_com(0x0c);                                                         //显示开,光标不显示,字符不闪烁
   write_com(0x06);       
   write_com(0x01);

}
void        write_ser(uchar        *ser)                                                                 //写字符串
{  uint        i;
        for(i=0;ser[i]!='';i++)
                {        write_data(ser[i]);
                    delay(5);
                 }       
}
void        display()                                                                                           //显示函数
{
   write_com(0x80);                                                                                       //第一行首地址
        write_ser("S_PM2.5:");                                                                       //字符串
        write_data(yi+'0');        write_data(er+'0');
        write_data(san+'0');
        write_data('u');
        write_data('g');
        write_data('/');
        write_data('m');
        write_data('3');
        write_com(0xc0);                                                                                  //第二行首地址
        write_ser("C_PM2.5:");                                                                           //字符串
        write_data(b%1000/100+'0');
    write_data(b%100/10+'0');
    write_data(b%10+'0');                             
    write_data('u');
        write_data('g');
        write_data('/');
        write_data('m');
        write_data('3');


}
void        display1()                                                                                            //显示更新函数
{
   write_com(0x88);                                                                                        //第一行首地址                                                                           
        write_data(yi+'0');        write_data(er+'0');                                                //更新设定数据
        write_data(san+'0');
        write_com(0xc8);                                                                                        //第二行首地址                                                                                  
        write_data(b%1000/100+'0');                                                                        //更新报警数据
    write_data(b%100/10+'0');
    write_data(b%10+'0');                     
}
//--------------------------系统主程序------------------------//
void main()
{      
         uint PM_AD_buf=0;
        uint PM_AD_dat=0;
        uint AD_dat1=0;
        float PM_js=0.0;
        bit flag1=0        ;
        initlcd();                                                            //液晶初始化
        display();                                                       
         init();                                                           //系统初始化
        while(1)
        {                                                                            //按键检测函数
          keyscan1();
          GP2Y_LED=1;
                TR0=1;                                                            //开启中断
             while(1)
                {
                        if(time_num1>5)                                //大约
                        break;
                }
        AD_dat1=A_D(1);                                                 //模数转换
        if(flag1==0){PM_AD_dat=AD_dat1; flag1=1;} //记录转换后的值
        PM_AD_dat=PM_AD_dat*8+AD_dat1;
        PM_AD_dat/=9;
//    PM_AD_dat=AD_dat1;                                                           //模数转换后计算平均值
        PM_js=((float)(PM_AD_dat/50.2+0.01))*100;//计算PM2.5的值
        PM_dat=(uint)(PM_js);
        b=PM_dat;
        if(b>=999) b=999;                                  //数据修正
        if(b<0)   b=10;
        keyscan1();                             //按键检测函数
        set_count=yi*100+er*10+san;                 //计算设定值
        if(b>=set_count)        {beep=0;}         //报警检测
        else beep=1;
        display1();                                                  //液晶显示数据更新
        delay(300);                                                  //延时
        };               
}
void time0_int() interrupt 1                 //定时中断函数         每40us进一次中断
{                                                                         
    time_num1++;                                               //定时计数变量+1
        if(time_num1==8)
        {
                GP2Y_LED=0;                                        //输出低电平,驱动传感器
        }
        else if(time_num1>250)                        //10MS后计数器清零,关闭定时器
        {
                time_num1=0;
                TR0=0;
   }       

}         

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。