OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4742|回复: 5

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

[复制链接]

5

主题

8

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2016-5-5
在线时间
8 小时
发表于 2016-5-6 14:48:03 | 显示全部楼层 |阅读模式
1金钱
求大神指点,我有一个别人用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]!='\0';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;
   }       

}         

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

92

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1134
金钱
1134
注册时间
2014-7-25
在线时间
176 小时
发表于 2016-5-6 16:23:59 | 显示全部楼层
凡是可以用钱解决的事情,做好用钱解决,开个价吧。。。
回复

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2016-5-6 19:17:23 | 显示全部楼层
不然自己写,不然托关系找熟人,再不然就花钱吧。
回复

使用道具 举报

8

主题

59

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2015-2-9
在线时间
10 小时
发表于 2016-5-7 10:55:37 | 显示全部楼层
[img]file:///C:\Users\KZP\AppData\Roaming\Tencent\Users\1792681370\QQ\WinTemp\RichOle\}9T`PJTNY[B07]MZ42I]8_W.png[/img]file:///C:\Users\KZP\AppData\Roaming\Tencent\Users\1792681370\QQ\WinTemp\RichOle\N{}DK1KC]9L(~T5XW2Q6WQ8.png

}9T`PJTNY[B07]MZ42I]8_W.png
N{}DK1KC]9L(~T5XW2Q6WQ8.png
回复

使用道具 举报

8

主题

59

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2015-2-9
在线时间
10 小时
发表于 2016-5-7 10:56:30 | 显示全部楼层
其实很简单,我的qq1792681370
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2017-5-29
在线时间
2 小时
发表于 2017-8-2 21:47:51 | 显示全部楼层
大兄弟~能把PM2.5模块的51程序发我一份么?多谢啦~邮箱:1282965786@qq.com
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-4-20 05:56

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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