咱們的ADC0809電壓表
///////通道編號的數(shù)碼管顯示函數(shù)///////
void disp_in(uchar a)
{
ADD_A = 0;
ADD_B = 0;
ADD_C = 0;
P0 = numtable[a];
delay(3);
}
///////通道1的AD轉(zhuǎn)換函數(shù)///////
void ADC_1()
{
STA_ALE = 0;
STA_ALE = 1;
ADD_A = 1;
ADD_B = 0;
ADD_C = 1;
ADC_B = 0;
ADC_A = 0;
STA_ALE = 0;
}
///////通道2的AD轉(zhuǎn)換函數(shù)///////
void ADC_2()
{
STA_ALE = 0; STA_ALE = 1;
ADD_A = 1;
ADD_B = 0;
ADD_C = 1;
ADC_B = 0;
ADC_A = 1;
STA_ALE = 0;
}
///////判別是哪條通道AD轉(zhuǎn)換函數(shù)///////
void ADC(uchar ad_dat)
{
if (1 == keynum)
{
ADC_1();
disp();
disp_in(1);
}
else if (2 == keynum)
{
ADC_2();
disp();
disp_in(2);
}
else if (3 == keynum)
{
TR1 = 1;
if (!shift)
{
ADC_1();
disp();
disp_in(1);
}
if (shift)
{
ADC_2();
disp();
disp_in(2);
}
}
else if (16 == keynum)
{
ADC_2();
disp();
disp_in(2);
}
while ( 0 == OE_EOC )
{
keyscan();
if (1 == keynum)
{
disp();
disp_in(1);
}
else if (2 == keynum)
{
disp();
disp_in(2);
}
else if (3 == keynum)
{
TR1 = 1;
if (!shift)
{
disp();
disp_in(1);
}
if (shift)
{
disp();
disp_in(2);
}
}
}
temp = ad_dat*0.0196078;
val_int = (uchar) temp;
val_decimal = (uchar) ((temp - val_int)*100);
}
///////定時器初始化函數(shù)//////
void timer_init()
{
IE = 0x8a; TMOD = 0x12;
TH0 = 0x14;
TL0 = 0x00;
TR0 = 1;
TH1 = -50000/256;
TL1 = -50000%6;
}
///////主函數(shù)//////
int main ()
{
timer_init();//初始化定時器
while(1)
{
keyscan();//矩陣鍵盤掃描賦值
if (1 == keynum || 2 == keynum || 3== keynum) //當有鍵按下時,啟動ADC轉(zhuǎn)換
ADC(P2);
else //否則顯示四個0
{
disp();
disp_in(0);
}
}
return 0;
}
///////1S顯示切換的定時中斷函數(shù)(T1)//////
void TIMER(void) interrupt 3
{
static uchar timer;
timer++;
if (20 == timer)
{
timer = 0;
shift = !shift;//用于兩位的1S顯示切換
}
}
///////提供給ADC芯片CLOCK的定時函數(shù)(T0)//////
void OTHER_CLOCK(void) interrupt 1
{
CLK = !CLK;
}
說說主要遇到的問題和學到的東西:一個是因為用了等待查詢方式來讀取ADC0809的AD轉(zhuǎn)換結(jié)果,加上矩陣鍵盤和38譯碼器選址,導致兩個問題:
1.各個功能的邏輯關(guān)系混亂。雖然只有幾個功能模塊,但是也思考了一番才有了新的程序架構(gòu)。還有就是始終沒能適應自頂向下的編程思維,比如會習慣先編出ADC的START信號或者選址函數(shù),再去想用在哪里。而不是先直接構(gòu)造一個ADC處理的框架,再去想細節(jié)的實現(xiàn)。
2.還有數(shù)碼管動態(tài)顯示不停閃爍。調(diào)試的時候,也老想著,應該就是這樣了吧,改不了了吧,呵呵,可是解決之后再次覺得天無絕人之路啊,
ADD_A = 1;
ADD_B = 0; 這段語句起初P0 = numtable_DE[val_int];是放在首位的,結(jié)果想想是不是因為用38
ADD_C = 0; 譯碼器控制位選擾亂了下一位的段選,移一下位就搞定了……真是奇妙
P0 = numtable_DE[val_int];
delay(1);
評論