|
數(shù)字電壓表可以測(cè)量0~5V電壓,并在四位LED數(shù)碼管上顯示出來。測(cè)量最小分辨率為0.019V,測(cè)量誤差約為±0.02V。
注:附件包含仿真電路圖、程序源碼和.hex文件。
proteus仿真電路圖:
proteus仿真圖:
仿真演示.png (71.02 KB, 下載次數(shù): 35)
下載附件
2019-3-22 16:49 上傳
程序代碼:
#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;
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};//共陽極0~9十個(gè)段碼
//******************************************************************************************
//延時(shí)子程序
//******************************************************************************************
void delay(uchar n)
{
uchar i,j;
for(i=0;i<n;i++)
for(j=0;j<125;j++);
}
//**************************************************************
//將A/D轉(zhuǎn)換輸出的數(shù)據(jù)轉(zhuǎn)換成相應(yīng)的電壓值并顯示出來
//**************************************************************
void convert(uchar volt_data)
{
uchar temp;
P0=leddata_dot[volt_data/51];//A/D轉(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+5];//余數(shù)大于19H,結(jié)果再加上5
P2_2=1; //顯示小數(shù)點(diǎn)后的第一位
delay(3);
P2_2=0;
}
temp=(((volt_data%51)*10)/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+5]; //余數(shù)大于19H,結(jié)果再加上5
P2_3=1; //顯示小數(shù)點(diǎn)后的第二位
delay(3);
P2_3=0;
}
}
void main()
{
uchar volt_data;
P3_4=1; //選擇通道3
P3_5=1;
P3_6=0;
while(1)
{
ST=0;
_nop_();
ST=1;
_nop_();
ST=0; //啟動(dòng)A/D轉(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ù)處理子程序
}
}
|
評(píng)分
-
查看全部評(píng)分
|