51 AD转换,用ADC0804,数据接P1.0-1.7,例子要求读取数据前先用P1=0Xff将P1口写1,什么原因?为何不写0?

作者&投稿:霍贸 (若有异议请与网页底部的电邮联系)
51单片机AD转换时数据读取为什么赋值给P1口?~

如果你用的是并行8位AD芯片转换的话 那么就需要8根数据线 而51单片机的IO作为GPIO口来使用的话 Px(P0弱上拉)都差不多,Px也是8位的而且支持字节操作,这样51单片机可以直接从Px寄存器中直接读到AD的值。并不一定非要是P1口。占用整个端口就是为了操作方便。

此处用四位共阴数码管
#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit wr=P3^6;
sbit rd=P3^7;
sbit led0=P2^0;
sbit led1=P2^1;
sbit led2=P2^2;
sbit led3=P2^3;
sbit led3v=P3^2;
sbit cs=P3^5;
unsigned int temp,temp1,qian,bai,shi,ge;
unsigned char ledmap[20]={
0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,
0xbf,0x86,0xdb,0xcf,0xe6,
0xed,0xfd,0x87,0xff,0xef};
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void start()
{
wr=1;
_nop_();
wr=0;
delay(1);
wr=1;
}
void Load()
{
rd=1;
_nop_();
rd=0;
_nop_();
delay(10);
temp1=P1;
rd=1;
}
void display()
{
led0=0;
qian=temp*100/51/100%10+10;
P0=ledmap[qian];
delay(5);
led0=1;
led1=0;
bai=temp*100/51/10%10;
P0=ledmap[bai];
delay(5);
led1=1;
led2=0;
shi=temp*100/51%10;
P0=ledmap[shi];
delay(5);
led2=1;
led3=0;
ge=temp*1000/51%10;
P0=ledmap[ge];
delay(5);
led3=1;
// delay(10);
}
void main()
{
int i=0;
uint y;
cs=0;
temp=0;
while(1)
{
start();
Load();
temp+=temp1;
i++;
if(i==2)
{
temp/=2;
for(y=50;y>0;y--)
display();
i=0;
temp=0;
}
}
}

51的P1口可输入可输出。
那么哪条指令让它作为输入口,怎么样才能让它作为输入口呢?
每个口上都有一个锁存器,锁住之前写的值。
比如,口上只是接一个上拉电阻,这个口作为输入应该是高电平吧。
那你往口里写一个0,口会输出0,这个口就成了低电平了。此时,你读这个IO口,也会是低电平。
如果不改写为1,锁存器内就一直是0,也就是输出0 ,程序读这个口上的电平也是0。
改写为1后,这个口上的电平才会1,或者说,不会把这个口拉低。
作为输入口时,要事先写1,也可以不用每次都写,只要里面不是0就成。

简单的来说就是:因为单片机的构造(上拉了电阻),需要将P1口写1,使之成为高电平,能够作为输入口。


垣曲县13973356618: 51 AD转换,用ADC0804,数据接P1.0 - 1.7,例子要求读取数据前先用P1=0Xff将P1口写1,什么原因?为何不写0? -
郝希当归: 51的P1口可输入可输出.那么哪条指令让它作为输入口,怎么样才能让它作为输入口呢?每个口上都有一个锁存器,锁住之前写的值.比如,口上只是接一个上拉电阻,这个口作为输入应该是高电平吧.那你往口里写一个0,口会输出0,这个口就成了低电平了.此时,你读这个IO口,也会是低电平.如果不改写为1,锁存器内就一直是0,也就是输出0 ,程序读这个口上的电平也是0.改写为1后,这个口上的电平才会1,或者说,不会把这个口拉低.作为输入口时,要事先写1,也可以不用每次都写,只要里面不是0就成.简单的来说就是:因为单片机的构造(上拉了电阻),需要将P1口写1,使之成为高电平,能够作为输入口.

垣曲县13973356618: 51单片机AD转换的问题 -
郝希当归: 不能,因为这两个ADC0804的地址是一样的.地址一样,片选也一样,不能同时采样.

垣曲县13973356618: 51单片机AD采样后如何转换成PWM -
郝希当归: 不是很明白你为什么要把数据转换成PWM信号输出,如果你想这么做的话,可以直接用串口把单片机读到的数据输出

垣曲县13973356618: 51单片机输出电压随输入电压变化,如何实现 -
郝希当归: 以下是单片机实践团为您解答:1、对于问题解决应该采取最简单有效的方法,说一下我的观点:对于大部分网友采用AD配合DA来实现,个人觉得是多此一举.如果是保留采用AD来采集的话,我们大可以使用定时器控制输出频率可变的方波...

垣曲县13973356618: 现有一个传感器,通过放大电路把模拟信号传到51单片机上,需要通过AD模块进行模数转换. -
郝希当归: 第6脚接信号电压正,第7脚接信号电压负,跟第8脚并一块.

垣曲县13973356618: AD0804的可以接51单片机的P1口吗 -
郝希当归: 1,ADC0804不是片外存储器,它的数据引脚可以连接包括P0在内的任意一个端口,但它的控制引脚CS端最好不要接在P0口,因为P0口内部没有上拉电阻,需要要外部接上拉电阻才能输出高电平,使用不方便;2,74HC573锁存器的LE端可以接除P0口以外的任意端口,理由同上.

垣曲县13973356618: 求用51单片机和AD0804测光敏的电阻阻值的程序,越简单越好(1602显示) -
郝希当归: 0804是并口,可以考虑用0832做串口的.这些都是八位的ADC,精度都不算很高,不过效果还说得过去,如果范围超过5V,需要用电阻分压的方式,甚至加电压跟随器的方式来采集,这样就能保证精度了,需要可以加我,我这里有些资料,可以交流一下.

垣曲县13973356618: ADC转换公式ADC芯片,模拟输入V,数字输出D,参考电压是VREF,它们之间的关系是什么?比如说ADC0804,它是8位的,有什么换算公式我查询了看... -
郝希当归:[答案] 由于是8位ADC,当单端输出时,数字输出D的范围是0-255,这时的公式应为:D=V/VREF*256,或 D*VREF/256=V. 当采用差分输出时,数字输出D的范围是-128 - +127,这时的公式应为:D=V/VREF*128,或 D*2*VREF/256=V.

垣曲县13973356618: ADC0804转换后的数字量怎样转化为模拟量(十进制)? -
郝希当归: 51芯片,可以用十进制调整语句进行调整:DA A

垣曲县13973356618: 求个51单片机 AD 程序 -
郝希当归: 255,假设ADC0809的输出端接到你的P2口,在5V时对应的是0XFF51没有ad模块,那么知道了P2的值是不是就知道了电压的值,V=P2*5/,要自己加ADC809或者别的,这个很简单,你的输入端接到ADC0809的输入端,再根据V的范围(也即P2口得到的值得大小)确定LED的亮灭

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网