留給想做萬用表的小伙伴們
電路原理圖如下:
DC轉(zhuǎn)換電路
全套MSP430萬用表資料
單片機源程序如下:
- /*
- * 簡易低功耗萬用表
- */
- #include <msp430g2553.h>
- #include "LCD12864P.h"
- unsigned int ADC_flag,ADC_flag1,shua_xin;
- unsigned int ADC_data[8],ADC_result[8],mser,song,liang_cheng = 0,s,wen_pt,pt100 = 0,zu_zhi = 0;
- unsigned int data0,data1,data2,data3,data4,data5,data6,data7;
- //double data0,data1,data2,data3,data4,data5,data6,data7;
- unsigned int table[]={0x00,0x02,0x01,0x04,0x08,0xEF,0xdf,0xcf,0x80};//量程選擇 【1】直流10v 【2】直流1v 【3】電阻值10k
- /*
- *初始化
- */
- void int_t()
- {
- WDTCTL = WDT_MDLY_8; //看門狗定時器的初始化設(shè)置
- IE1 |= WDTIE;
- Ini_Lcd(); //lcd初始化
- BCSCTL1 = CALBC1_8MHZ;
- DCOCTL = CALDCO_8MHZ;
- /*
- P1DIR &= BIT3+BIT4;/////////將按鍵口設(shè)置為輸入
- P1REN |= BIT3+BIT4;////////打開上拉電阻,目的為產(chǎn)生觸發(fā)沿高電平往低電平
- P1IE |= 0X18;//////////設(shè)置按鍵口中斷
- P1IES |= 0X18;///////////下降沿中斷。只有在松手時觸發(fā)中斷的產(chǎn)生
- */
- P1DIR &= BIT3;/////////將按鍵口設(shè)置為輸入
- P1REN |= BIT3;////////打開上拉電阻,目的為產(chǎn)生觸發(fā)沿高電平往低電平
- P1IE |= 0X08;//////////設(shè)置按鍵口中斷
- P1IES |= 0X08;///////////下降沿中斷。只有在松手時觸發(fā)中斷的產(chǎn)生
- P2DIR &= ~(BIT2+BIT3+BIT4+BIT5);/////////將功能選擇按鍵口設(shè)置為輸入 1.直流電壓 2.交流電壓 3.電阻量程 4.電容測量
- P1DIR |= BIT5 + BIT6 + BIT7 ; // 將擴展口為輸出
- _EINT(); //使能中斷,這是一個C編譯器支持的內(nèi)部過程。
- }
- /*
- * 按鍵延時程序
- */
- void delay(unsigned int n)//帶參數(shù)有返回值的函數(shù)
- {
- unsigned int i;
- unsigned int j;
- for(i=n;i>0;i--)
- for(j=100;j>0;j--)
- _nop();
- }
- /**************************************************************
- *名稱:ADC()
- *功能:AD設(shè)置轉(zhuǎn)換 中斷
- ****************************************************************/
- void ADC()
- {
- P1SEL |= BIT0 + BIT1 + BIT2 + BIT4;//+ BIT3;//+ BIT4 + BIT5 + BIT6 + BIT7; //設(shè)置為模擬輸入
- ADC10AE0 |= BIT0 + BIT1 + BIT2+ BIT4;// + BIT3;//+ BIT4 + BIT5 + BIT6 + BIT7; //開啟通道A1/A2/A4/A5/A6/A7
- ADC10CTL0|=ADC10ON+MSC+ADC10SHT_2+ADC10IE; //打開ADC轉(zhuǎn)換 ,ADC10使能 ,設(shè)置采用頻率16個周期,允許中斷
- ADC10CTL0 |=SREF_1 + REFON + REF2_5V; //開內(nèi)部參考電壓為2.5V,允許中斷
- ADC10CTL1|=CONSEQ_3+INCH_7; //使用雙(4)通道、循環(huán)采集模式
- ADC10DTC1|=0x08; //每一通道連續(xù)采樣1次
- _BIS_SR(GIE);
- }
- /*
- *功能:AD數(shù)據(jù)處理
- */
- void ADC_DATA()
- {
- unsigned char i;
- ADC10CTL0&=~ENC;
- while(ADC10CTL1&ADC10BUSY); //檢測AD是否繁忙
- ADC10CTL0|=ENC+ADC10SC; //啟動ADC
- ADC10SA=(unsigned int)ADC_result; //獲取ADC_result[]的首地址。首先對A1、A0采樣,放入ADC_result[0]和ADC_result[1]中,如此循環(huán)下去。
- for(i=0;i<8;i++)
- {
- ADC_data[i]=0;
- ADC_data[i]=ADC_result[i];
- // ADC_data[i]=(ADC_data[i]*25)/1023; //將ADC轉(zhuǎn)換成實際的電壓值
- }
- }
- /*
- * 擴展芯片595寫入程序
- */
- void kuo_zhan(unsigned int dat)
- {
- unsigned int i;
- for(i=0;i<8;i++)
- {
- if((dat<<i)&0x80)
- P1OUT|=BIT5;
- else
- P1OUT &= ~BIT5;
- P1OUT &= ~BIT7;
- _NOP();
- P1OUT |= BIT7;
- _NOP();
- }
- P1OUT &= ~BIT6;
- _NOP();
- P1OUT |= BIT6;
- _NOP();
- }
- /*
- * 直流電壓檢測
- */
- void zhi_liu()
- {
- unsigned int song_chao;
- lcd_pos(1,0);
- Disp_HZ("★低功耗萬用表★",8);
- lcd_pos(2,0);
- Disp_HZ("直流電壓",4);
- lcd_pos(3,0);
- Disp_HZ("測量量程",4);
- lcd_pos(4,0);
- Disp_HZ("測量電壓",4);
- if(liang_cheng == 1) //量程為10v的時候數(shù)據(jù)處理
- {
- kuo_zhan(table[1]); //打開10v通道
- song_chao = data0*5.8585*0.002443*100; //
- if(ADC_flag1 == 1)
- {
- ADC_flag1 = 0;
- lcd_pos(3,5);
- Disp_SZ(10/10);
- Disp_SZ(10%10);
- lcd_pos(3,6);
- Disp_HZ("V",1);
- lcd_pos(4,5);
- Disp_SZ(song_chao/1000);
- Disp_SZ(song_chao%1000/100);
- Disp_SZ(song_chao%100/10);
- Disp_SZ(song_chao%10);
- lcd_pos(4,7);
- Disp_HZ("V",1);
- }
- }
- else if(liang_cheng == 2) //量程為10v的時候數(shù)據(jù)處理
- {
- kuo_zhan(table[2]); //打開10v通道
- song_chao = data0*1.9825*0.002443*1000; //
- if(ADC_flag1 == 1)
- {
- ADC_flag1 = 0;
- lcd_pos(3,5);
- Disp_SZ(01/10);
- Disp_SZ(01%10);
- lcd_pos(3,6);
- Disp_HZ("V",1);
- lcd_pos(4,5);
- Disp_SZ(song_chao/1000);
- Disp_SZ(song_chao%1000/100);
- Disp_SZ(song_chao%100/10);
- Disp_SZ(song_chao%10);
- lcd_pos(4,7);
- Disp_HZ("V",1);
- }
- }
- else if(liang_cheng == 3) //量程為10v的時候數(shù)據(jù)處理
- {
- kuo_zhan(table[3]); //打開10v通道
- song_chao = data0*0.0891*0.002443*1000; //
- if(ADC_flag1 == 1)
- {
- ADC_flag1 = 0;
- lcd_pos(3,4);
- Disp_SZ(01/10);
- Disp_HZ(".",1);
- Disp_SZ(01%10);
- lcd_pos(3,6);
- Disp_HZ("V",1);
- lcd_pos(4,5);
- Disp_SZ(song_chao/1000);
- Disp_SZ(song_chao%1000/100);
- Disp_SZ(song_chao%100/10);
- Disp_SZ(song_chao%10);
- lcd_pos(4,7);
- Disp_HZ("V",1);
- }
- }
- }
- /*
- * 交流電壓檢測
- */
- void jiao_liu()
- {
- unsigned int chao_song;
- lcd_pos(1,0);
- Disp_HZ("★低功耗萬用表★",8);
- lcd_pos(2,0);
- Disp_HZ("交流電壓",4);
- lcd_pos(3,0);
- Disp_HZ("測量量程",4);
- lcd_pos(4,0);
- Disp_HZ("測量電壓",4);
- if(liang_cheng == 1) //量程為10v的時候數(shù)據(jù)處理
- {
- chao_song = data1*3.5*0.002443*100; //
- if(ADC_flag1 == 1)
- {
- ADC_flag1 = 0;
- lcd_pos(3,4);
- Disp_SZ(10/10);
- Disp_SZ(10%10);
- lcd_pos(3,6);
- Disp_HZ("V",1);
- lcd_pos(4,5);
- Disp_SZ(chao_song/1000);
- Disp_SZ(chao_song%1000/100);
- Disp_SZ(chao_song%100/10);
- Disp_SZ(chao_song%10);
- lcd_pos(4,7);
- Disp_HZ("V",1);
- }
- }
- else if(liang_cheng == 2) //量程為10v的時候數(shù)據(jù)處理
- {
- chao_song = data1*3.5*0.002443*1000; //
- if(ADC_flag1 == 1)
- {
- ADC_flag1 = 0;
- lcd_pos(3,4);
- Disp_SZ(01/10);
- Disp_SZ(01%10);
- lcd_pos(3,6);
- Disp_HZ("V",1);
- lcd_pos(4,5);
- Disp_SZ(chao_song/1000);
- Disp_SZ(chao_song%1000/100);
- Disp_SZ(chao_song%100/10);
- Disp_SZ(chao_song%10);
- lcd_pos(4,7);
- Disp_HZ("V",1);
- }
- }
- }
- /*
- * 電阻電壓檢測
- */
- void dian_zu()
- {
- lcd_pos(1,0);
- Disp_HZ("★低功耗萬用表★",8);
- lcd_pos(2,0);
- Disp_HZ("電阻電壓",4);
- lcd_pos(3,0);
- Disp_HZ("測量量程",4);
- lcd_pos(4,0);
- Disp_HZ("測量電壓",4);
- if(liang_cheng == 1) //量程為10v的時候數(shù)據(jù)處理
- {
- kuo_zhan(table[5]);
- if(ADC_flag1 == 1)
- {
- zu_zhi = (data2*1.3125*10); //100 歐姆 數(shù)據(jù)處理
- ADC_flag1 = 0;
- lcd_pos(3,5);
- Disp_SZ(10/10);
- Disp_SZ(10%10);
- lcd_pos(3,6);
- Disp_HZ("K",1);
- lcd_pos(4,5);
- Disp_SZ(zu_zhi/1000);
- Disp_SZ(zu_zhi%1000/100);
- Disp_SZ(zu_zhi%100/10);
- Disp_SZ(zu_zhi%10);
- lcd_pos(4,7);
- Disp_HZ("V",1);
- }
- }
- else if(liang_cheng == 2) //量程為10v的時候數(shù)據(jù)處理
- {
- kuo_zhan(table[6]);
- if(ADC_flag1 == 1)
- {
- zu_zhi = ((data2*0.00125438)/(1-data2*0.00125438))*1870;; //100 歐姆 數(shù)據(jù)處理
- ADC_flag1 = 0;
- lcd_pos(3,5);
- Disp_SZ(01/10);
- Disp_SZ(01%10);
- lcd_pos(3,6);
- Disp_HZ("K",1);
- lcd_pos(4,5);
- Disp_SZ(zu_zhi/1000);
- Disp_SZ(zu_zhi%1000/100);
- Disp_SZ(zu_zhi%100/10);
- Disp_SZ(zu_zhi%10);
- lcd_pos(4,7);
- Disp_HZ("V",1);
- }
- }
- else if(liang_cheng == 3) //量程為10v的時候數(shù)據(jù)處理
- {
- kuo_zhan(table[7]);
- if(ADC_flag1 == 1)
- {
- zu_zhi = ((data2*0.001244895)/(1-data2*0.001244895))*4950; //10K 歐姆的數(shù)據(jù)處理
- ADC_flag1 = 0;
- lcd_pos(3,5);
- Disp_SZ(100%1000/100);
- Disp_SZ(100%100/10);
- Disp_SZ(100%10);
- lcd_pos(3,7);
- Disp_HZ("Ω",1);
- lcd_pos(4,5);
- Disp_SZ(zu_zhi/1000);
- Disp_SZ(zu_zhi%1000/100);
- Disp_SZ(zu_zhi%100/10);
- Disp_SZ(zu_zhi%10);
- lcd_pos(4,7);
- Disp_HZ("V",1);
- }
- }
- }
- /*
- * 溫度pt100功能
- */
- void wen_du()
- {
- wen_pt = ((32231.7975*data4+0.3150709*data4*data4)*0.000016); //溫度的數(shù)據(jù)處理
- lcd_pos(2,4);
- Disp_SZ(wen_pt%1000/100);
- Disp_SZ(wen_pt%100/10);
- Disp_HZ(".",1); //充電電流
- Disp_SZ(wen_pt%10);
- lcd_pos(2,7);
- Disp_HZ("℃",1);
- }
- /*
- * 主函數(shù)
- */
- void main()
- {
- int_t();
- ADC(); //AD功能設(shè)置
- // ADC_DATA(); //AD轉(zhuǎn)換開始
- while(1)
- {
- ADC_DATA(); //AD轉(zhuǎn)換開始
- if(pt100 == 1)
- {
- pt100 = 0;
- wen_du();
- }
- if(P2IN & BIT2) //直流電壓檢測檔位
- {
- zhi_liu(); //直流電壓量程選擇控制
- }
- else if(P2IN & BIT3) //交流電壓檢測檔位
- {
- jiao_liu(); //直流電壓量程選擇控制
- }
- else if(P2IN & BIT4) //電阻電壓檢測檔位
- {
- dian_zu(); //直流電壓量程選擇控制
- }
- }
- }
- /**
- *名稱 看門狗 定時 中斷
- **/
- #pragma vector=WDT_VECTOR
- __interrupt void watchdog_timer(void)
- {
- shua_xin++;
- if(shua_xin >= 1000)
- {
- shua_xin = 0;
- ADC_flag1 = 1;
- s++;
- if(s >= 50)
- {
- pt100 = 1;
- }
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
數(shù)字萬用表內(nèi)部資料.rar
(4.99 MB, 下載次數(shù): 137)
2019-3-17 19:55 上傳
點擊文件名下載附件
|