利用G2口袋板,改變電位器阻值,使用adc測量阻值,再使用LCD和led顯示
單片機源程序如下:
- /*警告:由于G2 LaunchPad上的LED2使用了P1.6(I2C引腳),所以所有涉及到I2C的實驗都必須把P1.6跳線拔除,包含本例程!
- * main.c
- */
- #include"MSP430G2553.h"
- #include "Slope.h"
- #include "TCA6416A.h"
- #include "HT1621.h"
- #include "LCD_128.h"
- unsigned char Key=0; //輪盤電位器的電阻等效按鍵值
- //-----待測“傳感器電阻”的分檔值,實際接入了5k定值電阻+10k輪盤電位器-----
- const unsigned char R_Class[8]={55,67,82,97,113,128,138,144}; //單位為百歐
- void WDT_OnTime();
- void Slope_R_Dect(); //測得待測電阻后的事件處理函數
- void TCA6416A_LED(unsigned char num); //LED燈柱顯示函數
- void Display_SLOPE();
- void Display_RSENS(unsigned char Rsens);
- void main(void) {
- WDTCTL=WDTPW+WDTHOLD;
- BCSCTL1 = CALBC1_16MHZ; /* Set DCO to16MHz */
- DCOCTL = CALDCO_16MHZ;
- __delay_cycles(100000); //等待電壓穩定
- TCA6416A_Init();
- Slope_Measure_Init();
- HT1621_init();
- LCD_Clear();
- Display_SLOPE();
- HT1621_Reflash(LCD_Buffer);
- //-----設定WDT為16ms定時中斷-----
- WDTCTL=WDT_ADLY_16;
- //-----WDT中斷使能-----
- IE1|=WDTIE;
- _enable_interrupts();
- while(1);
- }
- /******************************************************************************************************
- * 名 稱:WDT_ISR(void)
- * 功 能:WDT定時中斷子函數
- * 入口參數:無
- * 出口參數:無
- * 說 明:直接調用事件處理函數即可
- * 范 例:無
- ******************************************************************************************************/
- #pragma vector=WDT_VECTOR
- __interrupt void WDT_ISR(void)
- {
- IE1&=~WDTIE;
- WDT_OnTime();
- IE1|=WDTIE;
- }
- /******************************************************************************************************
- * 名 稱:WDT_OnTime()
- * 功 能:WDT定時中斷的事件處理函數
- * 入口參數:無
- * 出口參數:無
- * 說 明:主要工作都在事件處理函數中體現
- * 范 例:無
- ******************************************************************************************************/
- void WDT_OnTime()
- {
- static unsigned char Charge_Ready=0; //充滿電標志位
- static unsigned char REF_Mreasure_Ready=0; //等于8表明參考電阻已測完
- static unsigned long R_REF_Sum=0; //暫存參考電阻的累加值
- if(Charge_Ready==0) //未充滿電
- {
- Slope_Port_Charge(); //充電
- Slope_R_Dect(); //執行顯示LED的任務
- Charge_Ready=1; //充滿電標志
- }
- else
- {
- //-----測量8次參考電阻值-----
- if(REF_Mreasure_Ready<8) // 判斷是否繼續測量參考電阻值
- {
- Slope_Measure_REF(); //測參考電阻值
- R_REF_Sum=R_REF_Sum+R_REF; //累加電阻值
- if(REF_Mreasure_Ready==7) R_REF=R_REF_Sum>>3; //測量完畢求出參考電阻的平均值
- REF_Mreasure_Ready++; //測量次數累加
- }
- //-----得到參考電阻值后,開始不停的測量傳感器電阻值-----
- else
- Slope_Measure_SENS(); //測完參考電阻才測傳感器電阻
- Charge_Ready=0; //測完一次,又該充電了
- }
- }
- /******************************************************************************************************
- * 名 稱:Slope_R_Dect()
- * 功 能:對傳感器電阻判斷檔位,調用LED顯示程序
- * 入口參數:無
- * 出口參數:無
- * 說 明:主要工作都在事件處理函數中體現
- * 范 例:無
- ******************************************************************************************************/
- void Slope_R_Dect()
- {
- static unsigned int Rsens=0;
- unsigned char Key_Last=0; //用于判斷是否數據有更新
- Key_Last=Key;
- //-----通過10k參考電阻,計算電阻絕對值,單位百歐-----
- Rsens=(((unsigned long int)100)*(unsigned long int)R_SENS)/R_REF;
- //-----傳感器電阻分檔判斷,5k至15k之間,分8檔-----
- if(Rsens<=R_Class[0]) Key=0;
- else if (Rsens<=R_Class[1]) Key=1;
- else if (Rsens<=R_Class[2]) Key=2;
- else if (Rsens<=R_Class[3]) Key=3;
- else if (Rsens<=R_Class[4]) Key=4;
- else if (Rsens<=R_Class[5]) Key=5;
- else if (Rsens<=R_Class[6]) Key=6;
- else if(Rsens<=R_Class[7]) Key=7;
- else Key=8;
- //-----調用一系列顯示任務-----
- Display_RSENS(Rsens); //顯示實際電阻值
- if(!(Key==Key_Last)) //顯示電阻分檔值
- {
- LCD_DisplayDigit(LCD_DIGIT_CLEAR ,6);
- LCD_DisplayDigit(Key,6);
- HT1621_Reflash_Digit(6);
- }
- TCA6416A_LED(Key); //LED燈柱顯示
- }
- /******************************************************************************************************
- * 名 稱:TCA6416A_LED()
- * 功 能:根據傳感器電阻值,實現LED燈柱效果
- * 入口參數:無
- * 出口參數:無
- * 說 明:需要調用I2C和TCA6416控制LED
- * 范 例:無
- ******************************************************************************************************/
- void TCA6416A_LED(unsigned char num)
- {
- unsigned char i = 0;
- for(i=0;i<8;i++)
- {
- if(i<num) // 判斷當前需要點亮幾盞燈
- PinOUT(i,0); //根據LED接法,IO低電平為點亮LED
- else
- PinOUT(i,1); //根據LED接法,IO高電平為熄滅LED
- }
- }
- /******************************************************************************************************
- * 名 稱:Display_SLOPE()
- * 功 能:在LED上顯示固定不變的內容
- * 入口參數:無
- * 出口參數:無
- * 說 明:包括顯示SLOPE,2個小數點,logo,kΩ單位。
- * 范 例:無
- ******************************************************************************************************/
- void Display_SLOPE()
- {
- //-----顯示S-----
- LCD_DisplayDigit(5,1);
- //-----顯示L-----
- LCD_DisplayDigit(0,2);
- LCD_ClearSeg(_LCD_2A);
- LCD_ClearSeg(_LCD_2B);
- LCD_ClearSeg(_LCD_2C);
- //-----顯示O-----
- LCD_DisplayDigit(0,3);
- //-----顯示P-----
- LCD_DisplayDigit(8,4);
- LCD_ClearSeg(_LCD_4C);
- LCD_ClearSeg(_LCD_4D);
- //-----顯示E-----
- LCD_DisplayDigit(8,5);
- LCD_ClearSeg(_LCD_5B);
- LCD_ClearSeg(_LCD_5C);
- //-----顯示小數點-----
- LCD_DisplaySeg(_LCD_DOT4);
- LCD_DisplaySeg(_LCD_DOT6);
- //-----顯示logo-----
- LCD_DisplaySeg(_LCD_TI_logo);
- LCD_DisplaySeg(_LCD_QDU_logo);
- //-----顯示kΩ-----
- LCD_DisplaySeg(_LCD_k_OHOM);
- LCD_DisplaySeg(_LCD_OHOM);
- }
- /******************************************************************************************************
- * 名 稱:Display_RSENS()
- * 功 能:在LED的小8字段上顯示實測傳感器電阻值
- * 入口參數:無
- * 出口參數:無
- * 說 明:哪位內容有改變才更新該位的顯存。
- * 范 例:無
- ******************************************************************************************************/
- void Display_RSENS(unsigned char Rsens)
- {
- unsigned char i=0;
- static unsigned char Digit[3]={0};
- unsigned char Digit_Past[3]={0}; //用于對比數值是否有改變
- for(i=0;i<3;i++){
- Digit_Past[i]=Digit[i];
- }
- //-----拆分數字-----
- Digit[2]=Rsens/100;
- Digit[1]=(Rsens%100)/10;
- Digit[0]=Rsens%10;
- //-----判別數位的改變,并更新該位顯存-----
- for(i=0;i<3;i++)
- {
- if(!(Digit[i]==Digit_Past[i])) //如果有變化
- {
- LCD_DisplayDigit(LCD_DIGIT_CLEAR ,i+8); //清除該8字段
- LCD_DisplayDigit(Digit[i],i+8); //寫顯存映射
- HT1621_Reflash_Digit(i+8); //僅更新該8字段的顯存
- }
- }
- }
復制代碼
所有資料51hei提供下載:
17_Slope_ADC.rar
(93.4 KB, 下載次數: 21)
2018-4-7 13:44 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|