我还是新手,不会写程序,只能找网上已有的资料。
最近要做煤气报警系统,所以找了一份资料。我要用到的是MQ-2气敏传感器、stc89c52单片机开发板(包含了蜂鸣器和LED等)、DS18B20温度传感器。
下面是程序,我的问题是这个程序好像没有体现出气敏传感器的模数转换、以及蜂鸣器报警,是这样吗?我需要再把这个程序完善一下吗?特别是最后的主函数部分我看不大懂,有没有好心人能给我解读一下。
程序:
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P1^0;//定义18B20数据线引脚
sbit LED=P1^3;
sbit input=P1^1;
unsigned char flag;//负数标志
//行扫描数组
uchar code scan[4]={0xef,0xf7,0xfb,0xfd};
//数码管显示的段码表
uchar code table[13]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x39,0x00};//,-,C,kong
//小数部分显示查询表
uchar code ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
uchar dispbuf[8];//显示缓冲区
uchar temper[2];//存放温度数组
uchar TCNT;
//******************************
//延时函数
//******************************
void delay (unsigned int us)
{
while(us--);
}
//******************************
//DS18B20复位函数
//******************************
void reset(void)
{
uchar x=0;
DQ=1;
delay(80);
DQ=0;
delay(80);
DQ=1;
delay(14);
x=DQ;
delay(20);
}
//******************************
//DS18B20中读一个字节
//******************************
uchar readbyte(void)
{
uchar i=0;
uchar dat=0;
for(i=8;i>0;i--)
{
DQ=0; //拉低总线,启动输入
dat>>=1; //要返回的数据右移一位,先读出来的是低位
DQ=1;
if(DQ==1) //当数据线为高时,证明该位数据为 1
dat|=0x80; //要传输数据的当前值置为 1,若不是,则为 0
delay(4);
}
return (dat);
}
//******************************
//向DS18B20中写1个字节
//******************************
void writebyte(unsigned char dat)
{
uchar i=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01; //把dat第0位的状态赋给DQ,其余位清零
delay(5);
DQ=1;
dat>>=1;
}
delay(4);
}
//******************************
//向DS18B20中读取实时温度值
//******************************
void readtemp(void)
{
uchar a=0,b=0;
reset();
writebyte(0xCC);//跳过序列号、写指令:跳过rom检测
writebyte(0x44);//启动温度转换
reset();
writebyte(0xCC);//跳过序列号
writebyte(0xBE);//读9个寄存器,前2个为温度
a=readbyte();//低位
b=readbyte();//高位
if(b>0x0f) //判断是否为负值 ;15
{
a=~a+1;
if(a==0)
b=~b+1;
else b=~b;
flag=10; //标志某种状态
}
else flag=12;
temper[0]=a&0x0f;
a=a>>4;
temper[1]=b<<4;
temper[1]=temper[1]|a;
}
//******************************
//动态扫描显示函数
//******************************
void scandisp()
{
unsigned char i,value; //value指浓度值?
for(i=0;i<4;i++)
{
P3=0xff; // 255
value=table[dispbuf[i]];
if(i==2)
value|=0x80; //-128;10000000b;把变量value的值的最高位写成“1”,而不改变其它位的值
P2=value;
P3=scan[i];
delay(90);
}
}
//******************************
//定时中断函数
//******************************
void Timer0(void)interrupt 1 using 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TCNT++;
if(TCNT==6)
{
TCNT =0;
LED=~LED; //若 LED = 0;低电平亮, ~取反 LED = 1;高电平LED灭
}
}
//******************************
//主函数
//******************************
void main()
{
uchar temp,temp1;
TCNT=0;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
IE=0x82;
while(1)
{
if(input==0)
TR0=1;
else
{
TR0=0;
LED=1;
}
readtemp();
temp1=temper[0];
temp=temper[1];
dispbuf[3]=ditab[temp1];
dispbuf[2]=temp%10;
temp=temp/10;
dispbuf[1]=temp%10;
dispbuf[0]=flag;
scandisp();
}
}
|