最近做了一个检测可燃气体的小玩意 附上源码,
//#include <REG51.H>
#include "intrins.h"
#include <S74595.h>
#define uchar unsigned char
#define uint unsigned int
#define FOSC 18432000L
typedef unsigned char BYTE;
typedef unsigned int WORD;
BYTE mq9word,mq9word1;
#define URMD 0 //0:使用定时器2作为波特率发生器
//1:使用定时器1的模式0(16位自动重载模式)作为波特率发生器
//2:使用定时器1的模式2(8位自动重载模式)作为波特率发生器
//sfr T2H = 0xd6; //定时器2高8位
//sfr T2L = 0xd7; //定时器2低8位
//sfr AUXR = 0x8e; //辅助寄存器
//sfr ADC_CONTR = 0xBC; //ADC控制寄存器
//sfr ADC_RES = 0xBD; //ADC高8位结果
//sfr ADC_LOW2 = 0xBE; //ADC低2位结果
//sfr P1ASF = 0x9D; //P1口第2功能控制寄存器
#define ADC_POWER 0x80 //ADC电源控制位
#define ADC_FLAG 0x10 //ADC完成标志
#define ADC_START 0x08 //ADC起始控制位
#define ADC_SPEEDLL 0x00 //540个时钟
#define ADC_SPEEDL 0x20 //360个时钟
#define ADC_SPEEDH 0x40 //180个时钟
#define ADC_SPEEDHH 0x60 //90个时钟
sbit dula=P3^5;
sbit wela=P3^4;
sbit led=P1^1;
sbit beep=P3^6;
sbit alm=P3^3;
BYTE X,v;
uchar num, num1=60,shi,ge;
void InitADC();
void T0timeInit();
//void InitUart();
BYTE GetADCResult(BYTE ch);
void Delay(WORD n);
void ShowResult(BYTE ch);
uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
void display();
void main()
{
P3M0=0x70;
P3M1=0;
T0timeInit() ;
InitADC();
led=0;
beep=0;
while(1)
{
display();
if (num1==0)
{
GetADCResult(0);
mq9word1=mq9word/4;
shi=mq9word/10;
ge=mq9word%10;
}
if(!alm | mq9word>=55 )
{
if((mq9word<=99 && mq9word>=55)| !alm)
v=15;
if(mq9word>=99)
v=5;
if(mq9word>99)
{
shi=10;
ge=10;
}
X++;
if(X>v)
{
X=0;
beep=~beep;
led=~led;
}
}
else
led=beep=0;
}
}
/*----------------------------
定时器初始化设置函数
----------------------------*/
void T0timeInit()
{
// AUXR &= 0x7F; //定时器时钟12T模式
TMOD=0x01; //设置定时器模式
TH0 = (65536-45872)/256; //设置定时初值
TL0 = (65536-45872)%256; //设置定时初值
EA=1;//开总中断
ET0=1;//开定时器0中断
TR0 = 1; //定时器0开始计时
}
/*
定时器中断函数
*/
void T0_time() interrupt 1
{
TH0 = (65536-45872)/256; //设置定时初值
TL0 = (65536-45872)%256; //设置定时初值
num++;
if(num==20)
{
num=0;
num1--;
if(num1==0)
{
ET0=0;
}
shi=num1/10;
ge=num1%10;
}
}
/*
数码管显示函数
*/
void display()
{
WriteTo74595(tab[shi]);
wela=1;
Delay(1);
wela=0;
WriteTo74595(tab[ge]);
dula=1;
Delay(1);
dula=0;
}
/*
读取ADC结果
*/
BYTE GetADCResult(BYTE ch)
{
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
_nop_(); //等待4个NOP
_nop_();
_nop_();
_nop_();
while (!(ADC_CONTR & ADC_FLAG));//等待ADC转换完成
ADC_CONTR &= ~ADC_FLAG; //Close ADC
mq9word=ADC_RES; //返回ADC结果
}
/*----------------------------
初始化ADC
----------------------------*/
void InitADC()
{
P1ASF = 0x01; //设置P1口为AD口
ADC_RES = 0; //清除结果寄存器
ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
Delay(2); //ADC上电并延时
}
/*----------------------------
软件延时
----------------------------*/
void Delay(WORD n)
{
WORD x;
while (n--)
{
x = 3000;
while (x--);
}
}
//void InitUart()
//{
// TMOD=0x22;
// TH1=0xfd;
// TL1=0xfd;
// TR1=1;
// REN=1;
// SM0=0;
// SM1=1;
//// EA=1;
// ES=1;
//}
//void SendData(BYTE dat)
//{
// while (!TI); //等待前一个数据发送完成
// TI = 0; //清除发送标志
// SBUF = dat; //发送当前数据
//}
|