⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 adc.c

📁 用ATMEGA16实现AD转换并通过串口将数据传回PC机
💻 C
字号:
//
//ICC-AVR application builder : 2009-2-5 19:27:04
// Target : M16
// Crystal: 4.0000Mhz INTERNAL
// 2009.2.6
//Zhu Shuang
//ADC OK 
//UART SEND OK


#include <iom16v.h>
#include <macros.h>

#define PIN_RXD    0   //PD0    RXD
#define PIN_TXD    1   //PD1    TXD

#define AD_SE_ADC0 0x00 //ADC0 
#define AD_SE_ADC1 0x01 //ADC1 
#define AD_SE_ADC2 0x02 //ADC2 
#define AD_SE_ADC3 0x03 //ADC3 
#define AD_SE_ADC4 0x04 //ADC4 
#define AD_SE_ADC5 0x05 //ADC5 
#define AD_SE_ADC6 0x06 //ADC6 

#define Vref 2650 //mV,参考电压,内部提供
#define Vref_type 0x60  //RIGHT对齐

/* 
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通道   
*/ 

/*   
                     ADCSRA (ADC Control and Status Register A) 
                      bit7   ADEN ADC使能=1 
                      bit6   ADSC 启动ADC开始转换=1 
                      bit5   ADATE 自己触发使能 
                      bit4   ADIF ADC中断标志 
                      bit3   ADIE ADC中断使能 
                      bit2:0 ADC 预分频选择位 111=128时钟分频 
*/  

void port_init(void)
{
 PORTA = 0x00;
 DDRA  = 0x00;
 PORTB = 0x00;
 DDRB  = 0x00;
 PORTC = 0x00; //m103 output only
 DDRC  = 0x00;
 PORTD = 0x00;
 DDRD  = 0x00;
}

//UART0 initialize
// desired baud rate: 9600
// actual: baud rate:4808 (0.2%)
// char size: 8 bit
// parity: Disabled
void uart0_init(void)
{
 UCSRB = 0x00; //disable while setting baud rate
 UCSRA = 0x00;
 //设置帧格式: 8 个数据位, 1 个停止位
 UCSRC = (1<<URSEL)|(3<<UCSZ0);
 //设置波特率
 UBRRL = 0x19; //set baud rate lo
 UBRRH = 0x00; //set baud rate hi
 // 接收器与发送器使能
 UCSRB = (1<<TXEN);
}

/*
void USART_Init( unsigned int baud )
{
//设置波特率
UBRRH = (unsigned char)(baud>>8);
UBRRL = (unsigned char)baud;
// 接收器与发送器使能
UCSRB = (1<<RXEN)|(1<<TXEN);
//设置帧格式: 8 个数据位, 2 个停止位
UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
}
*/

//ADC initialize
// Conversion time: 13uS
void adc_init(void)
{
 ADCSR = 0x00; //disable adc
 ADMUX = 0x00; //select adc input 0
 ACSR  = 0x80;
 ADCSRA=(1<<ADEN)|(0<<ADSC)|(0<<ADIE)|(1<<ADPS2)|(0<<ADPS1)|(0<<ADPS0); 
 //ADCSR = 0x84;
}

//call this routine to initialize all peripherals
void init_devices(void)
{
 //stop errant interrupts until set up
 CLI(); //disable all interrupts
 port_init();
 adc_init();
 uart0_init();

 MCUCR = 0x00;
 GICR  = 0x00;
 TIMSK = 0x00; //timer interrupt sources
 SEI(); //re-enable interrupts
 //all peripherals are now initialized
}

unsigned char read_adc(unsigned char adc_port)
{ unsigned int adc_data;
  ADMUX = Vref_type | adc_port;  //设置AD端口
  ADCSRA |= ADCSRA |(1<<ADSC); //开始转换
  while ((ADCSRA&0x10)==0);  //等待转换完成
  ADCSRA |= (1<<ADIF);    //清除标志位
  adc_data = ADC;
  return ADCH;
}

void uart_transmit( unsigned char data )
{
/* 等待发送缓冲器为空 */
while ( !( UCSRA & (1<<UDRE)) );
/* 将数据放入缓冲器,发送数据 */
UDR = data;
}

void delay(unsigned long a)
{
    unsigned long i,j;
    for(i = 0; i < a; i ++);
	  {for (j = 0; j < a; j ++)
	     {}
	  }
}

void main(void)
{ unsigned long volt;
  unsigned char adc_tmp;
  init_devices();
  
  DDRA = 0x00;   //设置A口为不带上拉输入;
  PORTA= 0x00;
  DDRD = 0xff;   //设置C口为输出口;
  PORTD= 0xff;
  //DDRD = 0xff;
  DDRD = (1<<PIN_TXD);         //TXD为输出
  PORTD =0xFF;

  
  ADMUX = Vref_type;   //选择第一通道ADC0;
  ADCSRA = 0x84;   //自由转换模式;启动A/D转换;
  delay(10000);   //延时待系统稳定;
  while(1)
    {
        //volt = read_adc(AD_SE_ADC0);   //获取A/D转换数据
        //volt = (volt * Vref)/1024;
		adc_tmp = read_adc(AD_SE_ADC1);
		//PORTD = adc_tmp;
		uart_transmit(adc_tmp);
        delay(50000);
		//PORTD = 0xff;
		
    }
  
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -