MCUInit(); //MCU初始化 ADCInit(); //AD模块初始化 LEDinit(); //LED数码块接口初始化 EnableInterrupts;
while(1){
V1Value=ADCAve(15,50); //取得中值滤波法得到的AD转换数值 ADCV_Vol(V1Value,LEDBUF); //将AD转换数值转化为对应的电压值的
//BCD码存入LED显示缓冲区LEDBUF
LEDshow(LEDBUF) ; //LED数码块显示 } }
ADC.c
//头文件
#include \
void ADCInit(void) {
ADC1CFG = 0b11010001;//低功耗,4分频,长采样,8位模式,总线时钟2分频 ADC1SC1=0b00000000;
ADC1SC2=0b00000000;//软件触发,禁止比较功能 }
uint8 ADCValue(uint8 channel) {
uint8 SC1_3; uint8 resultH; uint8 result;
//1 选取通道号AD0-AD27 = 00000-11011
channel &= 0b00011111; //取通道号变量的低五位(实际通道号) SC1_3 =ADC1SC1
&(ADC1SC1_COCO_MASK |ADC1SC1_AIEN_MASK |ADC1SC1_AIEN_MASK);
// 取ADC1SC1的高三位(取上电复位默认值000) // 单次转换, 禁止中断, 转换未完成
ADC1SC1 = SC1_3 | channel; //合并上述8位 //2 取A/D转换结果
while ((ADC1SC1 & ADC1SC1_COCO_MASK) == 0); //未完成则执行空操作 resultH = ADC1RH; result =ADC1RL; return result; }
uint8 ADCMid(uint8 channel) //中值滤波 {
uint8 i,j,k,tmp; //1 取三次A/D转换结果 i = ADCValue(channel); j = ADCValue(channel); k = ADCValue(channel); //2 从三次A/D转换结果中取中值 tmp = (i > j) ? j : i; tmp = (tmp > k) ? tmp : k; return tmp; }
uint8 ADCAve(uint8 channel, uint8 n) //均值滤波 {
uint16 i; uint32 j; j = 0;
for (i = 0; i < n; i++) j += ADCMid(channel); j = j/n; return (uint8)j; }
//将AD转换得到的数值量还原为实际的电压值,将电压值的BCD码存储显示缓冲区 void ADCV_Vol(uint8 ADC_V,uint8 *p){ uint8 V,V1;
V=(uint8)(ADC_V/51); V1=ADC_VQ; *p=V;
V=(uint8)(V1*10)/51; V1=(V1*10)Q; *(p+1)=V;
V=(uint8)(V1*10)/51; V1=(V1*10)Q; *(p+2)=V;
V=(uint8)(V1*10)/51; *(p+3)=V; } LED.c
#include \#include \void LEDinit(void) {
PTBDD = 0xFF; //数据口为输出
PTBPE=0xff; //为B口输出配置上拉电阻 PTBDS=0xff;
PTDDD |= 0x33; //位选口为输出 }
void LEDshow(uint8 *Buf) {
uint8 i,c; //uint16 j;
for (i = 0;i <= 3;i++) { c = Buf[i]; LEDshow1(3-i,c); //延时
delay(10); } }
const uint8 Dtable[10] =
// 0 1 2 3 4 5 6 7 8 9 {0x3F,0x06,0x5B,0x4F,0x66, 0x6D,0x7D,0x07,0x7F,0x6F}; //片选表 (电平为低片选) const uint8 CStable[4] = // 0 1 2 3 {0xDF,0xEF,0xFD,0xFE};
void LEDshow1(uint8 i, uint8 c) {
PTDD = CStable[i]; PTBD = Dtable[c]; }