|
說明 按鍵按下去 進(jìn)入單路電壓采集模式(及電壓表模式) 按鍵彈起來 就是8路電壓輪流采集模式
基于51單片機(jī)的ADC0809 4路數(shù)字電壓表下面是仿真圖
仿真圖
以下代碼已經(jīng)測(cè)試過
單片機(jī)代碼:
#include <reg52.h> //頭文件
#define uchar unsigned char //宏定義無(wú)符號(hào)字符型
#define uint unsigned int //宏定義無(wú)符號(hào)整型
code uchar seg7code[10]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //顯示段碼 數(shù)碼管字跟
sbit ST=P3^0; //A/D啟動(dòng)轉(zhuǎn)換信號(hào)
sbit OE=P3^1; //數(shù)據(jù)輸出允許信號(hào)
sbit EOC=P3^2; //A/D轉(zhuǎn)換結(jié)束信號(hào)
sbit CLK=P3^3; //時(shí)鐘脈沖
sbit KEY=P2^7;
uint z,x,AD0809, date; //定義數(shù)據(jù)類型
/******************************************************************
延時(shí)函數(shù)
******************************************************************/
void delay(uchar t)
{
uchar i,j;
for(i=0;i<t;i++)
{
for(j=13;j>0;j--);
{ ;
}
}
}
/**********************************************************************
數(shù)碼管動(dòng)態(tài)掃描
*********************************************************************/
void xianshi() //顯示函數(shù)
{
uint z,x;
z=date%100/10; //求千位
x=date%10; //求百位
P3&=0x0f;
P0=seg7code[z]&0x7f;
P3|=0X10;
delay(80);
P3&=0X0f;
P0=seg7code[x];
P3|=0X20;
//delay(80);
}
unsigned char GetVoltage(unsigned char ch)
{
float temp;
unsigned char value=0;
P2=0xf0;
P2|=ch;
delay(1);
ST=0; //使采集信號(hào)為低
delay(1);
ST=1; //開始數(shù)據(jù)轉(zhuǎn)換
delay(1);
ST=0; //停止數(shù)據(jù)轉(zhuǎn)換
delay(1);
while(!EOC); //等待數(shù)據(jù)轉(zhuǎn)換完畢
OE=1; //允許數(shù)據(jù)輸出信號(hào)
delay(1);
AD0809=P1; //讀取數(shù)據(jù)
OE=0; //關(guān)閉數(shù)據(jù)輸出允許信號(hào)
temp=AD0809;
temp=temp*19.531f; //計(jì)算出電壓值(19.531=5000mv除以AD的位數(shù)值256=5000/256)
value=temp/100;//為了方便顯示 進(jìn)行縮小 轉(zhuǎn)換成整形 比如實(shí)際電壓1.5V 1500mv/100=15 15在的十位顯示的時(shí)候作為電壓的整數(shù)位 個(gè)位作為小數(shù)位
return value;
}
void Timer0Init(void) //20毫秒@12.000MHz
{
TMOD &= 0xF0; //設(shè)置定時(shí)器模式
TL0 = 0xE0; //設(shè)置定時(shí)初值
TH0 = 0xB1; //設(shè)置定時(shí)初值
TF0 = 0; //清除TF0標(biāo)志
TR0 = 1; //定時(shí)器0開始計(jì)時(shí)
ET0=1;
EA=1;
}
/*************************************************************************
主函數(shù)
**************************************************************************/
unsigned char count=0;
void main()
{
KEY=1;
Timer0Init();
while(1) //無(wú)限循環(huán)
{
if(KEY==0)
{
date=GetVoltage(0); //數(shù)碼管顯示的數(shù)據(jù)值,其中20為采集數(shù)據(jù)的毫安值
}
else
{
date=GetVoltage(count);//采集第count路AD值
}
xianshi(); //數(shù)碼管顯示函數(shù)
}
}
unsigned char delay1=0;
void timer0( ) interrupt 1 //定時(shí)器0 10ms定時(shí)
{
TL0 = 0xE0; //設(shè)置定時(shí)初值
TH0 = 0xB1; //設(shè)置定時(shí)初值
delay1++;
if(delay1>20)
{//AD切換顯示的定時(shí)時(shí)間到
delay1=0;//中斷計(jì)數(shù)清零
count++;//路數(shù)變量自加
if(count>7)//路數(shù)變量大于7
count=0;//清零
}
}
Keil代碼與Proteus仿真下載:
仿真代碼.7z
(899.14 KB, 下載次數(shù): 72)
2022-9-26 15:21 上傳
點(diǎn)擊文件名下載附件
|
評(píng)分
-
查看全部評(píng)分
|