|
/*任务要求:4路电压信号输入,电压范围0~5V。单片机A0~A3通道轮流采样转换
4位LED数码管轮流显示4路电压值*/
#include
#define Num_of_Results 8
static unsigned int A0results[Num_of_Results];//A0结果数组
static unsigned int A1results[Num_of_Results];//A1结果数组
static unsigned int A2results[Num_of_Results];//A2结果数组
static unsigned int A3results[Num_of_Results];//A3结果数组
unsigned char led[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,
0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//共阳极数码管
char position[]={0x08,0x04,0x02,0x01};//位码
unsigned char led_buf[]={0,0,0,0};//显示缓冲区
unsigned long data;
void data_to_buf(void)//值送显示缓冲区函数
{
char i;
for(i=0;i<6;i++)
{
led_buf[i]=data%10;//低位在前
data=data/10;
}
}
void disp(void) //动态扫描显示函数
{
char i;
unsigned int k;
for(i=0;i<6;i++)
{
P4OUT=led[led_buf[i]];
P5OUT=position[i];
//if(i==3)
//P4OUT&=0x7f; //小数点
for(k=0;k<600;k++);//延时
P5OUT=0x00; //关显示
}
}
void main(void)
{
char i;
unsigned long data1,data2,data3,data4;
WDTCTL=WDTPW+WDTHOLD;
P4DIR=0xff;
P5DIR=0xff;
P6SEL|=0x0f;//打开A0~A3A/D通道输入
ADC12CTL0=ADC12ON+SHT0_15+MSC;//开ADC12模块+采样信号由SHI仅首次触发
//采集定时器分频系数n=1024
ADC12CTL1=SHP+CONSEQ_3+ADC12DIV_7;
//使用采样定时器输出作采集/转换信号SAMPCON
//重复序列采样模式+ADC12SSEL_2
ADC12MCTL0=INCH_0;//参考电压取AVCC,输入通道选择为A0
ADC12MCTL1=INCH_1;//参考电压取AVCC,输入通道选择为A1
ADC12MCTL2=INCH_2;//参考电压取AVCC,输入通道选择为A2
ADC12MCTL3=INCH_3+EOS;//参考电压取AVCC,输入通道选择为A3
//由此通道产生序列结束控制位
ADC12IE=0x08;//A3通道开中断ADC12IFG.3
ADC12CTL0|=ENC;//允许转换
ADC12CTL0|=ADC12SC;//启动转换
_EINT();
while(1)
{
data1=0;
data2=0;
data3=0;
data4=0;
for(i=0;i
{
data1=data1+A0results[i];
}
for(i=0;i
{
data2=data2+A1results[i];
}
for(i=0;i
{
data3=data3+A2results[i];
}
for(i=0;i
{
data4=data4+A3results[i];
}
data1=data1/Num_of_Results;//求平均值
data2=data2/Num_of_Results;//求平均值
data3=data3/Num_of_Results;//求平均值
data4=data4/Num_of_Results;//求平均值
data=data1*50;
data=data*10;
data=data*10;
data=data/4096;
data_to_buf();//数据送显示缓冲区
for(i=0;i<100;i++)
{
disp();
}
data=data2*50;
data=data*10;
data=data*10;
data=data/4096;
data_to_buf();//数据送显示缓冲区
for(i=0;i<100;i++)
{
disp();
}
data=data3*50;
data=data*10;
data=data*10;
data=data/4096;
data_to_buf();//数据送显示缓冲区
for(i=0;i<100;i++)
{
disp();
}
data=data4*50;
data=data*10;
data=data*10;
data=data/4096;
data_to_buf();//数据送显示缓冲区
for(i=0;i<100;i++)
{
disp();
}
}
}
#pragma vector=ADC12_VECTOR
__interrupt void ADC12ISR(void)//ADC中断服务函数
{
static unsigned int index=0;
A0results[index]=ADC12MEM0;//移动A0结果到数组,同时清除ADC12IFG.0
A1results[index]=ADC12MEM1;//移动A1结果到数组,同时清除ADC12IFG.1
A2results[index]=ADC12MEM2;//移动A2结果到数组,同时清除ADC12IFG.2
A3results[index]=ADC12MEM3;//移动A3结果到数组,同时清除ADC12IFG.3
index=(index+1)%Num_of_Results;//索引增加,取index变量的模(余数)
}
这是AD多路采样巡检,你再根据自己的要求加一些计算语句
|
|