|
adc采样数码管显示 真拿它没辙、、只好请教各位了
[复制链接]
#include
#include "math.h"
#define Num_of_Results 32
typedef unsigned char uchar;
typedef unsigned int uint;
static uint results[Num_of_Results]; //保存ADC转换结果的数组
float Trans_val(uint Hex_Val);
float m;
int Dispbuf[2];
int cnt;
//数码管7位段码;0--f
uchar scandata[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,
0x7c,0x39,0x5e,0x79,0x71};
/****************主函数******************/
void main(void)
{
WDTCTL=WDTPW+WDTHOLD; //关闭看门狗
TACTL=TASSEL1+TACLR; //选择SMCLK,清除TAR
CCTL0=CCIE; //CCR0中断允许
CCR0=400; //增计数模式
TACTL|=MC0;
P6SEL|=0x01;//p6.0做为模拟信号输入端口
P6DIR&=~BIT0;
ADC12MCTL0|=INCH_0;
//ADC12CTL0 &=REF2_5V; // 选择内部 1.5V 参考电压
ADC12CTL0 = ADC12ON + SHT0_15 + MSC; //打开ADC,设置采样时间
ADC12CTL1=SHP+CONSEQ_2;//使用采样定时
ADC12IE|=0x01;
ADC12CTL0|=ENC; //使能转换
ADC12CTL0|=ADC12SC; //开始转换
//初始化端口
P4DIR=0xff; //P4段选,P5位选,都设为输出
P5DIR=0xff;
P4OUT=0x00; //开始输出置反,不亮
P5OUT|=0x03;
_EINT();
while(1)
{
_BIS_SR(LMP0_bits + GIE);
Dispbuf[0]=(int)(m);
Dispbuf[1]=(int) (m*10-Dispbuf[0]*10);
}
}
/****************中断服务函数*********************
用途;多次平均计算P60口的模拟电压数值************/
#pragma vector=ADC_VECTOR
__interrupt void ADC12ISR(void)
{
static uint index=0;
results[index++]=ADC12MEM0; //移动结果
if(index==Num_of_Results)
{
uchar i;
unsigned long sum=0;
index=0;
for(i=0;i
{
sum+=results;
}
sum>>=5; //除以32
m=Trans_val(sum);
//m=Trans_val;
_BIC_SR_IRQ(LPM0_bits);
}
}
/*********************转换数据函数****************
功能;将16进制转换数据变换成三位10进制真实的模拟电压数据*****/
float Trans_val(uint Hex_val)
{
unsigned long caltmp;
float curr_volt1;
uint curr_volt;
caltmp=Hex_val;
caltmp=(caltmp<<5)+Hex_val; //caltmp=Hex_val*33
caltmp=(caltmp<<3)+(caltmp<<1); //caltmp=caltmp*10
curr_volt=caltmp>>12; //curr_volt= caltmp/2^n
curr_volt1=curr_volt*0.01;
return curr_volt1;
}
/*********************数码管显示***************/
//定时器中断
#pragma vector=TIMERA0_VECTOR//定时器0中断服务
__interrupt void timer_a0(void)
{
P5OUT=0xff;
P4OUT=scandata[Dispbuf[cnt]]; //输出段选信号
P5OUT&=~(1<<(cnt)); //输出位选信号
cnt++;
if(cnt==2) cnt=0; //0到2之间
}
|
|