#include "uart.h"
volatile unsigned char U1_Rec_data_buff[MAX_L]; //串口1接收缓存区
volatile unsigned short T1 = 0; //超时计时
volatile unsigned char U1_L_Temp = 0; //接收长度缓冲
volatile unsigned char U1_L = 0; //接收长度
volatile unsigned char U1_Over = 0; //接收完成标志位
volatile unsigned char U2_Rec_data_buff[1024];
volatile unsigned short U2_L_Temp = 0; //接收长度缓冲
volatile unsigned char U3_Rec_data_buff[MAX_u2_U4];
volatile unsigned char U3_L_Temp = 0; //接收长度缓冲
bit S2CONbusy;
bit S3CONbusy;
bit S4CONbusy;
void UartInit(void) //9600bps@24.000MHz //与PC通信 9600
{
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x40; //定时器1时钟为Fosc,即1T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //设定定时器1为16位自动重装方式
TL1 = 0x8F; //设定定时初值
TH1 = 0xFD; //设定定时初值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
ES = 1;
EA = 1;
}
void Uart3Init(void) //115200bps@24.000MHz //DALI串口 115200
{
P5M0=0x02;
P5M1=0x00;
P_SW2 = 0x02;//RX->P5.0 TX->P5.1
// S3CON = 0x10; //8位数据,可变波特率
// S3CON |= 0x40; //串口3选择定时器2为波特率发生器
S3CON = 0x50;
T4T3M |= 0x02; //定时器3时钟为Fosc,即1T
T3L = 0xCC; //设定定时初值
T3H = 0xFF; //设定定时初值
T4T3M |= 0x08; //启动定时器3
IE2 |= 0x08;
ES = 1;
EA =1;
U3_L_Temp = 0;
}
void Uart2Init(void) // //115200bps@24.000MHz //产品串口 115200
{
//RX->P1.0 TX->P1.1
//新板子需要配置双向模式
P1M0=0x02;
P1M1=0x00;
S2CON = 0x50;
AUXR |= 0x04; // 启动定时器
T2L = 0xCC; //65536-11059200/115200/4=0FFE8H
T2H = 0xFF;
AUXR |= 0x10; // 启动定时器
IE2 |= 0x01; // 使能串口中断
ES = 1;
EA = 1;
U2_L_Temp = 0;
}
void Uart4Init(void) //115200bps@24.000MHz debug
{
P0M0=0x00;
P0M1=0x00;
S4CON = 0x50; //8位数据,可变波特率
//S4CON |= 0x40; //串口4选择定时器4为波特率发生器
T4T3M |= 0x20; //定时器时钟1T模式
T4L = 0xCC; //设置定时初始值
T4H = 0xFF; //设置定时初始值
T4T3M |= 0x80; //定时器4开始计时
IE2 |= 0x10;
ES = 1;
EA = 1;
}
/*=================================*/
/* 串口1发送字节函数 */
/*=================================*/
void U1_Sendbyte(unsigned char sendcom)
{
ACC=sendcom;
SBUF = ACC;
while(!TI);
TI = 0;
}
void U3_Sendbyte(unsigned char sendcom)
{
U3_L_Temp = 0;
while (S3CONbusy);
S3CONbusy=1;
S3BUF=sendcom;
}
void U2_Sendbyte(unsigned char sendcom)
{
U2_L_Temp = 0;
while(S2CONbusy);
S2CONbusy=1;
S2BUF = sendcom;
}
void U4_Sendbyte(unsigned char sendcom)
{
while(S4CONbusy);
S4CONbusy=1;
S4BUF=sendcom;
}
char putchar(char ch)//printf重定向
{
while(S4CONbusy);
S4CONbusy=1;
S4BUF=ch;
return ch;
}
void U3_inter() interrupt 17 //using 1 //U3中断程序
{
unsigned char temp;
if(S3CON & S3CON^0)
{
S3CON &= 0x50;//坑爹玩意,需要对整个地址赋初始值
temp = S3BUF;
if(U3_L_Temp<MAX_u2_U4)
{
U3_Rec_data_buff[U3_L_Temp++]= temp;
}
else
{
U3_L_Temp = 0;
U3_Rec_data_buff[U3_L_Temp++]= temp;
}
}
if (S3CON & S3CON^1)
{
S3CON &= 0x50;//坑爹玩意,需要对整个地址赋初始值
S3CONbusy=0;
}
}
void U2_inter() interrupt 8 //using 1
{
unsigned char temp;
if(S2CON & S2CON^0)
{
S2CON &=0x50;//坑爹玩意,需要对整个地址赋初始值
temp = S2BUF;
if(U2_L_Temp<1024)
{
U2_Rec_data_buff[U2_L_Temp++]=temp;
}
else
{
U2_L_Temp = 0;
U2_Rec_data_buff[U2_L_Temp++]= temp;
}
}
if (S2CON & S2CON^1)
{
S2CON &= 0x50;//坑爹玩意,需要对整个地址赋初始值
S2CONbusy=0;
}
}
void U4_inter() interrupt 18 //using 1
{
if (S4CON & S4CON^1)
{
S4CON &= 0x50;//坑爹玩意,需要对整个地址赋初始值
S4CONbusy=0;
}
}
void U1_inter() interrupt 4 using 1//using 0 //U1中断程序
{
static unsigned char first=1;
unsigned char temp;
if(RI) //中断是否由接收引起
{
// P00=!P00;
if((first==1)||(start==1))
{
first = 0;
start = 0;
start_time=1;//开启超时计时
}
RI = 0;
T1 = 0; //复位超时计时
temp = SBUF;
if(U1_L_Temp<MAX_L)
{
U1_Rec_data_buff[U1_L_Temp++] = temp;
}
else
{
U1_L_Temp=0;
U1_Rec_data_buff[U1_L_Temp++] = temp;
}
}
}
STC8A8K64D4,多串口通信的 .c和.h文件
需积分: 34 85 浏览量
2022-12-30
19:14:56
上传
评论 1
收藏 2KB RAR 举报
神位移
- 粉丝: 2088
- 资源: 4
最新资源
- 基于C#和NET MAUI开发的音乐播放器+源代码+文档说明+sln.zip
- 基于python+flask+mysql实现的豆瓣电影可视化系统+源代码+文档说明+数据库sql.zip
- 程氏舞曲V4.2程氏舞曲V4.2程氏舞曲V4.2程氏舞曲V4.2
- FPGA读写 AD9708+ AD9280 ADDA实验Verilog逻辑源码Quartus工程文件+文档说明+硬件参考原理图
- 基于CH340C设计USB转TLL串口通信模块PADS 9.5设计硬件(原理图+PCB)文件.zip
- 信号与系统大作业-图像处理 实现了直接滤波法维纳滤波法最小二乘滤波法LR递归法matlab源码.zip
- php-leetcode题解之最小栈.zip
- php-leetcode题解之最长不含重复字符的子字符串.zip
- php-leetcode题解之最长公共前缀.zip
- php-leetcode题解之最小差值.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈