#include<iom128v.h>
#include<macros.h>
#define uchar unsigned char
#define uint unsigned int
#define BAUD 9600
#define F_CPU 8000000
#pragma interrupt_handler usart0jieshou:19
unsigned int ADdata;//AD转换获得的数据
//延时函数
void delay(uint ms)
{
uint i,j;
for(i=0;i<ms;i++)
for(j=0;j<1141;j++);
}
//端口初始化
void port_init()
{
PORTA=0X00;
DDRA=0X00;//ADC通道设置为输入并且高阻态
}
//USART寄存器配置
void usart_init(void)
{
UCSR0B=0X00;//关闭所有USART0的使能
UCSR0A=0B00000000;//bit1为0对波特率加倍无作用
UCSR0C=0X06;//奇偶模式无,8位数据位,1位停止位,异步模式
UBRR0L = (F_CPU / BAUD / 16 - 1) % 256;
UBRR0H = (F_CPU / BAUD / 16 - 1) / 256;
UCSR0B|=(1<< RXEN0)|(1<< TXEN0)|(1<<RXCIE0);//发送接收使能,接收结束使能
}
//字节发送函数
void usart_putchar(uchar y)
{
while(!(UCSR0A&(1<<UDRE0)));//只有数据寄存器为空才能发送数据
UDR0=y;
}
//接收中断函数
void usart0jieshou()
{
uchar x;
x=UDR0;
usart_putchar(x);
}
//AD转换初始化
void AD_init()
{
ADCSRA=0X00;//ADC关闭
ADMUX|=(1<<REFS0);//2.56v的片内基准电压源,ADC结果右对齐,选择通道ADC0
ACSR=0X80;//模拟比较器的控制和状态寄存器禁用
ADCSRA |= (1 << ADEN)|(1 << ADPS2) | (1 << ADPS1);//使能AD转换,ADC时钟8分频
}
//AD转换函数
unsigned int AD_getdata()
{
ADCSRA |= (1 << ADSC);//开始AD转换
while(!(ADCSRA & (1 << ADIF)));//等待转换完成
ADCSRA |= (1 << ADIF);//清零ADC中断标志位
ADC=ADCL+ADCH*256;
return ADC;//返回ADC值
}
void main()
{
port_init();
usart_init();
AD_init();
SEI();
while(1)
{
ADdata=(int)((long)AD_getdata()*5010/1024);
usart_putchar(ADdata / 1000 + 0x30); //得到电压值的千位并发送
usart_putchar('.'); //发送小数点
usart_putchar(ADdata % 1000 / 100 + 0x30); //得到电压值的百位并发送
usart_putchar(ADdata % 100 / 10 + 0x30); //得到电压值的十位并发送
usart_putchar(ADdata % 10 + 0x30); //得到电压值的个位并发送
usart_putchar('V'); //发送电压符号"V"
usart_putchar(0x0d);//
usart_putchar(0x0a); // AD值发送结束,回车换行
delay(1000);
}
}
这是我自学编的一个AD小例子,测量开发板上电压的变化,通过串口显示在电脑上,但是遇到了一个问题 串口能显示,但是总是循环显示最小值和当前值
ADMUX|=(1<<REFS0);
//2.56v的片内基准电压源,ADC结果右对齐,选择通道ADC0
ADdata=(int)((long)AD_getdata()*5010/1024);
既然选择了内部2.56V 那这个公式为什么又是5010/1024