找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2859|回复: 2
收起左侧

STC8A8K单片机串口使用冲突

[复制链接]
ID:942805 发表于 2022-4-15 21:19 | 显示全部楼层 |阅读模式
/*
串口2通讯实验
程序目前功能:  发送任意数据 LED都会变化  同时串口2在往主机发送0x0a
MUC主频为11.0592
波特率为9600
*/




#include "stc8.h"


sbit led=P5^5;
#define FOSC 11059200L                          //MUC主频为11.0592下
#define BAUD 9600                                  //串口2产生的波特率为9600
#define TM  (65536-(11059200L/4/9600)) //计算初值

#define FOSC 11059200L                          //MUC主频为11.0592下
#define BAUD1 4800                                  //串口2产生的波特率为9600
#define TM1  (65536-(FOSC/4/BAUD1)) //计算初值
unsigned char a;
        
void delay(unsigned int m)                  //延时函数
    {
          int  a=0,b=0;
          for(a=0;a<500;a++)
          for(b=0;b<m;b++);
        
        }

void ISP_Check1(unsigned char i)                                        //串口2发送数据调用函数
{

        
                S2BUF=i;
           while(S2CON&S2TI==0);                                // 等特数据传送        (S2TI发送中断标志)
  S2CON&=~S2TI;                                                //清标志位  


}
        
        
void ISP_Check(unsigned char i)                                        //串口2发送数据调用函数
{

        
                S3BUF=i;
           while(S3CON&S3TI==0);                                // 等特数据传送        (S2TI发送中断标志)
  S3CON&=~S3TI;                                                //清标志位  


}




void main()
{
  S3CON = 0x50;       //REN=1允许串行接受状态,串口工作模式2               

  T3L=(65536-(11059200L/4/9600));                          //配置串口2波特率         初始值
  T3H=(65536-(11059200L/4/9600))>>8;                    

  T4T3M |= 0x02;              //定时器3为1T模式
    T4T3M |= 0x08;              //定时器3开始计时
  IE2 = 0x08;            //串口2中断使能                                                           
  EA   = 1;           // 开总中断

          S2CON = 0x50;       //REN=1允许串行接受状态,串口工作模式2               

  T2L=TM1;                          //配置串口2波特率         初始值
  T2H=TM1>>8;                    

  AUXR=0X54;                  //开启定时器T2  并且开启1T模式
  IE2|=0X01;           //串口2中断使能                                                           
  EA   = 1;           // 开总中断
        
        
  while(1)
        {
                P55 = 1;
                delay(100);
        }


}

void Uart3() interrupt 17 using 1  //串口3中断
{
  if(S3CON&S3RI)                                                //如果收到数据 S2RI置位
  {
                P55 = 0;
   a = S3BUF;
                ISP_Check(a);
   S3CON&=~S3RI;                                                //清标志位  
  }
}




void Uart2()  interrupt 8 using 1                //串口2中断
{
  if(S2CON&S2RI)                                                //如果收到数据 S2RI置位
  {
                a = S2BUF;
   ISP_Check1(a);                                                        //翻转LED效果
   S2CON&=~S2RI;                                                //清标志位  
  }
}


串口2发送数据以后 串口3就接收不到数据了

回复

使用道具 举报

ID:624769 发表于 2022-4-16 00:04 | 显示全部楼层

以串口2为例, 如下修改,  串口3同理修改.  (当然, 建议是置标志位, 主程序中发送, 而不要在中断中发送,你非要中断中发送,就做如下修改)

//void ISP_Check1(unsigned char i)                                        //串口2发送数据调用函数
//{
//                 S2BUF=i;
//           while(S2CON&S2TI==0);                                // 等特数据传送        (S2TI发送中断标志)
//  S2CON&=~S2TI;                                                //清标志位  
//}

void Uart2()  interrupt 8 using 1                //串口2中断
{

  if(S2CON&S2TI)   S2CON&=~S2TI;
  if(S2CON&S2RI)                                                //如果收到数据 S2RI置位
  {
                 a = S2BUF;
               S2CON&=~S2RI;                                                //清标志位  
                S2BUF  = a;
//   ISP_Check1(a);                                                        //翻转LED效果
  }
}
回复

使用道具 举报

ID:47286 发表于 2022-4-16 00:30 | 显示全部楼层
帮顶

别人的程序基本不看 主要是水平有限 读半天都不一定能明白 但我用4个串口都开 互相不干扰 证明是完全可行的 请楼主参考其它大侠的回复再修改程序 祝你成功
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表