求解答下AD测量电压用串口显示遇到的小问题

2019-03-24 20:55发布

#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小例子,测量开发板上电压的变化,通过串口显示在电脑上,但是遇到了一个问题  串口能显示,但是总是循环显示最小值和当前值   此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
无敌小青年
1楼-- · 2019-03-25 15:28
0.042V
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  电压在由最低调到最大时  串口上的显示
无敌小青年
2楼-- · 2019-03-25 20:04
求求你们帮帮我吧 我都要逼疯了 下周得交给老师检查的  我邮箱lixiao7517@163.com     QQ751711054  手机15842671831  拜托了  真的很急
常见泽1
3楼-- · 2019-03-25 22:40

ADMUX|=(1<<REFS0);

//2.56v的片内基准电压源,ADC结果右对齐,选择通道ADC0

 

ADdata=(int)((long)AD_getdata()*5010/1024);

 

 

既然选择了内部2.56V 那这个公式为什么又是5010/1024

一周热门 更多>