|
分享一款數(shù)顯穩(wěn)壓電源設(shè)計(jì)資料
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.png (27.12 KB, 下載次數(shù): 68)
下載附件
2021-5-16 00:04 上傳
單片機(jī)源程序如下:
- /*數(shù)字電壓表,能在0-5V,0-50V,0-250V之間自動(dòng)切換量程*/
- #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}; //定義數(shù)碼管顯示數(shù)值
- uchar str_TME[4]={0,0,0,0,}; //定義數(shù)碼管顯示初始值
- unsigned char data1; //data1用來存放轉(zhuǎn)換以后的數(shù)據(jù)
- 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;//用來作量程標(biāo)志
- void delay(uchar ms) //定義ms延遲程序
- {
- uchar i;
- while(ms--)
- for(i=0;i<125;i++);
- }
- uchar tmel=0;
- bit sim=1;//轉(zhuǎn)換標(biāo)志
- /***********************計(jì)數(shù)器中斷函數(shù),用于控制電壓轉(zhuǎn)*********************
- *******************時(shí)間間隔,此程序設(shè)定間隔為1S電壓轉(zhuǎn)換一次***************/
- void tme_tr0(void) interrupt 1
- {
- TL0=0xb0;
- TH0=0x3c;
- if(++tmel==20)
- {
- tmel=0;
- sim=1;//1S時(shí)間到,實(shí)現(xiàn)一次電壓轉(zhuǎn)換
- }
- }
- /*****************定義數(shù)碼管顯示(共陽數(shù)碼管)***************************/
- 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;//顯示小數(shù)點(diǎn)
- 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;//顯示小數(shù)點(diǎn)
- 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]];//顯示小數(shù)點(diǎn)
- 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轉(zhuǎn)換子程序
- *******************************************************************************/
- sbit bADcs=P2^2; //片選位
- sbit bADcl=P2^1; //時(shí)鐘位
- sbit bADda=P2^0; //數(shù)據(jù)位
- void ad(void)
- { uchar i;
- bADcs = 0;//當(dāng)ADC0832未工作時(shí)其CS輸入端應(yīng)為高電平,此時(shí)芯片禁用,開始工作CS為低電平
- bADcl=0; //第一個(gè)時(shí)鐘下降沿前da為1,第二個(gè)與第三時(shí)鐘下降沿前的數(shù)據(jù)為通道選擇
- 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最后一位補(bǔ)1
- }
- bADcs=1; //轉(zhuǎn)換完后CS置1
- }
- void changs() //轉(zhuǎn)換程序
- {
- double sum;
- uchar val_Integer; //定義整數(shù)變量
- unsigned int val_Decimal; //定義小數(shù)變量
- if((dang1==0)&&(dang2==1)) //檔位轉(zhuǎn)換(0-100V)
- { flag=0;
- sum=data1*0.0196078*20 ; //擴(kuò)展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)//小數(shù)字時(shí)切換成5V量程
- { dang1=0;dang2=0;}
- }
- else if((dang1==1)&(dang2==0))//檔位轉(zhuǎn)換(0-25V?
- { flag=1;
- sum=data1*0.0196078*5 ; //擴(kuò)展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))//檔位轉(zhuǎn)換(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;//定時(shí)器設(shè)置
- IP=0x01;
- TL0=0xb0;//初值
- TH0=0x3c;
- TR0=1;//啟動(dòng)
- dang1=0;dang2=1;
- while(1)
- {
- switch(flag)//用flag標(biāo)志不同量程
- {
- case 0:
- VAL_xs0();//250量程顯示
- break;
- case 1:
- VAL_xs1();//50量程顯示
- break;
- case 2:
- VAL_xs2();//5V量程顯示
- break;
- }
- if(sim==1)//1秒到后,實(shí)現(xiàn)一次電壓轉(zhuǎn)換
- {
- ad(); //電壓轉(zhuǎn)換
- changs(); //數(shù)據(jù)轉(zhuǎn)換
- sim=0;
- }
- }
- }
復(fù)制代碼
所有資料51hei提供下載,內(nèi)含2個(gè)代碼與仿真,還有一個(gè)是電子秤 如有錯(cuò)誤請(qǐng)多多指教:
1_數(shù)顯穩(wěn)壓電源設(shè)計(jì).zip
(502.4 KB, 下載次數(shù): 94)
2021-5-13 12:40 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
|