?? 基于單片機系統的8路數字電壓表程序設計問題.txt
字號:
[求助]基于單片機系統的8路數字電壓表程序設計問題
8路數字電壓表測量由A/D轉換、數據處理及顯示控制等組成,測量0~5V范圍內的8路輸入電壓值,由4位共陽LED數碼管輪流顯示,最大分辨率0.01V,誤差±0.02V。使用AT89C52單片機,ADC0809 A/D轉換集成蕊片,單片機P1口、P3.0~P3.3口作4位LED數碼顯示控制。P3.5端口按鈕作單路/循環顯示轉換,P3.6為單路顯示時作通道選擇。ADC0809具有8路模擬信號輸入端口,地址線23~25腳為模擬信號輸入選擇端口,22腳為地址鎖存控制,當輸入高電平時對地址信號進行鎖存,6腳為開始A/D模數轉換,7腳為A/D轉換結束標志,結束時輸出高電平,A/D轉換后的數據由9腳輸出到單片機P2.5腳。
C源程序:
/***********************************************************************************/
// 8路電壓表C源程序
// Keil c51 v7.08
/***********************************************************************************/
/*使用AT89C52單片機,11.0592MHz晶振,P0口讀入A/D值,P2口作A/D控制,用共陽LED數碼管,P1口輸出段碼,P3口掃描,最高位指示通道(0~7)*/
#include <reg52.h> //51系列單片機定義文件
#include <intrins.h> //調_nop_(),延時函數用
#define ad_con P2 //A/D控制口
#define addata P0 //A/D數據計入讀入口
#define Disdata P1 //顯示數據段碼輸出口
#define uchar unsigned char //無符號字符(8位)
#define uint unsigned int //無符號整數(16位)
sbit ALE=P2^3; //鎖存地址控制位
sbit STARA=P2^4; //啟動一次轉換位
sbit OE=P2^5; //0890輸出數據控制位
sbit EOC=P3^7; //轉換結束標志位
sbit DISX=Disdata^7; //LED 小數點位
//
//
unsigned char code dis_7[11]={0xc0,0xf9,0xa4,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
/*共陽7段LED段碼表"0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "不亮"*/
unsigned char code scan_con[4]={0xfe,0xfd,0xfb,0xf7};//4位列掃控制字
unsigned char data ad_data[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//定義8個數據內存單元
unsigned int data dis[5]={0x00,0x00,0x00,0x00,0x00};//定義4個顯示數據單元和一個數據存儲單元
//
//
/********1ms延時子函數*********/
delay1ms(unsigned int t)
{
uint i,j;
for(i=0;i<t;i++);
for(j=0,j<120,j++);
}
//
//
/**********顯示掃描子函數**********/
scan()
{
unsigned char k,n;
int h;
dis[3]=0x00; //通道初值為0
for(n=0;n<8;n++); //每次顯示8個數據 (就是此處出錯)
{
dis[2]=ad_data[n]/51; //測得值轉換為3個BCD碼,最大值為5.00V
dis[4]=ad_data[n]%51; //余數暫存
dis[4]=dis[4]*10; //計算小數第一位
dis[1]=dis[4]/51;
dis[4]=dis[4]%51;
dis[4]=dis[4]*10; //計算小數第二位
dis[0]=dis[4]/51;
for(h=0;h<500;h++) //每個通道值顯示控制時間(約1S)
{
for(k=0;k<4;k++) //4位LED掃描控制
{
Disdata=dis_7[dis[k]];
if(k==2){DISX=0;}
P3=scan_con[k];delay1ms(1);P3=0xff;
}
}
dis[3]++; //通道值加1
}
}
//
//
/**********0809AD轉換子函數**********/
test()
{
unsigned char m;
unsigned char s=0x00;
ad_con=s;
for(m=0,m<8;m++);
{
ALE=1;_nop_();_nop_();ALE=0; //轉換通道地址鎖存
START=1;_nop_();_nop_();START=0; //開始轉換命令
_nop_();_nop_();_nop_();_nop_(); //延時4us
while(ECO==0); //等待轉換結束
OE=1;ad_data[m]=addata;OE=0;s++;ad_con=s;//取A/D值,地址加1
}
ad_con=0x00; //控制復位
}
//
//
/**********主函數**********/
main()
{
P0=0xff; //初始端口
P2=0x00;
P1=0xff;
P3=0xff;
while(1)
{
scan(); //依次顯示8個通道1次
test(); //測量轉換一次
}
}
//
//
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -