单片机ad显示程序c语言,单片机ad程序【经典C语言】.doc

AD采样转换程序

/*************************************************************

程序功能:对P6.0对应的模拟通道进行多次转换后,将32次平均值

在数码管上显示(数码管显示的只是ADC的转换结果而不

是真实的模拟电压)

--------------------------------------------------------------

特别说明:如果不进行32次平均,我们会看到最低位不停的跳变。

--------------------------------------------------------------

测试说明:调节电位器R7的调整旋钮,观察显示数字的变化

*************************************************************/

#include #include "BoardConfig.h"

uint Results[32]; //存放ADC的转换结果

uint Average;

//数码管7位段码:0--f

uchar scandata[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

uchar DispBuf[4] = {0,0,0,0};

//记录显示位数的全局变量

uchar cnt = 0;

void main(void)

{

WDTCTL = WDT_ADLY_1_9; // 设置内部看门狗工作在定时器模式,1.9ms中断一次

IE1 |= WDTIE; // 使能看门狗中断

BoardConfig(0x88); // 打开数码管,关闭流水灯和电平转换

P6SEL |= BIT1; // Enable A/D channel A0

//ADC12CTL0是转换控制类寄存器

ADC12CTL0 =ADC12ON + SHT0_15 + MSC; // Turn on ADC12, set sampling time

ADC12MCTL1|=INCH_1; //INCH-1 选择模拟通道(0~3;该四位所标示的值为所选择的模拟输入通道,可能是p6的位)

ADC12CTL1 =CSTARTADD0+SHP + CONSEQ_2; // CSTARTADD0转换起始地址 SHP 采样保持脉冲模式选择 CONSEQ_2转换模式选择位Use sampling timer, set mode

ADC12IE = BIT1; // Enable ADC12IFG.0

ADC12CTL0 |= ENC; // Enable conversions,ENC转换允许位

ADC12CTL0 |= ADC12SC; // Start conversion,ADC12SC转换开始位

P4DIR = 0xff;

P5DIR = 0xff;

_EINT();

while(1)

{

_BIS_SR(LPM0_bits + GIE); // Enter LPM0, Enable interrupts

DispBuf[0] = Average / 1000; //更新数码管显示

DispBuf[1] = (Average - DispBuf[0]*1000)/100;

DispBuf[2] = (Average - DispBuf[0]*1000 - DispBuf[1]*100)/10;

DispBuf[3] = (Average - DispBuf[0]*1000 - DispBuf[1]*100 - DispBuf[2]*10);

}

}

/*******************************************

函数名称:ADC12ISR

功 能:ADC12的中断服务函数

参 数:无

返回值 :无

********************************************/

#pragma vector=ADC_VECTOR

__interrupt void ADC12ISR (void)

{

static uchar index = 0;

Results[index++] = ADC12MEM1; // Move results, IFG is cleared

if(index == 31)

{

uchar i;

Average = 0;

for(i = 0; i < 32; i++)

Average += Results[i];

Average >>= 5; //除以32求平均值

index = 0;

_BIC_SR_IRQ(LPM0_bits); // Clear LPM0

}

}

/*******************************************

函数名称:watchdog_timer

功 能:看门狗中断服务函数,在这里输出数码管的

段选和位选信号

参 数:无

返回值 :无

********************************************/

#pragma vector=WDT_VECTOR

__interrupt void watchdog_timer(void)

{

P5OUT = 0xff;

P4OUT = scandata[DispBuf[cnt]]; //输出段选信号

P5OUT &= ~(1 << cnt); //输出位选信号

cnt++; //位计数变量在0~3之间循环

if(cnt == 4) cnt = 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值