學的這個專業(yè),但是沒怎么好好學,現(xiàn)在工作了才又撿起來,真是挺慚愧的,浪費自己的時間。最近在學習郭天祥老師的51單片機過程中,發(fā)現(xiàn)了郭老師寫的有些AD轉(zhuǎn)換例子還有改進的空間,論壇內(nèi)也沒有相關(guān)帖子,就打算上傳下讓后來學習的人參考。
這個例子很簡單,項目是:利用adc0804進行模數(shù)轉(zhuǎn)換,當擰動實驗板上的ad旁邊的電位器re2時,在數(shù)碼管的前三位以十進制的方式動態(tài)顯示出ad轉(zhuǎn)換后的數(shù)字量,數(shù)值在0-255變化; 如果用郭老師的程序?qū)懗鰜恚瑫l(fā)現(xiàn)在學習板上只能顯示上電的初始值,或者顯示128,需要改進a的值,我試了下,必須改到大概8000往上才能實時刷新顯示,而且動態(tài)顯示的數(shù)碼管肉眼可見的刷新率低,具體原因是因為轉(zhuǎn)換時間不夠,這個轉(zhuǎn)換時間大概有80ms左右?我不知道為什么會這么高,但是程序上運行來看,確實,如有錯誤,希望大佬指正,下面是我改進后的程序,能夠?qū)崟r顯示,而且清晰,如果輸出會有一兩個個數(shù)的抖動,那是因為它的原理決定。
單片機源程序如下:
#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);
}
|