微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 哪位哥帮我看看avr写的ad转换在串口显示,显示各种不对啊

哪位哥帮我看看avr写的ad转换在串口显示,显示各种不对啊

时间:10-02 整理:3721RD 点击:
# include <iom16v.h>
# include <macros.h>
unsigned int temperture[]={49,46,48,48,45,0};
unsigned int smg_8_show[]={0x81,0xb7,0xc2,0x92,0xb4,0x98,0x88,0xb3,0x80,0x90};
void delay(unsigned int x)
{
unsigned int i,j;
        for(i=x;i>0;i--)
        {
         for(j=0;j<1141;j++)
         {
          ;;
         }
        }
}
void Port_init()//端口初始化
{
DDRA&=~BIT(0);
PORTA&=~BIT(0);
}
void USART_Init(  unsigned int baud )//串口初始化
{
   UBRRH = (unsigned char )(baud>>8);/*设置波特率,baud的值查数据手册*/
   UBRRL = (unsigned char ) baud;/*  接收器与发送器使能*/
   UCSRB = (1<<RXEN)|(1<<TXEN);/*设置帧格式: 8 个数据位, 1个停止位*/
   UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
}
void USART_Receive(unsigned int r)
{
while ( !(UCSRA & (1<<UDRE)) );/*等待发送数据*/
UDR=r;
}
//AD转换初始化函数
void ADC_Init()
{
  ADMUX |= (1<<REFS0); //AVCC提供参考电压、ADC结果右对齐、选择通道ADC0
  //ADMUX |= (1<<REFS0)|(1<<ADLAR);//左对齐
   ADCSRA |=(1 <<ADEN) | (1 <<ADPS2) | (1 <<ADPS1); //使能AD转换,ADC时钟64分频
}
//AD转换函数
unsigned int ADC_GetData()
{
ADCSRA |= (1 <<ADSC);  //开始AD转换
while(!(ADCSRA & (1 <<ADIF)));  //等待转换完成
ADCSRA |= (1 <<ADIF);  //清零ADC中断标志位
return ADC;  //返回ADC值
}
void put_s_1(unsigned int *s)
{
while(*s)
{
  USART_Receive(*s);
  s++;
}
}
void main()
{
    unsigned int res,cr;
        //unsigned int re_0,re_1,re_2,re_3;
   DDRD =0Xff;
   Port_init();//初始化PA通道
   USART_Init(51);//串口初始化
   ADC_Init();//ADC初始化
   while(1)
   {
    res = ADC_GetData(); //变换得到电压整数位
    cr = ((int)((long)res*5000/1024));
        temperture[0]=cr/1000+48;
        temperture[1]=(cr%1000)/100+48;
        temperture[2]=(cr%100)/10+48;
        temperture[3]=(cr%10)+48;
    put_s_1(temperture);
        delay(1000);
   }  
}

unsigned int temperture[]={49,46,48,48,45,0};
把temperture定义成char型

楼上说了,将整型改为字符型。如果还不行就用串口发送一个简单字符。看看串口能不能接收正常。如果不正常就是串口的问题。如果正常那就是AD转换出错了。

首先用外用表或者示波器测量ad的值,然后计算出ad采样值,看看是转换计算的错误还是串口发送的错误。

两本AVR单片机黄金教程,我都要学啦

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top