學的這個專業,但是沒怎么好好學,現在工作了才又撿起來,真是挺慚愧的,浪費自己的時間。最近在學習郭天祥老師的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);
}
|