DSM501A灰尘传感器+51单片机C语言程序完整版

//***************************************
// 空气质量测试仪设计
// 使用单片机STC90C516RD
// 晶振:11.0592M
// 显示:LED数码管(适用DICE-5212K实验箱)
// 编译环境 Keil uVision2
// 时间:2014年6月24日
//编程思路:
//简单的就是做一个1ms的定时中断(要准点可以定时时间减少,反之定时时间加大)
//在中断中检测IO口的电平,是低就 加1
//30s内总共检测30000次 ,用你检测累加的值除以300就是百分数,也就是低脉冲率。
//用数码管最后两位显示
//****************************************
#include
#include //Keil library
#include //Keil library
#include
#include
#define uchar unsigned char
#define uint unsigned int

//*********************************************
//MON51必须用到的
code unsigned char stop[3] _at_ 0x3b;
//*********************************************
#define com8155 XBYTE[0xff20] //控制字
#define pa8155 XBYTE[0xff21] //位扫描
#define pb8155 XBYTE[0xff22] //段码位
unsigned char posit=0;
unsigned char const discode[] ={ 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xBF,0xff/*-*/};
unsigned char const positon[6]={ 0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
unsigned char disbuff[6] = { 0,0,0,0,0,0};
sbit PWM=P1^0; //脉冲输出


typedef unsigned char BYTE;
typedef unsigned short WORD;

BYTE BUF[8]; //接收数据缓存区
uchar ge,shi,bai,qian,wan; //显示变量
uint number_t0=0;
uint lt_time=0; //低脉冲时间
uchar lt_rate=0; //低脉冲率

void delay_nms(unsigned int k);
void conversion(uint temp_data);
void Display(void); //扫描数码管
//------------------------------------
void Delay5us();
void Delay5ms();
//-----------------------------------

//毫秒延时**************************
void delay_nms(unsigned int k)
{
unsigned int i,j;
for(i=0;i{
for(j=0;j<121;j++)
{;}}
}

//*********************************************************
void conversion(uint temp_data) // 数据转换出 个,十,百,千,万
{

//wan=temp_data/10000 ;
//temp_data=temp_data%10000; //取余运算
//qian=temp_data/1000 ;
//temp_data=temp_data%1000; //取余运算;
//bai=temp_data/100;
temp_data=temp_data%100; //取余运算
shi=temp_data/10;
temp_data=temp_data%10; //取余运算
ge=temp_data;
//disbuff[0]=0;
//disbuff[1]=wan;
//disbuff[2]=qian;
//disbuff[3]=bai;
disbuff[4]=shi;
disbuff[5]=ge;

}

/********************************************************/
void Display(void) //扫描数码管
{
for(posit=4;posit<6;posit++)
{
pb8155=discode[disbuff[posit]];
pa8155=positon[posit];
d

elay_nms(4); //延时2ms ;
}
}


//*********************************************************
//*********************定时器T0用于定时1MS********
//*********************************************************
timer0() interrupt 1 using 1 //T/C0中断服务程序, 每1ms中断一次
{

number_t0++;
if(PWM==0) lt_time++; //每1ms检测PWM脉冲是否为低电平
if(number_t0==30000) //munber_t0计数到30000MS,即30S,计算低脉冲率
{ TR0=0; //关闭定时器0
lt_rate=(int)(lt_time/300); //计算低脉冲率
number_t0=0; //30S时间计数器和低脉冲率变量初始化为0,开始下一个测量周期
lt_time=0;
TR0=1; // 启动定时器0
}
TH0=0xfc;
TL0=0x66;
}


//*********************************************************
//***********************主程序****************************
//*********************************************************
void main()
{
com8155=0x43; //8155控制字
TMOD=0x01;
TH0=0xfc; //晶振:11.0592MHz,定时1ms
TL0=0x66;
ET0=1;
TR0=1;
EA=1;

while(1) //循环
{
conversion(lt_rate); //计算数据和显示
Display(); //显示光照度
}
}

相关文档
最新文档