?? uart.c
字號:
#include "system.h"
volatile unsigned char UartSendBuffer[OutLEN]; //發送緩沖
volatile unsigned char UartReceiveBuffer[InLEN]; //接收數據緩沖
volatile unsigned char *outlast=UartSendBuffer; //最后由中斷傳輸出去的字節位置
volatile unsigned char *putlast=UartSendBuffer; //最后放入發送緩沖區的字節位置
volatile unsigned char UartSendBufferemptyFlag=1; //緩沖區數據發完標志 發完=1
volatile unsigned char UartSendBufferHaveDataFlag=0; //發送緩沖區非空標志 有=1
volatile unsigned char UartReceiveCounter=0; //接收計數器
volatile unsigned char UartRxTimerStartFlag=0; //接收超時計數器啟動標志
volatile unsigned char UartWaitForCounter=0; //接收超時計數器
volatile unsigned char UartDataReadyFlag=0; //接收完成標志
//=======================================================================================================
// 函數名稱: UartInit
//
// 功能描述:串口初始化
//
// 輸 入: void
//
// 輸 出: void
//
// 全局變量: UartReceiveCounter ; UartRxTimerStartFlag
// 調用模塊: 無
//
// 作 者: 盧明君
// 日 期: 2009年9月15日
// 備 注:
//-------------------------------------------------------------------------------------------------------
// 修改人:
// 日 期:
// 備 注:
//-------------------------------------------------------------------------------------------------------
//=======================================================================================================
/*
void UartInit(void)
{
SCON = 0x50;
//PCON |= 0x80;
//AUXR2|= 0x40;
//Timer1Init();
TR1=0; //停止定時器
// TCON=0x00; //定時器控制寄存器 注意:TCON只需操作一次
TMOD |= 0x20; //定時器1
TL1 = -(SYSCLK/12/32/baud);//0xfa; // -(SYSCLK/12/32/baud); //注意波特率加倍位
TH1 = TL1;
TR1=1; //啟動定時器1
// ET1=1; //打開定時器1中斷
UartReceiveCounter=0;
UartRxTimerStartFlag=0;
}
*/
//=======================================================================================================
// 函數名稱: UartSendchar
//
// 功能描述:放入一個字節到發送緩沖區
//
// 輸 入: unsigned char ucdata
//
// 輸 出: void
//
// 全局變量: outlast ; putlast ; UartSendBuffer[] ; UartSendBufferHaveDataFlag ; UartSendBufferemptyFlag
// 調用模塊: 無
//
// 作 者: 盧明君
// 日 期: 2009年9月15日
// 備 注:
//-------------------------------------------------------------------------------------------------------
// 修改人:
// 日 期:
// 備 注:
//-------------------------------------------------------------------------------------------------------
//=======================================================================================================
void UartSendchar(unsigned char ucdata)
{
ES=0; // 暫停串行中斷,以免數據比較時出錯
while((((outlast-putlast)==2)&&(outlast > putlast ))||((outlast < putlast)&&(OutLEN-(putlast-outlast)==2)))
{
ES=1;
ucdata++;
ucdata--;
ES=0;
}
*putlast=ucdata; // 放字節進入緩沖區
putlast++; // 發送緩沖區指針加1
if (putlast==UartSendBuffer+OutLEN) putlast=UartSendBuffer; // 指針到了頂部換到底部
UartSendBufferHaveDataFlag=1;
if (UartSendBufferemptyFlag) // 緩沖區無數據
{
UartSendBufferemptyFlag =0;
SBUF=*outlast; // 未發送完繼續發送
outlast++; // 最后傳出去的字節位置加1
if (outlast==UartSendBuffer+OutLEN)outlast=UartSendBuffer; // 地址到頂部回到底部
if (putlast==outlast)UartSendBufferHaveDataFlag=0; // 數據發送完置發送緩沖區空標志
} // 緩沖區開始為空,置為有,啟動發送
ES=1;
}
//=======================================================================================================
// 函數名稱: UartSendString
//
// 功能描述:發送字符串
//
// 輸 入: unsigned char *str
//
// 輸 出: void
//
// 全局變量:
// 調用模塊: UartSendchar
//
// 作 者: 盧明君
// 日 期: 2009年9月15日
// 備 注:
//-------------------------------------------------------------------------------------------------------
// 修改人:
// 日 期:
// 備 注:
//-------------------------------------------------------------------------------------------------------
//=======================================================================================================
void UartSendString(unsigned char *str)
{
while(*str) // 遇到停止符0結束
{
UartSendchar(*str++);
//while(UartSendBufferHaveDataFlag);
}
}
//=======================================================================================================
// 函數名稱: UartSendByte
//
// 功能描述:發送一串數據
//
// 輸 入: unsigned char *Startaddr,unsigned char SendByte
//
// 輸 出: void
//
// 全局變量:
// 調用模塊: UartSendchar
//
// 作 者: 盧明君
// 日 期: 2009年9月15日
// 備 注:
//-------------------------------------------------------------------------------------------------------
// 修改人:
// 日 期:
// 備 注:
//-------------------------------------------------------------------------------------------------------
//=======================================================================================================
void UartSendByte(unsigned char *Startaddr,unsigned char SendByte)
{
while(SendByte--)
{
UartSendchar(*Startaddr++);
}
}
void Uart(void) interrupt 4 using 2
{
if(TI)
{
TI=0;
if (UartSendBufferHaveDataFlag)
{
SBUF=*outlast; // 未發送完繼續發送
outlast++; // 最后傳出去的字節位置加1
if (outlast==UartSendBuffer+OutLEN)outlast=UartSendBuffer; // 地址到頂部回到底部
if (putlast==outlast)UartSendBufferHaveDataFlag=0; // 數據發送完置發送緩沖區空標志
}
else UartSendBufferemptyFlag =1;
}
if(RI)
{
RI = 0;
//==========================================================
// 若有必要 有待于加入 偶校驗算法 .數據位的bit7位為校驗位
//==========================================================
UartReceiveBuffer[UartReceiveCounter++]=SBUF&0x7f;
UartRxTimerStartFlag=1; // 啟動超時計數器
UartWaitForCounter=0; // 清超時計數器 // 10ms
if (UartReceiveCounter>=InLEN)
{
UartDataReadyFlag=1;
//UartReceiveCounter=0;
REN=0;
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -