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

📄 demo_13_1.c~

📁 这是马潮老师最新力做<<AVR单片机潜入式系统原理与应用实践>>中有关USART通信的C程序,用CVAVR编译,对想熟悉和学习AVR单片机的朋友一定有用.注释详细,一看就懂.
💻 C~
字号:
/*********************************************
File name			: demo_13_1.c
Chip type           : ATmega16
Program type        : Application
Clock frequency     : 4.000000 MHz
Memory model        : Small
External SRAM size  : 0
Data Stack size     : 256
*********************************************/

#include <mega16.h>
#include <delay.h>

#define BAUD    9600            //波特率采用9600bps
#define CRYSTAL 4000000			//系统时钟4MHz

//计算和定义波特率设置参数
#define BAUD_SETTING (unsigned int)((unsigned long)CRYSTAL/(16*(unsigned long)BAUD)-1)
#define BAUD_H (unsigned char)(BAUD_SETTING>>8)
#define BAUD_L (unsigned char)(BAUD_SETTING)

// USART控制和状态寄存器的标志位定义
#define RXC  7          // UCSRA位定义
#define TXC  6
#define UDRE 5
#define FE   4
#define DOR  3
#define PE   2
#define U2X  1
#define MPCM 0
#define RXCIE 7         // UCSRB位定义
#define TXCIE 6
#define UDRIE 5
#define RXEN  4
#define TXEN  3
#define UCSZ2 2
#define RXB8  1
#define TXB8  0
#define URSEL 7         // UCSRC位定义
#define UMSEL 6
#define UPM1  5
#define UPM0  4
#define USBS  3
#define UCSZ1 2
#define UCSZ0 1
#define UCPOL 0 

#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<PE)
#define DATA_OVERRUN (1<<DOR)
#define DATA_REGISTER_EMPTY (1<<UDRE)

flash char led_7[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

interrupt [USART_RXC] void usart_rx_isr(void)   // USART接收中断服务
{
    char status,data;
    status = UCSRA;
    data = UDR;
    if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
        PORTA = led_7[data];
}

void USART_Transmit(char data)
{
	while (!(UCSRA & DATA_REGISTER_EMPTY));     // 等待发送寄存器空			                
	UDR = data;                                 // 发送数据			        
}

void main( void )
{
    char i=0;
    
    PORTA = 0x00;       // LED段码输出
    DDRA = 0xff;
    PORTD = 0x03;       // TXD(PD1)输出
    DDRD = 0x02;        // RXD(PD0)输入,上拉有效
    
    UCSRA = 0x00;       // USART初始化
    UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);     // 允许RXC中断,接收允许,发送允许
    //UCSRB = 0x98;
    UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);   // 8 Data, 1 Stop, No Parity
    //UCSRC = 0x86;
    UBRRH = BAUD_H;     // 设置波特率
    UBRRL = BAUD_L;
    #asm("sei")         // 开中断
	for(;;)
	{
		USART_Transmit(i); 
	    if (++i >= 10) i = 0;
	    delay_ms(500);
	}
}

⌨️ 快捷键说明

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