|
#include <STC32G.h>
#include <intrins.h>
#include <stdio.h>
typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;
#define MAIN_Fosc 12000000UL
#define Baudrate 115200L
#define TM (65536 -(MAIN_Fosc/Baudrate/4))
#define PrintUart 1
sbit LED = P1^1;
u16 AM_PM;
//unsigned char PM25_value;
void delay_ms(unsigned int ms);
u16 Get_ADC12bitResult(u8 channel); //channel = 0~15
//u16 PM25_Get_Value(u8 ch); //获取PM2.5数值
/*串口初始化*/
void UartInit(void)
{
#if(PrintUart == 1)
SCON = (SCON & 0x3f) | 0x40;
T1x12 = 1; //定时器时钟1T模式
S1BRT = 0; //串口1选择定时器1为波特率发生器
TL1 = TM;
TH1 = TM>>8;
TR1 = 1; //定时器1开始计时
#else
S2_S = 1; //UART2 switch to: 0: P1.0 P1.1, 1: P4.6 P4.7
S2CFG |= 0x01; //使用串口2时,W1位必需设置为1,否则可能会产生不可预期的错误
S2CON = (S2CON & 0x3f) | 0x40;
T2L = TM;
T2H = TM>>8;
AUXR |= 0x14; //定时器2时钟1T模式,开始计时
#endif
}
void UartPutc(unsigned char dat)
{
#if(PrintUart == 1)
SBUF = dat;
while(TI==0);
TI = 0;
#else
S2BUF = dat;
while(S2TI == 0);
S2TI = 0; //Clear Tx flag
#endif
}
char putchar(char c)
{
UartPutc(c);
return c;
}
void main()
{
WTST = 0; //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
EAXFR = 1; //扩展寄存器(XFR)访问使能
CKCON = 0; //提高访问XRAM速度
P1M0 = 0x32; P1M1 = 0x30;
// ADC初始化
ADCTIM = 0x3f; //设置 ADC 内部时序,ADC采样时间建议设最大值
ADCCFG = 0x2f; //设置 ADC 转换结果右对齐,时钟为系统时钟/2/16
ADC_CONTR = 0x81; //使能 ADC 模块,并选择1通道
UartInit();
while(1)
{
GetGP2Y();
// printf("PM2.5:\r\n",PM25_value);
delay_ms(1000);
}
}
void delay_ms(unsigned int ms)
{
unsigned int i;
do{
i = MAIN_Fosc / 6000;
while(--i); //6T per loop
}while(--ms);
}
void Delay4us() //@12.000MHz
{
unsigned long i;
_nop_();
_nop_();
_nop_();
i = 10UL;
while (i) i--;
}
//========================================================================
// 函数: u16 Get_ADC12bitResult(u8 channel)
// 描述: 查询法读一次ADC结果.
// 参数: channel: 选择要转换的ADC.
// 返回: 12位ADC结果.
// 版本: V1.0, 2012-10-22
//========================================================================
u16 Get_ADC12bitResult(u8 channel) //channel = 0~15
{
ADC_RES = 0;
ADC_RESL = 0;
ADC_CONTR = (ADC_CONTR & 0xf0) | channel; //设置ADC转换通道
ADC_START = 1;//启动ADC转换
_nop_();
_nop_();
_nop_();
_nop_();
while(ADC_FLAG == 0); //wait for ADC finish
ADC_FLAG = 0; //清除ADC结束标志
return (((u16)ADC_RES << 8) | ADC_RESL);
}
/****
*******获取PM2.5值函数
*******传入值:adc通道
*******返回值:PM2.5值
*******注意:本函数需要调用adc获取函数
*****/
//u16 PM25_Get_Value(u8 ch)
//{
// u16 adc_value = 0; //adc值变量
// u16 PM_count = 0; //计数次数值变量
// u16 PM25_value = 0; //PM2.5值变量
// LED = 0; //PM2.5 LED灯拉低开启
// delay_ms(0.28);
// adc_value += Get_ADC12bitResult(u8 channel); //获取一次adc值,并累加
// Delay4us(); //延时40us
// LED = 1;
// if(++PM_count >= 5) //获取5次adc值
// {
// PM_count = 0; //计数次数清零
// adc_value = adc_value / 5; //取5次平均值
// PM25_value = ((adc_value/255.0)*5*0.17-0.1)*1000; //计算PM2.5值
// adc_value = 0; //adc值清零
// }
// return PM25_value; //返回PM2.5值
//}
void GetGP2Y(void)
{
float pm;
LED = 0; //PM2.5 LED灯拉低开启
delay_ms(0.28); //延时280us
AD_PM = Get_ADC12bitResult(u8 channel); //获取一次adc值
Delay4us(); //延时40us
LED = 1; //PM2.5 LED灯拉高关闭
delay_ms();
pm = 0.17*AD_PM-0.1; //电压-灰尘转换
printf("%f\n",pm);
}
|
|