|
從一個(gè)廢儀表上拆了一個(gè)數(shù)碼管版,經(jīng)過(guò)改造,焊出相應(yīng)的驅(qū)動(dòng)板,做出一個(gè)電壓表。
選用STC15w408AS單片機(jī),由于引腳少,選用74hc138芯片作為位選,74hc595作為段選,用TL431的2.5v穩(wěn)壓源做參考電壓。
電壓表的設(shè)計(jì)思路:其實(shí)就是運(yùn)用單片機(jī)內(nèi)置的多個(gè)接口ADC轉(zhuǎn)換。選用穩(wěn)壓2.5v進(jìn)行ADC轉(zhuǎn)換,這樣電壓變化小,轉(zhuǎn)出的ADC的值變的也小(估值558左右),再經(jīng)過(guò)另外一路兩個(gè)電阻分壓點(diǎn)轉(zhuǎn)換出來(lái)的ADC的值進(jìn)行計(jì)算。理論上能做到0~無(wú)窮大量程的(沒(méi)啥實(shí)際意義)。根據(jù)這個(gè)思路如果分壓電阻小于1R,根據(jù)分壓計(jì)算也可以設(shè)計(jì)出電流表。這里沒(méi)做電壓電流表,其實(shí)知道原理就行了。
制作出來(lái)的實(shí)物圖如下:
167258892.jpg (96.46 KB, 下載次數(shù): 44)
下載附件
2020-3-23 20:30 上傳
205917003.jpg (3.47 MB, 下載次數(shù): 39)
下載附件
2020-3-23 20:30 上傳
1025592641.jpg (2.74 MB, 下載次數(shù): 49)
下載附件
2020-3-23 20:30 上傳
1525746405.jpg (92.77 KB, 下載次數(shù): 52)
下載附件
2020-3-23 20:30 上傳
1682760983.jpg (3.85 MB, 下載次數(shù): 48)
下載附件
2020-3-23 20:30 上傳
1952476574.jpg (92.28 KB, 下載次數(shù): 49)
下載附件
2020-3-23 20:30 上傳
復(fù)制的代碼注釋亂碼,大家可以下載附件查看,標(biāo)注詳細(xì),適合初學(xué)單片機(jī)ADC的人。注:本人也是菜鳥(niǎo)一枚,大家互相交流學(xué)習(xí),有更好的方案可以留言。共同進(jìn)步。
單片機(jī)源程序如下:
- #include <STC15F2K60S2.H>
- #include<intrins.h>
- #define ADC_POWER 0x80
- #define ADC_FLAG 0x10
- #define ADC_START 0x08
- #define ADC_SPEEDLL 0x00
- #define ADC_SPEEDL 0x20
- #define ADC_SPEEDH 0x40
- #define ADC_SPEEDHH 0x60
- typedef unsigned char uchar;
- typedef unsigned int uint;
- sbit LSA=P1^2;
- sbit LSB=P1^0;
- sbit LSC=P3^7; //定義138邏輯芯片A,B,C腳
- sbit SRCLK=P3^6;
- sbit RCLK=P3^3;
- sbit SER=P3^2;//定義595芯片驅(qū)動(dòng)腳
- uchar number[]={0x82,0xf6,0x43,0x46,0x36,0x0e,0x0a,0xe6,0x02,0x06}; //0-9斷碼非標(biāo)準(zhǔn)碼
- unsigned char ch=4; //通道4,根據(jù)手冊(cè)0為P1^0,1為P1^1,依次類推
- float voltage=0; //定義浮點(diǎn)電壓參數(shù)
- uint ref=0,vin=0; //定義431穩(wěn)壓2.5v的ADC值。ref值是P1^4,vin是P1^3的ADC值
- void Hc595SendByte(uchar dat);//聲明595函數(shù)
- void DigDisplay();//聲明顯示函數(shù)
- void Delay1ms() //@24.000MHz
- {
- unsigned char i, j;
- i = 24; j = 85;
- do
- {
- while (--j);
- } while (--i);
- }
- void adc_int() interrupt 5 //ADC中斷
- {
-
- uint j=0;
- ADC_CONTR &=!ADC_FLAG;//清除中斷標(biāo)志位
- if(ch==4)
- {
- ref=(ADC_RES*4+ADC_RESL); //讀取P1^4口ADC值保存在ref變量中,由于采用tl431穩(wěn)壓2.5v,所以這個(gè)值大約在558左右。
- }
- else if(ch==3)
- {
- vin=(ADC_RES*4+ADC_RESL); //讀取P1^3口ADC值,這個(gè)值經(jīng)過(guò)兩個(gè)電阻分壓得到的。
- voltage=(2.5*vin)/ref; //計(jì)算電壓
- }
- if(ch==4) //切換轉(zhuǎn)換ADC口
- ch=3;
- else if(ch==3)
- ch=4;
- for(j=0;j<=30;j++);
- ADC_RES=0;
- ADC_RESL=0;
- ADC_CONTR=ADC_POWER |ADC_SPEEDLL | ADC_START | ch;//啟動(dòng)ADC轉(zhuǎn)換
- }
- void main()
- {
- uint i;
- P1ASF=0x18;//參考手冊(cè),0x38=00011000,開(kāi)啟P1^3,P1^4為ADC輸入口,其余P1口為正常IO口
- ADC_RES=0;
- ADC_CONTR=ADC_POWER|ADC_SPEEDLL | ADC_START | ch;
- for(i=0;i<1000;i++);
- IE=0xA0;
- while(1)
- {
- DigDisplay();
- }
- }
- void Hc595SendByte(uchar dat)
- {
- uchar a;
- SRCLK=0;
- RCLK=0;
- for(a=0;a<8;a++)
- {
- SER=dat>>7;
- dat<<=1;
- SRCLK=1;
- _nop_();
- SRCLK=0;
- }
- RCLK=1;
- _nop_();
- RCLK=0;
- }
- void DigDisplay()
- {
- uchar i;
- uint j;
- float k;
- k=voltage*380; //這個(gè)值可以修正,依據(jù)是根據(jù)兩個(gè)電阻的分壓點(diǎn)計(jì)算的,同事放大1000倍,這樣下面顯示可以顯示小數(shù)。
- j=(uint) k; //轉(zhuǎn)換成INT類型,不然下面的編譯不了。
-
- for(i=0;i<8;i++)
- {
- switch(i)
- {
- case(0):
- LSA=0;LSB=0;LSC=0;Hc595SendByte(number[vin/1000]); break;
- case(1):
- LSA=1;LSB=0;LSC=0;Hc595SendByte(number[vin%1000/100]); break;
- case(2):
- LSA=0;LSB=1;LSC=0; Hc595SendByte(number[vin%1000%100/10]);break;
- case(3):
- LSA=1;LSB=1;LSC=0;Hc595SendByte(number[vin%1000%100%10]); break; //顯示當(dāng)前測(cè)量的ADC的值,0-1023
- case(4):
- LSA=0;LSB=0;LSC=1; Hc595SendByte(number[j/1000]);break;
- case(5):
- LSA=1;LSB=0;LSC=1;Hc595SendByte(number[j%1000/100]&0xfd); break;
- case(6):
- LSA=0;LSB=1;LSC=1;Hc595SendByte(number[j%1000%100/10]); break;
- case(7):
- LSA=1;LSB=1;LSC=1; Hc595SendByte(number[j%1000%100%10]);break; //顯示當(dāng)前電壓值
-
- }
-
- Delay1ms();
- Hc595SendByte(0xFF);
-
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
STC15W408AS電壓表.zip
(39.41 KB, 下載次數(shù): 107)
2020-3-23 20:31 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
|