⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c.bak

📁 这是基于ATmegA48的串口测试小程序 方便实用 功能强大
💻 BAK
字号:
#include <avr/interrupt.h>
#include <string.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <avr/boot.h>
#include <util/twi.h>
#include <avr/wdt.h>
#include <stdio.h>
#include <stdlib.h>
//#inclide <marco.h>
//#define FOSC                                    7372800
//#define BAUD                                    115200
#define FOSC                                    8000000
#define BAUD                                    38400
//#define BAUD                                    19200

#define Red_Led_on()                            (PORTD &= ~_BV(PD7))
#define Red_Led_off()                           (PORTD |= )_BV(PD7))
#define Green_Led_on()                          (PORTD &= ~_BV(PD6))
#define Green_Led_off()                         (PORTD |= ~_BV(PD6))
#define TEST_BIT(value, bitmask)            (((value) & (1<<bitmask)) == (1<<bitmask))
#define SET_BIT(value, bitmask)             (value |= (1<<bitmask))
#define CLEAR_BIT(value, bitmask)           (value &= ~(1<<bitmask))
#define BIT0                                0
#define BIT1                                1
#define BIT2                                2
#define BIT3                                3
#define BIT4                                4
#define BIT5                                5
#define BIT6                                6
#define BIT7                                7

//#define MCU_MEGA8

volatile unsigned char g_ucSerialDataBuf;
volatile unsigned char g_ucByteFlag0;
#define serial_active_flag                  BIT0

void port_init(void)
{
    DDRD = 0xff;
    PORTD = 0x00;
    DDRC = 0xff;
    PORTC = 0x00;
    DDRB = 0xff;
    PORTB = 0x00;
}

void PutChar(unsigned char send_char)
{
    #ifdef MCU_MEGA8
    cli();
    while(!(UCSRA&(1<<UDRE)));
    UDR = send_char;
    while(!(UCSRA&(1<<UDRE)));
    sei();
    #else
    cli();
    while(!(UCSR0A & (1<<UDRE0)));
    UDR0 = send_char;
    while(!(UCSR0A & (1<<UDRE0)));
    sei();
    #endif
}

#ifdef MCU_MEGA8
ISR(USART_RXC_vect)
{
    if(!TEST_BIT(g_ucByteFlag0, serial_active_flag))
    {
        SET_BIT(g_ucByteFlag0, serial_active_flag);
        g_ucSerialDataBuf = UDR;
    }
}
#else
ISR(USART_RX_vect)
{
    if(!TEST_BIT(g_ucByteFlag0, serial_active_flag))
    {
        SET_BIT(g_ucByteFlag0, serial_active_flag);
        g_ucSerialDataBuf = UDR0;
    }
}
#endif

void uart_init(void)
{
    #ifdef MCU_MEGA8
    UCSRB = 0;
	UCSRA = 0x00;
	UCSRC = (1<<UCSZ1)|(1<<UCSZ0);
    UBRRL = (FOSC/16/(BAUD+1))%256;
	UBRRH = (FOSC/16/(BAUD+1))/256;
	UCSRB = (1<<RXEN) | (1<<TXEN) | (1<<RXCIE);
	#else
	UCSR0B = 0;
	UCSR0A = 0x00;
	UCSR0C = (1<<UCSZ01)|(1<<UCSZ00);
    UBRR0L = (FOSC/16/BAUD - 1)%256;
	UBRR0H = (FOSC/16/BAUD - 1)/256;
	UCSR0B = (1<<RXCIE0) | (1<<RXEN0) | (1<<TXEN0);
	#endif
}

void SerailData(void)
{
    if(TEST_BIT(g_ucByteFlag0, serial_active_flag))
    {
        PutChar(g_ucSerialDataBuf);
        
        switch(g_ucSerialDataBuf)
        {
            case 'a': Red_Led_on();
            break;
            case 'b': Red_Led_off();
            break;
            case 'c': Green_Led_on();
            break;
            case 'd': Green_Led_off();
            break;
        }
        CLEAR_BIT(g_ucByteFlag0, serial_active_flag);
    }
}

int main(void)
{
    port_init();
    uart_init();
    g_ucByteFlag0 = 0;
    PutChar('O');
    PutChar('K');
    sei();
    while(1)
    {
        SerailData();
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -