#include<reg51.h> #include<intrins.h> #define uchar unsigned char sbit P2_1=P2^1; //定义数码管位码端口 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};//带小数点的0~5六个 uchar code leddata[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //共阳极0~9十个段码/段码 //********************************* //延时子程序 //********************************* void delay(uchar n) { uchar i,j; for(i=0;i<n;i++) for(j=0;j<125;j++); } //********************************* //将AD转换输出的数据转换成相应的 //电压值并且显示出来 //********************************* void convert(int volt_data) { uchar temp; P0=leddata_dot[volt_data/51]; //AD转换的值/51即为个位的电压值 P2_1=1; //显示个位的值 delay(3); P2_1=0; if((volt_data%51)<0x19) //余数小于19H,显示小数点的后第一位 { P0=leddata[(volt_data%51)*10/51]; P2_2=1; delay(3); P2_2=0; } else { P0=leddata[(volt_data%51)*10/51]; //余数大于19H,结果再加上5 P2_2=1; //显示小数点的后的第一位 delay(3); P2_2=0; } temp=(((volt_data%51)*10)%51); if(temp<0x19) //余数小于19H,显示小数点的后第二位 { P0=leddata[temp*10/51]; P2_3=1; delay(3); P2_3=0; } else { P0=leddata[temp*10/51]; //余数大于19H,结果再加上5 P2_3=1; //显示小数点的后的第二位 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; //启动AD转换 if(EOC==0) //等待转换结束 delay(100); while(EOC==0); OE=1; //允许输出 volt_data=P1; //暂存转换结果 OE=0; //关闭输出 convert(volt_data); //调用数据处理子程序 } }