STC双串口使用

我们在使用485下发数据的时候需要使用两个串口。一个为PC接收,一个为芯片加密发送,当然我们可以使用IO模拟串口通信从而发送数据,为了简单点,现在用代码举例!

//串口1接收PC机下发数据 并处理 处理后由串口2驱动RS485下发给从机,当然这里没有加485,也没有加数据包处理,因为太简单,自行处理!
#include "STC15.h"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int

#define S2RI 0x01    //串口2接收中断请求标志位
#define S2TI 0x02    //串口2发送中断请求标志位

uchar indata[16];
uchar outdata[23];
uchar inCNT,flag;
uchar dataON[]={0xA6,0x01,0x01,0x01,0x11};
uchar dataOFF[]={0xA6,0x01,0x01,0x01,0x22};


uchar indata_a[16];
uchar outdata_a[23];
uchar inCNT_a,flag_a;

void Uart1_Init(void) //4800bps@11.0592MHz
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
AUXR &= 0xBF; //定时器1时钟为Fosc/12,即12T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xFA; //设定定时初值
TH1 = 0xFA; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
REN=1;//允许接收
    ES = 1;                 //Enable UART interrupt
    //EA = 1;                 //Open master interrupt switch
}


void Uart2_Init(void) //4800bps@11.0592MHz
{
S2CON = 0x50; //8位数据,可变波特率
AUXR &= 0xFB; //定时器2时钟为Fosc/12,即12T
T2L = 0xD0; //设定定时初值
T2H = 0xFF; //设定定时初值
AUXR |= 0x10; //启动定时器2
//IE2 =0x01; //开串口2中断  ES2=1
IE2|=0x01; //IE2&=0xFE;
EA = 1;
}


static  void uDelay(uchar j)
{
    uchar i;
    for(; j>0; j--)
    {
        for(i=0; i<255; i--)
        {
            ;
        }
    }
}
void SendData(){
outdata[0]=0xA0;
SBUF=outdata[0];
while(!TI){;}
TI=0;
uDelay(50);
}
void SendData_dataON(){
uchar i;
for(i=0;i<5;i++){
SBUF=dataON[i];
while(!TI);
TI=0;
}
}
void SendData_dataOFF(){
uchar i;
for(i=0;i<5;i++){
SBUF=dataOFF[i];
while(!TI);
TI=0;
}
}
void SendData_dataON_a(){
uchar ii;
for(ii=0;ii<5;ii++){
S2BUF=dataON[ii];
while(!(S2CON&S2TI));
S2CON&=~S2TI;
}
}
void main(void){
Uart1_Init();
Uart2_Init();
uDelay(200);
while(1){
// if(flag==0xA0){
// ES=0;flag=0;SendData();ES=1;
// }
// if(flag==1){
// ES=0;flag=0;SendData();ES=1;
// }
if(flag==11){
ES=0;IE2&=0xFE;flag=0;SendData_dataON_a();ES=1;IE2|=0x01;

//在这里解释一下,这段代码就是芯片接收正确数据就由串口2发送出去

}
if(flag_a==0xA0){
ES=0;IE2&=0xFE;flag_a=0;SendData();ES=1;IE2|=0x01;

//这里是如果下位机接收到数据,并返回一个指令A0,那么这个指令就传到上位机,这样我们就能知道发送成功与否,这就是应答。
}
// if(flag==22){
// ES=0;flag=0;SendData_dataOFF();ES=1;
// }
//SendData_dataON_a();


}
}


void uart1() interrupt 4{
if(RI){
RI=0;
indata[inCNT]=SBUF;
inCNT++;


if(inCNT>0){
if(indata[0]==0xA0){
flag=0xA0;inCNT=0;
}
}
if(inCNT>=5){
if((indata[0]==0x66)&&(indata[1]==0x66)){
flag=1;
inCNT=0;
}
}
if(inCNT>=7){
if((indata[0]==0x50)&&(indata[1]==0x05)){
if((indata[5]==0x11)&&(indata[6]==0x11)){
flag=11;inCNT=0;
}else if((indata[5]==0x22)&&(indata[6]==0x22)){
flag=22;inCNT=0;
}else{
inCNT=0;
}

}else{
inCNT=0;
}
}

}
}
void uart2() interrupt 8{
//接收
if(S2CON&S2RI){
S2CON&=~S2RI;
indata_a[inCNT_a]=S2BUF;
inCNT_a++;


if(inCNT_a>0){
if(indata_a[0]==0xA0){
flag_a=0xA0;inCNT_a=0;
}else{
inCNT_a=0;
}
}else{
inCNT_a=0;
}


}


}

  • 4
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STC15 单片机串口通信可以分为两种方式:硬件串口和软件模拟串口。 硬件串口通信需要使用单片机内置的 UART 模块,可以直接使用串口发送和接收数据。在 STC15 单片机中,UART 模块的引脚为 P3.0 (RXD) 和 P3.1 (TXD)。使用串口通信需要对 UART 模块进行初始化,设置波特率、数据位、停止位等参数,然后使用相关函数进行发送和接收数据。示例代码如下: ```c #include <STC15F2K60S2.H> void UART_Init() { TMOD &= 0x0F; // 设置定时器1为模式0 TMOD |= 0x20; TH1 = 0xFD; // 波特率为9600 TL1 = TH1; PCON |= 0x80; // SMOD = 1 TR1 = 1; // 启动定时器1 SCON = 0x50; // 8位数据位,无校验,1位停止位,允许接收 } void UART_SendByte(unsigned char dat) { SBUF = dat; while (!TI); // 等待发送完成 TI = 0; // 清除发送完成标志 } unsigned char UART_ReceiveByte() { while (!RI); // 等待接收完成 RI = 0; // 清除接收完成标志 return SBUF; } ``` 使用上述代码可以实现 STC15 单片机串口通信功能。发送数据可以使用 `UART_SendByte` 函数,接收数据可以使用 `UART_ReceiveByte` 函数。 另外一种方式是软件模拟串口通信,即使用 GPIO 口模拟串口通信。这种方式需要在程序中自行实现串口通信的数据帧格式和通信协议。示例代码如下: ```c #include <STC15F2K60S2.H> #define TX P3_3 // 发送引脚 #define RX P3_2 // 接收引脚 void UART_Init() { TX = 1; // 初始化发送引脚为高电平 RX = 1; // 初始化接收引脚为高电平 } void UART_SendByte(unsigned char dat) { unsigned char i; TX = 0; // 启动发送,将发送引脚设置为低电平 for (i = 0; i < 8; i++) { if (dat & 0x01) { TX = 1; // 发送数据位 } else { TX = 0; } dat >>= 1; } TX = 1; // 停止发送,将发送引脚设置为高电平 } unsigned char UART_ReceiveByte() { unsigned char i, dat = 0; while (RX); // 等待接收引脚为高电平 for (i = 0; i < 8; i++) { dat >>= 1; if (RX) { dat |= 0x80; // 接收数据位 } while (RX); // 等待接收引脚为低电平 } return dat; } ``` 使用上述代码可以实现 STC15 单片机的软件模拟串口通信功能。发送数据可以使用 `UART_SendByte` 函数,接收数据可以使用 `UART_ReceiveByte` 函数。需要注意的是,在使用软件模拟串口通信时,需要将发送和接收引脚的电平转换时间考虑在内,以避免数据传输错误。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值