|
本程序是《MSP430系列單片機(jī)系統(tǒng)工程設(shè)計(jì)與實(shí)踐》書里面的源碼,(包含工程文件(例4.1.6))完整例程下載:http://www.torrancerestoration.com/bbs/dpj-46245-1.html

關(guān)于本程序的詳細(xì)解說(shuō)大家可以點(diǎn)擊上圖下載電子書
- /*
-
- 超級(jí)終端在電壓表自動(dòng)校準(zhǔn)中的應(yīng)用實(shí)例
- 說(shuō)明:該程序示范用超級(jí)終端進(jìn)行電壓表校準(zhǔn)的人機(jī)交互范例。
-
- //=========================================================================
- (C)西安電子科技大學(xué) 測(cè)控技術(shù)與儀器教研中心 編寫:謝楷 2008/06/24
-
- */
- //******************************************************************************
- //
- // MSP430FE425
- // +-----------------+
- // | XIN|-
- // | | 32kHz
- // | XOUT|-
- // | |
- // | (TXD)P2.4|----------->(TTL/232)----> RXD(2)
- // | | 4800 bps ,n,8,1
- // | (RXD)P2.5|<-----------(TTL/232)<---- TXD(3) PC(DB9)
- // | |
- // | GND |---------------------------GND(5)
- //
- //******************************************************************************
- #include "msp430x42x.h" /*430寄存器頭文件*/
- #include "UART.h" /*串口通訊程序庫(kù)頭文件*/
- #include "stdio.h" /*標(biāo)準(zhǔn)IO設(shè)備頭文件(printf/scanf函數(shù)所需)*/
- #include "math.h" /*數(shù)學(xué)函數(shù)庫(kù)*/
- #include "LCD_Display.h" /*LCD顯示函數(shù)庫(kù)頭文件*/
- #include "ADC16.h" /*ADCc采樣函數(shù)庫(kù)頭文件*/
- #include "Flash.h"
- #include "BasicTimer.h"
- int Voltage_Sample()
- {
- int ADC_Value,i;
- ADC16_VrefOn(); // 打開(kāi)基準(zhǔn)源
- Analog_On(); // 打開(kāi)外設(shè)電源P2.2(如果有必要)
- for(i=0;i<100;i++); // 略延遲,等待穩(wěn)定
- ADC_Value=ADC16_Sample(2,1); //ADC2單次采樣
- ADC16_VrefOff(); // 打開(kāi)基準(zhǔn)源
- Analog_Off(); //關(guān)閉外設(shè)電源P2.2(如果有必要)
- return(ADC_Value); // 返回采樣結(jié)果
- }
- void Calibrate()
- {
- char Chr=0;
- int ADC_Temp;
- int Volt_FS;
- printf("\f"); // 清屏
- printf("1秒內(nèi)按'C'鍵進(jìn)入校準(zhǔn)模式\n"); // 提示按'C'鍵進(jìn)入校準(zhǔn)模式
- __delay_cycles(1000000); // 等待1秒
- Chr=U0RXBUF; // 取出串口收到數(shù)據(jù)(未收到讀回0)
- if((Chr=='C')||(Chr=='c')) // 如果收字符為'C'或'c',才進(jìn)入校準(zhǔn)模式
- {
- printf("校準(zhǔn)開(kāi)始\n"); // 提示校準(zhǔn)開(kāi)始
- printf("請(qǐng)輸入0V電壓,然后按回車鍵繼續(xù)...\n");
- while(getchar()!='\n'); // 等待回車鍵
- ADC_Temp=Voltage_Sample(); // 采樣一次ADC讀數(shù),作為零點(diǎn)數(shù)值
- Flash_WriteWord(0,ADC_Temp); // 將結(jié)果保存在InfoFlash的0、1單元
- printf("零點(diǎn)采樣值=%d\n",ADC_Temp);// 提示零點(diǎn)采樣結(jié)果
- printf("校準(zhǔn)輸入滿度校準(zhǔn)電壓(5000=50.00V):");// 提示輸入滿度校準(zhǔn)電壓值
- scanf("%d",&Volt_FS); // 從計(jì)算機(jī)輸入滿度電壓值
- Flash_WriteWord(2,Volt_FS); // 將結(jié)果保存在InfoFlash的2、3單元
- printf("請(qǐng)輸入滿度電壓,然后按回車鍵繼續(xù)...\n");
- while(getchar()!='\n'); // 等回車鍵
- ADC_Temp=Voltage_Sample(); // 采樣一次ADC讀數(shù),作為零點(diǎn)數(shù)值
- Flash_WriteWord(4,ADC_Temp); // 將結(jié)果保存在InfoFlash的4、5單元
- printf("滿度采樣值=%d\n",ADC_Temp);// 提示滿度采樣結(jié)果
- printf("校準(zhǔn)完畢!\n\7"); // 校準(zhǔn)完畢,鳴響一聲(\7是鳴響符)
- }
- }
- void main( void )
- {
- int ADC_0,ADC_F, VCAL,Voltage,ADC_Result;
- WDTCTL=WDTPW+WDTHOLD; //停止看門狗
- FLL_CTL0|=XCAP18PF; //配置晶振負(fù)載電容
- P1DIR|=BIT0+BIT1+BIT2+BIT3+BIT4;
- P2DIR|=BIT0+BIT1+BIT2+BIT3; //不用的IO設(shè)為輸出
- P1OUT=0;P2OUT=0; //以免不確定電平造成額外耗電
- BT_Init(2);
- LCD_Init(); //初始化液晶顯示
- UART_Init(4800,'n',8,1); //串口初始化,設(shè)置成4800bps,無(wú)校驗(yàn),8位數(shù)據(jù),1位停止
- ADC16_Init(2,0,'S',1); //ADC2設(shè)為外部輸入,數(shù)據(jù)格式有符號(hào),1倍放大
- Calibrate(); //校準(zhǔn)
- ADC_0=Flash_ReadWord(0); //讀取校準(zhǔn)參數(shù)(零點(diǎn))
- ADC_F=Flash_ReadWord(4); //讀取校準(zhǔn)參數(shù)(滿點(diǎn))
- VCAL=Flash_ReadWord(2); //讀取校準(zhǔn)參數(shù)(滿點(diǎn)電壓值)
- while(1)
- {
- Cpu_SleepWaitBT(); //等待被BT中斷喚醒,以下代碼每隔1/2秒執(zhí)行一次
- ADC_Result=Voltage_Sample(); //采樣一次
- Voltage=((long)ADC_Result-ADC_0)*VCAL/((long)ADC_F-ADC_0);//計(jì)算電壓
- LCD_DisplayDecimal(Voltage,2); //顯示電壓值,帶2位小數(shù) (例2.5.10)
- LCD_InsertChar(VV); // 尾部添加單位: V
- }
- }
復(fù)制代碼
|
|