|
本帖最后由 孤仙1233 于 2020-3-10 17:43 編輯
MQ-2煙霧傳感器經(jīng)ADC0809轉(zhuǎn)換,反饋大概的濃度值,但是燒入后51開發(fā)板蜂鳴器一直響,請(qǐng)求大神們幫我看看 謝謝!
#include <reg52.h> //器件配置文件
#include <intrins.h>
#include <stdio.h>
#define adc0809_data P0 //單片機(jī)P0接模塊D0~D7引腳
sbit ST = P2^3; //單片機(jī)P2.3接模塊STR引腳, 啟動(dòng)轉(zhuǎn)換信號(hào)
sbit EOC = P2^2; //單片機(jī)P2.2接模塊EOC, 轉(zhuǎn)換結(jié)束信號(hào),高電平有效
sbit OE = P2^1; //單片機(jī)P2.1接模塊OE,輸出允許信號(hào),高電平有效
sbit CLK = P2^0; //單片機(jī)P2.0接CLK ,ADC0809時(shí)鐘,輸入50-800KHZ的頻率
//一般選用500K
//將短接片去掉開啟位選功能,否則默認(rèn)IN0為輸入引腳
sbit AA = P2^6; //單片機(jī)P2.6接模塊A引腳
sbit BB = P2^5; //單片機(jī)P2.6接模塊B引腳
sbit CC = P2^4; //單片機(jī)P2.6接模塊C引腳
int k,j;
unsigned char AD_DATA[1]; //保存IN0通道轉(zhuǎn)換后的數(shù)據(jù)
int a[2],b[2];
unsigned char i;
void InitUART(void) //串口初始化
{
SCON = 0x50;
TH1 = 0xfd;
TL1 = TH1;
TMOD |= 0x02;
TR1 = 1;
TI = 1;
}
/*void UART_T (unsigned char UART_data)//定義串口發(fā)送數(shù)據(jù)變量
{
SBUF = UART_data; //將接收的數(shù)據(jù)發(fā)送回去
while(TI == 0); //檢查發(fā)送中斷標(biāo)志位
TI = 0; //令發(fā)送中斷標(biāo)志位為0(軟件清零)
}
void UART_TC (unsigned char *str)
{
while(*str != '\0') //檢查是否發(fā)送完畢
{
UART_T(*str); //發(fā)送
*str++; //指針指向下一個(gè)字符
}
*str = 0; //發(fā)送完畢后指針歸零
}
char putchar(char c)
{
UART_T(c);
return c;
}*/
/***********************************
函數(shù)名: delayms()
功能: 延時(shí) ms 毫秒
***********************************/
void delayms(unsigned int ms)
{
unsigned char j;
i=100;
for(;ms;ms--)
{
while(--i)
{
j=10;
while(--j);
}
}
}
void Analog_IO_Sel(unsigned char m)
{
switch(m)
{
case 0 : CC = 0; BB = 0; AA = 0; break;
case 1 : CC = 0; BB = 0; AA = 1; break;
case 2 : CC = 0; BB = 1; AA = 0; break;
case 3 : CC = 0; BB = 1; AA = 1; break;
case 4 : CC = 1; BB = 0; AA = 0; break;
case 5 : CC = 1; BB = 0; AA = 1; break;
case 6 : CC = 1; BB = 1; AA = 0; break;
case 7 : CC = 1; BB = 1; AA = 1; break;
}
}
/***********************************
函數(shù)名: AD()
功能: 啟動(dòng)AD轉(zhuǎn)換將值儲(chǔ)存于 AD_DATA[0]
***********************************/
void AD(void )
{
ST=0;
Analog_IO_Sel(0); //設(shè)置為IN0輸入
ST=1; //啟動(dòng)AD轉(zhuǎn)換
ST=0;
while(0==EOC);//等待轉(zhuǎn)換結(jié)束
OE=1;
AD_DATA[0]=P0; //讀取AD數(shù)據(jù),數(shù)據(jù)范圍為0-255
OE=0;
delayms(100);
ST=0;
Analog_IO_Sel(1); //設(shè)置為IN1輸入
ST=1; //啟動(dòng)AD轉(zhuǎn)換
ST=0;
while(0==EOC);//等待轉(zhuǎn)換結(jié)束
OE=1;
AD_DATA[1]=P0; //讀取AD數(shù)據(jù),數(shù)據(jù)范圍為0-255
OE=0;
delayms(100);
if (adc0809_data>=251)
{
adc0809_data=250;
}
}
/***********************************
函數(shù)名: t0()
功能: 產(chǎn)生ADC0809CLK所需要的時(shí)鐘
***********************************/
void t0(void) interrupt 1
{
TH0=(65536-2)/256; //重裝計(jì)數(shù)初值
TL0=(65536-2)%256; //重裝計(jì)數(shù)初值
CLK=~CLK;
}
/***********************************
函數(shù)名: Conut()
功能: 將AD_DATA[0]的各位拆分以方便
***********************************/
void Conut(void)
{
a[0]=AD_DATA[0]/100;
a[1]=AD_DATA[0]/10%10;
a[2]=AD_DATA[0]%10;
b[0]=AD_DATA[1]/100;
b[1]=AD_DATA[1]/10%10;
b[2]=AD_DATA[1]%10;
k=a[0]*100+a[1]*10+a[2];
j=b[0]*100+b[1]*10+b[2];
}
void main()
{
InitUART();
CLK=0;
TMOD|=0x01; //設(shè)定定時(shí)器 T0工作方式
TH0=(65536-2)/256; //利用T0中斷產(chǎn)生CLK信號(hào)
TL0=(65536-2)%256;
TR0=1; //啟動(dòng)定時(shí)器T0
ET0=1;
ES = 1;
EA=1; //開總中斷
//InitUART();
while(1)
{
AD();
Conut(); //計(jì)算
printf("%d",k);
printf("%d",j);
delayms(100); //100MS
}
}
/*void InterrupUART () interrupt 4
{
if (RI)
{
RI = 0;
SBUF = SBUF ;
}
if (TI)
{
TI =0;
}
}*/
|
|