我目前在一个项目中,我们必须使用AVR ATMEGA328微控制器(特别是USART外设)来控制8个LED。我们必须向微控制器发送命令,这些命令将以不同的速率打开,关闭和闪烁LED。我已经用C编写了一个程序,我认为它可以完成这项工作,但是我希望有人研究一下它,并帮助我解决可能出现的任何错误。对你的帮助表示感谢!

*附言命令阵列中的每个命令都与其在LED阵列中的相应LED状态相关联。 LED连接到微控制器的PORTB。

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

/* Arrays that contain all input commands and LED states */
const char *commands[] = {"ON0","ON1","ON2","ON3","ON4","ON5","ON6","ON7","ON8","OFF0","OFF1","OFF2","OFF3","OFF4","OFF5","OFF6","OFF7","OFF8","BLINK0","BLINK1","BLINK2","BLINK3","BLINK4","BLINK5","BLINK6","BLINK7","BLINK8","STOP"\0}
int LEDs[28] = {0X01,0X02,0X04,0X08,0X10,0X20,0X40,0X80,0XFF,0XFE,0XFD,0XFB,0XF7,0XEF,0XDF,0XBF,0X7F,0,0X01,0X02,0X04,0X08,0X10,0X20,0X40,0X80,0XFF,0}

int i;
int j;

int Blinky(int j); // Function to execute blinking commands where j is the argument
{
    PORTB = LEDs[j];
    _delay_ms[250 + (j-18) * 50];  /* Calculates blinking delay times */
    PORTB = 0;
    _delay_ms[250 + (j-18) * 50];
}

int main(void)
{
    DDRB=0XFF; // PORTB is set to output
    DDRD=0X02; // Turns on the transmit pin for the USART in PORTD

    /* Setup USART for 9600,N,8,1 */
    USCR0B = 0X18;
    USCR0C = 0X06;
    UBRR0 = 51;

    sei(); // Enable Global Interrupts

    char input;

    if(UCSR0A & 0X80) /* Reads data from the USART and assigns the contents to the character input */
        input = UDR0;

    j=28;

    char cmd;
    cmd = *commands[i];

    for(i=0; i<28; i++)
    {
        if(input==cmd) /* If the contents of UDR0 are equal to one of the commands */
            j = i;
    }

    while(1)
    {
        if(j<18)
            PORTB=LEDs[j]; // Executes the "ON" and "OFF" commands

        else if(j<27)
            Blinky(j);  // Executes the blinking command by calling the Blinky function

        else if(j=27)
            PORTB=0;  // Executes the "STOP" command

        else
            PORTB=0; // Accounts for typing errors
    }
    return(0);
}

最佳答案

这个程序有很多问题,但是代码审查并不是Stack Overflow的目的。有关如何提出适当问题的信息,请参见常见问题解答。

也就是说,一些明显的问题是:


_delay_ms()函数需要使用编译时常量来调用。如果需要在运行时计算参数,它将无法正常工作。
如果您没有从USART读取任何字符,那么您仍将遍历循环的其余部分。
char cmd声明一个字符变量,但是随后您为其分配了一个指针。
在将i设置为有意义的值之前使用。
input== cmd可能永远不会为真,因为一侧是字符,而另一侧是指针。


这个问题可能很快就会结束。祝您好运,如果您有一个更适合Stack Overflow的问题,请回来。

关于c - AVR USART编程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42518687/

10-13 07:10