亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? uart.c

?? ds18b20原版程序!!已經(jīng)調(diào)試通過了?。?!
?? C
字號:
/*************************************************************************
Title:     Interrupt UART library with receive/transmit circular buffers
Author:    Peter Fleury <pfleury@gmx.ch>   http://jump.to/fleury
File:      $Id: uart.c,v 1.5.2.2 2004/02/27 22:00:28 peter Exp $
Software:  AVR-GCC 3.3 
Hardware:  any AVR with built-in UART, 
           tested on AT90S8515 at 4 Mhz and ATmega at 1Mhz
Extension: uart_puti, uart_puthex by M.Thomas 9/2004

DESCRIPTION:
    An interrupt is generated when the UART has finished transmitting or
    receiving a byte. The interrupt handling routines use circular buffers
    for buffering received and transmitted data.
    
    The UART_RX_BUFFER_SIZE and UART_TX_BUFFER_SIZE variables define
    the buffer size in bytes. Note that these variables must be a 
    power of 2.
    
USAGE:
    Refere to the header file uart.h for a description of the routines. 
    See also example test_uart.c.

NOTES:
    Based on Atmel Application Note AVR306
                    
*************************************************************************/
#include <stdlib.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <avr/pgmspace.h>
#include "uart.h"


/*
 *  constants and macros
 */

/* size of RX/TX buffers */
#define UART_RX_BUFFER_MASK ( UART_RX_BUFFER_SIZE - 1)
#define UART_TX_BUFFER_MASK ( UART_TX_BUFFER_SIZE - 1)

#if ( UART_RX_BUFFER_SIZE & UART_RX_BUFFER_MASK )
#error RX buffer size is not a power of 2
#endif
#if ( UART_TX_BUFFER_SIZE & UART_TX_BUFFER_MASK )
#error TX buffer size is not a power of 2
#endif

#if defined(__AVR_AT90S2313__) \
 || defined(__AVR_AT90S4414__) || defined(__AVR_AT90S4434__) \
 || defined(__AVR_AT90S8515__) || defined(__AVR_AT90S8535__)
 /* old AVR classic with one UART */
 #define AT90_UART
 #define UART0_RECEIVE_INTERRUPT   SIG_UART_RECV
 #define UART0_TRANSMIT_INTERRUPT  SIG_UART_DATA
 #define UART0_STATUS   USR
 #define UART0_CONTROL  UCR
 #define UART0_DATA     UDR  
 #define UART0_UDRIE    UDRIE
#elif defined(__AVR_AT90S2333__) || defined(__AVR_AT90S4433__)
 /* old AVR classic with one UART */
 #define AT90_UART
 #define UART0_RECEIVE_INTERRUPT   SIG_UART_RECV
 #define UART0_TRANSMIT_INTERRUPT  SIG_UART_DATA
 #define UART0_STATUS   UCSRA
 #define UART0_CONTROL  UCSRB
 #define UART0_DATA     UDR 
 #define UART0_UDRIE    UDRIE
#elif  defined(__AVR_ATmega8__)  || defined(__AVR_ATmega16__) || defined(__AVR_ATmega32__) \
  || defined(__AVR_ATmega8515__) || defined(__AVR_ATmega8535__) \
  || defined(__AVR_ATmega323__) 
  /* ATMega with one USART */
 #define ATMEGA_USART
 #define UART0_RECEIVE_INTERRUPT   SIG_UART_RECV
 #define UART0_TRANSMIT_INTERRUPT  SIG_UART_DATA
 #define UART0_STATUS   UCSRA
 #define UART0_CONTROL  UCSRB
 #define UART0_DATA     UDR
 #define UART0_UDRIE    UDRIE
#elif defined(__AVR_ATmega163__) 
  /* ATMega163 with one UART */
 #define ATMEGA_UART
 #define UART0_RECEIVE_INTERRUPT   SIG_UART_RECV
 #define UART0_TRANSMIT_INTERRUPT  SIG_UART_DATA
 #define UART0_STATUS   UCSRA
 #define UART0_CONTROL  UCSRB
 #define UART0_DATA     UDR
 #define UART0_UDRIE    UDRIE
#elif defined(__AVR_ATmega162__)
 /* ATMega with two USART */
 #define ATMEGA_USART0
 #define ATMEGA_USART1
 #define UART0_RECEIVE_INTERRUPT   SIG_USART0_RECV
 #define UART1_RECEIVE_INTERRUPT   SIG_USART1_RECV
 #define UART0_TRANSMIT_INTERRUPT  SIG_USART0_DATA
 #define UART1_TRANSMIT_INTERRUPT  SIG_USART1_DATA
 #define UART0_STATUS   UCSR0A
 #define UART0_CONTROL  UCSR0B
 #define UART0_DATA     UDR0
 #define UART0_UDRIE    UDRIE0
 #define UART1_STATUS   UCSR1A
 #define UART1_CONTROL  UCSR1B
 #define UART1_DATA     UDR1
 #define UART1_UDRIE    UDRIE1
#elif defined(__AVR_ATmega64__) || defined(__AVR_ATmega128__) 
 /* ATMega with two USART */
 #define ATMEGA_USART0
 #define ATMEGA_USART1
 #define UART0_RECEIVE_INTERRUPT   SIG_UART0_RECV
 #define UART1_RECEIVE_INTERRUPT   SIG_UART1_RECV
 #define UART0_TRANSMIT_INTERRUPT  SIG_UART0_DATA
 #define UART1_TRANSMIT_INTERRUPT  SIG_UART1_DATA
 #define UART0_STATUS   UCSR0A
 #define UART0_CONTROL  UCSR0B
 #define UART0_DATA     UDR0
 #define UART0_UDRIE    UDRIE0
 #define UART1_STATUS   UCSR1A
 #define UART1_CONTROL  UCSR1B
 #define UART1_DATA     UDR1
 #define UART1_UDRIE    UDRIE1
#elif defined(__AVR_ATmega103__)
 /* ATMega with one UART */
 #error "AVR ATmega103 currently not supported by this libaray !"
#elif defined(__AVR_ATmega161__)
 /* ATmega with UART */
 #error "AVR ATmega161 currently not supported by this libaray !"
#elif defined(__AVR_ATmega169__)
 #error "AVR ATmega169 currently not supported by this libaray !"
#endif


/*
 *  module global variables
 */
static volatile unsigned char UART_TxBuf[UART_TX_BUFFER_SIZE];
static volatile unsigned char UART_RxBuf[UART_RX_BUFFER_SIZE];
static volatile unsigned char UART_TxHead;
static volatile unsigned char UART_TxTail;
static volatile unsigned char UART_RxHead;
static volatile unsigned char UART_RxTail;
static volatile unsigned char UART_LastRxError;



SIGNAL(UART0_RECEIVE_INTERRUPT)
/*************************************************************************
Function: UART Receive Complete interrupt
Purpose:  called when the UART has received a character
**************************************************************************/
{
    unsigned char tmphead;
    unsigned char data;
    unsigned char usr;
    unsigned char lastRxError;
 
 
    /* read UART status register and UART data register */ 
    usr  = UART0_STATUS;
    data = UART0_DATA;
    
    /* */
#if defined( AT90_UART )
    lastRxError = (usr & (_BV(FE)|_BV(DOR)) );
#elif defined( ATMEGA_USART )
    lastRxError = (usr & (_BV(FE)|_BV(DOR)) );
#elif defined( ATMEGA_USART0 )
    lastRxError = (usr & (_BV(FE0)|_BV(DOR0)) );
#elif defined ( ATMEGA_UART )
    lastRxError = (usr & (_BV(FE)|_BV(DOR)) );
#endif
        
    /* calculate buffer index */ 
    tmphead = ( UART_RxHead + 1) & UART_RX_BUFFER_MASK;
    
    if ( tmphead == UART_RxTail ) {
        /* error: receive buffer overflow */
        lastRxError = UART_BUFFER_OVERFLOW >> 8;
    }else{
        /* store new index */
        UART_RxHead = tmphead;
        /* store received data in buffer */
        UART_RxBuf[tmphead] = data;
    }
    UART_LastRxError = lastRxError;   
}


SIGNAL(UART0_TRANSMIT_INTERRUPT)
/*************************************************************************
Function: UART Data Register Empty interrupt
Purpose:  called when the UART is ready to transmit the next byte
**************************************************************************/
{
    unsigned char tmptail;

    
    if ( UART_TxHead != UART_TxTail) {
        /* calculate and store new buffer index */
        tmptail = (UART_TxTail + 1) & UART_TX_BUFFER_MASK;
        UART_TxTail = tmptail;
        /* get one byte from buffer and write it to UART */
        UART0_DATA = UART_TxBuf[tmptail];  /* start transmission */
    }else{
        /* tx buffer empty, disable UDRE interrupt */
        UART0_CONTROL &= ~_BV(UART0_UDRIE);
    }
}


/*************************************************************************
Function: uart_init()
Purpose:  initialize UART and set baudrate
Input:    baudrate using macro UART_BAUD_SELECT()
Returns:  none
**************************************************************************/
void uart_init(unsigned int baudrate)
{
    UART_TxHead = 0;
    UART_TxTail = 0;
    UART_RxHead = 0;
    UART_RxTail = 0;
    
#if defined( AT90_UART )
    /* set baud rate */
    UBRR = (unsigned char)baudrate; 

    /* enable UART receiver and transmmitter and receive complete interrupt */
    UART0_CONTROL = _BV(RXCIE)|_BV(RXEN)|BV(TXEN);

#elif defined (ATMEGA_USART)
    /* Set baud rate */
    UBRRH = (unsigned char)(baudrate>>8);
    UBRRL = (unsigned char) baudrate;

    /* Enable USART receiver and transmitter and receive complete interrupt */
    UART0_CONTROL = _BV(RXCIE)|(1<<RXEN)|(1<<TXEN);
    
    /* Set frame format: asynchronous, 8data, no parity, 1stop bit */
    #ifdef URSEL
    UCSRC = (1<<URSEL)|(3<<UCSZ0);
    #else
    UCSRC = (3<<UCSZ0);
    #endif 
    
#elif defined (ATMEGA_USART0 )
    /* Set baud rate */
    UBRR0H = (unsigned char)(baudrate>>8);
    UBRR0L = (unsigned char) baudrate;

    /* Enable USART receiver and transmitter and receive complete interrupt */
    UART0_CONTROL = _BV(RXCIE0)|(1<<RXEN0)|(1<<TXEN0);
    
    /* Set frame format: asynchronous, 8data, no parity, 1stop bit */
    #ifdef URSEL0
    UCSR0C = (1<<URSEL0)|(3<<UCSZ00);
    #else
    UCSR0C = (3<<UCSZ00);
    #endif 

#elif defined ( ATMEGA_UART )
    /* set baud rate */
    UBRRHI = (unsigned char)(baudrate>>8);
    UBRR   = (unsigned char) baudrate;

    /* Enable UART receiver and transmitter and receive complete interrupt */
    UART0_CONTROL = _BV(RXCIE)|(1<<RXEN)|(1<<TXEN);

#endif

}/* uart_init */


/*************************************************************************
Function: uart_getc()
Purpose:  return byte from ringbuffer  
Returns:  lower byte:  received byte from ringbuffer
          higher byte: last receive error
**************************************************************************/
unsigned int uart_getc(void)
{    
    unsigned char tmptail;
    unsigned char data;


    if ( UART_RxHead == UART_RxTail ) {
        return UART_NO_DATA;   /* no data available */
    }
    
    /* calculate /store buffer index */
    tmptail = (UART_RxTail + 1) & UART_RX_BUFFER_MASK;
    UART_RxTail = tmptail; 
    
    /* get data from receive buffer */
    data = UART_RxBuf[tmptail];
    
    return (UART_LastRxError << 8) + data;

}/* uart_getc */


/*************************************************************************
Function: uart_putc()
Purpose:  write byte to ringbuffer for transmitting via UART
Input:    byte to be transmitted
Returns:  none          
**************************************************************************/
void uart_putc(unsigned char data)
{
    unsigned char tmphead;

    
    tmphead  = (UART_TxHead + 1) & UART_TX_BUFFER_MASK;
    
    while ( tmphead == UART_TxTail ){
        ;/* wait for free space in buffer */
    }
    
    UART_TxBuf[tmphead] = data;
    UART_TxHead = tmphead;

    /* enable UDRE interrupt */
    UART0_CONTROL    |= _BV(UART0_UDRIE);

}/* uart_putc */


/*************************************************************************
Function: uart_puts()
Purpose:  transmit string to UART
Input:    string to be transmitted
Returns:  none          
**************************************************************************/
void uart_puts(const char *s )
{
    while (*s) 
      uart_putc(*s++);

}/* uart_puts */


/*************************************************************************
Function: uart_puts_p()
Purpose:  transmit string from program memory to UART
Input:    program memory string to be transmitted
Returns:  none
**************************************************************************/
void uart_puts_p(const char *progmem_s )
{
    register char c;
    
    while ( (c = pgm_read_byte(progmem_s++)) ) 
      uart_putc(c);

}/* uart_puts_p */

/*************************************************************************
Function: uart_puti()
Purpose:  transmit integer as ASCII to UART
Input:    integer value
Returns:  none
This functions has been added by Martin Thomas <eversmith@heizung-thomas.de>
Don't blame P. Fleury if it doesn't work ;-)
**************************************************************************/
void uart_puti( const int val )
{
    char buffer[sizeof(int)*8+1];
    
    uart_puts( itoa(val, buffer, 10) );

}/* uart_puti */

/*************************************************************************
Function: uart_puthex_nibble()
Purpose:  transmit lower nibble as ASCII-hex to UART
Input:    byte value
Returns:  none
This functions has been added by Martin Thomas <eversmith@heizung-thomas.de>
Don't blame P. Fleury if it doesn't work ;-)
**************************************************************************/
void uart_puthex_nibble(const unsigned char b)
{
    unsigned char  c = b & 0x0f;
    if (c>9) c += 'A'-10;
    else c += '0';
    uart_putc(c);
} /* uart_puthex_nibble */

/*************************************************************************
Function: uart_puthex_byte()
Purpose:  transmit upper and lower nibble as ASCII-hex to UART
Input:    byte value
Returns:  none
This functions has been added by Martin Thomas <eversmith@heizung-thomas.de>
Don't blame P. Fleury if it doesn't work ;-)
**************************************************************************/
void uart_puthex_byte(const unsigned char  b)
{
    uart_puthex_nibble(b>>4);
    uart_puthex_nibble(b);
} /* uart_puthex_byte */

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩av网站免费在线| 国产乱码一区二区三区| av在线一区二区三区| 99在线视频精品| 国产精品白丝jk黑袜喷水| 国产精品123| 国产精品538一区二区在线| 国产大陆精品国产| 91亚洲精品乱码久久久久久蜜桃| av电影一区二区| 91福利社在线观看| 日韩一区二区三区视频在线观看| 日韩一区二区三区四区五区六区| 日韩avvvv在线播放| 久久久电影一区二区三区| 不卡电影免费在线播放一区| 在线成人午夜影院| 国产精品美女久久久久久久久 | 亚洲女同ⅹxx女同tv| 亚洲少妇最新在线视频| 亚洲人一二三区| 麻豆91免费观看| 岛国精品一区二区| 精品剧情v国产在线观看在线| 欧美国产在线观看| 国产精品亚洲午夜一区二区三区 | 91久久精品午夜一区二区| 国产精品高潮久久久久无| 在线免费观看日韩欧美| 美女网站在线免费欧美精品| 国产欧美一区二区三区网站| 欧美在线三级电影| 国产乱码精品1区2区3区| 亚洲国产精品久久人人爱蜜臀| 日韩免费在线观看| 99久久婷婷国产综合精品电影 | 欧美性视频一区二区三区| 久久久精品蜜桃| 麻豆成人免费电影| 欧美男同性恋视频网站| 亚洲情趣在线观看| eeuss国产一区二区三区| 久久夜色精品一区| 国产一区二区不卡在线| 欧美精品一区二区在线播放| 另类中文字幕网| 成人av网址在线| 午夜精品久久久久久久蜜桃app| 精品国精品国产| 欧美日韩一二区| 99精品1区2区| 丁香激情综合五月| 美国精品在线观看| 亚洲福利电影网| 亚洲色图色小说| 中文字幕欧美激情| 久久亚洲精品国产精品紫薇| 欧美女孩性生活视频| 色网站国产精品| 成人中文字幕在线| 国产一区二区久久| 精品在线观看视频| 免费成人在线播放| 日本va欧美va瓶| 亚洲r级在线视频| 夜夜亚洲天天久久| 亚洲欧美日韩国产成人精品影院 | 经典三级视频一区| 免费精品视频最新在线| 亚洲国产欧美另类丝袜| 亚洲另类春色国产| 亚洲精品va在线观看| 国产精品久久久久aaaa樱花| 欧美国产97人人爽人人喊| 国产片一区二区三区| 久久久影视传媒| 精品久久久久久综合日本欧美| 正在播放亚洲一区| 欧美剧情电影在线观看完整版免费励志电影 | 97se亚洲国产综合自在线 | 激情成人综合网| 美国十次综合导航| 久久国产精品99久久久久久老狼| 日韩av一级电影| 国产曰批免费观看久久久| 中文字幕乱码久久午夜不卡| 日韩欧美一级二级| 日本一区二区在线不卡| 亚洲国产精品传媒在线观看| 欧美变态口味重另类| 欧美情侣在线播放| 欧美三级电影在线观看| 色吧成人激情小说| 91黄色小视频| 在线视频国内自拍亚洲视频| 成人午夜av电影| 日本道色综合久久| 亚洲美女在线国产| 日韩精品中文字幕一区二区三区 | 国产成人av一区二区三区在线| 国产福利一区在线观看| www.欧美色图| 欧美日韩在线三级| 日韩免费高清av| 国产精品毛片高清在线完整版| 亚洲欧洲综合另类| 日本伊人午夜精品| 国产999精品久久| 在线精品视频小说1| 欧美一区二区在线免费观看| 国产午夜精品理论片a级大结局| 亚洲欧洲成人av每日更新| 日韩电影免费一区| 成人av在线一区二区| 欧美丝袜自拍制服另类| 久久久美女艺术照精彩视频福利播放| 欧美极品aⅴ影院| 亚洲大片免费看| 国产成人av电影| 欧美一区二区三区公司| 国产农村妇女精品| 日日噜噜夜夜狠狠视频欧美人 | 日韩精品成人一区二区三区| 国产美女在线精品| 欧美日韩一区中文字幕| 精品国产欧美一区二区| 亚洲国产综合人成综合网站| 国产剧情一区在线| 欧美精品 国产精品| 国产精品久久久久久久久免费樱桃| 婷婷开心激情综合| 99精品1区2区| 国产无一区二区| 日韩国产欧美一区二区三区| 色综合天天综合网天天看片| 久久综合色播五月| 日韩激情av在线| 91久久精品一区二区| 国产欧美日韩精品a在线观看| 五月综合激情网| 91看片淫黄大片一级| 91色porny在线视频| 久久老女人爱爱| 成人爱爱电影网址| 美腿丝袜亚洲一区| 日韩精品一区二区三区四区视频| 亚洲精品午夜久久久| 91成人在线免费观看| 亚洲欧美激情一区二区| 成人va在线观看| 1区2区3区精品视频| www.亚洲色图| 亚洲午夜一区二区三区| 欧美日韩一区二区三区不卡| 黄一区二区三区| 欧美日韩国产大片| 伊人色综合久久天天人手人婷| 国产精品一线二线三线| 日韩三级在线观看| 日日摸夜夜添夜夜添亚洲女人| 91蜜桃免费观看视频| 国产精品国产三级国产三级人妇| 国产盗摄视频一区二区三区| 精品国产一二三| 蜜臀av性久久久久av蜜臀妖精| 欧美日韩mp4| 亚洲午夜久久久久中文字幕久| 91福利资源站| 亚洲午夜私人影院| 精品视频在线看| 无吗不卡中文字幕| 欧美精品第1页| 日本成人在线视频网站| 欧美一卡2卡三卡4卡5免费| 日韩成人一区二区| 精品久久久久久久久久久久久久久久久 | 亚洲图片另类小说| 91免费精品国自产拍在线不卡| 日韩久久一区二区| 欧美日韩中文国产| 日本欧美大码aⅴ在线播放| 欧美丰满少妇xxxxx高潮对白| 日韩高清在线电影| 久久品道一品道久久精品| 成人国产亚洲欧美成人综合网| 久久久天堂av| www.一区二区| 午夜久久久久久久久| 日韩一区二区麻豆国产| 国产中文字幕精品| 亚洲欧洲日韩在线| 精品视频在线视频| 狠狠色伊人亚洲综合成人| 国产午夜三级一区二区三| 91亚洲国产成人精品一区二三| 一卡二卡三卡日韩欧美| 日韩一二三区视频| 国产成人福利片| 亚洲一区日韩精品中文字幕| 日韩午夜激情av|