51单片机ad转换问题

用51单片机at89s52与adc0804进行ad转换按照郭天祥那本书做用滑动变阻器模拟电压,通过转换后在数显管显示0x00~0xff之间的数可是最后结果是无论如何调数显... 用51单片机at89s52与adc0804进行ad转换

按照郭天祥那本书做
用滑动变阻器模拟电压,通过转换后在数显管显示0x00~0xff之间的数
可是最后结果是无论如何调 数显管都是输出00 包括进行仿真也是
在线等答案

main.c

#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit adcs=P2^2; //控制A/D的cs端
sbit adwr=P2^0; //控制A/D的wr端
sbit adrd=P2^1; //控制A/D的rd端

const uint F=20; //晶振频率
const uint N=15000; //达到一次中断所完成的周期次数,9216即10ms
/******************************延时函数******************************/
void delay (uint ms)
{
uint i_delay,j_delay;
for (i_delay=0;i_delay<ms;i_delay++)
for (j_delay=0;j_delay<200;j_delay++);
}
/********************************************************************/

#include<display.c> //数码管显示函数

void main ()
{
uint i;
uchar num_fir,num_sec,adval;
adcs=0;
shu1=0;
shu2=0;
while (1)
{
adwr=1;
delay (10);
adwr=0;
delay (10);
adwr=1;
for (i=0;i<10;i++)
display(table[num_fir],table[num_sec]);
P3=0x11; //为了验证是不是我初始设值的问题,这里随便打的数字
adrd=1;
delay (10);
adrd=0;
delay (10);
adval=P3;
adrd=1;
num_fir=adval/16;
num_sec=adval%16;
}
}

display.c
/******************************数码管显示******************************/
uchar code table[]={0x30, 0xf3, 0xa4, 0xa2, 0x63, 0x2a, 0x28, 0xb3, 0x20, 0x22,0x21,0x67,0xec,0xe0,0x2c,0x2d}; //数字对应的十六进制
sbit shu1=P2^6; //控制数码管第一位
sbit shu2=P2^7; //控制数码管第二位
void display (uchar fir,uchar sec) //数码管显示
{
uchar temp3; //temp3用作暂时储存P0之前的数据、temp4用作暂时储存P2之前的数据
temp3=P0;

shu1=1; //显示第一位
shu2=0;
P0=fir;
delay (2);

shu2=1; //显示第二位
shu1=0;
P0=sec;
delay (2);
shu2=0;
P0=temp3; //恢复原来P0数据

}
/**********************************************************************/
展开
 我来答
Eryxe
推荐于2018-04-24 · TA获得超过320个赞
知道小有建树答主
回答量:99
采纳率:100%
帮助的人:84.2万
展开全部
首先,不知道你的原理图中的 VCC的标号是怎么画的,我记得那个标号一般是GND的,你在确认一下
其次,‘P3=0x11; //为了验证是不是我初始设值的问题...’,这里P3作为输入不建议做输出使用,P1口闲着可以随便用
然后,数码管动态显示应该预留足够的显示时间,程序中一次while循环一次
AD采集用到4个'delay (10) ', 数码管显示 有10个{delay (2)+delay (2)}
也就是说一个周期只有不到一半的时间在显示,那么做出来的效果数码管肯定不会太亮,建议适当增加数码管的显示时间(高级应用也可考虑用定时器中断定时更新数码显示)
还有就是‘uchar temp3; //temp3用作暂时储存P0...’,这里没必要保留P0的数据,你在退出显示的时候已经把位选关了

最后,不知道你是按照什么样的步骤软件仿真的,建议使用断点观察配合单步调试来查找问题,可以先不考虑数码管显示,AD采集数据正常之后再考虑显示,一步一步来分块排查解决问题
小新咥饼干
2014-02-20 · TA获得超过272个赞
知道小有建树答主
回答量:311
采纳率:0%
帮助的人:123万
展开全部

你用的是不是TX-1C开发板?参考的这本书?

更多追问追答
追问
书是……有点坑……
板自己看着电路图焊的
大侠看过那本书的话,应该会熟悉点吧?
追答
看是看过,不过记不太清了,你自己焊的电路板做数字实验应该没问题,但是这个是模数转换,模拟量很可能因为硬件的选材和焊接工艺受到影响,原因不好找啊
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
做而论道
高能答主

2014-02-20 · 把复杂的事情简单说给你听
知道大有可为答主
回答量:3万
采纳率:80%
帮助的人:1.2亿
展开全部
……
P3=0x11; //为了验证是不是我初始设值的问题,这里随便打的数字

--不可乱打字呀!
--为了使用 P3 输入,必须写:P3 = 0xFF;

adrd=1;
delay (10);
adrd=0;
delay (10);
adval=P3;
--这里,倒是可以随意的打上数字,如:
--P3=0x11;

--这么打,数码管,就应该显示 11。
--如果能显示出来 11,说明 ADC 部分,有错。
--如果不能显示出来 11,说明显示部分,有错。
……
更多追问追答
追问
显示出来的是00 就是不知道adc部分哪里有问题

前面那个注释是不小心打错了
追答
哦,我前面写的,有些纰漏。
……

adval=P3;
--这里,倒是可以随意的打上数字,如:

--adval = 0x11; ******这里改一下******

--这么打,数码管,就应该显示 11。
--如果能显示出来 11,说明 ADC 部分,有错。
--如果不能显示出来 11,说明显示部分,有错。
……

这么改,就是不用 ADC 了,直接,把 11,当做 ADC 的结果,送给变量。

再试试看。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式