/*******************************************************************************
*  标题:                  RS485串口通信试验(接受与发送)                        *
*                                                                                *
*  1.通过本例程了解串口的基本原理及使用 ,理解并掌握对串口进行初始化                *
*                                                                                *
*  2.请使用串口调试助手(Baud 4800、数据位8、停止位1、效验位无)做为上位机(发送)数据和(接受)数据,
*    请在字符串输入框中输入字符和数字(HEX),按发送按钮。观看接受窗显示情况.也可以用自动循环发送。
*
*  3.试验RS485需要用RS232转485的转换头。RS485的A对应串口头的9针  B对应4针.接法大家可以参考原理图。
*                                                                                  *
* 请学员认真消化本例程,学会用C语言操作串口和485的实现                          *
********************************************************************************/
#include <REG52.H>
#include <stdio.h>
sbit RS485E=P3^7;  //定义485的使能脚
bit SendFlag;
unsigned int ReData,SenData;
/**************************************
        延时程序
**************************************/
void delay(unsigned char i)
{
    unsigned char j;
    for(i; i > 0; i--)
        for(j = 200; j > 0; j--);
}
void main (void) {
        SCON = 0x50;      //REN=1允许串行接受状态,串口工作模式1                     
        TMOD|= 0x20;      //定时器工作方式2                   
        PCON|= 0x80;                                                         
        //TH1  = 0xFD;    //baud*2  /* reload value 19200、数据位8、停止位1。效验位无 (11.0592) 
        TH1 = 0xF3;                    // //baud*2  /*  波特率4800、数据位8、停止位1。效验位无 (12M)
        TL1 = 0xF3;     
        TR1  = 1;                                                           
        ES  = 1;        //开串口中断                 
        EA  = 1;        // 开总中断
   
      // IE = 0x0;
 
    while(1)
    {
   
      if (SendFlag==1)    // max485(半双工通信) RE/DE定义 RE=0为接受状态  DE=1为发送状态(参考MAX485芯片管脚)
        {  RS485E=1;      //                              RS5485E=0为接收状态  RS5485E=1为发送状态
          SBUF=SenData;      //发送数据
          delay(50);
      }
    else
      {
          RS485E=0;          //接收状态
      }
}
}
/****************************************************
              串口中断程序
******************************************************/
void ser_int (void) interrupt 4 using 1
{
if(TI == 1)
{
    TI = 0;
    SendFlag = 0;
}
if(RI == 1)        //RI接受中断标志
c51中字符串函数 {
    RI = 0;            //清除RI接受中断标志
    ReData = SBUF;  //SUBF接受/发送缓冲器
    SenData=ReData;
    SendFlag = 1;
   
}
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。