這款電路簡單制作容易的STC12C2052AD單片機(jī)0-9.9V電壓表,電路簡單,元件少,容易制作,PCB板為單面板,下面是制作好的實(shí)物。文后附有原理圖、源程序等資料。
單片機(jī)源程序如下:
#include #include #define uchar unsigned char #define uint unsigned int sbit temp=P1^7; sbit LED3=P3^0; //C sbit LED0=P1^4; // 小數(shù)點(diǎn)后一位 sbit LED1=P1^3; //個位 sbit LED2=P1^0; // 十位 sbit A=P1^1; sbit B_B=P1^5; sbit C=P3^2; sbit D=P3^4; sbit E=P3^5; sbit F=P1^2; sbit G=P3^1; sbit H=P3^3; //小數(shù)點(diǎn) char d[5]; uint R,M,N,h;//若定義成uchar型就只能顯示2.5V以下的數(shù)值 void dm(mz); void delayus(uint x) //(x+1)*6微 { while(x--); } /***************************************************************** 函數(shù)名:毫秒級CPU延時函數(shù) 調(diào) 用:delay (?); 參 數(shù):1-65535(參數(shù)不可為0) 返回值:無 結(jié) 果:占用CPU方式延時與參數(shù)數(shù)值相同的毫秒時間 備 注:應(yīng)用于1T單片機(jī)時i<600,應(yīng)用于12T單片機(jī)時i<125 /******************************************************************/ void delay(uint t) { uint i; //定義變量 for(;t>0;t--) //如果t大于0,t減1(外層循環(huán)) for(i=600;i>0;i--); //i等于124,如果i大于0,i減1 } /******************************************************************* 函數(shù)名:ADC初始化及8位A/D轉(zhuǎn)換函數(shù) 返回值:8位的ADC數(shù)據(jù) 結(jié) 果:讀出指定ADC接口的A/D轉(zhuǎn)換值,并返回數(shù)值 備 注:適用于STC12C2052AD系列單片機(jī)(必須使用STC12C2052AD.h頭文件) *******************************************************************/ uchar Read (uchar CHA) { uchar AD_FIN=0; //存儲A/D轉(zhuǎn)換標(biāo)志;若在函數(shù)外定義此變量則不能得到連續(xù)變化的模擬量的顯示 /******以下為ADC初始化程序****************************/ CHA &= 0x07; //選擇ADC的8個接口中的一個(0000 0111 清0高5位) ADC_CONTR = 0x60; //ADC轉(zhuǎn)換的速度(0XX0 0000 其中XX控制速度,請根據(jù)數(shù)據(jù)手冊設(shè)置) _nop_(); ADC_CONTR |= CHA; //選擇A/D當(dāng)前通道 _nop_(); ADC_CONTR |= 0x80; //啟動A/D電源 delay(1); //使輸入電壓達(dá)到穩(wěn)定(1ms即可? /******以下為ADC執(zhí)行程序****************************/ ADC_CONTR |= 0x08; //啟動A/D轉(zhuǎn)換(0000 1000 令A(yù)DCS = 1) _nop_(); _nop_(); _nop_(); _nop_(); while (AD_FIN ==0) //等待A/D轉(zhuǎn)換結(jié)束 { AD_FIN = (ADC_CONTR & 0x10); //0001 0000測試A/D轉(zhuǎn)換結(jié)束否 } ADC_CONTR &= 0xE7; //1111 0111 清ADC_FLAG位, 關(guān)閉A/D轉(zhuǎn)換, return (ADC_DATA); //返回A/D轉(zhuǎn)換結(jié)果(8位) } /****************************************************************** 顯示函數(shù)轉(zhuǎn)換函數(shù): M=模擬量采樣值,N=基準(zhǔn)電壓源采樣值(本例為2.5V),R=模擬量輸入值(待顯示值) N=256*2.5/Vcc;變形后得Vcc=256*2.5/N; 代入M=256*R/Vcc;得到M=R*N/2.5;變形后得R=M*2.5/N 1.105為輸入端分壓比。 ******************************************************************/ void transfer(void) { M=Read(6); //P1.6口模擬量轉(zhuǎn)換 N=Read(7); //P1.7口2.5V基準(zhǔn)電壓源采樣(轉(zhuǎn)換) R=((M*2.5)/N)*198; //輸入模擬量換算并放大500倍; /***以下為3位顯示轉(zhuǎn)換***/ h=R; d[3]=R/1000; R=R%1000; d[2]=R/100; R=R%100; d[1]=R/10; d[0]=R%10; } /**********顯示函數(shù)(未優(yōu)化)************************************************/ void xian_shi (void) { if(h>999) { d[3]=10; d[2]=10; d[1]=10; d[0]=10; } if(d[3]==0) d[3]=11; dm(d[3]); LED3=1; delayus(5); LED3=0; delayus(30); dm(d[2]); LED2=1; delayus(5); LED2=0; delayus(30); dm(12); LED2=1; delayus(1); LED2=0; delayus(400); dm(d[1]); LED1=1; delayus(5); LED1=0; delayus(30); dm(d[0]); LED0=1; delayus(5); LED0=0; delayus(30); } void dm(mz) { switch(mz) { case 0:A=0;B_B=0;C=0;D=0;E=0;F=0;G=1;H=1;break; case 1:A=1;B_B=0;C=0;D=1;E=1;F=1;G=1;H=1;break; case 2:A=0;B_B=0;C=1;D=0;E=0;F=1;G=0;H=1;break; case 3:A=0;B_B=0;C=0;D=0;E=1;F=1;G=0;H=1;break; case 4:A=1;B_B=0;C=0;D=1;E=1;F=0;G=0;H=1;break; case 5:A=0;B_B=1;C=0;D=0;E=1;F=0;G=0;H=1;break; case 6:A=0;B_B=1;C=0;D=0;E=0;F=0;G=0;H=1;break; case 7:A=0;B_B=0;C=0;D=1;E=1;F=1;G=1;H=1;break; case 8:A=0;B_B=0;C=0;D=0;E=0;F=0;G=0;H=1;break; case 9:A=0;B_B=0;C=0;D=0;E=1;F=0;G=0;H=1;break; case 10:A=0;B_B=1;C=1;D=0;E=0;F=0;G=1;H=1;break; //C case 11:A=1;B_B=1;C=1;D=1;E=1;F=1;G=1;H=1;break; //不顯示 case 12:A=1;B_B=1;C=1;D=1;E=1;F=1;G=1;H=0;break; //小數(shù)點(diǎn) } } /****************************************************************** 函數(shù)名:主函數(shù) 調(diào) 用:無 參 數(shù):無 返回值:無 結(jié) 果:程序開始處,無限循環(huán) 備 注: ******************************************************************/ void main (void) { P1M0 = 0xC0; P1M1 = 0x19; P3M0=0x00; P3M1=0x01; LED0=0; LED1=0; LED2=0; LED3=0; while(1) { uint i; i++; if (i==500) { transfer(); i=0; } xian_shi(); } }
上一篇:nRF24L01+51單片機(jī)無線語音點(diǎn)滴報警系統(tǒng)
下一篇:51單片機(jī)讀寫RC522卡(LCD12864)RFID開發(fā)程序與原理圖
推薦閱讀
史海拾趣
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦
- 【已結(jié)束】直播“戴”“芯”:英飛凌可穿戴設(shè)備保姆級解決方案
- e絡(luò)盟限時福利|《e選》產(chǎn)品低至5折起,下單百元返現(xiàn)中!
- 有獎活動|下載資料、預(yù)約視頻 泰克 HDMI 2.1 測試方案
- 有獎測評 | 英飛凌新品情報站:最新 5V XENSIVTM PAS CO2 傳感器 套件測評
- 如何加快你的FPGA設(shè)計步伐
- 有獎直播:萬物互聯(lián) -世健公司攜手Microchip專家,共同探討IoT解決方案
- 下載信息娛樂系統(tǒng)精品文章,贏【米家臺燈、小米保溫杯、米家藍(lán)牙溫濕計】,開啟MPS汽車技術(shù)進(jìn)階之旅!
- 有獎直播|瑞薩電子 Arm MCU 的新能源進(jìn)擊:RA6T2
- 有獎活動 | 來 Pl BridgeSwitch™ 技術(shù)中心探秘半橋電機(jī)驅(qū)動器新技術(shù)
- 愛“拼”才會贏 英飛凌柵極驅(qū)動IC拼圖闖關(guān) 活動開始啦!