AVR超级终端不显示传感器值

时间:2013-11-01 15:55:04

标签: c avr atmega hyperterminal usart

我需要以伏特的距离传感器读取值。传感器将电压二进制值发送到MUC(Atmega8),然后atmega8使用USART和RS232电缆与我的电脑通信。 PC上显示的读数是奇怪的随机字符。我不明白我做错了什么。

这是我的代码

//USART communicating with Atmega8
#include <avr/io.h>
#include <inttypes.h>
#include <util/delay.h>
#include <string.h>


//1MHZ Baud 9600
#define F_CPU 1000000

char *Bestbelieve ="t \r\n";

void InitADC()
{
    ADMUX=(0<<REFS1)|(1<<REFS1);                         // For Aref=internal;
    ADCSRA=(1<<ADEN)|(0<<ADPS2)|(1<<ADPS1)|(1<<ADPS0); //Prescalar div factor =8
}

uint16_t ReadADC()
{

    ADMUX=0x05;

    //Start Single conversion
    ADCSRA|=(1<<ADSC);

    //Wait for conversion to complete
    while(!(ADCSRA & (1<<ADIF)));

    //Clear ADIF by writing one to it
    //Note you may be wondering why we have write one to clear it
    //This is standard way of clearing bits in io as said in datasheets.
    //The code writes '1' but it result in setting bit to '0' !!!

    ADCSRA|=(1<<ADIF);

    return(ADC);
}

void Wait()
{
    uint8_t i;
    for(i=0;i<20;i++)
    _delay_loop_2(0);
}

char USARTReadChar()
{
    //Wait until a data is available

    while(!(UCSRA & (1<<RXC)))
    {
        //Do nothing
    }

    //Now USART has got data from host
    //and is available is buffer

    return UDR;
}

void USARTWriteChar(char* data)
{
    //Wait until the transmitter is ready
    while(*data)
    {  while(!(UCSRA & (1<<UDRE)))
        {
            //Do nothing
        }

        //Now write the data to USART buffer

        UDR=*data;
        data++;
    }}

    void USARTInit(uint16_t ubrr_value)
    {
        UBRRL = 12;
        UBRRH = 0;
        UCSRC=(1<<URSEL)|(3<<UCSZ0);
        UCSRB=(1<<RXEN)|(1<<TXEN);
        UCSRA=(1<<U2X);

    }


    int main()
    {

        uint16_t adc_result;

        //Initialize ADC
        InitADC();

        USARTInit(12);    //UBRR = 12

        //Loop forever

        while(1)
        {

            adc_result=ReadADC();           // Read Analog value from channel-0
            char *result[15];
            sprintf(result,"%d",adc_result);
            Wait();

            USARTWriteChar(adc_result);

            /* The code continuously has t outputted and skipped lines.
            */

        }
    }

1 个答案:

答案 0 :(得分:3)

您正在使用sprintf将数据格式化为result。但是,您可以在二进制值USARTWriteChar上使用adc_result

您需要打印出result,大概是通过调用USARTWriteChar的字符循环。