51单片机和ADC0809配合时出现错误现象,求解

2024-12-01 00:55:03
推荐回答(4个)
回答1:

你把adc的CLK接单片机的ALE 试试。
定时器 就 不用了。
我之前遇到的问题是这样的(可能和你有点不一样):
用proteus 仿真 是好的(也用的是定时器控制CLK)
但是,实际线路中,开机第一次转换是好的,接下来改变电位器就没反应了。
改变电位器后,再重启就又有一次好的(此时电位器的值)。

下面是我之前的提问:呵呵,希望对你有帮助!
http://zhidao.baidu.com/question/143979152.html

回答2:

不用那么麻烦 你落伍了 STC12系列就自带AD转换
#include
#include
#define uchar unsigned char
#define uint unsigned int
#include <1602.h>
#include
#include
int ADC_data[10];
sbit key=P3^2;
sbit Rxd=P3^0;
sbit Txd=P3^1;
uint ADC_data_avr;
uint ADC_data_sum;
uchar ADC_data_avr_miao,ADC_data_avr_fen,ADC_data_avr_ge;
void main()
{
uchar i;
lcdinit();
lcddisplaytable(0x80," Last Result",14);
EEPROM_Read();
initiate_RS232();
P1ASF=0xff;
ADC_CONTR=0x80;
while(1)
{
while(key==0)
{
lcddisplaytable(0x80," Result ",14);
ADC_data_sum=0;
for(i=0;i<10;i++)
{
ADC_CONTR=0xe8;
while(!(ADC_CONTR & 0x10));
ADC_CONTR=0xe0;
ADC_RESL=ADC_RESL & 0x03;
ADC_data[i]=(ADC_RES<<2)+ADC_RESL;
ADC_data_sum=ADC_data_sum+ADC_data[i];
}
ADC_data_avr=ADC_data_sum/10;
lcddisplaytable(0x80+0x40,"Average=",8);
ADC_data_avr_ge=ADC_data_avr*5/1024;
lcddisplay(0x88+0x40,ADC_data_avr_ge+48);
lcddisplay(0x89+0x40,'.');
ADC_data_avr_fen=(ADC_data_avr*50/1024)%10 ;
lcddisplay(0x8a+0x40,ADC_data_avr_fen+48);
ADC_data_avr_miao=(ADC_data_avr*50/102)%10;
lcddisplay(0x8b+0x40,ADC_data_avr_miao+48);
lcddisplay(0x8c+0x40,'V');
rs232_send(ADC_data_avr_ge,'.',ADC_data_avr_fen,ADC_data_avr_miao);
EEPROM_write(ADC_data_avr_ge,ADC_data_avr_fen,ADC_data_avr_miao);
key=1;
delay_1ms(1000);
}
}
}

#define Fosc 11071690// 22118400
#define BAUD 115200 //波特率
#define RELOAD_115200 (256 - (Fosc/16*10/BAUD+5)/10 ) //1T模式, 波特率加倍
#define BRTx12_enable() AUXR |= 0x04 //BRT 独立波特率发生器的溢出率快 12 倍
#define BRT_start() AUXR |= 0x10 //启动独立波特率发生器 BRT 计数。
void initiate_RS232 (void) //串口初始化
{
ES = 0; //禁止串口中断
SCON = 0x50; //可变波特率. 8位无奇偶校验
AUXR |= 0x01; //使用独立波特率发生器
PCON |= 0x80; //波特率加倍
BRTx12_enable(); //BRT 独立波特率发生器的溢出率快 12 倍
BRT = RELOAD_115200; //设置独立波特率发生器 BRT 的自动重装数
BRT_start(); //启动独立波特率发生器 BRT 计数。
ES = 1;
}
//---------------------------------------------------------------------
void Send_Byte(uchar one_byte) //发送一个字节
{
TI = 0; //清零串口发送中断标志
SBUF = one_byte;
while (TI == 0);
TI = 0; //清零串口发送中断标志
}
void rs232_send(uchar ge,uchar dian,uchar fen,uchar miao)
{
Send_Byte(ge);
Send_Byte(dian);
Send_Byte(fen);
Send_Byte(miao);
}

回答3:

你的程序应该判断是否AD完成!
现在的情况是有时候AD没有结束,你就把结果读进去了,所以会出现不规律的情况。增加一个if判断语句即可。

回答4:

你用ALE作为时钟