標題:
單片機Proteus仿真ADC0809數(shù)字電壓表程序設計
[打印本頁]
作者:
zyc0211
時間:
2020-12-22 08:17
標題:
單片機Proteus仿真ADC0809數(shù)字電壓表程序設計
源碼加電路圖
51hei.png
(28.04 KB, 下載次數(shù): 46)
下載附件
2020-12-22 15:13 上傳
51hei.png
(36.22 KB, 下載次數(shù): 36)
下載附件
2020-12-22 15:13 上傳
單片機源程序如下:
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
uchar code led[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//數(shù)碼管顯示0-9的電平碼
uint volt,vtime; //電壓值測定值
uchar addr;//測量地址位
sbit LW1=P2^3; //對應第4個數(shù)碼管
sbit LW2=P2^2; //對應第3個數(shù)碼管
sbit LW3=P2^1; //對應第2個數(shù)碼管
sbit LW4=P2^0; //對應第1個數(shù)碼管
sbit LW5=P1^4;//指示當前顯示的是第幾個轉(zhuǎn)換值
sbit CLK=P2^4; //時鐘信號
sbit START=P2^5; //轉(zhuǎn)換啟動開關(guān)
sbit EOC=P2^6; //轉(zhuǎn)換結(jié)束標志
sbit OE=P2^7;//定義ADC0809各腳
/**********************************************************/
//函數(shù)名:delay(uint x)
//功能:延時程序 改變測量地址
//調(diào)用函數(shù):
//輸入?yún)?shù):x
//輸出參數(shù):
//說明:程序的延時時間為x乘以0.5ms 每5s改變測量地址位
/**********************************************************/
void delay(uint x)
{
uchar y,z;
for(y=x;y>0;y--)
for(z=250;z>0;z--);//該步運行時間約為0.5ms
vtime++;
if(vtime==1000)
{
vtime=0;
addr++;
if(addr==3) //本例子一共有3個測量輸入值,輪流讀取這3個值并轉(zhuǎn)換顯示
addr=0;//以上語句實現(xiàn)測量地址位的改變
}
}
/**********************************************************/
//函數(shù)名:ADC()
//功能:數(shù)模轉(zhuǎn)換程序
//調(diào)用函數(shù):
//輸入?yún)?shù):
//輸出參數(shù):
//說明:將轉(zhuǎn)換好的測定值保存在變量volt中
/**********************************************************/
void ADC()
{
EA=1;//開中斷
//確保進入正常AD轉(zhuǎn)換狀態(tài)?
START=0;
START=1;
START=0;//ad開始轉(zhuǎn)換
while(EOC==0); //等待轉(zhuǎn)換結(jié)束
OE=1; //輸出數(shù)據(jù)標志為真
EA=0;//關(guān)中斷
volt=P3;//獲取轉(zhuǎn)換值保存到volt中,(P3為轉(zhuǎn)換后數(shù)據(jù))
volt=volt*196;//轉(zhuǎn)換值處理 (例子的滿量程為5V,轉(zhuǎn)換分辯率為8位即最大值是255,5/255=196mV,即1代表196mV)
OE=0;//輸出轉(zhuǎn)換結(jié)束 (要在獲取轉(zhuǎn)換值之后)
}
/**********************************************************/
//函數(shù)名:display()
//功能:4位數(shù)碼管顯示
//調(diào)用函數(shù):delay(uint x)
//輸入?yún)?shù):
//輸出參數(shù):
//說明:將處理后的電壓值顯示在4位數(shù)碼管上
/**********************************************************/
void display()
{
P0=0xff;//消隱 (相當于全部滅燈,清除上次顯示效果)
LW1=0;
P0=~led[volt/10000]&0x7f;//帶小數(shù)點1伏顯示位
delay(2);
P0=0xff;
LW1=1;
LW2=0;
P0=~led[(volt/1000)%10];//100毫伏顯示位
delay(2);
P0=0xff;
LW2=1;
LW3=0;
P0=~led[(volt/100)%10];//10毫伏顯示位
delay(2);
P0=0xff;
LW3=1;
LW4=0;
P0=~led[(volt/10)%10];//1毫伏顯示位
delay(2);
P0=0xff;
LW4=1;
LW5=0;
P0=~led[addr+1];//顯示電壓測量位
delay(2);
LW5=1;//指示當前顯示的是第幾個轉(zhuǎn)換值
}
/**********************************************************/
//主程序
/**********************************************************/
void main()
{
EA=1;//開總中斷
TMOD=0x01;//設定定時計數(shù)工作方式
//為定時器初賦值
TH0=0XFF;
TL0=0XB4;
ET0=1;//開定時器0中斷
TR0=1;//開啟定時器0
while(1)
{
P1=addr;//裝入測量地址
LW5=1;
ADC();//調(diào)用模數(shù)轉(zhuǎn)換程序
display();//調(diào)用顯示程序
}
}
/**********************************************************/
//函數(shù)名:timer() interrupt 1
//功能:定時中斷0響應程序
//調(diào)用函數(shù):
//輸入?yún)?shù):
//輸出參數(shù):
//說明:為ADC提供時鐘信號
/**********************************************************/
void timer() interrupt 1
{
//初值重置
TH0=0XFF;
TL0=0XF0;
CLK=~CLK;//取反 產(chǎn)生時鐘信號
}
復制代碼
仿真代碼51hei提供下載:
數(shù)字電壓表(ADC0809)-2.rar
(47.83 KB, 下載次數(shù): 70)
2020-12-22 08:16 上傳
點擊文件名下載附件
數(shù)字電壓表
下載積分: 黑幣 -5
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1