标题:
STC12C5A60S2双串口通讯基础程序
[打印本页]
作者:
guangliang825
时间:
2020-3-19 18:04
标题:
STC12C5A60S2双串口通讯基础程序
程序9600波特率 下 STC单片机双串口通讯发基础程序,程序内容,各自中断接收,中断转发接收到的数据。需要两个串口同时工作的可以用的上。
单片机源程序如下:
/*-----------------------------------------------
名称:STC12C5A60S2双串口通信
编写:Nico
日期:2009.5
修改:无
内容:9600波特率 双串口收发
接线:串口1 发送P3.1,接收P3.0
串口2 发送P1.3,接收P1.2
------------------------------------------------*/
#include"stc12c5a60s2.h"
#include"delay.h"
#define S2RI 0x01 //串口2接收中断中断请求标志位
#define S2TI 0x02 //串口2发送中断请求标志位
unsigned char flag1,flag2,temp1,temp2;
unsigned char uart2Receive[100];
unsigned char uart1Receive[100];
unsigned int point1=0,point2=0;
unsigned char i;
/*------------------------------------------------
函数声明
------------------------------------------------*/
//void SendStr(unsigned char *s);
void UART_1SendOneByte(unsigned char c);
void UART_2SendOneByte(unsigned char c);
void uart1SendStr(unsigned char *s);
void uart2SendStr(unsigned char *s);
/*------------------------------------------------
串口初始化
------------------------------------------------*/
void InitUART (void)
{
SCON = 0x50; // SCON: 模式 1, 8-bit UART, 使能接收
TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit 重装
TH1 = 0xFD; // TH1: 重装值 9600 波特率 晶振 11.0592MHz
TR1 = 1; // TR1: timer 1 打开
EA = 1; //打开总中断
ES = 1; //打开串口中断
S2CON = 0x50; //
BRT = 0xFD; // 9600
AUXR = 0x10; //
IE2 =0x01; //
}
/*------------------------------------------------
主函数
------------------------------------------------*/
void main (void)
{
InitUART();
DelayMs(100);
uart1SendStr("串口1初始化成功");
DelayMs(100);
uart2SendStr("串口2初始化成功");
while (1)
{
if(flag1==1)
{
flag1=0;
// uart2SendStr("串口1中断,串口2发送串口1接收的数据:");
uart1SendStr(uart1Receive);
for(i=0;i<=100;i++)
{
uart1Receive[i]=0;
}
}
if(flag2==1)
{
flag2=0;
// uart1SendStr("串口2中断,串口1发送串口2接收的数据:");
uart2SendStr(uart2Receive);
for(i=0;i<=100;i++)
{
uart2Receive[i]=0;
}
}
}
}
/*------------------------------------------------
1发送字符串
------------------------------------------------*/
void uart1SendStr(unsigned char *s)
{
while(*s!='\0')// \0 表示字符串结束标志,
//通过检测是否字符串末尾
{
UART_1SendOneByte(*s);
s++;
}
}
/*------------------------------------------------
2发送字符串
------------------------------------------------*/
void uart2SendStr(unsigned char *s)
{
while(*s!='\0')// \0 表示字符串结束标志,
//通过检测是否字符串末尾
{
UART_2SendOneByte(*s);
s++;
}
}
void UART_1SendOneByte(unsigned char c)
{
SBUF = c;
while(!TI); //?TI=0,????
TI = 0;
}
/****************串口2发送一个字符****************/
void UART_2SendOneByte(unsigned char c)
{
S2BUF = c;
while(!(S2CON&S2TI)); //?S2TI=0,????
S2CON&=~S2TI; //S2TI=0
}
/************串口1中断函数*************/
void UART_1Interrupt(void) interrupt 4
{
if(RI==1)
{
RI=0;
flag1=1;
temp1=SBUF;
uart1Receive[point1++]=temp1;
if(temp1=='\n')
{
flag1=1;
point1=0;
}
if(point1==100)
{
point1=0;
}
}
}
/************串口2中断函数*************/
void UART_2Interrupt(void) interrupt 8
{
EA = 0; //打开总中断
if(S2CON&S2RI)
{
S2CON&=~S2RI;
temp2=S2BUF;
uart2Receive[point2++]=temp2;
if(temp2=='\n')
{
point2=0;
flag2=1;
}
if(point2==100)
{
point2=0;
}
}
EA = 1; //打开总中断
}
复制代码
以上资料51hei提供下载:
12C5a60s2双串口通讯.rar
(50.5 KB, 下载次数: 196)
2020-3-19 18:05 上传
点击文件名下载附件
双串口程序下载
下载积分: 黑币 -5
作者:
renshanwu
时间:
2020-8-16 23:50
96行,109行的S++,是什么目的?为什么要自加?而且上文中只有*S,没有出现S啊?
作者:
renshanwu
时间:
2020-8-17 00:00
151,167行,是先开总中断,后关总中断,还是先关后开?
作者:
76221570
时间:
2021-4-7 14:48
我测试了一下,用串口助手发送数据时候需要勾选“发送新行” 才可以 ,要不然就有一个接收不到另一个发送的。程序没什么问题, 就是151行注释错了 ,代码没问题。
EA = 0; //打开总中断
这里应该是
EA = 0; //关闭总中断。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1