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

📄 usart1.c

📁 Atmega64单片机程序(完整工程)
💻 C
字号:
/*******************************************************************************
**--------------File Info-------------------------------------------------------
** 文   件   名:     USART1.c
** 最后修改日期:     2008-3-26
** 版        本:     V1.0
** 描        述:     M64串口一驱动											    header file
**------------------------------------------------------------------------------
** Created by:	     
** Created date:     
**------------------------------------------------------------------------------

*******************************************************************************/
#include <USART1.h>

#if USART1_EN==1

INT8U rx_buffer1[RX_BUFFER_SIZE1];
#if RX_BUFFER_SIZE1<256
    INT8U rx_wr_index1,rx_rd_index1,rx_counter1;
#else
    INT16U rx_wr_index1,rx_rd_index1,rx_counter1;
#endif
INT8U rx_buffer_overflow1;


INT8U tx_buffer1[TX_BUFFER_SIZE1];
#if TX_BUFFER_SIZE1<256
    INT8U tx_wr_index1,tx_rd_index1,tx_counter1;
#else
    INT16U tx_wr_index1,tx_rd_index1,tx_counter1;
#endif


#pragma interrupt_handler uart1_rx_isr:31
void uart1_rx_isr(void)
{
    INT8U status,data;
    status=UCSR1A;
    data=UDR1;
    if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
    {
        rx_buffer1[rx_wr_index1]=data;
        if (++rx_wr_index1 == RX_BUFFER_SIZE1)
	    rx_wr_index1=0;
        if (++rx_counter1 == RX_BUFFER_SIZE1)
        {
            rx_counter1=0;
            rx_buffer_overflow1=1;
        }
    }
}


#pragma interrupt_handler uart1_tx_isr:33
void uart1_tx_isr(void)
{
    if (tx_counter1)
    {
        --tx_counter1;
        UDR1=tx_buffer1[tx_rd_index1];
        if (++tx_rd_index1 == TX_BUFFER_SIZE1)
	    tx_rd_index1=0;
    }
}

//#pragma used+
void putchar1(INT8U c)
{
    while (tx_counter1 == TX_BUFFER_SIZE1);
    asm("cli");
    if (tx_counter1 || ((UCSR1A & DATA_REGISTER_EMPTY)==0))
    {
        tx_buffer1[tx_wr_index1]=c;
        if (++tx_wr_index1 == TX_BUFFER_SIZE1) 
	    tx_wr_index1=0;
        ++tx_counter1;
    }
    else
        UDR1=c;
    asm("sei");
}
//#pragma used-

//#pragma used+
INT8U getchar1(void)
{
    INT8U data;
    
    while (rx_counter1==0);
    data=rx_buffer1[rx_rd_index1];
    if (++rx_rd_index1 == RX_BUFFER_SIZE1) 
        rx_rd_index1=0;
    asm("cli");
    --rx_counter1;
    asm("sei");
    return data;
}
//#pragma used-

void Uart1_Init(void)
{ 
// USART1 initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART1 Receiver: On
// USART1 Transmitter: On
// USART1 Mode: Asynchronous
// USART1 Baud rate: 38400  16M osc
    UCSR1A=0x00;
    UCSR1B=0xD8;
    UCSR1C=0x06;
    
    UBRR1H=0x00;
    UBRR1L=0x19;
}

void Uart1_SendString(INT8U *pt)
{
    while(*pt)
    {
        putchar1(*pt++);
    }
}


//格式转换函数,十六进制转换为字符串  eg:输入0x5A,输出5A  
void PUT_INT8U_HexTOString(INT8U Hex)
{
    INT8U temp1,temp2;
    
    temp1=(Hex>>4)&0x0F;
    temp2=Hex&0x0F;
    
    if(temp1<10)
        putchar1(temp1+'0');
    else
        putchar1(temp1-10+'A');
	
    if(temp2<10)
        putchar1(temp2+'0');
    else
        putchar1(temp2-10+'A'); 
}

//格式转换函数,十进制数据转换为字符串 eg:输入001234,串口输出1234(去掉无效0)
void PUT_INT32U_DecTOString(INT32U Dec)
{
    INT8S temp8S ;
    INT32U temp32U ;
    INT8U buffer[11];
    
    temp32U=Dec ;
    for(temp8S=10;temp8S>=0;temp8S--)
    {
        buffer[temp8S]=temp32U%10+'0' ;
        temp32U=temp32U/10 ;
    }
    buffer[11]='\0' ;
    
    if(buffer[0]=='0')
    {
        if(buffer[1]=='0')
        {
            if(buffer[2]=='0')
            {
                if(buffer[3]=='0')
                {
                    if(buffer[4]=='0')
                    {
                        if(buffer[5]=='0')
                        {
                            if(buffer[6]=='0')
                            {
                                if(buffer[7]=='0')
                                {
                                    if(buffer[8]=='0')
                                    {
                                        if(buffer[9]=='0')
                                            Uart1_SendString(&buffer[10]);
                                        else Uart1_SendString(&buffer[9]);
                                    }
                                    else Uart1_SendString(&buffer[8]);
                                }
                                else Uart1_SendString(&buffer[7]);
                            }
                            else Uart1_SendString(&buffer[6]);
                        }
                        else Uart1_SendString(&buffer[5]);
                    }
                    else Uart1_SendString(&buffer[4]);
                }
                else Uart1_SendString(&buffer[3]);
            }
            else Uart1_SendString(&buffer[2]);
        }
        else Uart1_SendString(&buffer[1]);
    }
    else Uart1_SendString(&buffer[0]);
}

//串口输入字符,转换成十进制,即"123456"--123456
INT32U StringTODec(void)
{ 
    INT8U  num,temp8U ;
    INT32U temp32U ;
	
    temp8U=0x00 ;
    num=0x00 ;
    //如果不是回车键
    while(temp8U!=0x0D)
    {
        temp8U=getchar1();
        
        if(temp8U>='0'&&temp8U<='9')
        {
            putchar1(temp8U);
            num++;
            switch(num)
            {
                case 1 :temp32U=(INT32U)(temp8U-'0');break ;
                case 2 :temp32U=temp32U*10+(INT32U)(temp8U-'0');break ;
                case 3 :temp32U=temp32U*10+(INT32U)(temp8U-'0');break ;
                case 4 :temp32U=temp32U*10+(INT32U)(temp8U-'0');break ;
                case 5 :temp32U=temp32U*10+(INT32U)(temp8U-'0');break ;
                case 6 :temp32U=temp32U*10+(INT32U)(temp8U-'0');break ;
                case 7 :temp32U=temp32U*10+(INT32U)(temp8U-'0');break ;
                case 8 :temp32U=temp32U*10+(INT32U)(temp8U-'0');num=0 ;putchar1(' ');break ;
                default :num=0 ;break ;
            }
        }
    }
    return temp32U;
}

#endif

⌨️ 快捷键说明

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