单片机论坛

 找回密码
 立即注册
QQ登录 只需一步,快速开始
搜索
查看: 73|回复: 0
收起左侧

STC15F2K60S2单片机双串口(中继)实验源码-我的处女贴

[复制链接]
伈伈向荣 发表于 2018-2-8 22:34 | 显示全部楼层 |阅读模式
用编程器代替串口用 用编程器代替串口用 用两个stc-isp分别监控串口 用两个stc-isp分别监控串口
51单片机源程序:

  • /*******************************************************************************************
  • * 双串口试验(中继) *
  • * CPU:STC15F2K60S2 115200,N,8,1 @11.0592M *
  • * *
  • *********************************************************************************************/
  • #include <REG52.H>
  • #include <STDIO.H>
  • #include <INTRINS.H>


  • #define U8 unsigned char
  • #define U16 unsigned int
  • #define U32 unsigned long


  • sfr AUXR = 0x8e; //辅助寄存器
  • sfr T2H = 0xd6; //定时器2高8位
  • sfr T2L = 0xd7; //定时器2低8位
  • sfr P5 = 0xC8;
  • sfr S2BUF = 0x9B;
  • sfr IE2 = 0xaf;
  • sfr S2CON = 0x9a;
  • sbit DIR = P3^2; //定义485使能引脚
  • sbit DIR2 = P3^3;


  • #define S2RI 0x01 //S2CON.0
  • #define S2TI 0x02 //S2CON.1


  • bit flagTxd = 0; //发送完标志
  • bit flagTxd2 = 0;
  • U8 cntRxd = 0; //接收计数器
  • U8 cntRxd2 = 0;
  • U8 flagRxd = 0;//收到数据标志
  • U8 flagRxd2 = 0;
  • U8 pdata bufRxd[64]; //接收缓冲区
  • U8 pdata bufRxd2[64];


  • /**************************************
  • 延时程序
  • **************************************/
  • void Delay1ms()//@11.0592MHz
  • {
  • unsigned char i, j;
  • _nop_();
  • _nop_();
  • _nop_();
  • i = 11;
  • j = 190;
  • do
  • {
  • while (--j);
  • } while (--i);
  • }


  • void Delay(unsigned int i)
  • {
  • do
  • {
  • Delay1ms();
  • } while (--i);
  • }


  • /**************************************
  • 串口初始化
  • **************************************/
  • void UartInit(void)//115200bps @11.0592MHz
  • {
  • SCON = 0x50;//COM1 8为数据可变波特率
  • S2CON =0X50;//COM2 8为数据可变波特率
  • AUXR |= 0x01;//选择定时器2位波特率发生器
  • AUXR |= 0x04;//定时器2时钟为Fosc,即1T
  • T2L = 0xE8;//设定定时初始值低位
  • T2H = 0xFF;//设定定时初始值高位
  • AUXR |= 0x10;//启动定时器2
  • ES = 1; //使能串口1中断
  • IE2 = 0x01; //使能串口2中断
  • EA = 1;
  • }




  • /* 串口数据写入,即串口发送函数,buf为数据指针,len为数据长度*/
  • void UartWrite(U8 *buf, U8 len)
  • {
  • DIR = 1; //RS485设置为发送
  • while (len--) //循环发送所有字节
  • {
  • flagTxd = 0; //清发送标志
  • SBUF = *buf++; //发送一个字节
  • while (!flagTxd); //等待字节发送完成
  • }
  • Delay(1); //等待最后的停止位完成
  • DIR = 0; //RS485设置为接收
  • }




  • void UartWrite2(U8 *buf, U8 len)
  • {
  • DIR2 = 1; //RS485设置为发送
  • while (len--) //循环发送所有字节
  • {
  • flagTxd2 = 0; //清发送标志
  • S2BUF = *buf++; //发送一个字节
  • while (!flagTxd2); //等待字节发送完成
  • }
  • Delay(1); //等待最后的停止位完成
  • DIR2 = 0; //RS485设置为接收

  • }
  • void main (void)
  • {
  • U8 pdata Data[64]; //接收字节缓冲区
  • U8 pdata Data2[64];
  • U8 i;

  • UartInit();//串口初始化
  • while(1)
  • {
  • DIR = 0;//设置串口1为接收状态
  • if (flagRxd==1)//如果有数据
  • {
  • Delay(5);//等待接收
  • for (i=0;i<cntRxd;i++)
  • {
  • Data[ i]=bufRxd[ i];//读取缓冲区
  • }
  • UartWrite2(Data,cntRxd);//从COM2发送出去
  • cntRxd=0;//清空计数器及接收标志
  • flagRxd=0;
  • }
  • DIR2 = 0;//设置串口2为接收状态
  • if (flagRxd2==1)//如果有数据
  • {
  • Delay(5);//等待接收
  • for (i=0;i<cntRxd2;i++)
  • {
  • Data2[ i]=bufRxd2[ i];//读取缓冲区
  • }
  • UartWrite(Data2,cntRxd2);//从COM2发送出去
  • cntRxd2=0;//清空计数器及接收标志
  • flagRxd2=0;
  • }



  • }
  • }


  • /* 串口中断服务 */
  • void InterruptUART() interrupt 4
  • {
  • if (RI) //接收到新字符
  • {
  • RI = 0; //清零接收中断标志
  • flagRxd=1;
  • if (cntRxd < sizeof(bufRxd)) //接收缓冲区未用完时
  • { //保存接收字节,并自加计数器
  • bufRxd[cntRxd++] = SBUF;
  • }
  • }
  • if (TI) //字节发送完毕
  • {
  • TI = 0; //清零发送中断标志
  • flagTxd = 1; //设置字节发送完成标志
  • }
  • }


  • /* 串口中断服务 */
  • void InterruptUART2() interrupt 8
  • {
  • if (S2CON & S2RI) //接收到新字符
  • {
  • S2CON &= ~S2RI; //清零接收中断标志
  • flagRxd2=1;
  • if (cntRxd2 < sizeof(bufRxd2)) //接收缓冲区未用完时
  • { //保存接收字节,并自加计数器
  • bufRxd2[cntRxd2++] = S2BUF;
  • }
  • }
  • if (S2CON & S2TI) //字节发送完毕
  • {
  • S2CON &= ~S2TI; //清零发送中断标志
  • flagTxd2 = 1; //设置字节发送完成标志
  • }
  • }

  • 复制代码


    评分

    参与人数 1黑币 +50 收起 理由
    admin + 50 共享资料的黑币奖励!
    查看全部评分
    回复 使用道具 举报
    您需要登录后才可以回帖 登录 | 立即注册
    本版积分规则
    QQ|手机版|小黑屋|单片机论坛
    Powered by 单片机教程网
    快速回复 返回顶部 返回列表