使用P89LPC938的10位AD,并且使用周立功的例子来测试。例子如下:
但是在测试时,AD0口的电压值变化时,我直接读取了AD结果寄存器中的值,值没有什么太大的变化,并且基本趋近于0。请问:
1)938的AD使用是不是还要有什么其他的设置?
2)我也用过900系列的915、917单片机的AD,使用都很正常。938是不是对AD的使用在电路上还有什么特殊的要求?
谢谢!
//*******************************************************************************************
//版权:周立功单片机研究所
//文件:TEST938AD.C
//功能:对通道AD0 进行AD 转换,结果通过UART 发送到PC,通信波特率为9600BPS
//*******************************************************************************************
#include "reg932.h" //包含头文件
sfr ADCON0 = 0x97; //定义ADC 用到的寄存器
sfr ADMODA = 0xC0;
sfr ADMODB = 0xA1;
sfr ADINS = 0xA3;
unsigned char xdata AD0DAT0R _at_ 0xfffe; //定义AD0DAT0R 地址
unsigned char xdata AD0DAT0L _at_ 0xffff; //定义AD0DAT0L 地址
//------------------------------------
//msec: 延时子程序
//-------------------------------------
void msec(int msec)
{
int delay = 0;
while(msec)
{
for(delay = 0;delay < 680; delay++);
msec--;
}
}
//------------------------------------
// io_init: 初始化IO 子程序
//-------------------------------------
void io_init(void)
{
P0M1=0xFF;
P0M2=0x00;
P1M1=0x00;
P1M2=0x00;
}
//------------------------------------
//ad_init: 初始化AD 子程序
//-------------------------------------
void ad_init(void)
{
ADINS=0x01; //选择通道AD0
ADMODA|=0x10; //单次转换
}
//------------------------------------
// ad_start: 启动AD 转换子程序
//-------------------------------------
void ad_start(void)
{
ADCON0=0X05; //固定通道、单次转换、立即启动
while(!ADCON0&0x08); //等待转换完毕
}
//------------------------------------
// UART_init:初始化UART
//-------------------------------------
void UART_init()
{
SCON=0x50; // 选择内部BRG 为UART 波特率发生器
SSTAT=0x60;
BRGR0=0xF0; // 设置波特率为9600bps
BRGR1=0x02;
BRGCON = 0x03; // 允许BRG
}
//------------------------------------
// sendtoPC:通过UART 发送转换结果到PC
//-------------------------------------
void sendtoPC(void)
{
TI=0;
SBUF=AD0DAT0L; //发送结果高位,即9:2
while (!TI);
TI=0;
SBUF=AD0DAT0R; //发送结果低位,即7:0
while (!TI);
}
//------------------------------------
// main:主函数
//-------------------------------------
void main(void)
{ //初始化IO
io_init(); //初始化AD
ad_init(); //初始化UART
UART_init();
while(1)
{
ad_start(); //启动AD |