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) // { // } }