另外一个程序一直输出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;
}
}
|