另外一個程序一直輸出4,可是我采集的電壓是3.3v的
#include "includes.h"
#define INT8U unsigned char
#define INT32U unsigned int
#define ADC_POWER 0x80 //ADC power control bit
#define ADC_FLAG 0x10 //ADC complete flag
#define ADC_START 0x08 //ADC start control bit
#define ADC_SPEEDLL 0x00 //540 clocks
#define ADC_SPEEDL 0x20 //360 clocks
#define ADC_SPEEDH 0x40 //180 clocks
#define ADC_SPEEDHH 0x60 //90 clocks
INT8U res = 0,c;
bit busy = 0;
/************************************************
****函數名: Delay
****函數描述: 延時函數
****函數功能: 實現10ms延時
**************************************************/
void Delay2500ms()
{
uchar i,j,k;
_nop_();
_nop_();
i = 106;
j = 15;
k = 131;
do
{
do
{
while(--k);
}while(--j);
}while(--i);
}
void Delay2ms()
{
uchar i,j;
_nop_();
_nop_();
i = 22;
j = 128;
do
{
while(--j);
}while(--i);
}
void SendData(uchar dat)
{
while(busy);
busy = 1;
SBUF = dat;
}
void UartInit(void) //9600bps @11.0592MHz
{
PCON &= 0X7F;//波特率不倍速
SCON = 0X50;//8位數據,可變波特率
AUXR &= 0XBF;//定時器1時鐘為fosc/12,即12T
AUXR &= 0XFE;//串口1選擇定時器1位波特率發生器
TMOD &= 0XFF;//清除定時器1模式位
TMOD |= 0X20;//定時器1為8位自動重裝方式
TL1 = 0XFD; //設定定時器初值
TH1 = 0XFD; //設定定時器1重裝值
ET1 = 0; //禁止定時器1 中斷
TR1 = 1;//啟動定時器1
EA = 1;//開啟總中斷
ES = 1;//開啟串口中斷
}
/******************************
**** 函數名 :ADCResult
**** 函數描述 :A/D 采集轉換函數,設置A/D轉換相關的寄存器
**** 返回值 : A/D 轉換結果
******************************/
uchar ADCResult(uchar ch)
{
P1ASF = 0x40; //將P1^6口 作為AD輸入
ADC_CONTR |= ADC_POWER | ADC_SPEEDLL | ADC_START | ch;
_nop_();
_nop_();
_nop_();
_nop_(); //等待ADC_CONTR值寫入
while(!(ADC_CONTR & ADC_FLAG)); //如果AD轉換未結束FLAG位為0,程序在此等待,如果為1,跳出循環
ADC_CONTR &= ~ADC_FLAG; //寄存器復位
res = ADC_RES*5/1024*10;
return res; //返回AD轉換結果
}
void main()
{
uchar value;
UartInit();
Delay2ms();
Delay2ms();
while(1)
{
Delay2500ms();
value = ADCResult(0x04);
TI=1;
SendData(value);
while(!TI);
TI=0;
}
}
void RSINTR() interrupt 4 using 1
{
if(RI)
{
RI = 0;
ACC = SBUF;
}
if(TI)
{
TI = 0;
busy = 0;
}
}
|