国产免费AV|泡泡玛特欧洲总部将设在伦敦|中文天堂网www新版资源在线|一本久道综合在线中文|国精产品一二三产区的使用方法|香蕉鱼在线观看|www.27eee
ELEOK
標題:
51單片機ADC0832能換量程數字電壓表程序源碼和proteus仿真
[打印本頁]
作者:
eng
時間:
2021-6-14 02:42
標題:
51單片機ADC0832能換量程數字電壓表程序源碼和proteus仿真
完整源碼和proteus文件:
數顯穩壓電源設計.zip
(372.54 KB, 售價: 1 E幣)
2021-6-14 02:40 上傳
點擊文件名下載附件
售價: 1 E幣
[記錄]
[
購買
]
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
1.png
(106.97 KB)
下載附件
2021-6-14 02:39 上傳
部分源碼:完整源碼請下載附件
/*數字電壓表,能在0-5V,0-50V,0-250V之間自動切換量程*/
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
#include <intrins.h>
code uchar TAB[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //定義數碼管顯示數值
uchar str_TME[4]={0,0,0,0,}; //定義數碼管顯示初始值
unsigned char data1; //data1用來存放轉換以后的數據
sbit dang1=P2^7;
sbit dang2=P2^6;
sbit key1=P0^0;
sbit led1=P1^7;//0-50V指示
sbit led2=P1^6;//0-250V批示
sbit led3=P1^5;//0-5V指示
uchar flag;//用來作量程標志
void delay(uchar ms) //定義ms延遲程序
{
uchar i;
while(ms--)
for(i=0;i<125;i++);
}
uchar tmel=0;
bit sim=1;//轉換標志
/***********************計數器中斷函數,用于控制電壓轉*********************
*******************時間間隔,此程序設定間隔為1S電壓轉換一次***************/
void tme_tr0(void) interrupt 1
{
TL0=0xb0;
TH0=0x3c;
if(++tmel==20)
{
tmel=0;
sim=1;//1S時間到,實現一次電壓轉換
}
}
/*****************定義數碼管顯示(共陽數碼管)***************************/
sbit k1=P1^0; //第一位
sbit k2=P1^1; //第二位
sbit k3=P1^2; //第三位
sbit k4=P1^3; //第四位
void VAL_xs0()//0-250v顯示
{
k1=1; k2=1; k3=1; k4=1;
P3=TAB[str_TME[0]];
k1=0; //第一位顯示
delay(5);
k1=1;
P3=TAB[str_TME[1]];
k2=0; //第二位顯示
delay(5);
k2=1;
P3=(TAB[str_TME[2]])&0x7f;//顯示小數點
k3=0; //第三位顯示
delay(5);
k3=1;
P3=TAB[str_TME[3]];
k4=0; //第四位顯示
delay(5);
k4=1;
}
void VAL_xs1()//0-50v顯示
{
k1=1; k2=1; k3=1; k4=1;
P3=TAB[str_TME[0]];
k1=0; //第一位顯示
delay(5);
k1=1;
P3=(TAB[str_TME[1]])&0x7f;//顯示小數點
k2=0; //第二位顯示
delay(5);
k2=1;
P3=TAB[str_TME[2]];
k3=0; //第三位顯示
delay(5);
k3=1;
P3=TAB[str_TME[3]];
k4=0; //第四位顯示
delay(5);
k4=1;
}
void VAL_xs2()//0-5v顯示
{
k1=1; k2=1; k3=1; k4=1;
P3=(TAB[str_TME[0]])&0x7f;
k1=0; //第一位顯示
delay(5);
k1=1;
P3=TAB[str_TME[1]];//顯示小數點
k2=0; //第二位顯示
delay(5);
k2=1;
P3=TAB[str_TME[2]];
k3=0; //第三位顯示
delay(5);
k3=1;
P3=TAB[str_TME[3]];
k4=0; //第四位顯示
delay(5);
k4=1;
}
/******************************************************************************
AD0832AD轉換子程序
*******************************************************************************/
sbit bADcs=P2^2; //片選位
sbit bADcl=P2^1; //時鐘位
sbit bADda=P2^0; //數據位
void ad(void)
{ uchar i;
bADcs = 0;//當ADC0832未工作時其CS輸入端應為高電平,此時芯片禁用,開始工作CS為低電平
bADcl=0; //第一個時鐘下降沿前da為1,第二個與第三時鐘下降沿前的數據為通道選擇
bADda=1; //選置起始位
bADcl=1;
bADcl=0; // 1down
bADda=1; //通道選擇第1位
bADcl=1;
bADcl=0; // 2 down
bADda=0; //通道選擇第2位,通道選擇為1,0選通道0
bADcl=1;
bADcl=0; // 3 down
bADda=1;
bADcl=1;
bADcl=0; // 4 down
for(i=8;i>0;i--)
{
data1<<=1; //從第7位開始,要左移
bADcl=0;
bADcl=1;
if(bADda==1) data1|=0x01; //如果輸出1,data1最后一位補1
}
bADcs=1; //轉換完后CS置1
}
void changs() //轉換程序
{
double sum;
uchar val_Integer; //定義整數變量
unsigned int val_Decimal; //定義小數變量
if((dang1==0)&&(dang2==1)) //檔位轉換(0-100V)
{ flag=0;
sum=data1*0.0196078*20 ; //擴展50倍
led1=1;led2=0;led3=1;
val_Integer=(uchar)sum;
val_Decimal=(unsigned int)((sum-val_Integer)*10);
str_TME[3]=val_Decimal;
str_TME[2]=val_Integer%10;
str_TME[1]=val_Integer/10%10;
str_TME[0]=val_Integer/100;
if((sum<=25)&&(sum>=5))//如果在25V量程,則切換成25V量程
{
dang1=1; dang2=0;
}
if(sum<5)//小數字時切換成5V量程
{ dang1=0;dang2=0;}
}
else if((dang1==1)&(dang2==0))//檔位轉換(0-25V?
{ flag=1;
sum=data1*0.0196078*5 ; //擴展5倍
led2=1;led1=0;led3=1;
val_Integer=(uchar)sum;
val_Decimal=(unsigned int)((sum-val_Integer)*100);
str_TME[3]=val_Decimal%10;
str_TME[2]=val_Decimal/10;
str_TME[1]=val_Integer%10;
str_TME[0]=val_Integer/10;
if(sum>24.9)//大于25V切換成大量程
{
dang1=0; dang2=1;
}
if(sum<5)//小于5V切換成5V量程
{ dang1=0;dang2=0;}
}
else if((dang1==0)&&(dang2==0))//檔位轉換(0-5V?
{ flag=2;
sum=data1*0.0196078 ;
led2=1;led1=1; led3=0;
val_Integer=(uchar)sum;
val_Decimal=(unsigned int)((sum-val_Integer)*1000);
str_TME[3]=val_Decimal%10;
str_TME[2]=val_Decimal/10%10;
str_TME[1]=val_Decimal/100;
str_TME[0]=val_Integer;
if(sum>4.9)//大于5V切換成25V量程
{ dang1=1;dang2=0;
if(sum>25)//大于50V切換成250V量程
{
dang1=0; dang2=1;
}
}
}
}
/*****************************************************
主程序
*******************************************************/
main()
{
P1=0xc0;
IE=0x82;//開中斷
TMOD=0x01;//定時器設置
IP=0x01;
TL0=0xb0;//初值
TH0=0x3c;
TR0=1;//啟動
dang1=0;dang2=1;
while(1)
{
switch(flag)//用flag標志不同量程
{
case 0:
VAL_xs0();//250量程顯示
break;
case 1:
VAL_xs1();//50量程顯示
break;
case 2:
VAL_xs2();//5V量程顯示
break;
}
if(sim==1)//1秒到后,實現一次電壓轉換
{
ad(); //電壓轉換
changs(); //數據轉換
sim=0;
}
}
}
復制代碼
歡迎光臨 ELEOK (http://m.afoofa.cn/)
Powered by Discuz! X5.0