求解答下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条回答
无敌小青年
2019-03-25 09:36
测量电路板上的输出电压 跳动比我测得的值还要过分 但是我输入外部电压还是显示正确值与最小值循环着  帮帮我吧 谢谢

一周热门 更多>