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数据
}
/**********************************************************************/ 展开
按照郭天祥那本书做
用滑动变阻器模拟电压,通过转换后在数显管显示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数据
}
/**********************************************************************/ 展开
3个回答
展开全部
首先,不知道你的原理图中的 VCC的标号是怎么画的,我记得那个标号一般是GND的,你在确认一下
其次,‘P3=0x11; //为了验证是不是我初始设值的问题...’,这里P3作为输入不建议做输出使用,P1口闲着可以随便用
然后,数码管动态显示应该预留足够的显示时间,程序中一次while循环一次
AD采集用到4个'delay (10) ', 数码管显示 有10个{delay (2)+delay (2)}
也就是说一个周期只有不到一半的时间在显示,那么做出来的效果数码管肯定不会太亮,建议适当增加数码管的显示时间(高级应用也可考虑用定时器中断定时更新数码显示)
还有就是‘uchar temp3; //temp3用作暂时储存P0...’,这里没必要保留P0的数据,你在退出显示的时候已经把位选关了
最后,不知道你是按照什么样的步骤软件仿真的,建议使用断点观察配合单步调试来查找问题,可以先不考虑数码管显示,AD采集数据正常之后再考虑显示,一步一步来分块排查解决问题
其次,‘P3=0x11; //为了验证是不是我初始设值的问题...’,这里P3作为输入不建议做输出使用,P1口闲着可以随便用
然后,数码管动态显示应该预留足够的显示时间,程序中一次while循环一次
AD采集用到4个'delay (10) ', 数码管显示 有10个{delay (2)+delay (2)}
也就是说一个周期只有不到一半的时间在显示,那么做出来的效果数码管肯定不会太亮,建议适当增加数码管的显示时间(高级应用也可考虑用定时器中断定时更新数码显示)
还有就是‘uchar temp3; //temp3用作暂时储存P0...’,这里没必要保留P0的数据,你在退出显示的时候已经把位选关了
最后,不知道你是按照什么样的步骤软件仿真的,建议使用断点观察配合单步调试来查找问题,可以先不考虑数码管显示,AD采集数据正常之后再考虑显示,一步一步来分块排查解决问题
展开全部
……
P3=0x11; //为了验证是不是我初始设值的问题,这里随便打的数字
--不可乱打字呀!
--为了使用 P3 输入,必须写:P3 = 0xFF;
adrd=1;
delay (10);
adrd=0;
delay (10);
adval=P3;
--这里,倒是可以随意的打上数字,如:
--P3=0x11;
--这么打,数码管,就应该显示 11。
--如果能显示出来 11,说明 ADC 部分,有错。
--如果不能显示出来 11,说明显示部分,有错。
……
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 的结果,送给变量。
再试试看。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询