📄 adc.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 + -