四极管:AD转换之 AVR自带AD转换

来源:互联网 发布:易格家具淘宝代购假货 编辑:程序博客网 时间:2024/05/21 17:32

四极管:AD转换驱动(ADC.c)

/******************************************************************** 函数功能:AVR自带AD转换 函数说明:参数adc_input选择通道           使用环境:    硬件: MCU: ATmega32L                       F_CPU = 16000000                      外部:16000000    编译环境:WinAVR-20080610 显示说明:  LCD1602显示 包含文件 :<util/delay.h>   日期:2009年7月19日 作者:杨琦 修改者:    (日期:  )*********************************************************************/#define ucharunsigned char#define uintunsigned int#define BIT(x)(1<<(x))#define NOP()asm("nop")#define WDR() asm("wdr")uchar const num_char[10]="0123456789";//端口初始化void port_init(void){PORTA = 0x00;DDRA  = 0x00;}/*********************************************ADC多路复用器选择寄存器********************************************* ADMUX (ADC Multiplexer Select Register)    bit7   bit6    REFS1  REFS0    参考电压选择    0       0      AREF,内部Vref关闭    0       1      AVCC,AREF引脚外加滤波电容     1       0      保留1       1      2.56V的片内基准电压源,AREF引脚外加滤波电容     bit5           ADC结果左对齐选择  1=左对齐   0=右对齐     bit4~0         选择32通道*********************************************ADC控制和状态寄存器*********************************************ADCSRA(ADC  Control and Status Register A)    bit7 ADEN   ADC使能=1bit6   ADSC  启动ADC开始转换=1bit5   ADATE  自己触发使能bit4   ADIF    ADC中断标志bit3   ADIE    ADC中断时能bit2   ADC 预分频选择位   111=128时钟分频*//*********************************ADC初始化*********************************/void adc_init(void){ADCSRA=0x00;//ADC控制和状态寄存器:启动ADC开始转换ADMUX= 0x40;    //ADC多路复用器选择寄存器:2.56V的片内基准电压源,AREF引脚外加滤波电容 左对齐SFIOR |= 0x00;    //特殊功能I/O寄存器ADTS[2:0] = 000连续自由转换ACSR= 0x80; //禁止模拟比较器ADCSRA= 0xC7;  //1100 0111,128分频}/*******************************************************ADC中断处理子函数****************************************************/void init_devices(void){cli(); //禁止所有中断MCUCR  = 0x00;MCUCSR = 0x80;//禁止JTAGGICR   = 0x00;port_init();adc_init();sei();//开全局中断}/***********************************跳水运动计分法处理AD转换值***************************************/uint16_t read_adc(uchar  adc_input){   uint16_t  adcMax,adcMin,adcSum,adcData,adcResult;      adcMax = 0;   adcMin = ~0;   adcSum = 0;       ADMUX = (0x40|adc_input);    ADCSRA|= _BV(ADEN);      //使能ADC         _delay_ms(1);       for(uint8_t i=0;i<8;i++)          {      ADCSRA |= _BV(ADSC);     //启动AD转换     while((ADCSRA&0X10)==0); //等待AD转换结束  adcData = ADC; if(adcData>adcMax)           adcMax = adcData;     if(adcData<adcMin)            adcMin = adcData;adcSum += adcData;       ADCSRA |= _BV(ADIF);   }            adcResult = (adcSum-adcMax-adcMin)/(8-2);   //去除第一次和最后一次值            ADCSRA = 0; return adcResult;}/*********************************************************显示处理子程序***********************************************************/void dis(uint d){   Displaychar(0,1,num_char[d/1000]);  Displaychar(1,1,num_char[d%1000/100]);  Displaychar(2,1,num_char[d%100/10]);  Displaychar(3,1,num_char[d%10]);  }

主函数

四极管:main.c

//包含所需头文件#include <avr/io.h>#include <1602driver.c>#include <util/delay.h>#include <avr/interrupt.h>#include<ADC.c>//主函数int main(void){     uint16_t v;init_devices();Init_1602();while(1)     {         v = read_adc(0); dis(v);_delay_ms(10);     }        return  0; }


其他文件在上文有说明,不在加上来了。

转载请注明出处。作者:四极管。广西师范大学 电子工程学院大学生科技创新基地 邮箱: yangxingbo-0311@163.com。


 

原创粉丝点击