找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3233|回复: 0
收起左侧

G2口袋板MSP430G2553 slope adc源码

[复制链接]
ID:303111 发表于 2018-4-7 13:45 | 显示全部楼层 |阅读模式
利用G2口袋板,改变电位器阻值,使用adc测量阻值,再使用LCD和led显示

单片机源程序如下:
  1. /*警告:由于G2 LaunchPad上的LED2使用了P1.6(I2C引脚),所以所有涉及到I2C的实验都必须把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. //-----待测“传感器电阻”的分档值,实际接入了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();                        //测得待测电阻后的事件处理函数
  14. void TCA6416A_LED(unsigned char num);                //LED灯柱显示函数
  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);                        //等待电压稳定
  22.         TCA6416A_Init();
  23.         Slope_Measure_Init();
  24.         HT1621_init();
  25.         LCD_Clear();
  26.         Display_SLOPE();
  27.         HT1621_Reflash(LCD_Buffer);
  28.         //-----设定WDT为16ms定时中断-----
  29.         WDTCTL=WDT_ADLY_16;
  30.         //-----WDT中断使能-----
  31.     IE1|=WDTIE;
  32.          _enable_interrupts();

  33.         while(1);
  34. }

  35. /******************************************************************************************************
  36. * 名       称:WDT_ISR(void)
  37. * 功       能:WDT定时中断子函数
  38. * 入口参数:无
  39. * 出口参数:无
  40. * 说       明:直接调用事件处理函数即可
  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定时中断的事件处理函数
  53. * 入口参数:无
  54. * 出口参数:无
  55. * 说       明:主要工作都在事件处理函数中体现
  56. * 范       例:无
  57. ******************************************************************************************************/
  58. void WDT_OnTime()
  59. {
  60.         static unsigned char Charge_Ready=0;                        //充满电标志位
  61.         static unsigned char REF_Mreasure_Ready=0;        //等于8表明参考电阻已测完
  62.         static unsigned long R_REF_Sum=0;                        //暂存参考电阻的累加值
  63.                 if(Charge_Ready==0)                //未充满电
  64.                 {
  65.                         Slope_Port_Charge();        //充电
  66.                         Slope_R_Dect();                        //执行显示LED的任务
  67.                         Charge_Ready=1;                //充满电标志
  68.                 }
  69.                 else
  70.                 {
  71.                         //-----测量8次参考电阻值-----
  72.                         if(REF_Mreasure_Ready<8)                                        // 判断是否继续测量参考电阻值
  73.                         {
  74.                                 Slope_Measure_REF();                                                //测参考电阻值
  75.                                 R_REF_Sum=R_REF_Sum+R_REF;                //累加电阻值
  76.                                 if(REF_Mreasure_Ready==7)        R_REF=R_REF_Sum>>3;        //测量完毕求出参考电阻的平均值
  77.                                 REF_Mreasure_Ready++;                                        //测量次数累加
  78.                         }
  79.                         //-----得到参考电阻值后,开始不停的测量传感器电阻值-----
  80.                         else
  81.                                 Slope_Measure_SENS();                                        //测完参考电阻才测传感器电阻
  82.                                 Charge_Ready=0;                                                        //测完一次,又该充电了
  83.                 }
  84. }

  85. /******************************************************************************************************
  86. * 名       称:Slope_R_Dect()
  87. * 功       能:对传感器电阻判断档位,调用LED显示程序
  88. * 入口参数:无
  89. * 出口参数:无
  90. * 说       明:主要工作都在事件处理函数中体现
  91. * 范       例:无
  92. ******************************************************************************************************/
  93. void Slope_R_Dect()
  94. {
  95.         static unsigned int Rsens=0;
  96.         unsigned char Key_Last=0;                //用于判断是否数据有更新
  97.         Key_Last=Key;
  98.         //-----通过10k参考电阻,计算电阻绝对值,单位百欧-----
  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.         //-----调用一系列显示任务-----
  111.         Display_RSENS(Rsens);                //显示实际电阻值
  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. * 功       能:根据传感器电阻值,实现LED灯柱效果
  123. * 入口参数:无
  124. * 出口参数:无
  125. * 说       明:需要调用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)                                        // 判断当前需要点亮几盏灯
  134.                         PinOUT(i,0);                        //根据LED接法,IO低电平为点亮LED
  135.                 else
  136.                         PinOUT(i,1);                        //根据LED接法,IO高电平为熄灭LED
  137.         }
  138. }
  139. /******************************************************************************************************
  140. * 名       称:Display_SLOPE()
  141. * 功       能:在LED上显示固定不变的内容
  142. * 入口参数:无
  143. * 出口参数:无
  144. * 说       明:包括显示SLOPE,2个小数点,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.         //-----显示小数点-----
  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字段上显示实测传感器电阻值
  179. * 入口参数:无
  180. * 出口参数:无
  181. * 说       明:哪位内容有改变才更新该位的显存。
  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};                //用于对比数值是否有改变
  189.         for(i=0;i<3;i++){
  190.                 Digit_Past[i]=Digit[i];
  191.         }
  192.         //-----拆分数字-----
  193.         Digit[2]=Rsens/100;
  194.         Digit[1]=(Rsens%100)/10;
  195.         Digit[0]=Rsens%10;
  196.         //-----判别数位的改变,并更新该位显存-----
  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. }

复制代码

所有资料51hei提供下载:
17_Slope_ADC.rar (93.4 KB, 下载次数: 21)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表