描述:
本帖最后由 u012842154 于 2016-07-29 16:05:21 编辑
adc080851单片机proteus仿真
大神们好,下面是小弟仿真得 adc0808 测量输入电压后 将值用16进制数反馈给 串口调试助手,但是只有在测量+5V 和 0V得时候 反馈ff 和 00 是正确得 别的中间得值都不对(我加了个直流电压表看输入电压 再把得出得数据 * 5/256 但是值都对应不上)#include<reg51.h>
#include"hbx.h"
void initTimer0(void);
void SendOneByte(uchar c);
uchar date;
sbit add_a = P3^5;
sbit add_b = P3^6;
sbit add_c = P3^7;
sbit ale = P3^4;
sbit clo = P3^3;
sbit sta = P1^0;
sbit eoc = P1^1;
sbit oe = P3^2;
void main(void){
initTimer0();
add_a = add_b =add_c = 0;
while(1){
oe = 0;
sta = 0;
sta = 1;
sta = 0;
ale = 1;
while( eoc == 0 );
oe = 1;
date = P2;
oe = 0;
SendOneByte(date);
}
}
void initTimer0(){
TMOD = 0x22;
TH0 = 0xfb;
TL0 = 0xfb;
EA = 1;
ET0 = 1;
TR0 = 1;
SCON = 0x40;
TH1 = 0xFD;
TL1 = TH1;
PCON = 0x00;
TR1 = 1;
}
void timer0Interrupt(void) interrupt 1{
clo =~ clo;
}
void SendOneByte(unsigned char c)
{
SBUF = c;
while(!TI);
TI = 0;
}

解决方案1:
#include<reg51.h>
void initTimer0(void);
void SendOneByte(unsigned char c);
unsigned char date;
sbit add_a = P3^5;
sbit add_b = P3^6;
sbit add_c = P3^7;
sbit ale = P3^4;
sbit clo = P3^3;
sbit sta = P1^0;
sbit eoc = P1^1;
sbit oe = P3^2;
void main(void){
int timeout;
initTimer0();
add_a = add_b =add_c = 0;
while(1){
oe = 0;
sta = 0;
sta = 1;
sta = 0;
ale = 1;
timeout=0;
while ((eoc == 0)&&(timeout++<5000));
oe = 1;
date = P2;
oe = 0;
SendOneByte(date);
}
}
void initTimer0(){
TMOD = 0x22;
TH0 = 0xfb;
TL0 = 0xfb;
EA = 1;
ET0 = 1;
TR0 = 1;
SCON = 0x40;
TH1 = 0xFD;
TL1 = TH1;
PCON = 0x00;
TR1 = 1;
}
void timer0Interrupt(void) interrupt 1{
clo =~ clo;
}
void SendOneByte(unsigned char c)
{
SBUF = c;
while(!TI);
TI = 0;
}
ADC0808的21脚是高位P2.7才对的,17脚接P2.0,输出是16进码,
所以对口要用16进码才看到东西的,
还有这程序没有timeout,这有机会Halt的。
while ((eoc == 0)&&(timeout++<5000));
还有其它问题的。
#include<reg51.h>
void initTimer0(void);
void SendOneByte(unsigned char c);
unsigned char date;
sbit add_a = P3^5;
sbit add_b = P3^6;
sbit add_c = P3^7;
sbit ale = P3^4;
sbit clo = P3^3;
sbit sta = P1^0;
sbit eoc = P1^1;
sbit oe = P3^2;
void main(void){
initTimer0();
add_a = add_b =add_c = 0;
while(1){
oe = 0;
sta = 0;
sta = 1;
sta = 0;
ale = 1;
while( eoc == 0 );
oe = 1;
date = P2;
oe = 0;
SendOneByte(date);
}
}
void initTimer0(){
TMOD = 0x22;
TH0 = 0xfb;
TL0 = 0xfb;
EA = 1;
ET0 = 1;
TR0 = 1;
SCON = 0x40;
TH1 = 0xFD;
TL1 = TH1;
PCON = 0x00;
TR1 = 1;
}
void timer0Interrupt(void) interrupt 1{
clo =~ clo;
}
void SendOneByte(unsigned char c)
{
SBUF = c;
while(!TI);
TI = 0;
}