找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STC单片机串口2通信程序 从机应答地址可以发送,主机发送的数据不能接受

[复制链接]
跳转到指定楼层
楼主
ID:109646 发表于 2018-12-26 14:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STC12C5A60S2
主机
#include "master.H"


#define         S2RI    0x01                //S2CON不能位寻址
#define         S2TI    0x02
#define         S2RB8   0x04
#define         S2TB8   0x08
#define   addr1   0x31                //从机地址1
#define   addr2   0x32                //从机地址2
#define   addr3   0x33                //从机地址3

extern u16 adc_P10;
//u8 rbuf;
//
extern u8 code number[];


//串口初始化

void MasterUART_init(void)
{
        S2CON=0xF8;                                //模式3 允许多机通信 允许接受数据
        BRT=0xBF;                                //波特率
        AUXR=0x14;                                //使用独立波特率发生器        波特率不加倍S2MOD=0
        EA=1;
        IE2=0x01;
        AUXR1=0x10;                                //串口2切换到P4

}

void send_data(u8 ddata)    //发送数据
{
   S2BUF=ddata;      //发送数据
   while(!(S2CON&S2TI));     //等待发送完毕
   S2CON&=~S2TI;           //软件复位TI

}

void recv( ) interrupt 8
{
        u8 add=0;
       
                S2CON&=~S2RI;        //清零
                add=S2BUF;
                lcd_defcharacter8x16(1,0,1,add%10,number);
                                 
                if(add==addr1)
                {       
                        lcd_defcharacter8x16(2,0,1,add/10,number);
                        S2CON&=~S2TB8;;          //清地址标志  
                        if(adc_P10<240)                                                                                  
                        {
                                send_data(0x10);       
                        }
                        else send_data(0x20);       
                }
       
}


从机1  STC12C5A60S2
#define         S2RI    0x01                //S2CON不能位寻址
#define         S2TI    0x02
#define         S2RB8   0x04
#define         S2TB8   0x08
#define         S2SM2   0x20

#define   addr       0x31   //从机1地址
u8 rece_data;
void UART2_init(void)
{
        S2CON=0xF0;                                //模式3 允许多机通信 允许接受数据
        BRT=0xBF;                                //波特率
        AUXR|=0x14;                                //使用独立波特率发生器        波特率不加倍S2MOD=0
        EA=1;

        IE2=0x01;
}

void send_data(u8 ddata)    //发送数据,但此处由于与从机的协议,禁止发送0xff
{
   S2BUF=ddata;      //发送数据
   while(!(S2CON&S2TI));     //等待发送完毕
   S2CON&=~S2TI;           //软件复位TI

}

void recv( ) interrupt 8
{
        u8 add=0;
        IE2=0x00;
        S2CON&=~S2RI;        //清零
        add=S2BUF;
       
        if(add==addr)
        {               
                        S2CON&=~S2SM2;        //清零
                        send_data(addr);
                        S2CON|=S2TB8;           //TB8置1
                        while(!(S2CON&S2RI));
                        S2CON&=~S2RI;        //清零
                        rece_data=S2BUF;
                               
                       
        }else S2CON|=S2SM2;           //SM2置1

        IE2=0x01;       
}

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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