#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); //调用数据处理子程序
}
}