标题: 新手求教关于单片机+ADC0808仿真问题 [打印本页]

作者: rsdwm    时间: 2022-1-25 22:07
标题: 新手求教关于单片机+ADC0808仿真问题
仿真目的:采用总线形式进行ADC0808仿真
问题:1.输出值范围与预期不符,量程应该为【0-5】,仿真结果是【0.88-3.45】且在变动的过程中出现了大于9的数;2.即使采集口没有接其他东西,也会显示一个定值;3.本来是采集IN0的数据,但是如果IN1的模拟量变化,显示的数据也会变化。
小弟我真的看不出来,照着视频一行一行敲的代码,求助个位大佬的帮助。

出错情况
1.未连接有初值


2.量程不对



3.端口“串线”

代码:
1.ADC0808
头文件:
  1. #ifndef __ADC0809_H__
  2. #define __ADC0809_H__

  3. #include <REGX52.H>
  4. #include <absacc.H>

  5. sbit EOC    = P3^5;

  6. #define AD_IN0 XBYTE[0X7FF8]
  7. #define AD_IN1 XBYTE[0X7FF9]
  8. #define AD_IN2 XBYTE[0X7FFA]
  9. unsigned char ADC_Conv();
  10.         
  11. #endif
复制代码
函数部分:
  1. #include "ADC0809.H"

  2. unsigned char ADC_Conv()
  3. {
  4.         unsigned char ad_result = 0;
  5.         AD_IN0  = 0x0000; //借助对端口地址执行写操作时序,来满足A/D的操作时序
  6.         while(EOC == 0);//查询方式  高电平结束
  7.         ad_result = AD_IN0;//借助对端口地址执行读操作时序,来满足A/D的操作时序
  8.         return ad_result;
  9. }

复制代码

2.主函数 与 显示服务函数
  1. #include <REGX52.H>
  2. #include "DISPLAY.H"
  3. #include "ADC0809.H"

  4. void display_service();

  5. unsigned char ad_result = 0; // 0-255
  6. int ad_show = 0;

  7. void main()
  8. {

  9.         while(1)
  10.         {
  11.                 DotDig1 = 1;
  12.                 ad_result = ADC_Conv();
  13.                 ad_show = ad_result * 1.0 *500/255;  //5v - 500  255-份
  14.                 display_service();
  15.                 Display();
  16.         }
  17. }

  18. void display_service()
  19. {
  20.         LEDBUF[0]=23;
  21.         LEDBUF[1]=ad_show/100%10;
  22.         LEDBUF[2]=ad_show/10%10;
  23.         LEDBUF[3]=ad_show%10;
  24. }
复制代码

附件:仿真与代码
ADC0808总线型.zip (112.88 KB, 下载次数: 8)




作者: TEC    时间: 2022-1-26 10:06
最好把ADC部分的电路图补全,这样好分析一点。你的AD转换函数应该是不对的,没有ADWR,ADRD等的设置。
作者: wulin    时间: 2022-1-26 11:58
给你一个示例
数字电压表ADC0808仿真.rar (76.21 KB, 下载次数: 18)


作者: 123456ZXC1    时间: 2022-1-26 12:54
ADC部分的电路图补全一下
作者: rsdwm    时间: 2022-1-26 15:48
这个是adc部分的电路图


作者: rsdwm    时间: 2022-1-26 15:51
123456ZXC1 发表于 2022-1-26 12:54
ADC部分的电路图补全一下

您好,我补了一下,麻烦看一看
作者: rsdwm    时间: 2022-1-26 16:04
耽误大家时间了,由于本人的粗心,没有把ALE引脚的网络标号改掉。导致ALE没有信号。改完之后可以正常的显示。
但是我有些许疑问,第一,为什么不连接的时候会显示一个固定值2.49。第二,如果我测得是端口一,但端口一没有接任何东西此时应该显示第一个疑问的固定值,但是改变接在端口二的滑动电阻改变电压,此时数码管显示的值会变动,这种“串线”的情况是由于什么。如果正常端口一接入滑动电阻,则端口二的变动不会造成端口一数值的紊乱。
作者: rsdwm    时间: 2022-1-26 16:05
rsdwm 发表于 2022-1-26 15:48
这个是adc部分的电路图

找到问题了  ALE引脚没改
作者: rsdwm    时间: 2022-1-26 16:06
wulin 发表于 2022-1-26 11:58
给你一个示例

谢谢,不过我的是总线方式  这个是io口控制的
作者: rsdwm    时间: 2022-1-26 16:07
TEC 发表于 2022-1-26 10:06
最好把ADC部分的电路图补全,这样好分析一点。你的AD转换函数应该是不对的,没有ADWR,ADRD等的设置。

谢谢,找到问题了,引脚标号错了。方便看一下我新回复的问题吗
作者: rsdwm    时间: 2022-1-26 16:07
123456ZXC1 发表于 2022-1-26 12:54
ADC部分的电路图补全一下

谢谢,找到问题了,引脚标号错了。方便看一下我新回复的问题吗
作者: TEC    时间: 2022-1-26 17:40
rsdwm 发表于 2022-1-26 16:07
谢谢,找到问题了,引脚标号错了。方便看一下我新回复的问题吗

嘿嘿,不是很懂这个总线型方式。你的ADC0809的时钟信号是单片机ALE引脚提供的?可以在仿真的时候加个示波器对照一下。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1