久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機教程網(wǎng) >> MCU設(shè)計實例 >> 瀏覽文章

AVR atmega16協(xié)議的制定

作者:未知   來源:網(wǎng)上一位高手   點擊數(shù):  更新時間:2014年06月01日   【字體:

 此規(guī)定的協(xié)議時通過上位機發(fā)送指令,使單片機在不同的時間內(nèi)發(fā)送讀取的溫度值

 
#define F_CPU 8000000UL
#include
#include
#include
#define BAUD 9600  //定義波特率
#define uchar unsigned char
#define uint unsigned int
#define FRAMING_ERROR  _BV(FE)  //接收幀出錯
#define PARITY_ERROR   _BV(PE)  //校驗出錯
#define DATA_OVERRUN  _BV(DOR)  //數(shù)據(jù)溢出
#define DATA_REGISTER_EMPTY _BV(UDRE) //數(shù)據(jù)寄存器為空,當(dāng)寫入UDR(TXB)的字符被傳送到移位寄存器中時,該位置1, 表示UDR可以寫入新的數(shù)據(jù)。
#define RX_COMPLETE  _BV(RXC)  //接收器接收一個完整的數(shù)據(jù)幀后,接收到的數(shù)據(jù)駐留在接收緩沖器中,此時RXC標(biāo)志。會置1(產(chǎn)生接收完成中斷),
        //表示接收器收到一個數(shù)據(jù)在接收緩沖器中,未被讀取。當(dāng)RXC為“0”時,表示數(shù)據(jù)接收器為空。
#define TX_BUFFER_SIZE 6  //發(fā)送緩沖器大小      
//USART接收緩沖區(qū)
#define RX_BUFFER_SIZE 5   //接收緩沖器大小
   
uchar rx_buffer[RX_BUFFER_SIZE]={0,0,1,0,0};  //定義接收緩沖區(qū)
 
//定義接收緩沖區(qū)環(huán)形隊列的控制指針,rx_wr_index為寫指針,rx_rd_index為讀指針,rx_counter為存放在隊列中的已接受到字符數(shù)
#if RX_BUFFER_SIZE <256
uchar rx_wr_index,rx_rd_index,rx_counter;
#else
uint rx_wr_index,rx_rd_index,rx_counter;
#endif
//端口狀態(tài)初始化設(shè)置函數(shù)
//void Port_Init()
//{
 //PORTD = 0X00;          //USART 的發(fā)送接收端口分別為 PD0 和 PD1
 //DDRD |= (1 << PD1);   //PD0 為接收端口,置為輸入口;PD1 為發(fā)送端口,置為輸出口
//}
void Usart_Init()
{
 UCSRA = 0X00;
 UCSRC |= (1<<URSEL) | (1 << UCSZ1) | (1 << UCSZ0);  //異步,數(shù)據(jù)格式 8,N,1
 //UCSRC 寄存器與 UBRRH 寄存器共用相同的 I/O 地址,寫 UCSRC 時, URSEL 應(yīng)設(shè)置為 1。
 UBRRL = (F_CPU / BAUD / 16 - 1) % 256;            //波特率設(shè)置
 UBRRH = (F_CPU / BAUD / 16 - 1) / 256;
 UCSRB |= (1 << TXEN)|(1<<RXEN)|(1<<RXCIE)|(1<<TXCIE);       //接收發(fā)送接收使能,并使能發(fā)送接收標(biāo)志中斷,
}
 
uchar rx_buffer_overflow; //接收緩沖區(qū)溢出標(biāo)志
uchar recvFlag;
//接收中斷服務(wù)
ISR(USART_RXC_vect)
{
 uchar status,data;
 status=UCSRA;  //讀取接收狀態(tài)標(biāo)志位,必須先讀,當(dāng)讀了UDR以后,UCSRA便自動清零了
 data=UDR;     //讀取USART數(shù)據(jù)寄存器
 if(!recvFlag)
 {
  if ((status &(FRAMING_ERROR|PARITY_ERROR|DATA_OVERRUN)) ==0)
 {
  rx_buffer[rx_counter]=data;  //將字符填充到接收緩沖區(qū)隊列中
  rx_counter++;
  //Putchar(recvFlag);
  //Putchar(data);
  //
  //if((rx_counter++)==5)
  //{
   //rx_counter=0;
   //recvFlag=1;
  //}
  
  //Putchar(rx_counter);
  //制訂協(xié)議:第一位起始位:BBH;第二位命令字:0AH代表控制數(shù)據(jù)傳送的時間,0BH代表控制溫度上下限值,
  //第三位參數(shù)字,第四位校驗碼:命令字與參數(shù)字的異或,最后一位結(jié)束位:EEH
  switch(rx_counter)
  {
   case 1:        //檢驗起始位
    if(data!=0XBB) rx_counter=0;break;
   case 4:        //校驗校驗字
    if(data != rx_buffer[1]^rx_buffer[2])
    
    //Putchar("FF");
    rx_counter=0; 
    
    
    //Putchar(rx_buffer[0]);
    //Putchar(rx_buffer[1]);
    //Putchar(rx_buffer[2]);
    //Putchar(rx_buffer[3]);
    //Putchar(rx_buffer[4]);  
    break;
   case 5: //校驗結(jié)束字
       
    rx_counter=0;
    if(data ==0xEE) recvFlag=1;break; //recvFlag=1表示正確接收一個數(shù)據(jù)包 
  }
 }
 } 
 
}
 
 
//從接收隊列中讀取一個數(shù)據(jù)
 
uchar Getchar(void)
{
 uchar data;
 while(rx_counter==0);  //接收緩沖區(qū)中沒有數(shù)據(jù)可以讀取,等待。
 data=rx_buffer[rx_rd_index];  //讀取緩沖隊列中的數(shù)據(jù)
 if(++rx_rd_index==RX_BUFFER_SIZE)
 rx_rd_index=0;
 cli();     //禁止中斷,這一步非常重要
 --rx_counter;  //隊列未讀數(shù)據(jù)個數(shù)減1.因為該變量會在接收中斷中改變,為了防止沖突,所以改動前應(yīng)臨時禁止中斷。程序相當(dāng)可靠
 sei();  //使能中斷
 return data;
}
 
//發(fā)送緩沖區(qū)
uchar tx_buffer[TX_BUFFER_SIZE];  //定義發(fā)送緩沖區(qū)
//定義發(fā)送緩沖區(qū)環(huán)形隊列的控制指針,tx_wr_index為寫指針,tx_rd_index為讀指針,tx_counter為存放在隊列中的已接受到字符數(shù)
uchar tx_wr_index,tx_rd_index,tx_counter;
 
//向USART發(fā)送緩沖區(qū)寫一個字符
void Putchar(unsigned char c)
{
 
 while(tx_counter==TX_BUFFER_SIZE);  //如果發(fā)送隊列滿,等待
 cli();                              //禁止中斷
 if (tx_counter||((UCSRA & DATA_REGISTER_EMPTY)==0))
 {
  tx_buffer[tx_wr_index]=c;
  if(++tx_wr_index==TX_BUFFER_SIZE)
     tx_wr_index=0;
  ++tx_counter;
 }
 else
    UDR=c;
    sei();
}
 
ISR(USART_TXC_vect)
{
 if(tx_counter)     //發(fā)送隊列中還未發(fā)送的數(shù)據(jù)
 {
  --tx_counter;  //未發(fā)送數(shù)據(jù)減1。
  
  UDR = tx_buffer[tx_rd_index]; //發(fā)送一個數(shù)據(jù)。
   
  if(++tx_rd_index==TX_BUFFER_SIZE)
  
   tx_rd_index=0;    //讀指針指向下一個未發(fā)送的數(shù)據(jù),如果指到了隊列尾部,則回到隊列頭部。
 } 
}
關(guān)閉窗口

相關(guān)文章

主站蜘蛛池模板: 欧美一区二区大片 | 欧美国产中文字幕 | 一区免费观看 | 日本中文字幕视频 | 黄色一级毛片 | 精品1区 | 久久久久久国产一区二区三区 | 午夜视频在线观看网址 | 亚洲一区二区三区在线视频 | 国产免费拔擦拔擦8x高清 | av国产精品毛片一区二区小说 | 国产一区二区三区在线视频 | 99精品一级欧美片免费播放 | 亚洲欧美综合精品另类天天更新 | 国产精品一区在线观看你懂的 | 国产伦精品一区二区 | 国产精品毛片一区二区在线看 | 国产精品欧美一区二区三区不卡 | 欧美日韩免费一区二区三区 | 一区二区在线不卡 | 免费毛片网| 精品视频在线观看 | 久久久久久综合 | 亚洲国产aⅴ成人精品无吗 国产精品永久在线观看 | 日本久久久久久 | 一区二区三区四区国产 | 美女视频黄色的 | 日韩欧美中文字幕在线视频 | www久久99| 色婷婷综合久久久久中文一区二区 | 免费观看黄 | 久久久久久久久久久久久9999 | 欧美一区在线视频 | 久久i| 欧美男人的天堂 | 日韩有码一区二区三区 | 欧美a在线| 亚洲一区 中文字幕 | 在线看中文字幕 | 国产精品一区二区日韩 | 久久久久久久久久久91 |