首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

两单片机之间的通信有关问题

2013-07-04 
两单片机之间的通信问题通信[解决办法]串口的指令直接解析不就可以了嘛:)其它的,玩规范的一点,那可以加个M

两单片机之间的通信问题
通信
[解决办法]
串口的指令直接解析不就可以了嘛

:)

其它的,玩规范的一点,那可以加个MODBUS的协议.要是你愿意的话~
[解决办法]
这个嘛,可以选择i2c、spi、aurt。如果只想用一条线的话,可以用nec或者飞利浦的红外传输协议,当然也可以自己制定一个协议。
如果你非要软件例子,下面给你一个串口的,仅工参考学习

*---------------------------------*/
/* --- STC MCU Limited ------------------------------------------------*/
/* --- STC15F4K60S4 系列 串口1地址自动识别举例举例---------------------*/
/* --- Mobile: (86)13922805190 ----------------------------------------*/
/* --- Fax: 86-755-82905966 -------------------------------------------*/
/* --- Tel: 86-755-82948412 -------------------------------------------*/
/* --- Web: www.STCMCU.com --------------------------------------------*/
/* 如果要在程序中使用此代码,请在程序中注明使使用了宏晶科技的资料及程序 */
/* 如果要在文章中应用此代码,请在文章中注明使使用了宏晶科技的资料及程序 */
/*---------------------------------*/

//本示例在Keil开发环境下请选择Intel的8058芯片型号进行编译
//假定测试芯片的工作频率为18.432MHz

#include "reg51.h"
#include "intrins.h"

typedef unsigned char BYTE;
typedef unsigned int WORD;

//-----------------------------------------------

#define     SLAVE   1               //定义从机编号,0为从机1, 1为从机2

#if SLAVE == 0
#define     SAMASK  0x33            //从机1地址屏蔽位
#define     SERADR  0x55            //从机1的地址为xx01,xx01
#define     ACKTST  0x78            //从机1应答测试数据
#else
#define     SAMASK  0x3C            //从机2地址屏蔽位
#define     SERADR  0x5A            //从机2的地址为xx01,10xx
#define     ACKTST  0x49            //从机2应答测试数据
#endif

#define     URMD    2               //0:使用定时器2作为波特率发生器
                                    //1:使用定时器1的模式0(16位自动重载模式)作为波特率发生器


                                    //2:使用定时器1的模式2(8位自动重载模式)作为波特率发生器

sfr T2H   =   0xd6;                 //定时器2高8位
sfr T2L   =   0xd7;                 //定时器2低8位

sfr AUXR  =   0x8e;                 //辅助寄存器                              

sfr SADDR =   0xA9;                 //从机地址寄存器
sfr SADEN =   0xB9;                 //从机地址屏蔽寄存器

void InitUart();

char count;

void main()
{
    InitUart();                     //初始化串口
    ES = 1;
    EA = 1;
    while (1);
}

/*----------------------------
UART 中断服务程序
-----------------------------*/
void Uart() interrupt 4 using 1
{
    if (TI)
    {
        TI = 0;                     //清除TI位
        if (count != 0)
        {
            count--;
            SBUF = ACKTST;          //继续发送应答数据
        }
        else
        {
            SM2 = 1;                //若发送完成,则重新开始地址检测
        }
    }
    if (RI)
    {
        RI = 0;                     //清除RI位
        SM2 = 0;                    //本机被选中后,进入数据接收状态
        count = 7;
        SBUF = ACKTST;              //并开发送应答数据
    }
}

/*----------------------------
初始化串口
----------------------------*/
void InitUart()
{
    SADDR = SERADR;
    SADEN = SAMASK;
    SCON = 0xf8;                //设置串口为9位可变波特率,使能多机通讯检测,(将TB8设置为1,方便与PC直接通讯测试)


#if URMD == 0
    T2L = 0xd8;                 //设置波特率重装值
    T2H = 0xff;                 //115200 bps(65536-18432000/4/115200)
    AUXR = 0x14;                //T2为1T模式, 并启动定时器2
    AUXR 
[解决办法]
= 0x01;               //选择定时器2为串口1的波特率发生器
#elif URMD == 1
    AUXR = 0x40;                //定时器1为1T模式
    TMOD = 0x00;                //定时器1为模式0(16位自动重载)
    TL1 = 0xd8;                 //设置波特率重装值
    TH1 = 0xff;                 //115200 bps(65536-18432000/4/115200)
    TR1 = 1;                    //定时器1开始启动
#else
    TMOD = 0x20;                //设置定时器1为8位自动重装载模式
    AUXR = 0x40;                //定时器1为1T模式
    TH1 = TL1 = 0xfb;           //115200 bps(256 - 18432000/32/115200)
    TR1 = 1;
#endif
}

热点排行