?? m16uart.c
字號:
/*******************************************************************
實驗六
實驗名稱: 串口通信實驗
實驗目的: 學習AVR單片機的串行通信功能
實驗現象: 通過超級終端或者是串口調試助手向單片機發送數據,以*開始#結束
單片機儲存的是*#之間的數據, 發送R可將單片機最近一次記錄的數
據傳送給PC機,接收到新的數據,以前的數據將被清除, 數據長度在
255個字節以內
環 境: ICCAVR6.31A
時鐘頻率: 單片機內部1M頻率的時鐘
設 計 者: shinea8868
說 明: 部分程序原型源自網絡,經本人修改調試可用,請尊重知識產權,如
作商業用途請保留本段文字
完成日期: 2007年4月10日
*******************************************************************/
#include <iom16v.h>
#include <macros.h>
#include "..\ICC_H\SOFTWARE.h"
uchar RecvData[255]; //記錄接收到的數據
uchar i = 0;
uchar NewBeginFlag = 0; //接收到新的數據,清除原有數據
uchar RecvDataFlag = 0; //當有新的數據串接收是置一,結束為0
uchar ReadFlag = 0; //讀數據標志
/*-----------------------------------------------------------------
函數名稱: void Uart0Init(void)
函數功能: 串口初始化
波特率 9600 0.2% 字符長度 8bit 無奇偶校驗
參 數:
返 回 值: 無
-----------------------------------------------------------------*/
void Uart0Init(void)
{
UCSRB = 0x00; //關串口
UCSRA = 0x02; //倍速模式 M16中文P151
UCSRC = BIT(URSEL) | 0x06; //寫UCSRC寄存器,設定8個bit
UBRR = 0x000c; //設定串口波特率為9600
UCSRB = 0x98; //開串口
}
/*-----------------------------------------------------------------
函數名稱: void Uart0Init(void)
函數功能: 串口初始化
波特率 9600 0.2% 字符長度 8bit 無奇偶校驗
參 數:
返 回 值: 無
-----------------------------------------------------------------*/
#pragma interrupt_handler UartRecvData:12
void UartRecvData(void)
{
uchar temp;
temp = UDR;
if( temp == '*') //判斷是否是數據開始標志
{
NewBeginFlag = 1;
RecvDataFlag = 1;
}
else if( RecvDataFlag)
{
if( temp == '#') //判斷是否是數據結束標志
{
RecvDataFlag = 0; //置接收結束標志
}
else
{
RecvData[i++] = temp; //暫存數據
}
}
else if((temp == 'R')||(temp == 'r'))
{
ReadFlag = 1;
}
}
/*-----------------------------------------------------------------
函數名稱: void UartTransmitData(void)
函數功能: 發送字符串
參 數:
返 回 值: 無
-----------------------------------------------------------------*/
void UartTransmitData(void)
{
uchar j,Er[6] = "ERROR";
if( i == 0) //判斷接收到的數據是否為空
{
for( j = 0;j < 5; j++)
{
while(!(UCSRA&0x20)); //等待數據寄存器為空
UDR = Er[j]; //發送字符
}
}
else
{
for( j = 0;j < i; j++)
{
while(!(UCSRA&0x20)); //等待數據寄存器為空
UDR = RecvData[j]; //發送字符
}
}
}
/*-----------------------------------------------------------------
函數名稱: void InitDevices(void)
函數功能: 初始化各種信息
參 數:
返 回 值: 無
-----------------------------------------------------------------*/
void InitDevices(void)
{
CLI(); //關全部中斷
Uart0Init();
MCUCR = 0x00;
SEI();
}
void main( void)
{
uchar j;
InitDevices();
while(1)
{
if( NewBeginFlag) //有新的數據接收,清除原有數據
{
NewBeginFlag = 0;
for( j = 1; j ; j++ )
{
RecvData[j] = 0;
}
}
if( ReadFlag)
{
UartTransmitData();
ReadFlag = 0;
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -