1. 程式人生 > >STC15F2K60S2串列埠通訊程式程式碼

STC15F2K60S2串列埠通訊程式程式碼





//**********************************************

//STC15F2K60S2串列埠通訊程式,將串列埠接受到的資料從串列埠發出去
//採用22.1184M晶振,波特率115200
//為方便大家除錯,特附該程式的專案工程檔案下載地址,下載開啟即可除錯下載到微控制器
//
//*********************************************




#include <stc15fxxxx.h> //呼叫stc15f系列標頭檔案,下載地址: http://pan.baidu.com/s/1eRUbjLS


/*************常量定義****************/


#define MAIN_Fosc
22118400L //主時鐘,晶振頻率不同的直接在這裡修改頻率
#define serial_one_read_max 32 //定義快取區的長度
#define serial_one_baud_rate 115200L //波特率,只需在這裡修改波特率就可以了
#define Timer1_Reload (65536UL -(MAIN_Fosc / 4 / serial_one_baud_rate))   //用定時器1做波特率發生器,計算定時器1的重灌值


/*************變數定義****************/
u8  serial_one_read_data[serial_one_read_max];
//定義串列埠接受資料快取區
u8  serial_one_read_count=0; //接受資料的個數


//初始化串列埠1
void serial_one_init()
{
SCON |= 0x40; //8位資料
P_SW1 &=  ~0xc0; //UART1 使用P30 P31口 預設
TR1 = 0; //關閉定時器
AUXR &= ~0x01; //S1 BRT Use Timer1;
TMOD &= ~(1<<6); //Timer1 set As Timer
TMOD &= ~0x30;
//Timer1_16bitAutoReload;2
AUXR |=  (1<<6); //Timer1 set as 1T mode
TH1 = (u8)(Timer1_Reload >> 8);
TL1 = (u8)Timer1_Reload;
TR1  = 1; //開啟定時器
PS = 1; //高優先順序中斷
REN = 1; //允許接收
ES  = 1; //允許中斷


EA = 1; //允許全域性中斷
}


//延時10毫秒
void Delay10ms() //@22.1184MHz
{
unsigned char i, j, k;


_nop_();
_nop_();
i = 1;
j = 216;
k = 35;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}


//串列埠1傳送一個位元組
void serial_one_send_byte(u8 dat)
{
SBUF = dat;//傳送資料
while(!TI);//等待發送完畢
TI=0; //清除傳送標誌
}


//串列埠1傳送字串
void serial_one_send_string(u8 *dat)
{
while(*dat)
serial_one_send_byte(*dat++);
}


//串列埠1傳送指定指定長度資料
void serial_one_send_length_string(u8 *dat,u8 length)
{
u8 i=0;
for(;i < length;i++)
serial_one_send_byte(dat[i]);
}




void main()
{
Delay10ms();//延時10毫秒
Delay10ms();//延時10毫秒
serial_one_init();//串列埠初始化
while(1)
{
if(serial_one_read_count > 0)//如果接受到資料
{
Delay10ms();//延時10毫秒,等待資料全部讀入
serial_one_send_length_string(serial_one_read_data,serial_one_read_count);//傳送接收到的資料
serial_one_read_count = 0;//接收計數清0
}
}
}


/********************* 串列埠1中斷函式************************/
void UART1_int (void) interrupt UART1_VECTOR
{
if(RI)
{
RI = 0;//清除接受標誌
serial_one_read_data[serial_one_read_count] = SBUF;//將資料存入陣列
if(++serial_one_read_count > serial_one_read_max) //避免溢位
serial_one_read_count = 0;
}


// if(TI)
// {
// }
}