智能仪器课程设计报告Word格式.docx
- 文档编号:18408720
- 上传时间:2022-12-16
- 格式:DOCX
- 页数:21
- 大小:158KB
智能仪器课程设计报告Word格式.docx
《智能仪器课程设计报告Word格式.docx》由会员分享,可在线阅读,更多相关《智能仪器课程设计报告Word格式.docx(21页珍藏版)》请在冰豆网上搜索。
①参与通信的所有从机的SM2位置1,即从机处于只接收地址帧的状态;
②主机发送一帧地址信息,包括8位地址及第九位地址/数据标志位(该位应为1,表示该帧信息的前8位为地址);
③由于从机的SM2位已置1,故主机发送的地址信息被所有从机收到,各从机鉴别接收到的地址信息是否与本机地址相同(每个从机已规定其相应的地址)。
对于接收到的地址与本机地址相符的从机,通过程序将其SM2置为0,这样主机之后发送的其他数据信息将被选中的从机接收到,主机与所选的从机之间通信,主机可向从机发送命令数据或从机向主机发送相关的测量结果等。
由于未选中的从机的SM2仍为1,故未选中的从机将不理会主机与选中从机之间传送的数据信息(因为这些信息的第九位均为0),直到主机发送新的地址帧为止。
MAX485芯片的使用:
MAX485是MAXIM公司推出的专门用于RS-485标准通信的接口芯片,它是半双工工作的收发器,其典型工作电路如图2所示:
图2MAX485工作电路
其中管脚
、DE是收发器的控制脚,根据MAX485的逻辑功能表,
、DE都置为高电平,则发送器可工作,接收器不工作;
、DE都置为低电平,则接收器可工作,发送器不工作(发送器和接收器无法同时工作),所以可用单片机的io口使能
、DE来实现半双工通信。
51与MAX485的接口示意图如下:
图3单片机与MAX485连接示意图
(3)键盘设计:
根据题意,主机由于只需使用到两个按键,所以主机的按键可使用独立式按键方式,即两个按键接入单片机的两个io口,通过判断高低电平判断哪个键被按下;
从机则需要使用矩阵式键盘,本组使用4×
4的矩阵式键盘,并用线反转法进行键值扫描。
(4)显示单元:
由于需要显示的信息比较简单,所以可以简单的使用LED数码管来显示,本组使用的单片机开发板上集成了4个数码管,共用一个译码器,可以通过循环点亮的方式显示多个数字。
3、硬件设计
①主机和从机通过MAX485连接的电气图:
图4主机和从机通过MAX485连接的电气图
②主机和按键、数码管的连接图
③从机和键盘、数码管的连接图
图5主机和按键、数码管的连接图
图6从机和键盘、数码管的连接图
4、软件设计
①led数码管显示子程序:
单片机开发板上的LED数码管是共阳极连接方式,数码管的a-h脚分别连到P0.0-P0.7,四个LED的控制角分别接到P2.0-P2.3;
在数码管上需要显示的数字或字符的共阳极代码如下:
显示
内容
共阳极代码
C0H
3
B0H
6
82H
9
6FH
d
A1H
1
F9H
4
99H
7
F8H
E
79H
2
A4H
5
92H
8
80H
N
C8H
程序代码:
#defineucharunsignedchar
sbitP2_0=P2^0;
//用来点亮数码管1
sbitP2_1=P2^1;
//用来点亮数码管2
sbitP2_2=P2^2;
//用来点亮数码管3
sbitP2_3=P2^3;
//用来点亮数码管4
ucharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,
0xf8,0x80,0x90};
//液晶查询表
voiddisplay_1(unsignedintnumber);
voiddisplay_2(unsignedintnumber);
voiddisplay_3(unsignedintnumber);
voiddisplay_4(unsignedintnumber);
/***********************************
函数名:
voiddisplay_1
参数:
(unsignedintnumber)
作用:
根据输入的数字点亮显示数码管1
************************************/
voiddisplay_1(unsignedintnumber)
{P0=table[number];
P2_0=0;
}
voiddisplay_2
根据输入的数字点亮显示数码管2
voiddisplay_2(unsignedintnumber)
P2_1=0;
voiddisplay_3
根据输入的数字点亮显示数码管3
voiddisplay_3(unsignedintnumber)
P2_2=0;
voiddisplay_4
根据输入的数字点亮显示数码管4
voiddisplay_4(unsignedintnumber)
P2_3=0;
②键盘扫描子程序
使用线反转法扫描键盘,矩阵键盘的1-4行接入P1.7-P1.4,1-4列接入P1.3-P1.0,同时P1.3-P1.0接上拉电阻,线反转法的步骤:
1、将列线作为输出线,行线作为输入线,置输出线全部为0,此时行线中呈低电平0的为按键所在行,如果全部都不是0,则没有按键按下;
2、将第一步反过来,即将行线作为输出线,列线作为输入线,置输出线全部为0,此时列线中呈低电平0的为按键所在列,至此便确定了按键的位置,可根据行列参数查询实现写好的键值表,获取键值。
线反转法扫键流程图:
图7键盘子程序流程图
扫描键盘子程序代码:
#include<
stdio.h>
inthang;
//定义行号
intlie;
//定义列号
unsignedintKey_Val=1;
//保存键值
unsignedintkeymap[]={1,2,3,0,4,5,6,0,7,8,9,0,0,0,0,0};
//设置键盘逻辑键值
intKeyScan();
//扫键子函数
voidDelay();
//延时
/*************************************
key_Val对应键值
列:
[p13][p12][p11][p10]
↓↓↓↓
行:
[p17]→1
(1)2
(2)3(3)4(A)
[p16]→5(4)6(5)7(6)8(B)
[p15]→9(7)10(8)11(9)12(C)
[p14]→13(*)14(0)15(#)16(D)
**************************************/
voidDelay()//延时子函数
{
longi;
for(i=1000;
i>
0;
i--);
intKeyScan()//扫键子函数
P1=0xF0;
//列输出全0;
if((P1&
0xF0)!
=0xF0)//扫描行,如果不全为0,则进入
switch(P1)//获得行号
case0x70:
hang=1;
break;
case0xB0:
hang=2;
case0xD0:
hang=3;
case0xE0:
hang=4;
default:
Delay();
//延时去抖动
P1=0x0F;
//行输出全0
0x0F)!
=0x0F)//扫描列,如果不全为0,则确认按键按下
switch(P1)//获得列号
case0x07:
lie=1;
case0x0B:
lie=2;
case0x0D:
lie=3;
case0x0E:
lie=4;
return1;
//扫描到按键按下,则返回1
else
return0;
//未扫描到按键按下,返回0
③主机程序:
在主机主程序中首先进行串口的配置,需要将串口置为模式3;
然后程序一直循环查询是否有按键按下(K1或K2),如果有按键按下,则进入与从机通信的子程序。
主机主程序流程图:
图8主机主程序流程图
主机与从机通信的子程序是主机程序的最关键部分,负责主机与从机建立联系、数据通信和终止连接的任务。
以按下按键K1为例,按下K1表示应与从机1通信,程序进入通信子程序,首先主机向所有从机发送从机1的地址“0x01”,然后主机等待从机1的回应(从机1收到请求会发回本机的地址信号0x01作为回应),接收到回应则继续进行通信;
然后主机一直处于接收状态,循环接收从机发送的数据,并将数据通过数码管显示,直到接收到数据0,则退出子程序;
注意由于单片机外接MAX485进行通信,所以在发送或接收前需要改变控制脚
、DE改变MAX485的收发状态。
图9主机与子程序通信流程图
主机程序代码:
//主机程序
reg51.h>
string.h>
ye_jing_xian_shi.h>
sbitRE=P3^2;
//MAX485的控制脚RE和DE
sbitDE=P3^3;
//发送时置高,接收时置地
unsignedchartemp=0xff;
sbitKEY1=P2^4;
//P2.4,P2.5是两个按键
sbitKEY2=P2^5;
//
//延时1ms函数
voiddelay_1ms(unsignedintt)
unsignedintx,y;
for(x=t;
x>
x--)
for(y=110;
y>
y--);
//串口初始化函数
voidserial_init()
TMOD=0x20;
//定时器1工作于方式2
TH1=0xfd;
TL1=0xfd;
//波特率为9600
PCON=0;
SCON=0xd0;
//串口工作于方式3
TR1=1;
//开启定时器
TI=0;
RI=0;
//向指定从机地址发送数据
//和从机通信
voidADDR_data(unsignedaddr)
intj=0;
while(temp!
=addr)//主机等待从机返回其地址作为应答信号
{
RE=1;
//发送状态
DE=1;
//发送从机地址
TB8=1;
//发送地址帧
SBUF=addr;
while(!
TI);
RE=0;
//接收状态
DE=0;
//接收从机应答信号
RI);
temp=SBUF;
//从机会发送自己的地址作为回应
}//选通从机后跳出循环
display_1(addr);
//接通后在数码管上显示1或2
//主机循环接收从机发过来的数字信号并在数码管上显示,直到接收到0
do{
display_1(temp);
//在数码管上显示数字
}while(temp!
=0);
//接收到0,表示此次通信结束,数码管闪烁表示
for(j=0;
j<
50;
j++)
{
delay_1ms(10);
P2_0=1;
P0=0x86;
P2_1=1;
P0=0xc8;
P2_2=1;
P0=0xa1;
P2_3=1;
}
}
voidmain()
//初始为发送状态
serial_init();
while
(1)
if(KEY1==0)
delay_1ms(5);
//消抖
KEY1);
ADDR_data(0x01);
if(KEY2==0)
KEY2);
ADDR_data(0x02);
//重置为发送状态
④从机程序:
从机首先进行串口初始化,然后处于循环接收状态,即等待主机的请求,如果接收缓存区有数据,判断是否等于本机地址,等于则表明有主机请求,则再向主机发送本机地址作为回应;
然后从机进入读键子程序,循环读出键值并将键值发送到主机,直到有0键按下,从机将0发送后退出子程序,即结束此次通信,重新开始主循环。
从机主程序流程图:
图10从机程序流程图
从机程序代码(从机1):
//从机1程序
jian_pan.h>
#defineaddr0x01//从机2的地址
unsignedcharaa=0xff;
//主机与从机之间通信标志
unsignedintKey;
unsignedintj;
//初始为接收状态
SM2=1;
//接收地址帧
while(aa!
=addr)//从机等待主机请求自己的地址
aa=SBUF;
//一旦被请求,从机返回自己地址作为应答,等待接收数据
TB8=0;
SM2=0;
//接收数据帧
5;
display_1
(1);
delay_1ms(500);
P2_0=1;
//连接成功则进入扫键程序
do//循环扫描键盘
Key=KeyScan();
if(Key==1)//如果扫描到按键按下
Key_Val=keymap[(hang-1)*4+lie-1];
//计算得到键值
display_1(Key_Val);
//从机上显示
//将按下的数字发送到主机
SBUF=Key_Val;
}while(Key_Val!
=0x00);
Key_Val=1;
aa=0xff;
//重置为接收状态
5、系统调试及测试
系统实物图:
首先按下主机的K1按钮,主机显示“1”,从机1闪烁显示“1”,表示已经接通,然后在从机1键盘上按下任何键,从机和主机同时显示键值,按下0键,则主机显示“1END”表示结束,从机数码管灯灭,再按下键盘无反应;
再测试从机2,按下主机的K2按钮,主机显示“2”,从机2闪烁显示“2”,表示已经接通,然后在从机2键盘上按下任何键,从机和主机同时显示键值,按下0键,则主机显示“2END”表示结束,从机数码管灯灭,再按下键盘无反应;
在某个从机与主机通信时,按下主机另一从机按钮或在另一从机上按下键盘,不影响通信。
6、结论
测试结果表明设计的系统满足题目要求,完成了RS-485标准的主从式多机系统设计任务。
但是本设计并没有体现出通信接口的识别功能这一点(即利用SM2位进行地址信息和数据信息的区分),这主要是因为主机并不需要向从机发送数据信息,只发送了地址信息进行请求。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 智能 仪器 课程设计 报告