マニュアルによれば、STC12C5A60S2シリーズマイコンはreg51.hのヘッダファイルを直接使用できるようですが、対応する特殊機能レジスタを使用する場合は対応する定義を行う必要があります。
ビデオチュートリアルリンクのメモ: https://www.bilibili.com/video/BV1Qq4y1Z7iS/?spm_id_from=333.880.my_history.page.click&vd_source=b91967c499b23106586d7aa35af46413
テスト用に 2 つのシリアル ポートを開きます。
シリアルポート2の受信割り込みを使用するには、シリアルポート2の割り込みイネーブルを追加する必要があります。
IE2 = 0x01; //Enable UART2 interrupt
uart2.c のコードは次のとおりです。
#include "uart2.h"
extern void sendByte(unsigned char dat);
void uart2_init(void) //[email protected]
{
AUXR &= 0xF7; //波特率不倍速
S2CON = 0x50; //8位数据,可变波特率
AUXR &= 0xFB; //定时器时钟12T模式
BRT = 0xFD; //设置定时重载值
AUXR |= 0x10; //启动独立波特率发射器
IE2 = 0x01; //Enable UART2 interrupt
}
void uart2_SendByte(unsigned char dat)
{
S2BUF = dat;
while(!(S2CON & S2TI)); // S2CON & S2TI == 0 时,会一直等在这
S2CON &= ~S2TI; // 手动清 0
}
#if 0
void uart2_SendString(unsigned char *dat)
{
while(*dat != '\0')
{
uart2_SendByte(*dat++);
}
}
#endif
char putchar(char c)
{
uart2_SendByte(c);
return c;
}
/*----------------------------
UART2 interrupt service routine
----------------------------*/
void Uart2() interrupt 8
{
unsigned char dat;
if (S2CON & S2RI)
{
S2CON &= ~S2RI; //Clear receive interrupt flag
dat = S2BUF;
sendByte(dat);
}
}
uart2.h のコードは次のとおりです。
#ifndef _UART2_H_
#define _UART2_H_
#include "stc12c5a60s2.h"
#define S2RI 0x01 //S2CON.0
#define S2TI 0x02 //S2CON.1
#define S2RB8 0x04 //S2CON.2
#define S2TB8 0x08 //S2CON.3
// 函数声明
extern void uart2_init(void);
extern void uart2_SendByte(unsigned char dat);
extern void uart2_SendString(unsigned char *dat);
#endif
(シリアルポートのタイムアウト受信に基づくユーザー定義通信プロトコルの実装プログラミング~プロトコル内でのCRC16検証と受信応答処理)をベースにプロジェクトを修正し、コードをCSDNデータベースにアップロードしました。
12T – 12 で除算 – 12 クロックごとにカウント
1T – 除算なし – 1 クロックごとにカウント