- 打卡等级:偶尔看看III
- 打卡总天数:41
- 最近打卡:2025-12-26 13:08:12
中级会员
- 积分
- 239
|
发表于 2025-11-5 14:37:27
|
显示全部楼层
串口通信配置文件
#include <AI8051U.H>
//============================================================================================================================串口2
unsigned char xdata Uart_Send_2[50]; //发送缓冲区,最多50个字节
unsigned char xdata Uart_Receive_2[50]; //接收缓冲区,最多50个字节
unsigned char Index_Send_2 = 0; //全局变量,用于中断发送缓冲区里的索引
unsigned char Index_Receive_2 = 0; //全局变量,用于中断接收缓冲区里的索引
unsigned char Best_Num_2; //全局变量,最大数,也就是发送字节的数量
bit Check_Busy_2 = 0; //发送的标志位,很重要
/*===============================================================================
//函数:Uart_Send_String
//描述:用于向串口发送字符串,原理是通过中断发送
//参数:*Data,用“ ”存放字符串。Best,字符串总数
//返回:无
//版本:2025.7 徐靖昀
=================================*/
void Uart_Send_String_2(const unsigned char *Data,unsigned char Best)
{
unsigned char i;
if(Check_Busy_2) //检测到忙就退出
{
return;
}
for(i = 0; i < Best ;i++)
{
Uart_Send_2 = Data; //Data赋值给缓冲区数组
}
Best_Num_2 = Best; //把字符长度传递到全局变量
Index_Send_2 = 0; //索引清零
S2BUF = Uart_Send_2[0]; //把Data赋值给缓冲区数组的第一个赋给对应串口的数据寄存器
Check_Busy_2 = 1; //置忙位
}
/*===============================
//函数:Uart2_Isr
//描述:中断函数,当软件给S2BUF赋值一次后便会进入中断
//参数:无
//返回:无
//版本:2025.7 徐靖昀
=================================*/
void Uart2_Isr(void) interrupt 8
{
if (S2CON & 0x02) //检测串口2发送中断
{
S2CON &= ~0x02; //清除串口2发送中断请求位
if(Check_Busy_2)
{
Index_Send_2++;
if(Index_Send_2 < Best_Num_2)
{
S2BUF = Uart_Send_2[Index_Send_2];
}
else
{
Check_Busy_2 = 0;
}
}
}
if (S2CON & 0x01) //检测串口2接收中断
{
S2CON &= ~0x01; //清除串口2接收中断请求位
Uart_Receive_2[Index_Receive_2++] = S2BUF;
}
}
/*===============================
//函数:Uart2_Init
//描述:串口通信2初始化,40MHZ,9600波特率
//参数:无
//返回:无
//版本:2025.7 徐靖昀
=================================*/
void Uart2_Init(void) //9600bps@40.000MHz
{
P_SW2 |= 0x01; //UART2/USART2: RxD2(P4.2), TxD2(P4.3)
S2CON = 0x50; //8位数据,可变波特率
AUXR |= 0x04; //定时器时钟1T模式
T2L = 0xEE; //设置定时初始值
T2H = 0xFB; //设置定时初始值
AUXR |= 0x10; //定时器2开始计时
IE2 |= 0x01; //使能串口2中断
Index_Receive_2 = 0;
}
unsigned char String[10]; //存放long类型转换为字符串的数据
unsigned char Hex_To_DecString_Flag = 0; //位数标志位
/*===============================
//函数:Hex_To_DecString
//描述:用于把long长整型变量转换成十进制字符串
//参数:Data,要转换的变量
//返回:全局变量String[]数组,存储十进制字符串;全局变量Hex_To_DecString_Flag存储位数,代表字符串长度
//版本:2025.7 徐靖昀
=================================*/
void Hex_To_DecString(unsigned long Data)
{
unsigned long Change = Data; //Change算位数,Data转换成数组
unsigned char Count = 0; //Count存储位数
if (Change == 0)
{
String[0] = '0'; // 处理数值为0的特殊情况
Hex_To_DecString_Flag = 1;
return;
}
while(Change > 0)
{
Change /= 10;
Count++;
}
Hex_To_DecString_Flag = Count;
while(Data>0)
{
String[--Count] = (Data%10)+'0';
Data /= 10;
}
}
/*===============================
//函数:Num_All
//描述:用于发送自定义数组,为字符串1,字符串1长度,变量1,字符串2,字符串2长度,变量2,字符串3,字符串3长度
//参数:*Data_1,*Data_2,*Data_3,Num_1,Num_2,Num_3,NUM,DEC
//返回:全局变量数组All_Num[],存储整合后的数组;Send_Math,整个字符串的长度
//版本:2025.7 徐靖昀
=================================*/
unsigned char All_Num[30];
unsigned char Send_Math = 0;
void Num_All(unsigned char *Data_1 ,unsigned char Num_1 ,unsigned long NUM ,unsigned char *Data_2 ,unsigned char Num_2 ,unsigned long DEC ,unsigned char *Last,unsigned char Num_3)
{
unsigned char i_1;
unsigned char j_5;
unsigned char B_2;
unsigned char Z_4;
unsigned char X_3;
unsigned char NUM_Long;
unsigned char DEC_Long;
for(i_1 = 0;i_1 < Num_1;i_1++) //第一个文本
{
All_Num[i_1] = Data_1[i_1];
}
Hex_To_DecString(NUM);
NUM_Long = Hex_To_DecString_Flag;
for(B_2 = 0;B_2 < NUM_Long;B_2++) //第一个变量
{
All_Num[Num_1+B_2] = String[B_2];
}
for(X_3 = 0;X_3 < Num_2;X_3++) //第二个文本
{
All_Num[Num_1+NUM_Long+X_3] = Data_2[X_3];
}
Hex_To_DecString(DEC);
DEC_Long = Hex_To_DecString_Flag;
for(Z_4 = 0;Z_4 < DEC_Long;Z_4++) //第二个变量
{
All_Num[Num_1+Num_2+NUM_Long+Z_4] = String[Z_4];
}
for(j_5 = 0;j_5 < Num_3;j_5++) //第三个文本
{
All_Num[(Num_1+Num_2+DEC_Long+NUM_Long+j_5)] = Last[j_5];
}
Send_Math = Num_1 + Num_2 + Num_3 + NUM_Long + DEC_Long; //总的变量的长度
}
/*===============================
//函数:String_All
//描述:用于发送自定义的字符串.格式为:字符串1,字符串1长度,变量1,字符串2,字符串2长度,字符串3,字符串3长度,字符串4,字符串4长度
//参数:*Data_1,Num_1,NUM,*Data_2,Num_2,*Data_3,Num_3,*Data_4,Num_4
//返回:全局变量数组Show_String_ALL[]用于存储整个数组;变量String_Math,为整个数组的长度
//版本:2025.7 徐靖昀
=================================*/
unsigned char Show_String_ALL[30];
unsigned char String_Math = 0;
void String_All(unsigned char *Data_1 ,unsigned char Num_1 ,unsigned long NUM ,unsigned char *Data_2 ,unsigned char Num_2 ,unsigned char *Data_3,unsigned char Num_3,unsigned char *Last,unsigned char Num_4)
{
unsigned char O;
unsigned char T;
unsigned char T_2;
unsigned char F;
unsigned char F_2;
unsigned char NUM_Long;
for(O = 0;O < Num_1;O++) //第一个文本
{
Show_String_ALL[O] = Data_1[O];
}
Hex_To_DecString(NUM);
NUM_Long = Hex_To_DecString_Flag;
for(T = 0;T < NUM_Long;T++) //第一个变量
{
Show_String_ALL[Num_1+T] = String[T];
}
for(T_2 = 0;T_2 < Num_2;T_2++) //第二个文本
{
Show_String_ALL[Num_1+NUM_Long+T_2] = Data_2[T_2];
}
for(F = 0;F < Num_3;F++) //第二个文本
{
Show_String_ALL[Num_1+Num_2+NUM_Long+F] = Data_3[F];
}
for(F_2 = 0;F_2 < Num_4;F_2++) //第三个文本
{
Show_String_ALL[(Num_1+Num_2+Num_3+NUM_Long+F_2)] = Last[F_2];
}
String_Math = Num_1 + Num_2 + Num_3 + NUM_Long + Num_4; //总的变量的长度
}
/*===============================
//函数:LCD_Send_Number
//描述:向串口屏发送数字变量
//参数:Digit:序号选择,Change数字
//返回:无
//版本:2025.7 徐靖昀
=================================*/
void LCD_Send_Number(unsigned char Digit,unsigned long Change)
{
Num_All("n",1,Digit,".val=",5,Change,"\xff\xff\xff",3);
Uart_Send_String_2(All_Num,Send_Math);
}
/*===============================
//函数:LCD_Send_String
//描述:向串口屏发送文本
//参数:Digit:序号;*Change:要发送的文本;L_ong:文本长度
//注意:中文字符串长度为文字数量的二倍!!!如LCD_Send_String(0,“单片机”,6)
//返回:无
//版本:2025.7 徐靖昀
=================================*/
void LCD_Send_String(unsigned char Digit,unsigned char *Change,unsigned char L_ong)
{
String_All("t",1,Digit,".txt=\"",6,Change,L_ong,"\"\xff\xff\xff",4);
Uart_Send_String_2(Show_String_ALL,String_Math);
}
/*===============================
//函数:LCD_Send_Float
//描述:向串口屏发送数字变量
//参数:Digit:序号选择,Change数字
//返回:无
//版本:2025.7 徐靖昀
=================================*/
void LCD_Send_Float(unsigned char Digit,unsigned long Change)
{
Num_All("x",1,Digit,".val=",5,Change,"\xff\xff\xff",3);
Uart_Send_String_2(All_Num,Send_Math);
}
/*===============================
//函数:LCD_Send_Colour
//描述:向串口屏发送数字变量
//参数:Digit:序号选择,Change数字
//返回:无
//版本:2025.7 徐靖昀
=================================*/
void LCD_Send_Clolur(unsigned char Digit,unsigned long Change)
{
// Num_All("r",1,Digit,".bco=",5,Change,"\xff\xff\xff",3);
// Uart_Send_String_2(All_Num,Send_Math);
Num_All("r",1,Digit,".pco=",5,Change,"\xff\xff\xff",3);
Uart_Send_String_2(All_Num,Send_Math);
}
//绿色为2032
//红色为63488
/*===============================================================================
//函数:UartTask_2
//描述:设置接收数值时单片机对应的操作
//参数:无
//返回:无
//版本:2025.7 徐靖昀
=================================*/
void UartTask_2(void) //接收串口要执行的任务
{
if( Index_Receive_2 >= 2 ) //判断最少N个字节
{
if((Uart_Receive_2[Index_Receive_2-1] == 'N')) //末尾判断
{
if((Uart_Receive_2[Index_Receive_2-1] == 'N') )
{
P0 = 0x00;
Uart_Send_String_2 ("n0.val=15\xFF\xFF\xFF",12);
Index_Receive_2 = 0;
}
}
else if((Uart_Receive_2[Index_Receive_2-1] == '\n') && (Uart_Receive_2[Index_Receive_2-2] == '\r')&&(Uart_Receive_2[Index_Receive_2-3] == 'x') && (Uart_Receive_2[Index_Receive_2-4] == 'j') && (Uart_Receive_2[Index_Receive_2-5] == 'y'))
{
P0 = 0xFF;
Uart_Send_String_2("Yes\r\n",5);
Index_Receive_2 = 0;
}
}
} |
|