版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
南京人口学院课程设计报告课程单片机微型计算机原理与接口技术论文题目单片机多机通信学生姓名学号指导教师2011年1月单片机多机通信一﹑数据通信协议1.帧格式:总字节数+命令+地址+内容+校验2.帧格式说明:总字节数:4位命令:4位地址:1字节校验:1字节内容:实际传送的数据,最大为13字节3.总字节数说明:总字节数4位,一帧数据最大16个字节,最小3个字节4.命令格式说明:0000:寻址命令,此时地址表示从机的ID0001:应答寻址命令0010:主机向从机写数据命令0011:主机向从机读数据命令0100:从机应答主机的读/写命令此时是片内寻址命令。地址表示从机内存的起始地址,主机读/写数据的起始地址,地址的增长方向由主机决定,寻址范围:0~2550101:从机向主机写数据命令0110:从机向主机读数据命令0111:主机响应从机读/写此时是片内寻址命令。地址表示主机内存的起始地址,从机读/写数的起始地址,地址的增长方向由从机决定,寻址范围:0~2551000:1001:1010:1011:1100:1101:此时是片外寻址命令,地址增为2个字节,寻址范围:0~64K此命令是未开发命令1110:帧错误1111:通信结束命令5.地址格式说明:当片内寻址命令时,地址是一个字节,寻址片内范围:0~255当片外寻址命令时,地址是两个字节,寻址范围:0~64K6.内容格式说明:是传输的数据,总大小有帧大小以及命令格式决定7.校验格式说明:校验是存储帧中数字1的个数二、主机通信程序流程图NNYYNYNNY开始主机初始化置M为计数标志M=0?发送地址帧,M=M-1收到从机应答帧解析应答帧帧校验正确?重设M的值M=0?发送数据帧M=M-1A通信失败通信失败NYYN解析应答帧解析应答帧帧校验正确?收到应答帧等待从机应答帧返回通信结束三、从机通信程序流程图NNYNYYNYNYNYNYN从机初始化等待主机广播收到地址帧解析地址帧校验正确?地址匹配?回复应答帧值SM2=0置M为计数器M=0?接受一帧数据收到一帧数据解析帧数据校验正确?处理接受的一帧数据是数据帧?重置M的值通信失败结束帧准备接受下一帧四、主机通信功能模块1、主机初始化模块设置缓冲区16个字节(既是发送,又是接收缓冲区)设置计数值M设置堆栈指针2、帧设置模块设置帧的通信方式(总字节数、命令、地址、内容、校验)计算校验方式即设置校验字节3、接受帧模块送数据到指定的缓冲区4、发送帧模块设置发送缓冲区5、解析帧模块解析帧大小解析帧命令解析地址五、从机通信功能模块1、主机初始化模块设置缓冲区16个字节(既是发送,又是接收缓冲区)设置计数值M设置堆栈指针2、帧设置模块设置帧的通信方式(总字节数、命令、地址、内容、校验)计算校验方式即设置校验字节3、接受帧模块设置接收缓冲区4、发送帧模块根据解析格式发送数据5、解析帧模块解析帧大小解析帧命令解析地址/* 多机通信中的主机通信程序 将以地址04H开始的数据发送到从机缓冲区中*/org0000hljmpstartorg0024h;0014h~0023h,16字节为数据缓冲区start: movsp,#03h ;0004h~0013h为堆栈区 movr2,#6 ;计数值N mov07h,#255 clres;关闭串口中断sloop1:callset_frame mova,r2 jzerror callsend_frame decr2 callreceive_frame mova,07h jzsloop1;没有收到应答帧 callanaly_frame ;有收到应答帧 cjner6,#01h,sloop1;没有收到从机地址应答帧 movr2,#6;重设N的值sloop2:callsend_frame;发送数据帧 mova,r2 jzerror decr2 callreceive_frame mova,07h jzsloop2;没有收到应答帧 callanaly_frame ;有收到应答帧 cjner6,#04h,error;没有收到数据应答帧,失败 jmpmreturnerror: sjmp$mreturn:ljmpstart/*函数名称:set_frame入口参数:r0(帧缓冲区首址)、r1(帧数据区首址) r7(帧大小)、r6(帧命令) r5(地址)、r4(校验)、r3(帧数据大小)出口参数:r0(帧缓冲区首址)、r1(帧数据区首址) r7(帧大小)、r6(帧命令) r5(地址)、r4(校验)、r3(帧数据大小)功能:设置帧*/set_frame: movr0,#14h mova,r7;设置帧的大小 swapa mov@r0,a mova,r6;设置帧命令 orla,@r0 mov@r0,a incr0 mova,r5 mov@r0,a;设置地址(从机地址或内存地址) cjner3,#0,sloop jmpsreturnsloop: incr0 mova,@r1 mov@r0,a djnzr3,sloopsreturn: callcheck_frame;此处应该增加一个校验函数 ret/*函数名称:send_frame入口参数:r0(帧缓冲区首址)、 r7(帧大小)、r3(帧数据大小)出口参数:无 功能:发送帧*/send_frame:loop2: mova,@r0 movsbuf,a jnbti,$ incr0 djnzr7,loop2 clrti ret/*函数名称:receive入口参数:r0(帧缓冲区首址)、07h(表示接受时限) 07h=0表示主机等待超时,接收失败出口参数:r0(帧缓冲区首址)、07h函数功能:*/receive_frame:wait: jbri,rec djnz07h,wait jmprreturnrec: mova,sbuf mov@r0,a swapa;计算接收帧的大小 anla,#0eh movr7,a clrriloop3: ;接收帧的数据 jnbri,$ incr0 mov@r0,sbuf djnzr7,loop3 callanaly_framerreturn: ret/*函数名称:check_frame 出口参数:r0(帧缓冲区首址)入口参数:r0(帧缓冲区首址) r4(校验)功能:帧校验函数,累加帧中1个数*/check_frame: movr4,#00h mova,@r0 anla,#0f0h swapa movr7,a mova,#01hcheck: ;累加帧中1的个数 anla,@r0 jzcloop incr4cloop: rla djnzr7,checkret/*函数名称:analy_frame入口参数:r0(帧缓冲区首址)出口参数:r0(帧缓冲区首址)、r1(帧数据区首址) r2(帧命令标志)、r7(帧大小)、r6(帧命令) r5(地址)、r4(校验)、r3(帧数据大小)函数功能:*/analy_frame: mova,@r0;取帧大小,存到r7中 anla,#0f0h swapa movr7,a mova,@r0 ;取帧命令,存到r6中 anla,#0fh incr0 movr5,@r0 movr6,a;判断帧命令 cjner6,#00h,rel0 cjner6,#01h,rel1 cjner6,#02h,rel2 cjner6,#03h,rel3 cjner6,#04h,rel4 cjner6,#05h,rel5 cjner6,#06h,rel6 cjner6,#07h,rel7 cjner6,#0eh,rele cjner6,#0fh,relfrel0: ajmpareturnrel1: clrTB8 ajmpareturnrel2: ajmpareturnrel3: ajmpareturnrel4: ajmpareturnrel5: ajmpareturnrel6: ajmpareturnrel7: ajmpareturnrele: ajmpareturnrelf: ajmpareturnareturn:retEnd/* 从机通讯程序,从机地址为:ID*/org0000hljmpstartorg0024h;0014h~0023h,16字节为数据缓冲区start: movsp,#03h ;0004h~0013h为堆栈区 movr2,#6 ;计数值N mov07h,#255 clres;关闭串口中断 setbSM2sloop1: mova,r2 jzerror callreceive_frame decr2 mova,07h jzsloop1;没有收到帧 callanaly_frame ;有收到应答帧,解析收到的帧 cjner6,#00h,sloop1 cjner5,ID,sloop1sloop2:callreceive_frame;接收数据帧 mova,r2 jzerror decr2 callsend_frame mova,07h jzsloop2;没有收到应答帧 callanaly_frame ;有收到数据帧 cjner6,#04h,error;没有收到数据应答帧,失败 jmpmreturnerror: sjmp$mreturn:ljmpstart/*函数名称:set_frame入口参数:r0(帧缓冲区首址)、r1(帧数据区首址) r7(帧大小)、r6(帧命令) r5(地址)、r4(校验)、r3(帧数据大小)出口参数:r0(帧缓冲区首址)、r1(帧数据区首址) r7(帧大小)、r6(帧命令) r5(地址)、r4(校验)、r3(帧数据大小)功能:设置帧*/set_frame: movr0,#14h mova,r7;设置帧的大小 swapa mov@r0,a mova,r6;设置帧命令 orla,@r0 mov@r0,a incr0 mova,r5 mov@r0,a;设置地址(从机地址或内存地址) cjner3,#0,sloop jmpsreturnsloop: incr0 mova,@r1 mov@r0,a djnzr3,sloopsreturn: callcheck_frame;此处应该增加一个校验函数 ret/*函数名称:send_frame入口参数:r0(帧缓冲区首址)、 r7(帧大小)、r3(帧数据大小)出口参数:无 功能:发送帧*/send_frame:loop2: mova,@r0 movsbuf,a jnbti,$ incr0 djnzr7,loop2 clrti ret/*函数名称:receive入口参数:r0(帧缓冲区首址)、07h(表示接受时限) 07h=0表示主机等待超时,接收失败出口参数:r0(帧缓冲区首址)、07h函数功能:*/receive_frame:wait: jbri,rec djnz07h,wait jmprreturnrec: mova,sbuf mov@r0,a swapa;计算接收帧的大小 anla,#0eh movr7,a clrriloop3: ;接收帧的数据 jnbri,$ incr0 mov@r0,sbuf djnzr7,loop3 callanaly_framerreturn: ret/*函数名称:check_frame 出口参数:r0(帧缓冲区首址)入口参数:r0(帧缓冲区首址) r4(校验)功能:帧校验函数,累加帧中1个数*/check_frame: movr4,#00h mova,@r0 anla,#0f0h swapa movr7,a mova,#01hcheck: ;累加帧中1的个数 anla,@r0 jzcloop incr4cloop: rla djnzr7,checkret/*函数名称:analy_frame入口参数:r0(帧缓冲区首址)出口参数:r0(帧缓冲区首址)、r1(帧数据区首址) r2(帧命令标志)、r7(帧大小)、r6(帧命令) r5(地址)、r4(校验)、r3(帧数据大小)函数功能:*/analy_frame: mova,@r0;取帧大小,存到r7中 anla,#0f0h swapa movr7,a mova,@r0 ;取帧命令,存到r6中 incr0 mova,@r0 anla,#0fh movr6,a;判断帧命令 cjner6,#00h,rel0 cjner6,#01h,rel1 cjner6,#02h,rel2 cjner6,#03h,rel3 cjner6,#04h,rel4 cjner6,#05h,rel5 cjner6,#06h,rel6 cjner6,#07h,rel7 cjner6,#0eh,rele cjner6,#0fh,relfrel0: ajmpareturnrel1: clrTB8 ajmpareturnrel2: ajmpareturnrel3: ajmpareturnrel4: ajmpareturnrel5: ajmpareturnrel6: ajmpareturnrel7: ajmpareturnrele: ajmpareturnrelf: ajmpareturnareturn:retend/* 从机通讯程序,从机地址为:ID*/org0000hljmpstartorg0024h;0014h~0023h,16字节为数据缓冲区start: movsp,#03h ;0004h~0013h为堆栈区 movr2,#6 ;计数值N mov07h,#255 clres;关闭串口中断 setbSM2sloop1: mova,r2 jzerror callreceive_frame decr2 mova,07h jzsloop1;没有收到帧 callanaly_frame ;有收到应答帧,解析收到的帧 cjner6,#00h,sloop1 cjner5,ID,sloop1sloop2:callreceive_frame;接收数据帧 mova,r2 jzerror decr2 callsend_frame mova,07h jzsloop2;没有收到应答帧 callanaly_frame ;有收到数据帧 cjner6,#04h,error;没有收到数据应答帧,失败 jmpmreturnerror: sjmp$mreturn:ljmpstart/*函数名称:set_frame入口参数:r0(帧缓冲区首址)、r1(帧数据区首址) r7(帧大小)、r6(帧命令) r5(地址)、r4(校验)、r3(帧数据大小)出口参数:r0(帧缓冲区首址)、r1(帧数据区首址) r7(帧大小)、r6(帧命令) r5(地址)、r4(校验)、r3(帧数据大小)功能:设置帧*/set_frame: movr0,#14h mova,r7;设置帧的大小 swapa mov@r0,a mova,r6;设置帧命令 orla,@r0 mov@r0,a incr0 mova,r5 mov@r0,a;设置地址(从机地址或内存地址) cjner3,#0,sloop jmpsreturnsloop: incr0 mova,@r1 mov@r0,a djnzr3,sloopsreturn: callcheck_frame;此处应该增加一个校验函数 ret/*函数名称:send_frame入口参数:r0(帧缓冲区首址)、 r7(帧大小)、r3(帧数据大小)出口参数:无 功能:发送帧*/send_frame:loop2: mova,@r0 movsbuf,a jnbti,$ incr0 djnzr7,loop2 clrti ret/*函数名称:receive入口参数:r0(帧缓冲区首址)、07h(表示接受时限) 07h=0表示主机等待超时,接收失败出口参数:r0(帧缓冲区首址)、07h函数功能:*/receive_frame:wait: jbri,rec djnz07h,wait jmprreturnrec: mova,sbuf mov@r0,a swapa;计算接收帧的大小 anla,#0eh movr7,a clrriloop3: ;接收帧的数据 jnbri,$ incr0 mov@r0,sbuf djnzr7,loop3 callanaly_framerreturn: ret/*函数名称:check_frame 出口参数:r0(帧缓冲区首址)入口参数:r0(帧缓冲区首址) r4(校验)功能:帧校验函数,累加帧中1个数*/check_frame: movr4,#00h mova,@r0 anla,#0f0h swapa movr7,a mova,#01hcheck: ;累加帧中1的个数 anla,@r0 jzcloop incr4cloop: rla djnzr7,checkret/*函数名称:analy_frame入口参数:r0(帧缓冲区首址)出口参数:r0(帧缓冲区首址)、r1(帧数据区首址) r2(帧命令标志)、r7(帧大小)、r6(帧命令) r5(地址)、r4(校验)、r3(帧数据大小)函数功能:*/analy_frame: mova,@r0;取帧大小,存到r7中 anla,#0f0h swapa movr7,a mova,@r0 ;取帧命令,存到r6中 incr0 mova,@r0 anla,#0fh movr6,a;判断帧命令 cjner6,#00h,rel0 cjner6,#01h,rel1 cjner6,#02h,rel2 cjner6,#03h,rel3 cjner6,#04h,rel4 cjner6,#05h,rel5 cjner6,#06h,rel6 cjner6,#07h,rel7 cjner6,#0eh,rele cjner6,#0fh,relfrel0: ajmpareturnrel1: clrTB8 ajmpareturnrel2: ajmpareturnrel3: ajmpareturnrel4: ajmpareturnrel5: ajmpareturnrel6: ajmpareturnrel7: ajmpareturnrele: ajmpareturnrelf: ajmpareturnareturn:retend/* 多机通信中的主机通信程序 将以地址04H开始的数据发送到从机缓冲区中*/org0000hljmpstartorg0024h;0014h~0023h,16字节为数据缓冲区start: movsp,#03h ;0004h~0013h为堆栈区 movr2,#6 ;计数值N mov07h,#255 clres;关闭串口中断sloop1:callset_frame mova,r2 jzerror callsend_frame decr2 callreceive_frame mova,07h jzsloop1;没有收到应答帧 callanaly_frame ;有收到应答帧 cjner6,#01h,sloop1;没有收到从机地址应答帧 movr2,#6;重设N的值sloop2:callsend_frame;发送数据帧 mova,r2 jzerror decr2 callreceive_frame mova,07h jzsloop2;没有收到应答帧 callanaly_frame ;有收到应答帧 cjner6,#04h,error;没有收到数据应答帧,失败 jmpmreturnerror: sjmp$mreturn:ljmpstart/*函数名称:set_frame入口参数:r0(帧缓冲区首址)、r1(帧数据区首址) r7(帧大小)、r6(帧命令) r5(地址)、r4(校验)、r3(帧数据大小)出口参数:r0(帧缓冲区首址)、r1(帧数据区首址) r7(帧大小)、r6(帧命令) r5(地址)、r4(校验)、r3(帧数据大小)功能:设置帧*/set_frame: movr0,#14h mova,r7;设置帧的大小 swapa mov@r0,a mova,r6;设置帧命令 orla,@r0 mov@r0,a incr0 mova,r5 mov@r0,a;设置地址(从机地址或内存地址) cjner3,#0,sloop jmpsreturnsloop: incr0 mova,@r1 mov@r0,a djnzr3,sloopsreturn: callcheck_frame;此处应该增加一个校验函数 ret/*函数名称:send_frame入口参数:r0(帧缓冲区首址)、 r7(帧大小)、r3(帧数据大小)出口参数:无 功能:发送帧*/send_frame:loop2: mova,@r0 movsbuf,a jnbti,$ incr0 djnzr7,loop2 clrti ret/*函数名称:receive入口参数:r0(帧缓冲区首址)、07h(表示接受时限) 07h=0表示主机等待超时,接收失败出口参数:r0(帧缓冲区首址)、
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【五年级下册数学】【人教版】第四单元测试卷3套带答案
- 粘钢加固施工方案
- 罐区可燃气体检测施工方案及技术措施
- 锻造企业维修工运行操作安全操作规程
- 2.1不等式的性质与解集教学设计-高一上学期数学人教A版(2019)必修第一册
- 2.2氯及其化合物 教学设计 2025-2026学年高一上学期化学人教版(2019)必修第一册
- 2025-2026学年乘车教学设计图片可爱
- 2025-2026学年63实数二教案
- 2026年四川省德阳市社区工作者招聘笔试参考题库及答案详解
- 2026年莆田市涵江区社区工作者招聘笔试参考试题及答案详解
- 2026年有限空间试题和答案
- 2026年党员党史知识竞赛试题(附答案)
- 2026年安徽省中考英语试题(含答案)
- 2026河北省新高一入学摸底测试全科高频考点与模拟训练
- 2026河北石家庄行唐县住房和城乡建设局公开招聘协管员95名考试参考题库及答案详解
- 创新医疗监管实施方案
- 2026年北京市海淀区初三下学期一模英语试卷及答案
- 诊所岗位职责及工作制度
- 自考职业生涯规划大纲与学习指导
- 企业质量信用报告制度
- 雨课堂学堂在线学堂云《代谢与运动营养学(北京体育)》单元测试考核答案
评论
0/150
提交评论