找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3899|回復(fù): 0
收起左側(cè)

G2口袋板MSP430G2553 slope adc源碼

[復(fù)制鏈接]
ID:303111 發(fā)表于 2018-4-7 13:45 | 顯示全部樓層 |閱讀模式
利用G2口袋板,改變電位器阻值,使用adc測(cè)量阻值,再使用LCD和led顯示

單片機(jī)源程序如下:
  1. /*警告:由于G2 LaunchPad上的LED2使用了P1.6(I2C引腳),所以所有涉及到I2C的實(shí)驗(yàn)都必須把P1.6跳線拔除,包含本例程!
  2. * main.c
  3. */
  4. #include"MSP430G2553.h"
  5. #include "Slope.h"
  6. #include "TCA6416A.h"
  7. #include "HT1621.h"
  8. #include "LCD_128.h"

  9. unsigned char Key=0;                //輪盤電位器的電阻等效按鍵值
  10. //-----待測(cè)“傳感器電阻”的分檔值,實(shí)際接入了5k定值電阻+10k輪盤電位器-----
  11. const unsigned char R_Class[8]={55,67,82,97,113,128,138,144};                //單位為百歐

  12. void WDT_OnTime();
  13. void Slope_R_Dect();                        //測(cè)得待測(cè)電阻后的事件處理函數(shù)
  14. void TCA6416A_LED(unsigned char num);                //LED燈柱顯示函數(shù)
  15. void Display_SLOPE();
  16. void Display_RSENS(unsigned char Rsens);

  17. void main(void) {
  18.         WDTCTL=WDTPW+WDTHOLD;
  19.     BCSCTL1 = CALBC1_16MHZ;      /* Set DCO to16MHz */
  20.     DCOCTL = CALDCO_16MHZ;
  21.         __delay_cycles(100000);                        //等待電壓穩(wěn)定
  22.         TCA6416A_Init();
  23.         Slope_Measure_Init();
  24.         HT1621_init();
  25.         LCD_Clear();
  26.         Display_SLOPE();
  27.         HT1621_Reflash(LCD_Buffer);
  28.         //-----設(shè)定WDT為16ms定時(shí)中斷-----
  29.         WDTCTL=WDT_ADLY_16;
  30.         //-----WDT中斷使能-----
  31.     IE1|=WDTIE;
  32.          _enable_interrupts();

  33.         while(1);
  34. }

  35. /******************************************************************************************************
  36. * 名       稱:WDT_ISR(void)
  37. * 功       能:WDT定時(shí)中斷子函數(shù)
  38. * 入口參數(shù):無
  39. * 出口參數(shù):無
  40. * 說       明:直接調(diào)用事件處理函數(shù)即可
  41. * 范       例:無
  42. ******************************************************************************************************/
  43. #pragma vector=WDT_VECTOR
  44. __interrupt void WDT_ISR(void)
  45. {
  46.          IE1&=~WDTIE;
  47.         WDT_OnTime();
  48.          IE1|=WDTIE;
  49. }
  50. /******************************************************************************************************
  51. * 名       稱:WDT_OnTime()
  52. * 功       能:WDT定時(shí)中斷的事件處理函數(shù)
  53. * 入口參數(shù):無
  54. * 出口參數(shù):無
  55. * 說       明:主要工作都在事件處理函數(shù)中體現(xiàn)
  56. * 范       例:無
  57. ******************************************************************************************************/
  58. void WDT_OnTime()
  59. {
  60.         static unsigned char Charge_Ready=0;                        //充滿電標(biāo)志位
  61.         static unsigned char REF_Mreasure_Ready=0;        //等于8表明參考電阻已測(cè)完
  62.         static unsigned long R_REF_Sum=0;                        //暫存參考電阻的累加值
  63.                 if(Charge_Ready==0)                //未充滿電
  64.                 {
  65.                         Slope_Port_Charge();        //充電
  66.                         Slope_R_Dect();                        //執(zhí)行顯示LED的任務(wù)
  67.                         Charge_Ready=1;                //充滿電標(biāo)志
  68.                 }
  69.                 else
  70.                 {
  71.                         //-----測(cè)量8次參考電阻值-----
  72.                         if(REF_Mreasure_Ready<8)                                        // 判斷是否繼續(xù)測(cè)量參考電阻值
  73.                         {
  74.                                 Slope_Measure_REF();                                                //測(cè)參考電阻值
  75.                                 R_REF_Sum=R_REF_Sum+R_REF;                //累加電阻值
  76.                                 if(REF_Mreasure_Ready==7)        R_REF=R_REF_Sum>>3;        //測(cè)量完畢求出參考電阻的平均值
  77.                                 REF_Mreasure_Ready++;                                        //測(cè)量次數(shù)累加
  78.                         }
  79.                         //-----得到參考電阻值后,開始不停的測(cè)量傳感器電阻值-----
  80.                         else
  81.                                 Slope_Measure_SENS();                                        //測(cè)完參考電阻才測(cè)傳感器電阻
  82.                                 Charge_Ready=0;                                                        //測(cè)完一次,又該充電了
  83.                 }
  84. }

  85. /******************************************************************************************************
  86. * 名       稱:Slope_R_Dect()
  87. * 功       能:對(duì)傳感器電阻判斷檔位,調(diào)用LED顯示程序
  88. * 入口參數(shù):無
  89. * 出口參數(shù):無
  90. * 說       明:主要工作都在事件處理函數(shù)中體現(xiàn)
  91. * 范       例:無
  92. ******************************************************************************************************/
  93. void Slope_R_Dect()
  94. {
  95.         static unsigned int Rsens=0;
  96.         unsigned char Key_Last=0;                //用于判斷是否數(shù)據(jù)有更新
  97.         Key_Last=Key;
  98.         //-----通過10k參考電阻,計(jì)算電阻絕對(duì)值,單位百歐-----
  99.         Rsens=(((unsigned long int)100)*(unsigned long int)R_SENS)/R_REF;
  100.         //-----傳感器電阻分檔判斷,5k至15k之間,分8檔-----
  101.         if(Rsens<=R_Class[0])                         Key=0;
  102.         else if (Rsens<=R_Class[1])         Key=1;
  103.         else if (Rsens<=R_Class[2])        Key=2;
  104.         else if (Rsens<=R_Class[3])         Key=3;
  105.         else if (Rsens<=R_Class[4])         Key=4;
  106.         else if (Rsens<=R_Class[5])         Key=5;
  107.         else if (Rsens<=R_Class[6])         Key=6;
  108.         else         if(Rsens<=R_Class[7])         Key=7;
  109.         else                                                                                        Key=8;
  110.         //-----調(diào)用一系列顯示任務(wù)-----
  111.         Display_RSENS(Rsens);                //顯示實(shí)際電阻值
  112.         if(!(Key==Key_Last))                        //顯示電阻分檔值
  113.         {
  114.                 LCD_DisplayDigit(LCD_DIGIT_CLEAR ,6);
  115.                 LCD_DisplayDigit(Key,6);
  116.                 HT1621_Reflash_Digit(6);
  117.         }
  118.         TCA6416A_LED(Key);                         //LED燈柱顯示
  119. }
  120. /******************************************************************************************************
  121. * 名       稱:TCA6416A_LED()
  122. * 功       能:根據(jù)傳感器電阻值,實(shí)現(xiàn)LED燈柱效果
  123. * 入口參數(shù):無
  124. * 出口參數(shù):無
  125. * 說       明:需要調(diào)用I2C和TCA6416控制LED
  126. * 范       例:無
  127. ******************************************************************************************************/
  128. void TCA6416A_LED(unsigned char num)
  129. {
  130.         unsigned char i = 0;
  131.         for(i=0;i<8;i++)
  132.         {
  133.                 if(i<num)                                        // 判斷當(dāng)前需要點(diǎn)亮幾盞燈
  134.                         PinOUT(i,0);                        //根據(jù)LED接法,IO低電平為點(diǎn)亮LED
  135.                 else
  136.                         PinOUT(i,1);                        //根據(jù)LED接法,IO高電平為熄滅LED
  137.         }
  138. }
  139. /******************************************************************************************************
  140. * 名       稱:Display_SLOPE()
  141. * 功       能:在LED上顯示固定不變的內(nèi)容
  142. * 入口參數(shù):無
  143. * 出口參數(shù):無
  144. * 說       明:包括顯示SLOPE,2個(gè)小數(shù)點(diǎn),logo,kΩ單位。
  145. * 范       例:無
  146. ******************************************************************************************************/
  147. void Display_SLOPE()
  148. {
  149.         //-----顯示S-----
  150.         LCD_DisplayDigit(5,1);
  151.         //-----顯示L-----
  152.         LCD_DisplayDigit(0,2);
  153.         LCD_ClearSeg(_LCD_2A);
  154.         LCD_ClearSeg(_LCD_2B);
  155.         LCD_ClearSeg(_LCD_2C);
  156.         //-----顯示O-----
  157.         LCD_DisplayDigit(0,3);
  158.         //-----顯示P-----
  159.         LCD_DisplayDigit(8,4);
  160.         LCD_ClearSeg(_LCD_4C);
  161.         LCD_ClearSeg(_LCD_4D);
  162.         //-----顯示E-----
  163.         LCD_DisplayDigit(8,5);
  164.         LCD_ClearSeg(_LCD_5B);
  165.         LCD_ClearSeg(_LCD_5C);
  166.         //-----顯示小數(shù)點(diǎn)-----
  167.         LCD_DisplaySeg(_LCD_DOT4);
  168.         LCD_DisplaySeg(_LCD_DOT6);
  169.         //-----顯示logo-----
  170.         LCD_DisplaySeg(_LCD_TI_logo);
  171.         LCD_DisplaySeg(_LCD_QDU_logo);
  172.         //-----顯示kΩ-----
  173.         LCD_DisplaySeg(_LCD_k_OHOM);
  174.         LCD_DisplaySeg(_LCD_OHOM);
  175. }
  176. /******************************************************************************************************
  177. * 名       稱:Display_RSENS()
  178. * 功       能:在LED的小8字段上顯示實(shí)測(cè)傳感器電阻值
  179. * 入口參數(shù):無
  180. * 出口參數(shù):無
  181. * 說       明:哪位內(nèi)容有改變才更新該位的顯存。
  182. * 范       例:無
  183. ******************************************************************************************************/
  184. void Display_RSENS(unsigned char Rsens)
  185. {
  186.         unsigned char i=0;
  187.         static unsigned char Digit[3]={0};
  188.         unsigned char Digit_Past[3]={0};                //用于對(duì)比數(shù)值是否有改變
  189.         for(i=0;i<3;i++){
  190.                 Digit_Past[i]=Digit[i];
  191.         }
  192.         //-----拆分?jǐn)?shù)字-----
  193.         Digit[2]=Rsens/100;
  194.         Digit[1]=(Rsens%100)/10;
  195.         Digit[0]=Rsens%10;
  196.         //-----判別數(shù)位的改變,并更新該位顯存-----
  197.         for(i=0;i<3;i++)
  198.         {
  199.                 if(!(Digit[i]==Digit_Past[i]))                //如果有變化
  200.                 {
  201.                         LCD_DisplayDigit(LCD_DIGIT_CLEAR ,i+8);        //清除該8字段
  202.                         LCD_DisplayDigit(Digit[i],i+8);                                                //寫顯存映射
  203.                         HT1621_Reflash_Digit(i+8);                                                        //僅更新該8字段的顯存
  204.                 }
  205.         }
  206. }

復(fù)制代碼

所有資料51hei提供下載:
17_Slope_ADC.rar (93.4 KB, 下載次數(shù): 21)


回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表