#include<reg51.h> #include<intrins.h> #define uchar unsigned char sbit P2_1=P2^1; //定義數(shù)碼管位碼端口 sbit P2_2=P2^2; sbit P2_3=P2^3; sbit OE=P3^0; //定義ADC0808端口 sbit EOC=P3^1; sbit ST=P3^2; sbit P3_4=P3^4; sbit P3_5=P3^5; sbit P3_6=P3^6; uchar code leddata_dot[]={0x40,0x79,0x24,0x30,0x19,0x12};//帶小數(shù)點(diǎn)的0~5六個(gè) uchar code leddata[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //共陽(yáng)極0~9十個(gè)段碼/段碼 //********************************* //延時(shí)子程序 //********************************* void delay(uchar n) { uchar i,j; for(i=0;i<n;i++) for(j=0;j<125;j++); } //********************************* //將AD轉(zhuǎn)換輸出的數(shù)據(jù)轉(zhuǎn)換成相應(yīng)的 //電壓值并且顯示出來(lái) //********************************* void convert(int volt_data) { uchar temp; P0=leddata_dot[volt_data/51]; //AD轉(zhuǎn)換的值/51即為個(gè)位的電壓值 P2_1=1; //顯示個(gè)位的值 delay(3); P2_1=0; if((volt_data%51)<0x19) //余數(shù)小于19H,顯示小數(shù)點(diǎn)的后第一位 { P0=leddata[(volt_data%51)*10/51]; P2_2=1; delay(3); P2_2=0; } else { P0=leddata[(volt_data%51)*10/51]; //余數(shù)大于19H,結(jié)果再加上5 P2_2=1; //顯示小數(shù)點(diǎn)的后的第一位 delay(3); P2_2=0; } temp=(((volt_data%51)*10)%51); if(temp<0x19) //余數(shù)小于19H,顯示小數(shù)點(diǎn)的后第二位 { P0=leddata[temp*10/51]; P2_3=1; delay(3); P2_3=0; } else { P0=leddata[temp*10/51]; //余數(shù)大于19H,結(jié)果再加上5 P2_3=1; //顯示小數(shù)點(diǎn)的后的第二位 delay(3); P2_3=0; } } void main() { int volt_data; P3_4=1; //選擇通道3 P3_5=1; P3_6=0; while(1) { ST=0; _nop_(); ST=1; _nop_(); ST=0; //啟動(dòng)AD轉(zhuǎn)換 if(EOC==0) //等待轉(zhuǎn)換結(jié)束 delay(100); while(EOC==0); OE=1; //允許輸出 volt_data=P1; //暫存轉(zhuǎn)換結(jié)果 OE=0; //關(guān)閉輸出 convert(volt_data); //調(diào)用數(shù)據(jù)處理子程序 } }