proteus仿真问题,求解答。。。。
51单片机吧
全部回复
仅看楼主
level 6
2016年02月04日 13点02分 1
level 6
用proteus仿真ad转换,用adc0808,发现adc0808芯片的输出有问题。如上图,电压表与液晶屏显示有出入。
第二幅图 是adc0808输出的电平,(用p2口接受0808的输出,再在p3口显示接收的电频,DATA=P2,P3=DATA)
发现p3口电频=00010101= 21
21*500/255=41 这说明LCD上显示没错,而是adc0808芯片输出的信号有错。
2016年02月04日 13点02分 2
level 6
下面给部分程序
void data_change(void)//ad输出
{
start=0;
oe=0;
start=1;
start=0;
while (eoc==0);
oe=1;
DATA = P2;
oe=0;
}
void data_pro(void)//数值处理
{uint t;
t=DATA*500/255;
t1=t/100;
t2=t/10%10;
t3=t%10;
}
void main(void)//主函数
{
InitTimer0();
LCD_init();
while(1)
{ data_change();
data_pro();
watch_display();
P3=DATA;
}
}
2016年02月04日 13点02分 3
个位数是对100求余[呵呵]
2016年02月05日 00点02分
@抗压吧务团队🌹 对100求余那出来的是十位和各个位[不高兴]
2016年02月05日 00点02分
@怕端午的粽子 数值换算木有错的,是adc0808输出有问题
2016年02月05日 00点02分
2016年02月05日 00点02分
level 6
求大神[乖],我实在不知哪错了
2016年02月04日 13点02分 4
level 6
而且随变阻器移动,电压表正常增大,二显示屏上是从变大到变小再变大再变小如此反复。
0v和5v倒是正常显示。
2016年02月04日 13点02分 5
level 13
ADC0808的时钟信号怎么来的?
2016年02月04日 13点02分 6
定时器定时5us,中断服务加clk=~clk。所以频率应该是100khz
2016年02月04日 14点02分
@怕端午的粽子 用示波器看过clk接口频率正常
2016年02月04日 14点02分
@怕端午的粽子 建议你从ALE出来,用分频电路,ADC0808在proteus里面经常会莫名其妙的
2016年02月04日 14点02分
level 6
上全代码
#include <reg51.h>
#include<function51.h>
typedef unsigned int uint;
typedef unsigned char uchr;
uchr code num[ ]={0x30,0x31,0x32,0x33,0x34,
0x35,0x36,0x37,0x38,0x39,};
sbit clk = P1^0;
sbit start = P1^1;
sbit eoc =P1^2;
sbit oe =P1^3;
sbit ale=P1^4 ;
sbit RS = P1^5;
sbit RW = P1^6;
sbit E = P1^7;
unsigned long DATA;
uchr t1,t2,t3;
void LCD_init(void);//初始化函数
void LCD_write_command(uchr command);//写指令函数
void LCD_write_data(uchr dat);//写数据函数
void LCD_disp_char(uchr x,uchr y,uchr dat);//在某个屏幕位置上显示一 个字符,X(0-16),y(1-2)
void watch_display(void);//显示函数
void data_change(void);//ad转换
void data_pro(void); //数据显示处理
2016年02月05日 02点02分 7
level 6
void LCD_init(void)
{
LCD_write_command(0x38);//设置 8 位格式,2 行,5x7
LCD_write_command(0x0c);//整体显示,关光标,不闪烁
LCD_write_command(0x06);//设定输入方式,增量不移位
LCD_write_command(0x01);//清除屏幕显示
delay_us(100);
}
void LCD_write_command(uchr command)
{
P0=command;
RS=0;
RW=0;
E=1;
delay_us(1);
E=0;
}
void LCD_write_data(uchr dat)
{
P0=dat;
RS=1;
RW=0;
E=1;
delay_us(1);
E=0;
}
void LCD_disp_char(uchr x,uchr y,uchr dat)
{
uchr address;
if(x==1)
address=0x80+y;
else
address=0xc0+y;
LCD_write_command(address);
LCD_write_data(dat);
}
void data_change(void)
{
start=0;
oe=0;
start=1;
start=0;
while (eoc==0);
oe=1;
DATA = P2;
oe=0;
}
void data_pro(void)
{uint t;
t=DATA*500/255;
t1=t/100;
t2=t/10%10;
t3=t%10;
}
2016年02月05日 02点02分 8
level 6
void InitTimer0(void)
{
TMOD = 0x01;
TH0 = 0xFF;
TL0 = 0xFB;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void Timer0Interrupt(void) interrupt 1
{
TH0 = 0xFF;
TL0 = 0xFB;
clk=~clk;
}
void watch_display(void)
{
LCD_disp_char(1,1,'v');
LCD_disp_char(1,2,'o');
LCD_disp_char(1,3,'l');
LCD_disp_char(1,4,':');
LCD_disp_char(2,6,num[t1]);
LCD_disp_char(2,7,'.');
LCD_disp_char(2,8,num[t2]);
LCD_disp_char(2,9,num[t3]);
LCD_disp_char(2,10,'V');
}
void main(void)
{
InitTimer0();
LCD_init();
while(1)
{ data_change();
data_pro();
watch_display();
P3=DATA;
}
}
2016年02月05日 02点02分 9
level 6
这是clk的仿真波形图一格10us,周期好像有问题,但我用定时方式2也一样的波。
void InitTimer0(void)
{
TMOD = 0x02;
TH0 = 0x00;
TL0 = 0xFB;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void Timer0Interrupt(void) interrupt 1
{
TH0 = 0x00;
TL0 = 0xFB;
CLK=~CLK
}
2016年02月05日 02点02分 10
level 6
2016年02月05日 02点02分 11
1