两单片机之间的通信问题

JKvigoss 2013-05-02 02:08:02
原本是要做一个基于单片机的红外通信,只是做仿真,不过后来仿真软件(protues旧版)没有红外发射和接收器,所以只要做个模拟红外发射接收就行,主要是做编码和解码。我之前做法只是将简单的接收端和发射端的单片机的管脚相连通,希望通过接收端的管脚高低电平的变化让接收端的管脚接收,16位0或1组成一个操作码,然后接收端进行解码。
但是后来发现,这样做两个单片机之间不能进行通信,后来看了下串口通信,但是好像都是双工的,我只需要发射端能将信号发送到接收端,应该是说接收端能接收到发射端某个管脚的高低电平变化,有没有什么简单的办法?如果只能用串口 有没有谁给个例子呀。 小弟感激不尽。
...全文
467 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
kuangkuang2113 2013-05-09
  • 打赏
  • 举报
回复
牛人啊,抓紧学习
JKvigoss 2013-05-08
  • 打赏
  • 举报
回复
感谢各位.. 后来用了 外部中断来接受脉冲..
ymm198606 2013-05-07
  • 打赏
  • 举报
回复
单片机之间的通信用SPI试试;两个单片机分主从
u010564727 2013-05-04
  • 打赏
  • 举报
回复
这个嘛,可以选择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 }
粒坨-康 2013-05-03
  • 打赏
  • 举报
回复
你把你的邮箱发给我咯。
JKvigoss 2013-05-03
  • 打赏
  • 举报
回复
引用 9 楼 pk124729136 的回复:
你把你的邮箱发给我咯。
好的 365528596@qq.com
JKvigoss 2013-05-02
  • 打赏
  • 举报
回复
引用 7 楼 pk124729136 的回复:
我有做个一个关于俩个之间单片机通信,用三个跟线链接单片机引脚,不是用的串口。
能不能发给我下啊
粒坨-康 2013-05-02
  • 打赏
  • 举报
回复
我有做个一个关于俩个之间单片机通信,用三个跟线链接单片机引脚,不是用的串口。
JKvigoss 2013-05-02
  • 打赏
  • 举报
回复
引用 5 楼 lbing7 的回复:
串口的指令直接解析不就可以了嘛 :) 其它的,玩规范的一点,那可以加个MODBUS的协议.要是你愿意的话~
能不能 给个例子啊 没用过串口啊
lbing7 2013-05-02
  • 打赏
  • 举报
回复
串口的指令直接解析不就可以了嘛 :) 其它的,玩规范的一点,那可以加个MODBUS的协议.要是你愿意的话~
JKvigoss 2013-05-02
  • 打赏
  • 举报
回复
不是啊 我就是没有红外发射器 和 红外接收器 。其实就是做一个 有线通信 然后单片机内部 做编码和解码. 怎么做有线通信? 求教呀!!
lbing7 2013-05-02
  • 打赏
  • 举报
回复
引用 2 楼 xqhrs232 的回复:
[quote=引用 1 楼 lbing7 的回复:] 见到过用在单片机UART口上直接驱动红外收发对管实现通信的方案 据说,效果不错.不过我没有具体做过,所以不好说 实现方式就是用232的TX接驱动电路到发射管,RX经接收管后,输入
真的可以这样弄?[/quote] 确实见过这样的方案.而且应用到产品上大规模推广了 只是我自己没有确实去做过,具体的性能,不敢直接下定论
xqhrs232 2013-05-02
  • 打赏
  • 举报
回复
引用 1 楼 lbing7 的回复:
见到过用在单片机UART口上直接驱动红外收发对管实现通信的方案 据说,效果不错.不过我没有具体做过,所以不好说 实现方式就是用232的TX接驱动电路到发射管,RX经接收管后,输入
真的可以这样弄?
lbing7 2013-05-02
  • 打赏
  • 举报
回复
见到过用在单片机UART口上直接驱动红外收发对管实现通信的方案 据说,效果不错.不过我没有具体做过,所以不好说 实现方式就是用232的TX接驱动电路到发射管,RX经接收管后,输入

27,374

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧