还剩14页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
南京人口学院课程设计报告课程单片机微型计算机原理与接口技术论文题目单片机多机通信学生姓名徐良飞学号07705334指导教师李维维2011年1月单片机多机通信一﹑数据通信协议1.帧格式总字节数+命令+地址+内容+校验2.帧格式说明总字节数4位命令4位地址1字节校验1字节内容实际传送的数据,最大为13字节3.总字节数说明总字节数4位,一帧数据最大16个字节,最小3个字节4.命令格式说明0000寻址命令,此时地址表示从机的ID0001应答寻址命令0010主机向从机写数据命令0011主机向从机读数据命令0100从机应答主机的读/写命令此时是片内寻址命令地址表示从机内存的起始地址,主机读/写数据的起始地址,地址的增长方向由主机决定,寻址范围0~2550101从机向主机写数据命令0110从机向主机读数据命令0111主机响应从机读/写此时是片内寻址命令地址表示主机内存的起始地址,从机读/写数的起始地址,地址的增长方向由从机决定,寻址范围0~255100010011010101111001101此时是片外寻址命令,地址增为2个字节,寻址范围0~64K此命令是未开发命令1110帧错误1111通信结束命令5.地址格式说明当片内寻址命令时,地址是一个字节,寻址片内范围0~255当片外寻址命令时,地址是两个字节,寻址范围0~64K6.内容格式说明是传输的数据,总大小有帧大小以及命令格式决定7.校验格式说明校验是存储帧中数字1的个数
二、主机通信程序流程图
三、从机通信程序流程图
四、主机通信功能模块
1、主机初始化模块设置缓冲区16个字节(既是发送,又是接收缓冲区)设置计数值M设置堆栈指针
2、帧设置模块设置帧的通信方式(总字节数、命令、地址、内容、校验)计算校验方式即设置校验字节
3、接受帧模块送数据到指定的缓冲区
4、发送帧模块设置发送缓冲区
5、解析帧模块解析帧大小解析帧命令解析地址
五、从机通信功能模块
1、主机初始化模块设置缓冲区16个字节(既是发送,又是接收缓冲区)设置计数值M设置堆栈指针
2、帧设置模块设置帧的通信方式(总字节数、命令、地址、内容、校验)计算校验方式即设置校验字节
3、接受帧模块设置接收缓冲区
4、发送帧模块根据解析格式发送数据
5、解析帧模块解析帧大小解析帧命令解析地址/*多机通信中的主机通信程序将以地址04H开始的数据发送到从机缓冲区中*/org0000hljmpstartorg0024h;0014h~0023h16字节为数据缓冲区start:movsp#03h;0004h~0013h为堆栈区movr2#6;计数值Nmov07h#255clres;关闭串口中断sloop1:callset_framemovar2jzerrorcallsend_framedecr2callreceive_framemova07hjzsloop1;没有收到应答帧callanaly_frame;有收到应答帧cjner6#01hsloop1;没有收到从机地址应答帧movr2#6;重设N的值sloop2:callsend_frame;发送数据帧movar2jzerrordecr2callreceive_framemova07hjzsloop2;没有收到应答帧callanaly_frame;有收到应答帧cjner6#04herror;没有收到数据应答帧,失败jmpmreturnerror:sjmp$mreturn:ljmpstart/*函数名称set_frame入口参数r0帧缓冲区首址、r1帧数据区首址r7帧大小、r6帧命令r5地址、r4校验、r3帧数据大小出口参数r0帧缓冲区首址、r1帧数据区首址r7帧大小、r6帧命令r5地址、r4校验、r3帧数据大小功能设置帧*/set_frame:movr0#14hmovar7;设置帧的大小swapamov@r0amovar6;设置帧命令orla@r0mov@r0aincr0movar5mov@r0a;设置地址从机地址或内存地址cjner3#0sloopjmpsreturnsloop:incr0mova@r1mov@r0adjnzr3sloopsreturn:callcheck_frame;此处应该增加一个校验函数ret/*函数名称send_frame入口参数r0帧缓冲区首址、r7帧大小、r3帧数据大小出口参数无功能发送帧*/send_frame:loop2:mova@r0movsbufajnbti$incr0djnzr7loop2clrtiret/*函数名称receive入口参数r0帧缓冲区首址、07h表示接受时限07h=0表示主机等待超时,接收失败出口参数r0帧缓冲区首址、07h函数功能*/receive_frame:wait:jbrirecdjnz07hwaitjmprreturnrec:movasbufmov@r0aswapa;计算接收帧的大小anla#0ehmovr7aclrriloop3:;接收帧的数据jnbri$incr0mov@r0sbufdjnzr7loop3callanaly_framerreturn:ret/*函数名称check_frame出口参数r0帧缓冲区首址入口参数r0帧缓冲区首址r4校验功能:帧校验函数,累加帧中1个数*/check_frame:movr4#00hmova@r0anla#0f0hswapamovr7amova#01hcheck:;累加帧中1的个数anla@r0jzcloopincr4cloop:rladjnzr7checkret/*函数名称analy_frame入口参数r0帧缓冲区首址出口参数r0帧缓冲区首址、r1帧数据区首址r2帧命令标志、r7帧大小、r6帧命令r5地址、r4校验、r3帧数据大小函数功能*/analy_frame:mova@r0;取帧大小存到r7中anla#0f0hswapamovr7amova@r0;取帧命令,存到r6中anla#0fhincr0movr5@r0movr6a;判断帧命令cjner6#00hrel0cjner6#01hrel1cjner6#02hrel2cjner6#03hrel3cjner6#04hrel4cjner6#05hrel5cjner6#06hrel6cjner6#07hrel7cjner6#0ehrelecjner6#0fhrelfrel0:ajmpareturnrel1:clrTB8ajmpareturnrel2:ajmpareturnrel3:ajmpareturnrel4:ajmpareturnrel5:ajmpareturnrel6:ajmpareturnrel7:ajmpareturnrele:ajmpareturnrelf:ajmpareturnareturn:retEnd/*从机通讯程序从机地址为ID*/org0000hljmpstartorg0024h;0014h~0023h16字节为数据缓冲区start:movsp#03h;0004h~0013h为堆栈区movr2#6;计数值Nmov07h#255clres;关闭串口中断setbSM2sloop1:movar2jzerrorcallreceive_framedecr2mova07hjzsloop1;没有收到帧callanaly_frame;有收到应答帧解析收到的帧cjner6#00hsloop1cjner5IDsloop1sloop2:callreceive_frame;接收数据帧movar2jzerrordecr2callsend_framemova07hjzsloop2;没有收到应答帧callanaly_frame;有收到数据帧cjner6#04herror;没有收到数据应答帧,失败jmpmreturnerror:sjmp$mreturn:ljmpstart/*函数名称set_frame入口参数r0帧缓冲区首址、r1帧数据区首址r7帧大小、r6帧命令r5地址、r4校验、r3帧数据大小出口参数r0帧缓冲区首址、r1帧数据区首址r7帧大小、r6帧命令r5地址、r4校验、r3帧数据大小功能设置帧*/set_frame:movr0#14hmovar7;设置帧的大小swapamov@r0amovar6;设置帧命令orla@r0mov@r0aincr0movar5mov@r0a;设置地址从机地址或内存地址cjner3#0sloopjmpsreturnsloop:incr0mova@r1mov@r0adjnzr3sloopsreturn:callcheck_frame;此处应该增加一个校验函数ret/*函数名称send_frame入口参数r0帧缓冲区首址、r7帧大小、r3帧数据大小出口参数无功能发送帧*/send_frame:loop2:mova@r0movsbufajnbti$incr0djnzr7loop2clrtiret/*函数名称receive入口参数r0帧缓冲区首址、07h表示接受时限07h=0表示主机等待超时,接收失败出口参数r0帧缓冲区首址、07h函数功能*/receive_frame:wait:jbrirecdjnz07hwaitjmprreturnrec:movasbufmov@r0aswapa;计算接收帧的大小anla#0ehmovr7aclrriloop3:;接收帧的数据jnbri$incr0mov@r0sbufdjnzr7loop3callanaly_framerreturn:ret/*函数名称check_frame出口参数r0帧缓冲区首址入口参数r0帧缓冲区首址r4校验功能:帧校验函数,累加帧中1个数*/check_frame:movr4#00hmova@r0anla#0f0hswapamovr7amova#01hcheck:;累加帧中1的个数anla@r0jzcloopincr4cloop:rladjnzr7checkret/*函数名称analy_frame入口参数r0帧缓冲区首址出口参数r0帧缓冲区首址、r1帧数据区首址r2帧命令标志、r7帧大小、r6帧命令r5地址、r4校验、r3帧数据大小函数功能*/analy_frame:mova@r0;取帧大小存到r7中anla#0f0hswapamovr7amova@r0;取帧命令,存到r6中incr0mova@r0anla#0fhmovr6a;判断帧命令cjner6#00hrel0cjner6#01hrel1cjner6#02hrel2cjner6#03hrel3cjner6#04hrel4cjner6#05hrel5cjner6#06hrel6cjner6#07hrel7cjner6#0ehrelecjner6#0fhrelfrel0:ajmpareturnrel1:clrTB8ajmpareturnrel2:ajmpareturnrel3:ajmpareturnrel4:ajmpareturnrel5:ajmpareturnrel6:ajmpareturnrel7:ajmpareturnrele:ajmpareturnrelf:ajmpareturnareturn:retendNYYNYNNY开始主机初始化置M为计数标志M=0?发送地址帧,M=M-1收到从机应答帧解析应答帧帧校验正确?重设M的值M=0?发送数据帧M=M-1A通信失败通信失败NYYN解析应答帧解析应答帧帧校验正确?收到应答帧等待从机应答帧返回通信结束NYNYYNYNYNYNYN从机初始化等待主机广播收到地址帧解析地址帧校验正确?地址匹配?回复应答帧值SM2=0置M为计数器M=0?接受一帧数据收到一帧数据解析帧数据校验正确?处理接受的一帧数据是数据帧?重置M的值通信失败结束帧准备接受下一帧。