完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
单片机:STC52
一主9从 通信方式:串口 232 硬件连接:STC52最小系统+232 再把他们 用主从的方式接起来 功能:主机控制从机各自的led闪烁 问题:实现主机控制第一个从机正常工作,但接上其他的从机(哪怕只接一个串口,且不带电),主机和第一个从机就不工作了。请教大侠问题出在哪,我该怎么办? 主机程序 #include //#include #define unit unsigned int #define uchar unsigned char #define addr1 0x31 //从机1地址 #define addr2 0x32 //从机2地址 void Port_Init(void) { P0=0xff; P1=0xff; } void Delay_10ms(unit del) { unit i,j; for(i=0; i } void Uart_Init(void) { TMOD=0x20; //定时器T1使用工作方式2 TH1=0xFD; TH0=0xFD; TR1=1; //开始计时 PCON=0x00; //SMOD=0; SCON=0xd0; //工作方式3,9位数据位,波特率9600bit/s,允许接收 ti=1; RI=1; } uchar Receive(void) //接收数据程序 { uchar Data; while(!RI); //等待接受完毕 Data=SBUF; //接收数据 RI=0; return Data; } void send_addr(uchar addr) //发送地址 { uchar tem; while(addr!=tem) //如果发送的地址与从机应答的地址不一样,则一直发送地址 { while(!TI); //等待发送完毕 TI=0; //软件复位TI TB8=1; //发送地址帧 SBUF=addr; //发送地址 tem=Receive(); } } void send_data(uchar ddata) //发送数据,但此处由于与从机的协议,禁止发送0xff { while(!TI); //等待发送完毕 TI=0; //软件复位TI TB8=0; //发送数据帧 SBUF=ddata; //发送数据 while(!TI); } void main() { Uart_Init(); Port_Init(); send_addr(addr1); //向从机1发地址 send_data(0x01); Delay_10ms(300); //Uart_Init(); send_addr(addr1); //向从机2发地址 send_data(0x02); Delay_10ms(300); // while(1); } 从机程序 #include #include #define unit unsigned int #define uchar unsigned char #define addr 0x31 //从机1地址 void Delay_10ms(unit del) { unit i,j; for(i=0; i } void UnitOn(void) { unit00=0; Delay_10ms(10); unit01=0; Delay_10ms(10); unit02=0; Delay_10ms(10); unit03=0; Delay_10ms(10); unit04=0; Delay_10ms(10); unit05=0; Delay_10ms(10); /*unit06=1; Delay_10ms(10); unit07=1;*/ unit10=0; Delay_10ms(10); unit11=0; Delay_10ms(10); unit12=0; Delay_10ms(10); unit13=0; Delay_10ms(10); unit14=0; Delay_10ms(10); unit15=0; Delay_10ms(10); } void UnitOff(void) { unit00=1; Delay_10ms(10); unit01=1; Delay_10ms(10); unit02=1; Delay_10ms(10); unit03=1; Delay_10ms(10); unit04=1; Delay_10ms(10); unit05=1; Delay_10ms(10); unit10=1; Delay_10ms(10); unit11=1; Delay_10ms(10); unit12=1; Delay_10ms(10); unit13=1; Delay_10ms(10); unit14=1; Delay_10ms(10); unit15=1; Delay_10ms(10); /*unit16=0; Delay_10ms(10); unit17=0;*/ } void Uart_Init(void) { TMOD=0x20; //定时器T1使用工作方式2 TH1=0xFD; TH0=0xFD; TR1=1; //开始计时 PCON=0x00; //SMOD=0; SCON=0xd0; //工作方式3,9位数据位,波特率9600bit/s,允许接收 TI=1; RI=0; } void send(uchar Data) //发送数据程序 { while(!TI); //等待发送完毕 SBUF=Data; TI=0; while(!TI); } uchar recv_data(void) //接收数据 { uchar date; while(!RI); //等待接受完毕 RI=0; if(RB8==1) //若当前接收为地址帧则返回0xff return 0xff; date=SBUF; //while(!RI); return date; } void main() { uchar tem,Data; Uart_Init(); while(1) { SM2=1; //只接收地址帧 //如果接收到的地址帧不是本机地址,则继续等待 while(tem!=addr) { while(!RI); RI=0; tem=SBUF; } //如果是本机地址,发送应答信号,并做好接受数据的准备 TB8=0; //主机不检测该位 send(addr); SM2=0; //允许接受数据信息 //接收数据 Data=recv_data(); if(Data==0xff) continue; switch(Data) { case 0x01: //在此可以写入要完成的动作,最多可完成256个动作 UnitOn(); break; case 0x02:UnitOff(); //P1=0xaa; //为方便其间,赋值给P1口,测P1口电平来检测该程序 break; case 0x03: break; case 0x04: break; default: break; } } } |
|
相关推荐
6个回答
|
|
电源功率不够 电源的纹波太大
|
|
|
|
|
|
|
|
已经搞好了,软硬件都改了一下
|
|
|
|
有 1主多从的连接模块
E232H4 4路RS-232高速隔离集线转换器 特点 ▶ 实现一个串口设备与4个串口设备主从式通信 ▶ 专用工业导轨槽模块 ▶ 两端信号保持光电隔离; ▶ 全面容错机制,一路从节点损坏不影响其他节点通信 |
|
|
|
下来试试看行不行
|
|
|
|
3机以上通讯不能加MAX232芯片
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
飞凌嵌入式-ELFBOARD 解决PCB布线时无法捕捉到焊盘中心的问题
449 浏览 0 评论
Openharmony软件评估指南-米尔瑞芯微RK3568开发板
803 浏览 0 评论
STM32CUBEMX(7)--移植雅特力AT32F403AVGT(兼容STM32F103VGT6),DAC输出电压
1113 浏览 0 评论
【RA-Eco-RA0E1-32PIN-V1.0开发板试用】开发板简介与上电测试
1059 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-shell脚本编写之传参
590 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11053 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-9-11 20:50 , Processed in 0.707283 second(s), Total 83, Slave 65 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191