|
最近做了一個(gè)檢測可燃?xì)怏w的小玩意 附上源碼,
//#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:使用定時(shí)器2作為波特率發(fā)生器
//1:使用定時(shí)器1的模式0(16位自動(dòng)重載模式)作為波特率發(fā)生器
//2:使用定時(shí)器1的模式2(8位自動(dòng)重載模式)作為波特率發(fā)生器
//sfr T2H = 0xd6; //定時(shí)器2高8位
//sfr T2L = 0xd7; //定時(shí)器2低8位
//sfr AUXR = 0x8e; //輔助寄存器
//sfr ADC_CONTR = 0xBC; //ADC控制寄存器
//sfr ADC_RES = 0xBD; //ADC高8位結(jié)果
//sfr ADC_LOW2 = 0xBE; //ADC低2位結(jié)果
//sfr P1ASF = 0x9D; //P1口第2功能控制寄存器
#define ADC_POWER 0x80 //ADC電源控制位
#define ADC_FLAG 0x10 //ADC完成標(biāo)志
#define ADC_START 0x08 //ADC起始控制位
#define ADC_SPEEDLL 0x00 //540個(gè)時(shí)鐘
#define ADC_SPEEDL 0x20 //360個(gè)時(shí)鐘
#define ADC_SPEEDH 0x40 //180個(gè)時(shí)鐘
#define ADC_SPEEDHH 0x60 //90個(gè)時(shí)鐘
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;
}
}
/*----------------------------
定時(shí)器初始化設(shè)置函數(shù)
----------------------------*/
void T0timeInit()
{
// AUXR &= 0x7F; //定時(shí)器時(shí)鐘12T模式
TMOD=0x01; //設(shè)置定時(shí)器模式
TH0 = (65536-45872)/256; //設(shè)置定時(shí)初值
TL0 = (65536-45872)%256; //設(shè)置定時(shí)初值
EA=1;//開總中斷
ET0=1;//開定時(shí)器0中斷
TR0 = 1; //定時(shí)器0開始計(jì)時(shí)
}
/*
定時(shí)器中斷函數(shù)
*/
void T0_time() interrupt 1
{
TH0 = (65536-45872)/256; //設(shè)置定時(shí)初值
TL0 = (65536-45872)%256; //設(shè)置定時(shí)初值
num++;
if(num==20)
{
num=0;
num1--;
if(num1==0)
{
ET0=0;
}
shi=num1/10;
ge=num1%10;
}
}
/*
數(shù)碼管顯示函數(shù)
*/
void display()
{
WriteTo74595(tab[shi]);
wela=1;
Delay(1);
wela=0;
WriteTo74595(tab[ge]);
dula=1;
Delay(1);
dula=0;
}
/*
讀取ADC結(jié)果
*/
BYTE GetADCResult(BYTE ch)
{
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
_nop_(); //等待4個(gè)NOP
_nop_();
_nop_();
_nop_();
while (!(ADC_CONTR & ADC_FLAG));//等待ADC轉(zhuǎn)換完成
ADC_CONTR &= ~ADC_FLAG; //Close ADC
mq9word=ADC_RES; //返回ADC結(jié)果
}
/*----------------------------
初始化ADC
----------------------------*/
void InitADC()
{
P1ASF = 0x01; //設(shè)置P1口為AD口
ADC_RES = 0; //清除結(jié)果寄存器
ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
Delay(2); //ADC上電并延時(shí)
}
/*----------------------------
軟件延時(shí)
----------------------------*/
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); //等待前一個(gè)數(shù)據(jù)發(fā)送完成
// TI = 0; //清除發(fā)送標(biāo)志
// SBUF = dat; //發(fā)送當(dāng)前數(shù)據(jù)
//}
|
|