找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2377|回复: 1
打印 上一主题 下一主题
收起左侧

STC12C5A60S2单片机开发板之双485通信测试

[复制链接]
跳转到指定楼层
楼主
ID:324810 发表于 2018-5-8 10:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/********************************************************************
PC机与控制板采用485-1或者485-2连接都可以进行测试

单片机接收PC机发送的十六进制码表如下:

01、全开:PC发送FF FF*********返回:FF AA;           
02、全关:PC发送FF 00*********返回:FF BB;
************************************************************
03、第1路开:PC发送FF 01*********返回:FF A1;
04、第2路开:PC发送FF 02*********返回:FF A2;
05、第3路开:PC发送FF 03*********返回:FF A3;
06、第4路开:PC发送FF 04*********返回:FF A4;
07、第5路开:PC发送FF 05*********返回:FF A5;
08、第6路开:PC发送FF 06*********返回:FF A6;
09、第7路开:PC发送FF 07*********返回:FF A7;
10、第8路开:PC发送FF 08*********返回:FF A8;
11、第1路关:PC发送FF F1*********返回:FF B1;
12、第2路关:PC发送FF F2*********返回:FF B2;
13、第3路关:PC发送FF F3*********返回:FF B3;
14、第4路关:PC发送FF F4*********返回:FF B4;
15、第5路关:PC发送FF F5*********返回:FF B5;
16、第6路关:PC发送FF F6*********返回:FF B6;
17、第7路关:PC发送FF F7*********返回:FF B7;
18、第8路关:PC发送FF F8*********返回:FF B8;
************************************************************

*********************************************************************/
#include<STC12C5A60S2.H>                 //库文件
#include <intrins.h>
#define uchar unsigned char//宏定义无符号字符型
#define uint unsigned int  //宏定义无符号整型
/********************************************************************
                            初始定义
*********************************************************************/


uchar receBuf[2]={0xee,0xee};
uchar P2dat=0xee;
void B485_send1(uchar c);
void B485_send2(uchar c);
void B485_CLR1();
void B485_CLR1();
/*定义八位数字量输出IO口*/
sbit Y01=P0^0;  
sbit Y02=P0^1;
sbit Y03=P0^2;
sbit Y04=P0^3;
sbit Y05=P0^4;
sbit Y06=P0^5;
sbit Y07=P0^6;
sbit Y08=P0^7;
/*定义双485方向控制位*/
sbit RS485_DIR1=P3^2;
sbit RS485_DIR2=P1^1;
/********************************************************************
                            延时函数
*********************************************************************/

void Delay2ms()                //@11.0592MHz
{
        unsigned char i, j;

        i = 22;
        j = 128;
        do
        {
                while (--j);
        } while (--i);
}


/********************************************************************
              功能:串口初始化,波特率9600,方式1
*********************************************************************/
void Init_Com(void)
{
    //串口1初始化
    RS485_DIR1=0;//RS485_1设置为接收
        SCON = 0x50;                //8位数据,可变波特率
        AUXR &= 0xBF;                //定时器1时钟为Fosc/12,即12T
        AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
        TMOD &= 0x0F;                //清除定时器1模式位
        TMOD |= 0x20;                //设定定时器1为8位自动重装方式
        TL1 = 0xFD;                //设定定时初值
        TH1 = 0xFD;                //设定定时器重装值
        ET1 = 0;                //禁止定时器1中断
        TR1 = 1;                //启动定时器1

   //串口2初始化       
    RS485_DIR2=0;//RS485_2设置为接收
    AUXR|=0x10;        //启动波特率发生器
        S2CON = 0x50;                                 //方式1,八位数据,可变波特率
        BRT=0XFD;                                  //设置波特率9600
   //串口中断初始化       
        ES=1;                //开串口1中断            
        IE2=0x01;        //开串口2中断
        EA=1;                 //开总中断            
}
void Timer0Init(void)                //1毫秒@11.0592MHz
{
        AUXR &= 0x7F;                //定时器时钟12T模式
        TMOD &= 0xF0;                //设置定时器模式
        TMOD |= 0x01;                //设置定时器模式
        TL0 = 0x66;                //设置定时初值
        TH0 = 0xFC;                //设置定时初值
        TF0 = 0;                //清除TF0标志
        TR0 = 1;                //定时器0开始计时
    ET0 = 1;  //开定时器中断
}
/********************************************************************
                            配置P4口
*********************************************************************/
void P4_init(void)
{
   P4SW|=0x70;                   //配置P4.4,P4.5,P4.6为IO口
   P4M0|=0x10;                   //配置P4.4,P4.5,P4.6为普通IO口
   P4M1|=0x10;
   P4|=0x3f;           //置P4.0,P4.1,P4.2,P4.3,P4.4,P4.5,P4.6为1
   P5|=0x08;           //置P5.0,P5.1,P5.2,P5.3为1  
}
/********************************************************************
                            485发送及清零函数
*********************************************************************/
void B485_send1(uchar c)
{
    RS485_DIR1=1;
    SBUF=c;
    Delay2ms();
    RS485_DIR1=0;
}
void B485_send2(uchar c)
{
    RS485_DIR2=1;
    S2BUF=c;
    Delay2ms();
    RS485_DIR2=0;

}
void B485_CLR1()
{
    uchar i;
                 for( i=0;i<2;i++)
                {
                        receBuf[i] = 0xee;
                } i=0;
}
void B485_CLR2()
{
    uchar i;
                 for( i=0;i<2;i++)
                {
                        receBuf[i] = 0xee;
                } i=0;
}
/********************************************************************
                            主函数
*********************************************************************/
void main()
{
   Init_Com();//串口初始化
   P4_init();
   Timer0Init();
   while(1)
   {
     ;
   }
}
/********************************************************************
                          串口中断函数
*********************************************************************/
void commIntProc() interrupt 4
{
    uchar i;
        if(TI)
    {
      TI = 0;
      RS485_DIR1=0;
        }         
        else if(RI)
         {
//           RI = 0;
                 for( i=0;i<2;i++)
                {
                        receBuf[i] = SBUF;
            while(!RI);RI=0;
            Delay2ms();
                }         
          i=0;
         } //接收数据SBUF赋与dat       
}
/********************************************************************
                         串口二(485) 发送接收中断函数
*********************************************************************/
void uart2_isr()  interrupt 8
{
    uchar j;   
   if( S2CON & 0x01 )
         {

                 for( j=0;j<2;j++)
                {
                        receBuf[j] = S2BUF;
            while(!(S2CON &= ~0x01));S2CON &= ~0x01;
            Delay2ms();
                }         
          j=0;
         }
        if( S2CON & 0x02 )
        {
          S2CON&=0xfd;
      RS485_DIR2=0;
        }
}
void timer() interrupt 1//定时器0中断
{
        TL0 = 0x66;                //设置定时初值
        TH0 = 0xFC;                //设置定时初值
    P2dat=P2;
    if(receBuf[0]==P2dat)//P2口为薄码开关地址数据
    {   
        switch(receBuf[1]) //接收数据判断
        {

            case 0xFF: Y01=Y02=Y03=Y04=Y05=Y06=Y07=Y08=0;
                       B485_send1(P2dat);B485_send1(0xAA);B485_CLR1();
                       B485_send2(P2dat);B485_send2(0xAA);B485_CLR2();
                       break;                                                      //  全开
            case 0x00: Y01=Y02=Y03=Y04=Y05=Y06=Y07=Y08=1;
                       B485_send1(P2dat);B485_send1(0xBB);B485_CLR1();
                       B485_send2(P2dat);B485_send2(0xBB);B485_CLR2();
                       break;                                                      //  全关

            case 0x01: Y01=0;B485_send1(P2dat);B485_send1(0xA1);B485_CLR1();
                       B485_send2(P2dat);B485_send2(0xA1);B485_CLR2();break;           //  第一路开
            case 0x02: Y02=0;B485_send1(P2dat);B485_send1(0xA2);B485_CLR1();
                       B485_send2(P2dat);B485_send2(0xA2);B485_CLR2();break;           //  第二路开
            case 0x03: Y03=0;B485_send1(P2dat);B485_send1(0xA3);B485_CLR1();
                       B485_send2(P2dat);B485_send2(0xA3);B485_CLR2();break;           //  第三路开
            case 0x04: Y04=0;B485_send1(P2dat);B485_send1(0xA4);B485_CLR1();
                       B485_send2(P2dat);B485_send2(0xA4);B485_CLR2();break;           //  第四路开
            case 0x05: Y05=0;B485_send1(P2dat);B485_send1(0xA5);B485_CLR1();
                       B485_send2(P2dat);B485_send2(0xA5);B485_CLR2();break;           //  第五路开
            case 0x06: Y06=0;B485_send1(P2dat);B485_send1(0xA6);B485_CLR1();
                       B485_send2(P2dat);B485_send2(0xA6);B485_CLR2();break;           //  第六路开
            case 0x07: Y07=0;B485_send1(P2dat);B485_send1(0xA7);B485_CLR1();
                       B485_send2(P2dat);B485_send2(0xA7);B485_CLR2();break;           //  第七路开
            case 0x08: Y08=0;B485_send1(P2dat);B485_send1(0xA8);B485_CLR1();
                       B485_send2(P2dat);B485_send2(0xA8);B485_CLR2();break;           //  第八路开

            case 0xF1: Y01=1;B485_send1(P2dat);B485_send1(0xB1);B485_CLR1();
                       B485_send2(P2dat);B485_send2(0xB1);B485_CLR2();break;           //  第一路关
            case 0xF2: Y02=1;B485_send1(P2dat);B485_send1(0xB2);B485_CLR1();
                       B485_send2(P2dat);B485_send2(0xB2);B485_CLR2();break;           //  第二路关
            case 0xF3: Y03=1;B485_send1(P2dat);B485_send1(0xB3);B485_CLR1();
                       B485_send2(P2dat);B485_send2(0xB3);B485_CLR2();break;           //  第三路关
            case 0xF4: Y04=1;B485_send1(P2dat);B485_send1(0xB4);B485_CLR1();
                       B485_send2(P2dat);B485_send2(0xB4);B485_CLR2();break;           //  第四路关
            case 0xF5: Y05=1;B485_send1(P2dat);B485_send1(0xB5);B485_CLR1();
                       B485_send2(P2dat);B485_send2(0xB5);B485_CLR2();break;           //  第五路关
            case 0xF6: Y06=1;B485_send1(P2dat);B485_send1(0xB6);B485_CLR1();
                       B485_send2(P2dat);B485_send2(0xB6);B485_CLR2();break;           //  第六路关
            case 0xF7: Y07=1;B485_send1(P2dat);B485_send1(0xB7);B485_CLR1();
                       B485_send2(P2dat);B485_send2(0xB7);B485_CLR2();break;           //  第七路关
            case 0xF8: Y08=1;B485_send1(P2dat);B485_send1(0xB8);B485_CLR1();
                       B485_send2(P2dat);B485_send2(0xB8);B485_CLR2();break;           //  第八路关
            default:break;                                           //  跳出
        }
    }         
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:369814 发表于 2018-8-14 21:19 | 只看该作者
楼主,发现如果发送的是FF或者FF0,也是全开状态
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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