打印
[ZLG-MCU]

P89LPC938的AD转换值不正确

[复制链接]
2459|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
bonsens|  楼主 | 2009-10-23 11:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用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

相关帖子

沙发
linhai1986| | 2009-10-26 22:31 | 只看该作者
帮顶

使用特权

评论回复
板凳
雁舞白沙| | 2009-10-27 10:34 | 只看该作者
#include "reg932.h" //包含头文件

为何是932呢?

使用特权

评论回复
地板
xiaoxin1986| | 2009-10-28 00:18 | 只看该作者
是啊,不明白

使用特权

评论回复
5
dxf40943596| | 2009-11-2 10:21 | 只看该作者
void ad_start(void)
{
ADCON0=0X05; //固定通道、单次转换、立即启动
while(!ADCON0&0x08); //等待转换完毕
}



上面等待转换完毕有问题
应该这样写
   while(!(ADCON0&0x08));
或者是
   while((ADCON0&0x08)==0);
都是可以的,我先前也是用KEIL仿真过,发现转化结果只有高8位,没底2位
后来才发现是问题出现在那里,

使用特权

评论回复
6
雁舞白沙| | 2009-11-2 11:31 | 只看该作者
void ad_start(void)
{
ADCON0=0X05; //固定通道、单次转换、立即启动
while(!ADCON0&0x08); //等待转换完毕
}


上面等待转换完毕有问题
应该这样写
   while(!(ADCON0&0x08));
或者是
   while((ADCON0&0x08)==0); ...
dxf40943596 发表于 2009-11-2 10:21



很可能是这里的问题,更具语法判断是这里的!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

1

粉丝