ADC0804 数码管显示数据错误 请指正
时间:10-02
整理:3721RD
点击:
- /*
- 将 ADC0804 的输出变量显示在数码管上
- */
- #include<reg52.h>
- #include<intrins.h>
- #define uint unsigned int
- #define uchar unsigned char
- uchar code table[]={
- 0x3f,0x06,0x5b,0x4f,
- 0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,
- 0x39,0x5e,0x79,0x71};
- sbit dula=P2^6;
- sbit wela=P2^7;
- sbit wr=P3^6;
- sbit rd=P3^7;
- uchar num;
- void delayms(uint z)
- {
- uint x;
- while(z--)
- {
- for(x=110;x>0;x--);
- }
- }
- void display(uchar aa,uchar bb,uchar cc)
- {
- wela=1;
- P0=0xfe;
- wela=0;
- P0=0xff;
- dula=1;
- P0=table[aa];
- dula=0;
- delayms(3);
- wela=1;
- P0=0xfd;
- wela=0;
- P0=0xff;
- dula=1;
- P0=table[bb];
- dula=0;
- delayms(3);
- wela=1;
- P0=0xfb;
- wela=0;
- P0=0xff;
- dula=1;
- P0=table[cc];
- dula=0;
- delayms(3);
- }
- void displayNum(uchar num)
- {
- uchar aa,bb,cc;
- aa=num/100;
- bb=num%100/10;
- cc=num%10;
- display(aa,bb,cc);
- }
- void init()
- {
- num=0;
- //cs set 0
- wela=1;
- P0=0x7f;
- wela=0;
- }
- void getData()
- {
- //start conversion
- wr=1;
- wr=0;
- wr=1;
- delayms(10);
- //output
- P1=0xff;//读取之前写入全1
- rd=0;
- delayms(2); //ns数量级 可以不考虑吧
- num=P1;
- rd=1;
- delayms(2); //ns数量级 可以不考虑吧
- //P1=num;
- //delayms(10);
- }
- void main()
- {
- init();
- while(1)
- {
- displayNum(num);
- getData();
- }
- }
void main()
{
uchar temp;
init();
while(1)
{
//for(temp=15;temp>0;temp--)//延长AD转换时间
//displayNum(num);
getData();
}
}
主函数换成以上代码,调节电位器,P1可以获取数据。
void main()
{
uchar temp;
init();
while(1)
{
for(temp=255;temp>0;temp--)//延长AD转换时间
displayNum(temp);
//getData();
}
}
主函数换成以上代码,数码管可以准确动态的显示数据
void main()
{
init();
while(1)
{
displayNum(num);
getData();
}
}
换成这个代码后,P1为0xff,数码管显示255,请问哪里有错误。
另外,getData中的P1=0xff,换成什么,数码管就显示什么数据。
读取时间延时太短,数据尚未读入
- /*
- 将 ADC0804 的输出变量显示在数码管上
- */
- #include<reg52.h>
- #include<intrins.h>
- #define uint unsigned int
- #define uchar unsigned char
- uchar code table[]={
- 0x3f,0x06,0x5b,0x4f,
- 0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,
- 0x39,0x5e,0x79,0x71};
- sbit dula=P2^6;
- sbit wela=P2^7;
- sbit wr=P3^6;
- sbit rd=P3^7;
- uchar num;
- void delayms(uint z)
- {
- uint x;
- while(z--)
- {
- for(x=110;x>0;x--);
- }
- }
- void display(uchar aa,uchar bb,uchar cc)
- {
- wela=1;
- P0=0x7e;
- wela=0;
- P0=0xff;
- dula=1;
- P0=table[aa];
- dula=0;
- delayms(2);
- wela=1;
- P0=0x7d;
- wela=0;
- P0=0xff;
- dula=1;
- P0=table[bb];
- dula=0;
- delayms(2);
- wela=1;
- P0=0x7b;
- wela=0;
- P0=0xff;
- dula=1;
- P0=table[cc];
- dula=0;
- delayms(2);
- }
- void displayNum(uchar num)
- {
- uchar aa,bb,cc;
- aa=num/100;
- bb=num%100/10;
- cc=num%10;
- display(aa,bb,cc);
- }
- void init()
- {
- num=0;
- //cs set 0
- wela=1;
- P0=0x7f;
- wela=0;
- }
- void getData()
- {
- //start conversion
- wr=1;
- wr=0;
- wr=1;
- delayms(2);
- //output
- rd=0;
- delayms(2);
- num=P1;
- rd=1;
- delayms(2);
- }
- void main()
- {
- init();
- while(1)
- {
- getData();
- displayNum(num);
- }
- }
更正的地方:display()函数中的P0的赋值予以修改
仍存在的问题:三位数码管中的百十位数码管亮度大约为个位亮度的60%,仍不知道原因
把你程序中数据输出部分的延时换成um级的,你的延时时间太少,延长一下即可(通常用_nop_()做延时)效果比较好
请问,um级是什么意思,百度没有找到,你这里指的是不是us级的时间呢?
本人不是电子专业的,只是想从计算机转入此行,有很多基础不会,还望指教。
_nop_()表示空循环一个机器指令的时间,12M中表示1us;6M中表示2us;24M中表示0.5us(微妙)
1S=1000ms=1000 000us;
是的,不小心打错了...
