STC12C5A60S2 双串口使用程序(已经验证成功)
#include <stc12c5a60s2.h>
#include "intrins.h"
#define uchar unsigned char
#define S2RI 0x01 // 串口2接收中断请求标志位
#define S2TI 0x02 // 串口2发送中断请求标志位
//================================================
// 对于将P4.4、P4.5当做I/O口使用必须添加的定义||
//================================================
sfr p4sw=0xbb; // 需在主函数文件中做相应设置4、5、6为1(作为I/O口使用)
/*sbit button1=P4^3;
sbit button2=P4^4;
sbit button3=P4^5;
sbit button4=P4^6;*/
页脚内容1
uchar code temp1[]={" 白云:“我可是个名人”"};
uchar code temp2[]={" 黑土:“啥名人啊,你就是个人名”"}; uchar code temp3[]={" 小崔:“诶,大叔大妈,你俩都冷静冷静”"}; uchar code temp4[]={" 观众:“哈哈哈哈”"};
/*void delay_1ms(uchar ii) // 误差-0.018084490741us
{
unsigned char a,b;
for(; ii>0; ii--)
for( b = 18; b>0; b--)
for( a = 152; a>0; a--);
_nop_(); //if Keil,require use intrins.h
}
void delay1s(void) //误差-0.000000000125us
{
unsigned char a,b,c;
for( c = 212; c>0; c--)
页脚内容2
for( b = 160; b>0; b--)
for( a = 80; a>0; a--);
_nop_(); //if Keil,require use intrins.h
_nop_(); //if Keil,require use intrins.h
}*/
//************************ 串口通信部分******************************
uchar wj_uun = '!'; // 用于存放串口1接收的字符
uchar wj_uun2 = '?'; // 用于存放串口2接收的字符
void bt_uart_init() // 单片机双串口初始化
{
//SCON=0X50; // SM0=0 SM1=1 SM2=0 REN=1
SM0 = 0; // 串口工作方式1:1位起始位,8位数据位,1位停止位允许串口接收SM1 = 1;
REN = 1; // 允许串口接收
页脚内容3
//RI=1; // 接收标志位,0:正在接收1:接收完毕(如果RI=1就一直执行串口中断)
TMOD = 0X20; // 定时器T1工作方式2
TH1 = 0XFD; // 9600bit/s下的定时器初值
TL1 = 0XFD;
TR1 = 1; // 启动定时器T1
EA = 1; // 开总中断
ES = 1; // 开串行口中断
S2CON = 0x50; // 串口2工作在方式1 10位异步收发S2SM0=0 S2SM1=1 S2REN=1允许接收
BRT = 0XFD; // 9600bit/s下的独立波特率发生器初值
AUXR = 0x10; // 辅助寄存器:0001 0000 ->BRTR=1:独立波特率发生器开始计数,S2SMOD=0:波特率不加倍,BRTx12=0:独立波特率每12个时钟计数一次
IE2 = 0x01; // 开串口2中断0000 0001->ES2=1
// AUXR1 = 0x10; // 0001 0000->S2_P4=1:UART2从P1口(RxD2:P1.2 TxD2:P1.3)切换到P4口(RxD2:P4.2 TxD2:P4.3) 否则默认都为P1口
}
/************** 串口1发送函数*****************/
页脚内容4
void s1_send_char(uchar dat) // 发送端(发送的是字符)
{
SBUF = dat; // 将字符送入发送缓冲寄存器
while(!TI); // TI为发送状态标志位,0:发送中1:发送结束TI = 0; // 手动清零标志位
}
void s1_send_string(uchar *pt) // 通过调用发送字符函数来发送字符数组
{
while(*pt != '\0')
{
s1_send_char(*pt++);
}
}
/************** 串口2发送函数*****************/
void s2_send_char(uchar dat2) // 发送端(发送的是字符)
{
页脚内容5
S2BUF = dat2; // 将字符送入串口2的发送缓冲寄存器
while(!(S2CON&S2TI)); // 判断发送是否结束:S2CON.bit2 = 0:发送中1:发送结束
S2CON &= ~S2TI; // 手动清零标志位,令S2CON.bit2 = 0
}
void s2_send_string(uchar *pt2) // 通过调用发送字符函数来发送字符数组
{
while(*pt2!='\0')
{
s2_send_char(*pt2++);
}
}
/************** 串口1中断程序*****************/
void bt_serial_1() i nterrupt 4 // 中断编号4为串行口1中断
{
if(RI) // 接收标志位,0:正在接收1:接收完毕(如果RI=1就一直执行中断)
{
页脚内容6
RI = 0; // 同样需要手动清零
wj_uun = SBUF; // 将接收缓冲器接收的字符送入变量中
}
}
/************** 串口2中断程序*****************/
void bt_serial_2() interrupt 8 // 中断编号8为串行口2中断
{
if(S2CON&S2RI) // 接收标志位: S2CON.bit1 = 0:正在接收1:接收完毕(如果RI=1就一直执行中断)
{
S2CON &= ~S2RI; // 同样需要手动清零,令S2CON.bit1 = 0
wj_uun2 = S2BUF; // 将串口2接收到的字符送入变量中
}
}
页脚内容7
void main(void)
{
bt_uart_init(); // 串口初始化
p4sw = 0x70; // 0111 0000 对应的4、5、6脚设置成功通用I/O口while(1)
{
/*if(wj_uun != '!') // 串口1接收
{
s1_send_char(wj_uun); // 串口1发送
wj_uun = '!';
}*/
if(wj_uun2 != '?') // 串口2接收
{
s2_send_char(wj_uun2); // 串口2发送
wj_uun2 = '?';
}
}
页脚内容8
}
页脚内容9。