完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
三、C语言程序
(1)主机程序 #include #include #define _SUCC_ 0x0f//数据传送成功 #define _ERR_ 0xf0//数据传送失败 unsigned char Table[9]={0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39}; unsigned char Buff[20]; //数据缓冲区 unsigned char temp=0xff; ***it KEY1=P1^6; ***it KEY2=P1^7; //unsigned char addr; //延时1ms函数 void delay_1ms(unsigned int t) { unsigned int x,y; for(x=t;x>0;x--) for(y=110;y>0;y--); } //缓冲区初始化 void Buff_init() { unsigned char i; //将Table里的数据放到缓冲区里 for(i=0;i<9;i++) { Buff= Table; delay_1ms(100); } } //串口初始化函数 void serial_init() { TMOD=0x20; //定时器1工作于方式2 TH1=0xfd; TL1=0xfd; //波特率为9600 PCON=0; SCON=0xd0; //串口工作于方式3 TR1=1; //开启定时器 ti=0; RI=0; } //发送数据函数 void SEND_data(unsigned char *Buff) { unsigned char i; unsigned char lenth; unsigned char check; lenth=strlen(Buff); //计算数据长度 check=lenth; TI=0; //发送数据长度 TB8=0; //发送数据帧 SBUF=lenth; while(!TI); TI=0; for(i=0;i check=check^Buff; TB8=0; SBUF=Buff; while(!TI); TI=0; } TB8=0; //发送校验字节 SBUF=check; while(!TI); TI=0; } //向指定从机地址发送数据 void ADDR_data(unsigned addr) { while(temp!=addr) //主机等待从机返回其地址作为应答信号 { TI=0; //发送从机地址 TB8=1; //发送地址帧 SBUF=addr; while(!TI); TI=0; RI=0; while(!RI); temp=SBUF; RI=0; } temp=_ERR_; //主机等待从机数据接收成功信号 while(temp!=_SUCC_) { SEND_data(Buff); RI=0; while(!RI); temp=SBUF; RI=0; } } void main() { Buff_init(); serial_init(); while(1) { if(KEY1==0) { delay_1ms(5); if(KEY1==0) { while(!KEY1); ADDR_data(0x01); } } if(KEY2==0) { delay_1ms(5); if(KEY2==0) { while(!KEY2); ADDR_data(0x02); } } } } (2)从机1程序 #include #include #define addr 0x01//从机1的地址 #define _SUCC_ 0x0f//数据传送成功 #define _ERR_ 0xf0//数据传送失败 unsigned char aa=0xff;//主机与从机之间通信标志 unsigned char Buff[20];//数据缓冲区 //串口初始化函数 void serial_init() { TMOD=0x20; //定时器1工作于方式2 TH1=0xfd; TL1=0xfd; //波特率为9600 PCON=0; SCON=0xd0; //串口工作于方式3 TR1=1; //开启定时器 TI=0; RI=0; } //接收数据函数 unsigned char RECE_data(unsigned char *Buff) { unsigned char i,temp; unsigned char lenth; unsigned char check; RI=0; //接收数据长度 while(!RI); if(RB8==1) //若接收到地址帧,则返回0xfe return 0xfe; lenth=SBUF; RI=0; check=lenth; for(i=0;i while(!RI); if(RB8==1) //若接收到地址帧,则返回0xfe return 0xfe; Buff=SBUF; check=check^(Buff); RI=0; } while(!RI); //接收校验字节 if(RB8==1) //若接收到地址帧,则返回0xfe return 0xfe; temp=SBUF; RI=0; check=temp^check; //将从主机接收到的校验码与自己计算的校验码比对 if(check!=0) //校验码不一致,表明数据接收错误,向主机发送错误信号,函数返回0xff { TI=0; TB8=0; SBUF=_ERR_; while(!TI); TI=0; return 0xff; } TI=0; //校验码一致,表明数据接收正确,向主机发送成功信号,函数返回0x00 TB8=0; SBUF=_SUCC_; while(!TI); TI=0; return 0; } void main() { serial_init(); while(1) { SM2=1; //接收地址帧 while(aa!=addr) //从机等待主机请求自己的地址 { RI=0; while(!RI); aa=SBUF; RI=0; } TI=0; //一旦被请求,从机返回自己的地址作为应答,等待接收数据 TB8=0; SBUF=addr; while(!TI); TI=0; SM2=0; //接收数据帧 aa=0xff; //从机接收数据,并将数据保存到数据缓冲区 while(aa==0xff) { aa=RECE_data(Buff); } if(aa==0xfe) continue; P1=Buff[1]; //查看接收到的数据 } } (3)从机2程序 #include #include #define addr 0x02//从机2的地址 #define _SUCC_ 0x0f//数据传送成功 #define _ERR_ 0xf0//数据传送失败 unsigned char aa=0xff;//主机与从机之间通信标志 unsigned char Buff[20];//数据缓冲区 //串口初始化函数 void serial_init() { TMOD=0x20; //定时器1工作于方式2 TH1=0xfd; TL1=0xfd; //波特率为9600 PCON=0; SCON=0xd0; //串口工作于方式3 TR1=1; //开启定时器 TI=0; RI=0; } //接收数据函数 unsigned char RECE_data(unsigned char *Buff) { unsigned char i,temp; unsigned char lenth; unsigned char check; RI=0; //接收数据长度 while(!RI); if(RB8==1) //若接收到地址帧,则返回0xfe return 0xfe; lenth=SBUF; RI=0; check=lenth; for(i=0;i while(!RI); if(RB8==1) //若接收到地址帧,则返回0xfe return 0xfe; Buff=SBUF; check=check^(Buff); RI=0; } while(!RI); //接收校验字节 if(RB8==1) //若接收到地址帧,则返回0xfe return 0xfe; temp=SBUF; RI=0; check=temp^check; //将从主机接收到的校验码与自己计算的校验码比对 if(check!=0) //校验码不一致,表明数据接收错误,向主机发送错误信号,函数返回0xff { TI=0; TB8=0; SBUF=_ERR_; while(!TI); TI=0; return 0xff; } TI=0; //校验码一致,表明数据接收正确,向主机发送成功信号,函数返回0x00 TB8=0; SBUF=_SUCC_; while(!TI); TI=0; return 0; } void main() { serial_init(); while(1) { SM2=1; //接收地址帧 while(aa!=addr) //从机等待主机请求自己的地址 { RI=0; while(!RI); aa=SBUF; RI=0; } TI=0; //一旦被请求,从机返回自己地址作为应答,等待接收数据 TB8=0; SBUF=addr; while(!TI); TI=0; SM2=0; //接收数据帧 aa=0xff; //从机接收数据,并将数据保存到数据缓冲区 while(aa==0xff) { aa=RECE_data(Buff); } if(aa==0xfe) continue; P1=Buff[2]; //查看接收到的数据 } } |
|
相关推荐
3个回答
|
|
|
|
485通讯分享下!!!
|
|
|
|
谢谢分享
|
|
|
|
只有小组成员才能发言,加入小组>>
3282 浏览 9 评论
2959 浏览 16 评论
3464 浏览 1 评论
9007 浏览 16 评论
4054 浏览 18 评论
1122浏览 3评论
577浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
572浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2305浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1862浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-27 17:22 , Processed in 1.353044 second(s), Total 85, Slave 65 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号