找回密码
 立即注册

QQ登录

只需一步,快速开始

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

关于单片机多机通讯的问题 希望各位大佬指教下

[复制链接]
跳转到指定楼层
楼主
ID:843631 发表于 2021-2-5 01:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
200黑币
  • 主机代码
  • #include <reg52.h>
  • #define uchar unsigned char
  • #define uint unsigned int
  •         void UART_init()
  • {
  • TMOD = 0x20; //定时器1,工作方式2:8位、自动重装  0x0010_0000
  •   TH1 = 0xfd; //fd: 9600bps @ 11.0592M
  •   TL1 = 0xfd; //e8: 1200bps @ 11.0592M
  •   //f4: 2400bps @ 11.0592M
  •   REN = 1; //允许串口接收
  •   SM0 = 1;
  •   SM1 = 1; //SM0和SM1:串口工作模式3,主从模式 + 波特率可变
  •   SM2 = 0; //只接收地址(从机如此配置,主机不需要)
  •         TB8=1;
  •         RI=0;
  •         TI=0;
  •   TR1 = 1; //启动定时器1
  •   EA = 1; //中断 总开关
  • }
  • void master(uchar addr);
  • void main()
  • {
  •        UART_init();
  •         master(0x01);
  •         while(1);
  • }
  • void master(uchar addr)
  • {
  •                 SBUF=addr;    //先发送从机地址
  •                 while(!TI);
  •                 TI=0;
  •                while(!RI);  //这里一开始接收的不是从机发送的0xaa(接收的是0xff)  一定要再接收一次才是0xaa
  •                RI=0;
  •               while(!RI);    //再接收一次才是0xaa    换了设备试了试也是这个样子
  •               RI=0;
  •                 if(SBUF==0XAA)
  •                 {
  •                         SBUF=0XFA;
  •                         while(!TI);
  •                         TI=0;
  •                         P1=0X00;
  •                 }
  • else if(SBUF==0XFF)
  •         P1=0XF0;   //P1口是接的led灯来验证
  • }

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

使用道具 举报

沙发
ID:843631 发表于 2021-2-5 01:35 | 只看该作者
从机的代码
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
void UART_init()         //从机需要开中断
        {
  
  TMOD = 0x20; //定时器1,工作方式2:8位、自动重装  0x0010_0000
  TH1 = 0xfd; //fd: 9600bps @ 11.0592M
  TL1 = 0xfd; //e8: 1200bps @ 11.0592M
  //f4: 2400bps @ 11.0592M
  REN = 1; //允许串口接收
  SM0 = 1;
  SM1 = 1; //SM0和SM1:串口工作模式3,主从模式 + 波特率可变
  SM2 = 1; //只接收地址(从机如此配置,主机不需要)
        TI=0;
        RI=0;
  ES = 1; //开串口中断
  TR1 = 1; //启动定时器1
  EA = 1; //中断 总开关
}
        void main()
{
       
        UART_init();


       
       
}



void ssio()   interrupt 4   //从机地址是0x01
{
        uchar addr;
        ES=0;
        addr=SBUF;
        RI=0;
        if(addr==0X01)
        {       
                P1=0X00;
                SBUF=0XAA;
                while(!TI);
                TI=0;
                while(!RI);
                RI=0;
                if(SBUF==0XFA)
                P1=0XF0;
               
               
        }
       
        ES=1;
}
回复

使用道具 举报

板凳
ID:843631 发表于 2021-2-5 01:36 | 只看该作者
从机明明代码上发送的是0xaa 不知道为什么凭空多了个0xff出来
回复

使用道具 举报

地板
ID:213173 发表于 2021-2-5 08:41 | 只看该作者
CalmBlank 发表于 2021-2-5 01:36
从机明明代码上发送的是0xaa 不知道为什么凭空多了个0xff出来

void main()
{
        UART_init();
        while(1);
}
回复

使用道具 举报

5#
ID:390416 发表于 2021-2-5 08:55 | 只看该作者
单片机串口1打印程序 可以打印3个十六位的变量 http://www.51hei.com/bbs/dpj-201660-1.html
回复

使用道具 举报

6#
ID:390416 发表于 2021-2-5 08:55 | 只看该作者
STC单片机串口发送 不需要while死等 串口接收执行软件复位 http://www.51hei.com/bbs/dpj-200927-1.html
回复

使用道具 举报

7#
ID:843631 发表于 2021-2-5 22:31 | 只看该作者
wulin 发表于 2021-2-5 08:41
void main()
{
        UART_init();

我试了一下 加了while(1)没有变化 还是会有一个0xff发出来.....
回复

使用道具 举报

8#
ID:843631 发表于 2021-2-5 23:01 | 只看该作者
wulin 发表于 2021-2-5 08:41
void main()
{
        UART_init();

void main()
{

        UART_init();
        SBUF=0X01;
        while(!TI);
        TI=0;
        if(RI==1)
                P1=0XAA;
        while(1);

}

写成这个样子 P1口的led也会亮....
回复

使用道具 举报

9#
ID:843631 发表于 2021-2-5 23:28 | 只看该作者
谢谢大佬,是串口初始化的问题   把sm0 1 2 ren 用scon表达就没有这个现象了 。。。也不知道为啥
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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