收藏 分享(赏)

单片机多机通信(课程设计)new.doc

上传人:dzzj200808 文档编号:2306688 上传时间:2018-09-10 格式:DOC 页数:17 大小:74.48KB
下载 相关 举报
单片机多机通信(课程设计)new.doc_第1页
第1页 / 共17页
单片机多机通信(课程设计)new.doc_第2页
第2页 / 共17页
单片机多机通信(课程设计)new.doc_第3页
第3页 / 共17页
单片机多机通信(课程设计)new.doc_第4页
第4页 / 共17页
单片机多机通信(课程设计)new.doc_第5页
第5页 / 共17页
点击查看更多>>
资源描述

1、南京人口学院课程设计报告课 程 单片机微型计算机原理与接口技术 论文题目 单片机多机通信 学生姓名 徐良飞 学 号 07705334 指导教师 李维维 2011 年 1 月 单片机多机通信一数据通信协议1帧格式:总字节数 命令 地址 内容 校验 2帧格式说明:总字节数:4 位命令:4 位地址:1 字节校验:1 字节内容:实际传送的数据,最大为 13 字节3总字节数说明:总字节数 4 位,一帧数据最大 16 个字节,最小 3 个字节4命令格式说明:0000:寻址命令,此时地址表示从机的 ID0001:应答寻址命令0010:主机向从机写数据命令0011:主机向从机读数据命令0100:从机应答主机的

2、读写命令此时是片内寻址命令。地址表示从机内存的起始地址,主机读写数据的起始地址,地址的增长方向由主机决定,寻址范围:0 2550101:从机向主机写数据命令0110:从机向主机读数据命令0111:主机响应从机读写此时是片内寻址命令。地址表示主机内存的起始地址,从机读写数的起始地址,地址的增长方向由从机决定,寻址范围:0 2551000:1001:1010:1011:1100:1101:此时是片外寻址命令,地址增为 2 个字节,寻址范围:0 64K此命令是未开发命令1110:帧错误 1111:通信结束命令5地址格式说明:当片内寻址命令时,地址是一个字节,寻址片内范围:0 255当片外寻址命令时,

3、地址是两个字节,寻址范围:0 64K6内容格式说明:是传输的数据,总大小有帧大小以及命令格式决定7校验格式说明:校验是存储帧中数字 1 的个数二、主机通信程序流程图NYYNYNNY开始主机初始化置 M 为计数标志M = 0? 发送地址帧,M = M-1收到从机应答帧解析应答帧帧校验正确?重设 M 的值M = 0 ?发送数据帧 M = M-1A通信失败通信失败NYYN解析应答帧解析应答帧帧校验正确?收到应答帧等待从机应答帧返回通信结束三、从机通信程序流程图NYNYYNYNYNYNYN从机初始化等待主机广播收到地址帧解析地址帧校验正确?地址匹配?回复应答帧值 SM2 = 0置 M 为计数器M =

4、0 ?接受一帧数据收到一帧数据解析帧数据校验正确?处理接受的一帧数据是数据帧?重置 M 的值通信失败结束帧准备接受下一帧四、主机通信功能模块1、主机初始化模块设置缓冲区 16 个字节(既是发送,又是接收缓冲区)设置计数值 M设置堆栈指针2、帧设置模块设置帧的通信方式(总字节数、命令、地址、内容、校验)计算校验方式即设置校验字节3、接受帧模块送数据到指定的缓冲区4、发送帧模块设置发送缓冲区5、解析帧模块解析帧大小解析帧命令解析地址五、从机通信功能模块1、主机初始化模块设置缓冲区 16 个字节(既是发送,又是接收缓冲区)设置计数值 M设置堆栈指针2、帧设置模块设置帧的通信方式(总字节数、命令、地址

5、、内容、校验)计算校验方式即设置校验字节3、接受帧模块设置接收缓冲区4、发送帧模块根据解析格式发送数据5、解析帧模块解析帧大小解析帧命令解析地址/*多机通信中的主机通信程序将以地址 04H 开始的数据发送到从机缓冲区中*/org 0000hljmp startorg 0024h ;0014h0023h,16 字节为数据缓冲区start:mov sp,#03h ;0004h0013h 为堆栈区mov r2,#6 ;计数值 Nmov 07h,#255clr es ;关闭串口中断sloop1:call set_framemov a,r2jz errorcall send_framedec r2cal

6、l receive_framemov a,07hjz sloop1 ;没有收到应答帧call analy_frame ;有收到应答帧cjne r6,#01h,sloop1 ;没有收到从机地址应答帧mov r2,#6 ;重设 N 的值sloop2:call send_frame ;发送数据帧mov a,r2jz errordec r2call receive_framemov a,07hjz sloop2 ;没有收到应答帧call analy_frame ;有收到应答帧cjne r6,#04h,error;没有收到数据应答帧,失败jmp mreturnerror:sjmp $mreturn:lj

7、mp start/*函数名称:set_frame入口参数:r0(帧缓冲区首址) 、r1(帧数据区首址)r7(帧大小)、r6(帧命令)r5(地址)、r4(校验)、 r3(帧数据大小)出口参数:r0(帧缓冲区首址) 、r1(帧数据区首址)r7(帧大小)、r6(帧命令)r5(地址)、r4(校验)、 r3(帧数据大小)功能:设置帧*/set_frame:mov r0,#14hmov a,r7 ;设置帧的大小swap amov r0,amov a,r6 ;设置帧命令orl a,r0mov r0,ainc r0mov a,r5mov r0,a ;设置地址( 从机地址或内存地址)cjne r3,#0,slo

8、opjmp sreturnsloop:inc r0mov a,r1mov r0,adjnz r3,sloopsreturn:call check_frame ;此处应该增加一个校验函数ret/*函数名称:send_frame入口参数:r0(帧缓冲区首址) 、r7(帧大小)、r3(帧数据大小)出口参数:无 功能:发送帧*/send_frame:loop2:mov a,r0mov sbuf,ajnb ti,$inc r0djnz r7,loop2clr tiret/*函数名称:receive入口参数:r0(帧缓冲区首址) 、07h(表示接受时限)07h = 0 表示主机等待超时,接收失败出口参数:

9、r0(帧缓冲区首址) 、07h函数功能:*/receive_frame:wait:jb ri,recdjnz 07h,waitjmp rreturnrec:mov a,sbufmov r0,aswap a ;计算接收帧的大小anl a,#0ehmov r7,aclr riloop3: ;接收帧的数据jnb ri,$inc r0mov r0,sbufdjnz r7,loop3call analy_framerreturn:ret/*函数名称:check_frame出口参数:r0(帧缓冲区首址)入口参数:r0(帧缓冲区首址)r4(校验)功能:帧校验函数,累加帧中 1 个数*/check_frame

10、:mov r4,#00hmov a,r0anl a,#0f0hswap amov r7,amov a,#01hcheck: ;累加帧中 1 的个数anl a,r0jz cloopinc r4cloop:rl adjnz r7,checkret/*函数名称:analy_frame入口参数:r0(帧缓冲区首址)出口参数:r0(帧缓冲区首址) 、r1(帧数据区首址)r2(帧命令标志)、r7(帧大小)、r6( 帧命令)r5(地址)、r4(校验)、 r3(帧数据大小)函数功能:*/analy_frame:mov a,r0 ;取帧大小,存到 r7 中anl a,#0f0h swap amov r7,amo

11、v a,r0 ;取帧命令,存到 r6 中anl a,#0fh inc r0mov r5,r0 mov r6,a ;判断帧命令cjne r6,#00h,rel0cjne r6,#01h,rel1cjne r6,#02h,rel2cjne r6,#03h,rel3cjne r6,#04h,rel4cjne r6,#05h,rel5cjne r6,#06h,rel6cjne r6,#07h,rel7cjne r6,#0eh,relecjne r6,#0fh,relfrel0:ajmp areturnrel1:clr TB8ajmp areturnrel2:ajmp areturnrel3:ajmp

12、areturnrel4:ajmp areturnrel5:ajmp areturnrel6:ajmp areturnrel7:ajmp areturnrele:ajmp areturnrelf:ajmp areturnareturn:retEnd/*从机通讯程序,从机地址为:ID*/org 0000hljmp startorg 0024h ;0014h0023h,16 字节为数据缓冲区start:mov sp,#03h ;0004h0013h 为堆栈区mov r2,#6 ;计数值 Nmov 07h,#255clr es ;关闭串口中断setb SM2sloop1:mov a,r2jz erro

13、rcall receive_framedec r2mov a,07hjz sloop1 ;没有收到帧call analy_frame ;有收到应答帧 ,解析收到的帧cjne r6,#00h,sloop1cjne r5,ID,sloop1sloop2:call receive_frame ;接收数据帧mov a,r2jz errordec r2call send_framemov a,07hjz sloop2 ;没有收到应答帧call analy_frame ;有收到数据帧cjne r6,#04h,error;没有收到数据应答帧,失败jmp mreturnerror:sjmp $mreturn:

14、ljmp start/*函数名称:set_frame入口参数:r0(帧缓冲区首址) 、r1(帧数据区首址)r7(帧大小)、r6(帧命令)r5(地址)、r4(校验)、 r3(帧数据大小)出口参数:r0(帧缓冲区首址) 、r1(帧数据区首址)r7(帧大小)、r6(帧命令)r5(地址)、r4(校验)、 r3(帧数据大小)功能:设置帧*/set_frame:mov r0,#14hmov a,r7 ;设置帧的大小swap amov r0,amov a,r6 ;设置帧命令orl a,r0mov r0,ainc r0mov a,r5mov r0,a ;设置地址( 从机地址或内存地址)cjne r3,#0,s

15、loopjmp sreturnsloop:inc r0mov a,r1mov r0,adjnz r3,sloopsreturn:call check_frame ;此处应该增加一个校验函数ret/*函数名称:send_frame入口参数:r0(帧缓冲区首址) 、r7(帧大小)、r3(帧数据大小)出口参数:无 功能:发送帧*/send_frame:loop2:mov a,r0mov sbuf,ajnb ti,$inc r0djnz r7,loop2clr tiret/*函数名称:receive入口参数:r0(帧缓冲区首址) 、07h(表示接受时限)07h = 0 表示主机等待超时,接收失败出口参

16、数:r0(帧缓冲区首址) 、07h函数功能:*/receive_frame:wait:jb ri,recdjnz 07h,waitjmp rreturnrec:mov a,sbufmov r0,aswap a ;计算接收帧的大小anl a,#0ehmov r7,aclr riloop3: ;接收帧的数据jnb ri,$inc r0mov r0,sbufdjnz r7,loop3call analy_framerreturn:ret/*函数名称:check_frame出口参数:r0(帧缓冲区首址)入口参数:r0(帧缓冲区首址)r4(校验)功能:帧校验函数,累加帧中 1 个数*/check_fra

17、me:mov r4,#00hmov a,r0anl a,#0f0hswap amov r7,amov a,#01hcheck: ;累加帧中 1 的个数anl a,r0jz cloopinc r4cloop:rl adjnz r7,checkret/*函数名称:analy_frame入口参数:r0(帧缓冲区首址)出口参数:r0(帧缓冲区首址) 、r1(帧数据区首址)r2(帧命令标志)、r7(帧大小)、r6( 帧命令)r5(地址)、r4(校验)、 r3(帧数据大小)函数功能:*/analy_frame:mov a,r0 ;取帧大小,存到 r7 中anl a,#0f0h swap amov r7,a

18、mov a,r0 ;取帧命令,存到 r6 中 inc r0mov a,r0 anl a,#0fhmov r6,a ;判断帧命令cjne r6,#00h,rel0cjne r6,#01h,rel1cjne r6,#02h,rel2cjne r6,#03h,rel3cjne r6,#04h,rel4cjne r6,#05h,rel5cjne r6,#06h,rel6cjne r6,#07h,rel7cjne r6,#0eh,relecjne r6,#0fh,relfrel0:ajmp areturnrel1:clr TB8ajmp areturnrel2:ajmp areturnrel3:ajmp areturnrel4:ajmp areturnrel5:ajmp areturnrel6:ajmp areturnrel7:ajmp areturnrele:ajmp areturnrelf:ajmp areturnareturn:retend

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报