单片机多机通信课程设计.doc_第1页
单片机多机通信课程设计.doc_第2页
单片机多机通信课程设计.doc_第3页
单片机多机通信课程设计.doc_第4页
单片机多机通信课程设计.doc_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

南京人口学院课程设计报告 课 程 单片机微型计算机原理与接口技术 论文题目 单片机多机通信 学生姓名 徐良飞 学 号 07705334 指导教师 李维维 2011年 1月 单片机多机通信一数据通信协议 1帧格式: 总字节数 命令 地址 内容 校验 2帧格式说明: 总字节数:4 位 命令:4 位 地址:1 字节 校验:1 字节 内容:实际传送的数据,最大为13字节3总字节数说明:总字节数4位,一帧数据最大16个字节,最小3个字节4命令格式说明: 0000:寻址命令,此时地址表示从机的ID 0001:应答寻址命令 0010:主机向从机写数据命令 0011:主机向从机读数据命令 0100:从机应答主机的读写命令此时是片内寻址命令。地址表示从机内存的起始地址,主机读写数据的起始地址,地址的增长方向由主机决定,寻址范围:0 255 0101:从机向主机写数据命令 0110:从机向主机读数据命令 0111:主机响应从机读写此时是片内寻址命令。地址表示主机内存的起始地址,从机读写数的起始地址,地址的增长方向由从机决定,寻址范围:0 255 1000: 1001: 1010: 1011: 1100: 1101:此时是片外寻址命令,地址增为2个字节,寻址范围:0 64K此命令是未开发命令 1110:帧错误 1111:通信结束命令5地址格式说明: 当片内寻址命令时,地址是一个字节,寻址片内范围:0 255 当片外寻址命令时,地址是两个字节,寻址范围:0 64K6内容格式说明: 是传输的数据,总大小有帧大小以及命令格式决定7校验格式说明: 校验是存储帧中数字1的个数二、主机通信程序流程图NYYNYNNY开始主机初始化置M为计数标志M = 0? 发送地址帧,M = M-1收到从机应答帧解析应答帧帧校验正确?重设M的值M = 0 ?发送数据帧M = M-1A通信失败通信失败NYYN解析应答帧解析应答帧帧校验正确?收到应答帧等待从机应答帧返回通信结束三、从机通信程序流程图NYNYYNYNYNYNYN从机初始化等待主机广播收到地址帧解析地址帧校验正确?地址匹配?回复应答帧值SM2 = 0置M为计数器M = 0 ?接受一帧数据收到一帧数据解析帧数据校验正确?处理接受的一帧数据是数据帧?重置M的值通信失败结束帧准备接受下一帧四、主机通信功能模块 1、主机初始化模块 设置缓冲区16个字节(既是发送,又是接收缓冲区) 设置计数值M 设置堆栈指针 2、帧设置模块 设置帧的通信方式(总字节数、命令、地址、内容、校验) 计算校验方式即设置校验字节 3、接受帧模块 送数据到指定的缓冲区 4、发送帧模块 设置发送缓冲区 5、解析帧模块 解析帧大小 解析帧命令 解析地址五、从机通信功能模块 1、主机初始化模块 设置缓冲区16个字节(既是发送,又是接收缓冲区) 设置计数值M 设置堆栈指针 2、帧设置模块 设置帧的通信方式(总字节数、命令、地址、内容、校验) 计算校验方式即设置校验字节 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 r2call receive_framemov a,07hjz sloop1 ;没有收到应答帧call analy_frame;有收到应答帧cjne r6,#01h,sloop1 ;没有收到从机地址应答帧mov r2,#6 ;重设N的值sloop2:call send_frame ;发送数据帧 mov a,r2 jz error dec r2 call receive_frame mov a,07h jz sloop2 ;没有收到应答帧 call analy_frame;有收到应答帧 cjne r6,#04h,error;没有收到数据应答帧,失败 jmp mreturnerror:sjmp $mreturn: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,sloopjmp 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表示主机等待超时,接收失败出口参数: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: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,amov 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 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 errorcall receive_framedec r2mov a,07hjz sloop1 ;没有收到帧call analy_frame;有收到应答帧,解析收到的帧cjne r6,#00h,sloop1cjne r5,ID,sloop1sloop2:call receive_frame ;接收数据帧 mov a,r2 jz error dec r2 call send_frame mov a,07h jz sloop2 ;没有收到应答帧 call analy_frame;有收到数据帧 cjne r6,#04h,error;没有收到数据应答帧,失败 jmp mreturnerror:sjmp $mreturn: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,sloopjmp 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表示主机等待超时,接收失败出口参数: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: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,amov 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,rel4

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论