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