#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小例子,测量开发板上电压的变化,通过串口显示在电脑上,但是遇到了一个问题 串口能显示,但是总是循环显示最小值和当前值
此帖出自
小平头技术问答
0.042V
0.042V
0.042V
0.042V
0.042V
0.828V
0.042V
0.828V
0.042V
0.828V
0.042V
0.828V
0.042V
0.828V
2.844V
0.042V
2.844V
0.042V
2.844V
0.042V
2.844V
0.042V
2.844V
3.122V
3.373V
3.373V
3.122V
3.122V
3.373V
3.122V
3.373V
3.122V
3.373V
3.373V
4.300V
4.300V
4.300V
4.300V
4.300V
4.300V
4.300V
4.300V
4.300V
4.300V
4.300V
4.300V
4.300V
4.924V
4.924V
4.924V
4.924V
4.924V
4.924V
4.924V
4.924V
4.924V
4.924V
4.924V
4.924V 电压在由最低调到最大时 串口上的显示
ADMUX|=(1<<REFS0);
//2.56v的片内基准电压源,ADC结果右对齐,选择通道ADC0
ADdata=(int)((long)AD_getdata()*5010/1024);
既然选择了内部2.56V 那这个公式为什么又是5010/1024
一周热门 更多>