0

我需要从距离传感器中读取以伏特为单位的值。传感器将电压二进制值发送到 MUC (Atmega8),然后 atmega8 使用带有 RS232 电缆的 USART 与我的电脑通信。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.
            */

        }
    }
4

1 回答 1

3

您正在使用sprintf将数据格式化为result. 但是,您然后使用USARTWriteChar您的二进制值adc_result

您需要打印出来result,大概是对调用的字符进行循环USARTWriteChar

于 2013-11-01T16:54:00.257 回答