3101|0

71

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

ADC12单通道多次转换程序详解 [复制链接]

采用的是lcd1602液晶显示

#define   Num_of_Results   32
uint results[Num_of_Results];
uchar d[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
uchar d1[11]={0xbf,0x86,0xdb,0xcf,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
uchar a[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
void main()
{
  // Stop watchdog timer to prevent time out reset
        uchar j; 
        WDTCTL = WDTPW + WDTHOLD;
        //使用外部高频晶体振荡器
        BCSCTL1&=~XT2OFF;
        do{
          IFG1&=~OFIFG;
          for(j=0XFF;j>0;j--);
        }while((IFG1&OFIFG));
        BCSCTL2|=SELM_2;
       
 
        P6DIR&=~(BIT0+BIT1);
        P6SEL |= BIT0+BIT1;  // 使能ADC通道
        ADC12CTL0 = ADC12ON+SHT0_8+MSC;
        // ADC12ON打开ADC,
        //SHT0_8设置采样时间,合适即可
        //MSC设置多次采样
        ADC12CTL1 = CSTARTADD_0+CSTARTADD_1+SHP+CONSEQ_3;
        // CSTARTADD_3让采样结果保存在ADC12MEM3中
        //CONSEQ_2单通道多次转换
        //SHP使用采样定时器
        ADC12IE = BIT0+BIT1;// 中断允许,IFG置位后会进入中断服务程序
        ADC12MCTL0=INCH_0;//通道A1 默认SERF为0,即参考0-AVCC 
        ADC12MCTL1=INCH_1;//通道A1 默认SERF为0,即参考0-AVCC     
        ADC12CTL0 |= ENC+ADC12SC;  // 使能转换并且开始转换       
        ADC12IFG=0;
        _EINT();//打开中断
 while(1);
}
//ADC中断服务函数,在这里用多次平均的        
#pragma vector=ADC_VECTOR
__interrupt void ADC12ISR (void)
{
  static uint index = 0;
      uint i,j;
      uchar ptr[4];
 P4DIR=0XFF;//p4作为输出
        P5DIR=0XFF;
        P6DIR=0XFF;
       
  results[index++] = ADC12MEM0+ADC12MEM1;  // 必须和CSTARTADD_3一样
  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=3300*sum/4095;//扩大1000倍    
    ptr[3] = real / 1000;       
    ptr[2] = (real - ptr[3]*1000)/100;
    ptr[1] = (real - ptr[3]*1000 - ptr[2]*100)/10;
    ptr[0] = (real - ptr[3]*1000 - ptr[2]*100 - ptr[1]*10);  
        for(i=0;i<4;i++)
        {
                P4OUT=d[10];
                P5OUT|=BIT5;//设置p5.5为高电平
                P4OUT=a;
                P5OUT^=BIT5;//设置p5.5为低电平    
               
                P6OUT|=BIT6;
                if(i==3)
                P4OUT=d1[ptr];
                else
                P4OUT=d[ptr];
                for(j=0;j<1000;j++);
                P4OUT=d[10];                            
                P6OUT^=BIT6;            
        }  
  }
  ADC12IFG=0;
}

 
点赞 关注

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表