标题:
STC15单片机4串口中断收发数据源代码,亲测能用
[打印本页]
作者:
xs3396
时间:
2018-9-11 17:04
标题:
STC15单片机4串口中断收发数据源代码,亲测能用
STC15W4K58s4单片机4路串口同时中断收发数据代码
0.png
(10.2 KB, 下载次数: 98)
下载附件
2018-9-11 18:01 上传
单片机源程序如下:
#include "uart.h"
u8 Uart1_RecvBuf[11]; //串口数据缓存
u8 point1 = 0; //绶存指针
u8 UART1_RecvFlag=0;
u8 Uart2_RecvBuf[11]; //串口数据缓存
u8 point2 = 0; //绶存指针
u8 UART2_RecvFlag=0;
u8 Uart3_RecvBuf[11]; //串口数据缓存
u8 point3 = 0; //绶存指针
u8 UART3_RecvFlag=0;
u8 Uart4_RecvBuf[11]; //串口数据缓存
u8 point4 = 0; //绶存指针
u8 UART4_RecvFlag=0;
void UartInit(void) //9600bps@11.0592MHz
{
P3M0 &= ~(1<<7); //设置P3.7为准双向IO
P3M1 &= ~(1<<7);
S1_USE_P30P31();
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x40; //定时器1时钟为Fosc,即1T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD |= 0x00; //设定定时器1为16位自动重装方式
TL1 = 0xE0; //设定定时初值
TH1 = 0xFE; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
S2CON = 0x50; //8位数据,可变波特率
AUXR |= 0x04; //定时器2时钟为Fosc,即1T
T2L = 0xE0; //设定定时初值
T2H = 0xFE; //设定定时初值
AUXR |= 0x10; //启动定时器2
S3CON = 0x10; //8位数据,可变波特率
S3CON |= 0x40; //串口3选择定时器3为波特率发生器
T4T3M |= 0x02; //定时器3时钟为Fosc,即1T
T3L = 0xE0; //设定定时初值
T3H = 0xFE; //设定定时初值
T4T3M |= 0x08; //启动定时器3
S4CON = 0x10; //8位数据,可变波特率
S4CON |= 0x40; //串口4选择定时器4为波特率发生器
T4T3M |= 0x20; //定时器4时钟为Fosc,即1T
T4L = 0xE0; //设定定时初值
T4H = 0xFE; //设定定时初值
T4T3M |= 0x80; //启动定时器4
UART2_INT_ENABLE();
UART3_INT_ENABLE();
UART4_INT_ENABLE();
ES = 1;
EA = 1;
}
/*----------------------------
发送串口数据
----------------------------*/
void Uart1_Sendbyte(unsigned char ch)
{
SBUF = ch; //写数据到UART数据寄存器
while (!TI); //等待前面的数据发送完成
TI = 0;
}
void Uart1_SendData()
{
int i;
for(i=0;i<11;i++)
{
Uart1_Sendbyte(Uart1_RecvBuf[i]);
}
}
void Usart() interrupt 4 using 1 // 串口中断函数
{
ES = 0;
if (RI)
{
RI = 0; //清除RI位
Uart1_RecvBuf[point1] = SBUF;
if (Uart1_RecvBuf[0] == 0x55)
{
point1++;
if(point1>=11)
{
point1 = 0;
}
}
if(Uart1_RecvBuf[1] == 0x53)
{
UART1_RecvFlag=1;
}
}
ES = 1;
}
/*----------------------------
通过串口2发送串口数据
----------------------------*/
void Uart2_Sendbyte(unsigned char ch)
{
S2BUF = ch; //写数据到UART数据寄存器
while(!TI2); //不忙后发送数据
CLR_TI2();
}
void Uart2_SendData()
{
int i;
for(i=0;i<11;i++)
{
Uart2_Sendbyte(Uart2_RecvBuf[i]);
}
}
void Usart2() interrupt 8 using 1
{
UART2_INT_DISABLE();
if(RI2)
{
CLR_RI2(); //清除RI位
Uart2_RecvBuf[point2] = S2BUF;
if (Uart2_RecvBuf[0] == 0x55)
{
point2++;
if(point2>=11)
{
point2 = 0;
}
}
if(Uart2_RecvBuf[1] == 0x53)
{
UART2_RecvFlag=1;
}
}
UART2_INT_ENABLE();
}
/*----------------------------
通过串口3发送串口数据
----------------------------*/
void Uart3_Sendbyte(unsigned char ch)
{
S3BUF = ch; //写数据到UART数据寄存器
while(!TI3); //不忙后发送数据
CLR_TI3();
}
void Uart3_SendData()
{
int i;
for(i=0;i<11;i++)
{
Uart3_Sendbyte(Uart3_RecvBuf[i]);
}
}
void Usart3() interrupt 17
{
UART3_INT_DISABLE();
if(RI3)
{
CLR_RI3(); //清除RI位
Uart3_RecvBuf[point3] = S3BUF;
if (Uart3_RecvBuf[0] == 0x55)
{
point3++;
if(point3>=11)
{
point3 = 0;
}
}
if(Uart3_RecvBuf[1] == 0x53)
{
UART3_RecvFlag=1;
}
}
UART3_INT_ENABLE();
}
/*----------------------------
通过串口4发送串口数据
----------------------------*/
void Uart4_Sendbyte(unsigned char ch)
{
S4BUF = ch; //写数据到UART数据寄存器
while(!TI4); //不忙后发送数据
CLR_TI4();
}
void Uart4_SendData()
{
int i;
for(i=0;i<11;i++)
{
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
4路串中断收发.rar
(126.09 KB, 下载次数: 266)
2018-9-11 17:03 上传
点击文件名下载附件
STC15W4K58S4单片机源程序
下载积分: 黑币 -5
作者:
xsf444051989
时间:
2018-12-26 18:06
希望有用
作者:
liuz325
时间:
2019-3-17 22:04
希望有用
作者:
gongzhu
时间:
2019-6-2 21:55
整了个15w4k48S4回来做modbus从站用,正需要!
作者:
hyz5122
时间:
2019-7-10 09:08
不错,先下载来学习,学习
作者:
yulin3192
时间:
2019-7-18 15:46
不是我想要的答案
作者:
elec_hangzhou
时间:
2019-8-2 15:04
希望能解决我的困惑,学习一下。
作者:
zhangjianhu
时间:
2019-10-18 10:23
参考下楼主的历程,写的很清晰
作者:
caiwj
时间:
2020-3-5 17:26
参考下楼主的历程
作者:
talentnan
时间:
2021-3-31 09:39
正在使用STC15w4k32s4写多串口同时通讯程序,参考一下
作者:
15540241206
时间:
2021-9-8 11:04
没啥用 调试了一下没反应 白充了!!!!!
作者:
ZHAOBAO511
时间:
2022-6-28 10:42
直接发送没反应:delayms(200);
Uart4_SendData1();
delayms(200);
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1