⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rs485_com.c

📁 主要是can工业总线方面的应用程序
💻 C
字号:

//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//描述:
//      该程序INT0按键程序+显示程序+RS485通讯                                  &
//      每按一次,数码管1-2(自右向左)显示加1,并且发送数据到485节点2;       &
//      接收到485节点2的数据在数码管3-4(自右向左)                            &
//      485总线是半双工的                                                      &
//      通讯波特率:19200                                                       &
//      每次收发一个字节                                                       &

//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//【声明】 此程序仅用于学习与参考,引用请注明版权和作者信息!                   &
//【声明】 作者: PIAE小组                                                      &

#include <reg52.h>
#include <intrins.h>
#include <RS485_def.h>

void INT0_Counter( void ) interrupt 0 using 1
{//INT0按键为计数按键
    EA = 0;
    TX_data++; //按键计数单元加1,将给数据发送
    TXD_flag = 1;
    EA = 1;
}


void RS485_RXD( void ) interrupt 4   using 1
{//接收数据函数,在中断服务程序中调用
    uchar temp;
    EA = 0;//关闭所有中断
    ES = 0;//关闭串口
    if(RI==1)
    {//在调试中发送,会收到一个多于的数据0,这可能是MAX483的性能决定的,
    //所以采取了滤波的方法
        RI = 0;
        temp = SBUF;
        if( temp == 0)
        {
            if(RX_data == 0)
            {
                RX_data = 0;
            }
        }
        else
        {
            RX_data = temp;
        }

        RXD_flag = 1;//置接收到数据标志
    }
    _nop_();
    ES = 1;//打开串口
    EA = 1;//打开中断
}

void main(void)
{
    CPU_init();
    _nop_();
    while(1)
    {
        NOPS;
  /////////////////////// 接收处理程序/////////////////////////////////
        if( RXD_flag )
        {
            EA = 0;//关闭CPU中断
            LED_RED = !LED_RED;//指示灯状态变化
            RXD_flag = 0;//清楚标志
            RX_data = RX_data;//接收对方发送的数据
            if(RX_data>99)
            {
                RX_data = 0;
            }
            EA = 1;
        }
///////////////////////发送处理程序/////////////////////////////////
        if( TXD_flag )
        {
            EA = 0;
            LED_GRE = !LED_GRE;//指示灯状态变化
            TXD_flag = 0;
            TX_data  = TX_data;//
            if(TX_data>99)
            {
                TX_data = 0;
            }
            RS485_wren = 1;//变为发送状态
            RS485_TXD();
            _nop_();
            RS485_wren = 0;//返回到接收状态
            _nop_();
            _nop_();
            EA = 1;
        }
///////////////////////数码管显示程序/////////////////////////////////
        led_seg7(1,TX_data);
        led_seg7(3,RX_data);

///////////////////////数码管显示程序/////////////////////////////////
    }//while 结束
}//main结束


void Delay(uchar delay_time)
{//延时程序
    while(delay_time--)
    {}
}


void CPU_init(void)
{//初始化CPU
    RS485_wren = 0;//RS485初始化为接收模式
    SCON = 0x50; //串口方式1
    PCON = 0x80; //串口波特率加速
    TMOD = 0x21;
    TH1=0xFD; //19200bps
    TL1=0xFD;
    TR1 = 1;
    TI = 0;
    RI = 0;
    PS = 1;      //串口中断的优先级设为最高

    IT0 = 1;//外部中断0负边沿触发
    EX0 = 1;//打开外部中断0
    ES  = 1;//打开串口中断
    EA = 1; //打开总中断
    SJA1000_CS = 1;//片选无效
}

void RS485_TXD( void )
{
    uchar k = 200;
    TI = 1;
    while(TI)
    {
        RS485_wren = 1;//RS485处于发送状态
        TI = 0;//一字节发送完后清除标志位
        SBUF = TX_data;
        while(!TI)
        {}//等待发送
        TI = 0;
    }
    _nop_();

    while( k-- )
    {//这段代码时候了延时,确保485线上数据发送完毕
        led_seg7(1,TX_data);
        led_seg7(3,RX_data);
    }
}

void led_seg7(uchar from,uchar number)
{//from(1_4):数码管显示起始位置(从右到左),number:显示的数
    uchar digit,temp_l;
    uchar temp_h=0x7f;
    temp_h = _cror_(temp_h,from-1);   //确定从哪一位开始显示,即确定高四位
    temp_h = temp_h & 0xf0;           //取高四位
    temp_l = P2 & 0x0f;               //取P2的低四位
    P2 = temp_h | temp_l;             //设定P2口

    if(number==0)
    {
        P0 = led[0];
        Delay(5);
        P0 = 0xff;
    }
    else
    {
        while(number)
	{
            digit = number%10 ;
	    number /= 10;
            P0 = led[digit] ;
	    Delay(5);
            temp_h = P2 & 0xf0;               //取P2的高四位
            temp_h = temp_h | 0x0f;           //拼装 temp_h,进行位选
	    temp_h = _cror_(temp_h,1);
	    temp_h = temp_h & 0xf0;           //取高四位
            temp_l = P2 & 0x0f;               //取P2的低四位
            P0 = 0xff;
            P2 = temp_h | temp_l;             //设定P2口
        }//while结束
    }//else结束

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -