當(dāng)前位置:首頁 > 單片機 > 單片機
[導(dǎo)讀]52單片機實用的IO模擬串行口C語言源程序 作者:21IC suda 用途:短距離、波特率要求不高、環(huán)境干擾不大的場合 特點: 程序簡練、實用、移植方便 占用定時器T2 只消耗約600字節(jié)的ROM 有詳細的注釋 參數(shù): 晶

52單片機實用的IO模擬串行口C語言源程序
作者:21IC suda
用途:短距離、波特率要求不高、環(huán)境干擾不大的場合
特點:
程序簡練、實用、移植方便
占用定時器T2
只消耗約600字節(jié)的ROM
有詳細的注釋
參數(shù):
晶振:22.1184MHz
波特率:1200
起始位:1
數(shù)據(jù)位:8
校驗位:無
停止位:1
*/


#include


//將T2定時器的自動重裝寄存器定義成16位SFR,以方便訪問
sfr16 RCAP2 = 0xCA;


//修改如下定義將方便程序移植
sbit RXD_pin = P3^0; //定義接收引腳
sbit TXD_pin = P3^1; //定義發(fā)送引腳
#define MAIN_CLK 22118400L //定義主頻
#define BAUD_RATE 1200L //定義波特率(數(shù)值不能太高,因為要給T2中斷服務(wù)程序留足執(zhí)行時間)
#define HITS 8 //定義采樣率(應(yīng)當(dāng)是偶數(shù);減少采樣率能提高波特率,但為保證可靠工作,最小不能少于6次)

#define RXD_BUF_LEN 32 //定義接收緩沖區(qū)大小
volatile unsigned char RXD_buf[RXD_BUF_LEN]; //定義接收緩沖區(qū)(循環(huán)隊列)
volatile unsigned char RXD_p1; //指向緩沖區(qū),由中斷程序自動修改
volatile unsigned char RXD_p2; //指向緩沖區(qū),由主程序修改

#define TXD_BUF_LEN 32 //定義發(fā)送緩沖區(qū)大小
volatile unsigned char TXD_buf[TXD_BUF_LEN]; //定義發(fā)送緩沖區(qū)(循環(huán)隊列)
volatile unsigned char TXD_p1; //指向TXD_buf,由主程序修改
volatile unsigned char TXD_p2; //指向TXD_buf,由中斷程序修改


//定時器T2初始化
extern void T2_init()
{
EA = 0;
T2CON = 0x00;
PT2 = 1; //將T2中斷設(shè)置成高級優(yōu)先級
RCAP2 = 65536L - ( MAIN_CLK / 12 ) / ( BAUD_RATE * HITS ); //此公式值得你琢磨一下
TH2 = RCAP2H;
TL2 = RCAP2L;
ET2 = 1;
TR2 = 1;
EA = 1;
}


//接收初始化
extern void RXD_init()
{
unsigned char i;
RXD_pin = 1;
RXD_p1 = 0;
RXD_p2 = 0;
for ( i=0; i {
RXD_buf[i] = 0x00;
}
}


//發(fā)送初始化
extern void TXD_init()
{
unsigned char i;
TXD_pin = 1;
TXD_p1 = 0;
TXD_p2 = 0;
for ( i=0; i< TXD_BUF_LEN; i++ )
{
TXD_buf[i] = 0x00;
}
}

//發(fā)送單個字符
extern void TXD_Send_Char(const unsigned char c)
{
unsigned char p; //臨時變量
p = TXD_p1 + 1;
if ( p >= TXD_BUF_LEN ) p = 0;
while ( p == TXD_p2 ); //判斷發(fā)送緩沖隊列是否已滿,如果是,則暫時不能發(fā)送
TXD_buf[TXD_p1] = c; //先將c寫入隊列
TXD_p1 = p; //再修改TXD_p1
//在T2中斷服務(wù)程序里會自動完成發(fā)送
}

//發(fā)送字符串(不包括末尾的'