1. 程式人生 > >STC89C52微控制器——串列埠傳送程式2

STC89C52微控制器——串列埠傳送程式2

修改了 1 中不能連續呼叫 字串傳送的BUG!!

 
/*-----------------------------------------------
  名稱:串列埠通訊 修復程式1中無法連續呼叫字串傳送的BUG
  編寫:LZM  [email protected]
</a>  日期:2015.05.24
  修改:無
  內容:連線好串列埠波特率設定為9600,無奇偶校驗
        晶振11.0592MHz
		接上串列埠,可以接收到自己傳送的字元
------------------------------------------------*/

#include<reg52.h> //包含標頭檔案,一般情況不需要改動,標頭檔案包含特殊功能暫存器的定義                        

/*******************************************************************
請提前計算一下所選晶振能達到的最高速度,波特率不能超過最高速度
(1) 波特率加倍(SMOD=1):  Max_Baud = FOSC/12/16
(2) 波特率不加倍(SMOD=0):Max_Baud = FOSC/12/32
例如:22.1184MHz晶振,波特率加倍時,最大波特率=22118400/12/16=115200
*******************************************************************/
#define FOSC	11059200		//振盪頻率
#define BAUD	9600			//波特率
#define SMOD	1			//是否波特率加倍
#if SMOD
	#define TC_VAL	(256-FOSC/16/12/BAUD)
#else
	#define TC_VAL	(256-FOSC/32/12/BAUD)
#endif

typedef unsigned char uint8;
typedef unsigned int uint16;

code const char str1[] = "The string is 來自微控制器!\r\n";	 
code const char str2[] = "Author: Louis \r\n";
code const char str3[] = "多多指教~~\r\n";

//const  限定一個變數不允許被改變。在一定程度上提高程式安全性和可靠性
//code 儲存區間為 程式儲存區

/***************函式宣告*******************/
void InitUART(void);
void SendOneByte(uint8);
void SendrStr(const uint8 *ptr);

/****************主函式********************/
void main(void)
{
    uint8 i=0;
    InitUART();

    while(str2[i]!='\0')
    {
	SendOneByte(str2[i++]);	
    }

	SendrStr(&str1[0]);
	SendrStr(&str1[0]);
    while(1);
}

/****************中斷服務函式***************/
void UART_ISR(void) interrupt 4
{
    uint8 RX_Data;
    //只響應"接收"中斷,"傳送"中斷來了就直接抹掉
    if(RI)
   {
     RI = 0;	//串列埠中斷標誌不能自己清除,需要手動清除
     RX_Data=SBUF;
     SendOneByte(RX_Data);
   }
   else
     TI = 0;		//串列埠發中斷是傳送完緩衝區資料之後產生
}

/****************串列埠初始化函式*************/
void InitUART(void)
{
    TMOD = 0x20;    //定時器1,模式2工作模式	   
    SCON = 0x50;    //串列埠工作模式1,允許REN   /* SCON: 模式 1,  8-bit UART, 使能接收         */
    TH1 = TC_VAL;
    TL1 = TH1;
    PCON = 0x80; 	//傳送速率加倍
    ES = 1;
    EA = 1;
    TR1 = 1;
}
/**************串列埠傳送字元函式*************/
void SendOneByte(uint8 c)
{
    ES = 0;			//禁止中斷,讓串列埠安心工作啊
    SBUF = c;
    while(!TI);		//等待發送完畢
    TI = 0;			//清TI中斷
    ES = 1;			//開啟中斷
}
/**************串列埠傳送字串函式*************/
void SendrStr(const uint8 *ptr)
{
    
	for(;*ptr!='\0';ptr++)
	{
	   SendOneByte(*ptr);
	}
}