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

📄 uart.c

📁 AVR单片机平台Atmega32+CH375A芯片读写U盘代码
💻 C
字号:
#include "UART.h"
//全局变量

unsigned char *UartRx;          //存放接收数据的指针
unsigned int RxIndex=0;			//存放接收数据的个数
unsigned int *RxLength;         //数据接收长度地址指针
unsigned char UartState=0;        

#define UART_REC_COM 7
/*
BIT      7          6----------------------------------------0
    UART_REC_COM         RESERVE
    接收完成
 */  


void put_c(unsigned char c) //发送采用查询方式
{
	while( !(UCSRA & (1<<UDRE)) );
	UDR=c;
}

void put_s(unsigned char *ptr)
{
	while (*ptr)
	{
		put_c(*ptr++);
	}
}

void put_bytes(unsigned char *ptr,unsigned int length)
{
    unsigned int SendIndex;
    for(SendIndex = 0;SendIndex < length;SendIndex++)
    {
        put_c(*ptr++);
    }
}


//串口接收中断服务程序
#pragma interrupt_handler usart_rx_isr: iv_USART_RX
void usart_rx_isr(void)
{
	
	*(UartRx+RxIndex) = UDR;		//保存数据到数组里面
    RxIndex++;
	if((RxIndex>=2) &&
        (RxIndex>= *RxLength))
    {
        RxIndex=0;
        UartState|= 1<<UART_REC_COM;    //通知主函数已经接收一帧数据完成
    }
		
}

/************************************************************************/
/* EnInterrup:0,不使能接收功能,!0使能接收功能
                                                                     */
/************************************************************************/
void init_USART(unsigned char EnInterrup)//USART 初始化
{

    //USART 9600 8, n,1  PC上位机软件(超级终端等)也要设成同样的设置才能通讯
    UCSRC = (1<<URSEL) | 0x06;
    //异步,8位数据,无奇偶校验,一个停止位,无倍速
    /*
    UBRRH与UCSRC共用I/O 地址。因此访问该地址时需注意以下问题。
    写访问
    当在该地址执行写访问时, USART 寄存器选择位(URSEL)控制被写入的寄存器。
    若URSEL为0,对UBRRH值更新;若URSEL为1,对UCSRC设置更新
    
    读访问
    对UBRRH 或UCSRC 寄存器的读访问则较为复杂。但在大多数应用中,基本不需要读这些寄存器
    
    
    没有UBRR这个16位寄存器,因为UBRRL(0x09)/UBRRH(0x20)的地址不连续,而且UBRRH跟UCSRC共用地址
    */
    
    //U2X=0时的公式计算
    UBRRL= (F_CPU/BAUDRATE/16-1)%256;
    UBRRH= (F_CPU/BAUDRATE/16-1)/256;
    //U2X=1时的公式计算
    //UBRRL= (F_CPU/BAUDRATE/8-1)%256;
    //UBRRH= (F_CPU/BAUDRATE/8-1)/256;
    //也可根据数据手册的[波特率设置的例子]查得
    //UBRRL = 0x2F; //set baud rate lo
    //UBRRH = 0x00; //set baud rate hi
    UCSRA = 0x00;
    if(EnInterrup)
        UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);
    //使能接收中断,使能接收,使能发送
    else
        UCSRB = (1<<RXEN)|(1<<TXEN);
}

⌨️ 快捷键说明

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