学的这个专业,但是没怎么好好学,现在工作了才又捡起来,真是挺惭愧的,浪费自己的时间。最近在学习郭天祥老师的51单片机过程中,发现了郭老师写的有些AD转换例子还有改进的空间,论坛内也没有相关帖子,就打算上传下让后来学习的人参考。
这个例子很简单,项目是:利用adc0804进行模数转换,当拧动实验板上的ad旁边的电位器re2时,在数码管的前三位以十进制的方式动态显示出ad转换后的数字量,数值在0-255变化; 如果用郭老师的程序写出来,会发现在学习板上只能显示上电的初始值,或者显示128,需要改进a的值,我试了下,必须改到大概8000往上才能实时刷新显示,而且动态显示的数码管肉眼可见的刷新率低,具体原因是因为转换时间不够,这个转换时间大概有80ms左右?我不知道为什么会这么高,但是程序上运行来看,确实,如有错误,希望大佬指正,下面是我改进后的程序,能够实时显示,而且清晰,如果输出会有一两个个数的抖动,那是因为它的原理决定。
单片机源程序如下:
#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 duan=P2^6;
sbit wei=P2^7;
sbit wr=P3^6;
sbit rd=P3^7;
uchar bai,shi,ge,num;
uint a,a1,a2,a3;
void set();
void dsplay(uchar,uchar,uchar);
void delayms(uint x)
{
uint i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
void main()
{
set();
while(1)
{
wr=1;
_nop_();
wr=0;
_nop_();
wr=1;
for(a=30;a>0;a--)
{
dsplay(a1,a2,a3);
}
P1=0xff;
rd=1;
_nop_();
rd=0;
_nop_();
num=P1;
rd=1;
a1=num/100;
a2=num%100/10;
a3=num%10;
}
}
void set()
{
wei=1;
P0=0x7f;
wei=0;
a1=a2=a3=0;
}
void dsplay(uchar a1,uchar a2,uchar a3)
{
wei=1;
P0=0x7e;
wei=0;
P0=0x00;
duan=1;
P0=table[a1];
duan=0;
P0=0xff;
delayms(1);
wei=1;
P0=0x7d;
wei=0;
P0=0x00;
duan=1;
P0=table[a2];
duan=0;
P0=0xff;
delayms(1);
wei=1;
P0=0x7b;
wei=0;
P0=0x00;
duan=1;
P0=table[a3];
duan=0;
P0=0xff;
delayms(1);
}
|