[讨论] adc采样数码管显示 真拿它没辙、、只好请教各位了

Qknight   2009-6-10 10:09 楼主
#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之间
}

回复评论 (3)

你把你目前的问题说一下!看看是不是硬件问题!
处处留心皆学问!
点赞  2009-6-10 12:29
这样的程序430里面的例程应该有,拿过来修改一下就可以了
点赞  2009-6-10 16:14
说说遇到什么困难了,这样只贴程序,不知问啥
点赞  2009-6-11 15:57
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复