查看: 1359|回复: 0
打印 上一主题 下一主题

基于MSP430G2553内部ADC10温度传感器使用详解

[复制链接]
跳转到指定楼层
沙发
发表于 2015-9-29 17:05:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
基于MSP430G2553内部ADC10温度传感器使用详解
同样的,使用lcd1602显示,这里不再多述其程序了,前面有
  • /#include "lcd1602.h"
  • #define   Num_of_Results   32
  • static uint results[Num_of_Results];
  • uchar a[10]="0123456789";
  • uchar b[16]="temperatu       ";
  • unsigned  int ad_value[3];
  • void main()
  • {
  •     // Stop watchdog timer to prevent time out reset
  •           WDTCTL = WDTPW + WDTHOLD;
  •           //主系统时钟切换为外部高速晶振
  • if (CALBC1_8MHZ == 0xFF || CALDCO_8MHZ == 0xFF)
  • {
  •        while(1);   // If calibration constants erased, trap CPU!!
  • }
  • // Configure Basic Clock
  • BCSCTL1 = CALBC1_8MHZ;     // Set range
  • DCOCTL = CALDCO_8MHZ;    // Set DCO step + modulation*/
  •           P1SEL |= BIT0+BIT1+BIT2;  // p1.0为A0
  •           P1DIR&=~(BIT0+BIT1+BIT2);// p1.0为输入
  •          ADC10CTL0= ADC10ON+REFON+ADC10SHT_3+MSC+ADC10IE+SREF_1;
  •                        // ADC12ON打开ADC;
  •                        //ADC10SHT_3设置采样时间,合适即可
  •                        //MSC设置多次采样
  •                        // 中断允许,IFG置位后会进入中断服务程序
  •          ADC10CTL1= CONSEQ_3+INCH_10;
  •                         //CONSEQ_2单通道多次转换
  •                         // INCH_10选择内部通道A10
  •            ADC10CTL0&=~ADC10IFG;//清除中断标志位
  •          _EINT();//打开中断
  •          init_lcd();
  •           delay(10);
  • while(1)
  •           {
  •              while (ADC10CTL1 & BUSY);// Wait if ADC10 core is active
  •             ADC10CTL0 |= ENC+ADC10SC;//使能转换并且开始转换
  •             _NOP();
  •           }
  • }
  • //ADC中断服务函数,在这里用多次平均的
  • #pragma vector=ADC10_VECTOR
  • __interrupt void ADC10ISR (void)
  • {
  •         uint i;
  •         uchar ptr[4];
  •           P2SEL=0X00;
  •    static uint index = 0;
  •     results[index++] =ADC10MEM;
  •     if(index == Num_of_Results)
  •     {
  •           unsigned long sum = 0,real;
  •           index = 0;
  •           for(i = 0; i < Num_of_Results; i++)
  •           {
  •               sum += results;
  •           }
  •           sum >>= 5;                            //除以32求得平均值
  •          real=((1.5*sum/1023)-0.986)/0.00355;//扩大1000倍
  •       ptr[0] = real / 100;
  •       ptr[1] = (real - ptr[0]*100)/10;
  •       ptr[2] = (real - ptr[0]*100 - ptr[1]*10);
  •       for(i=0;i<3;i++)
  •         b[i+11]=a[ptr];
  •       _NOP();
  •       display_string(b,0xc0);
  •       _NOP();
  •     }
  •     ADC10CTL0&=~ADC10IFG;//清除中断标志位
  • }


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

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