智能仪器课程设计报告.docx

上传人:b****4 文档编号:6888733 上传时间:2023-05-10 格式:DOCX 页数:21 大小:175.01KB
下载 相关 举报
智能仪器课程设计报告.docx_第1页
第1页 / 共21页
智能仪器课程设计报告.docx_第2页
第2页 / 共21页
智能仪器课程设计报告.docx_第3页
第3页 / 共21页
智能仪器课程设计报告.docx_第4页
第4页 / 共21页
智能仪器课程设计报告.docx_第5页
第5页 / 共21页
智能仪器课程设计报告.docx_第6页
第6页 / 共21页
智能仪器课程设计报告.docx_第7页
第7页 / 共21页
智能仪器课程设计报告.docx_第8页
第8页 / 共21页
智能仪器课程设计报告.docx_第9页
第9页 / 共21页
智能仪器课程设计报告.docx_第10页
第10页 / 共21页
智能仪器课程设计报告.docx_第11页
第11页 / 共21页
智能仪器课程设计报告.docx_第12页
第12页 / 共21页
智能仪器课程设计报告.docx_第13页
第13页 / 共21页
智能仪器课程设计报告.docx_第14页
第14页 / 共21页
智能仪器课程设计报告.docx_第15页
第15页 / 共21页
智能仪器课程设计报告.docx_第16页
第16页 / 共21页
智能仪器课程设计报告.docx_第17页
第17页 / 共21页
智能仪器课程设计报告.docx_第18页
第18页 / 共21页
智能仪器课程设计报告.docx_第19页
第19页 / 共21页
智能仪器课程设计报告.docx_第20页
第20页 / 共21页
亲,该文档总共21页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

智能仪器课程设计报告.docx

《智能仪器课程设计报告.docx》由会员分享,可在线阅读,更多相关《智能仪器课程设计报告.docx(21页珍藏版)》请在冰点文库上搜索。

智能仪器课程设计报告.docx

智能仪器课程设计报告

智能仪器设计课程设计报告

―――采用RS485标准的主从式多机系统设计

 

学生姓名:

王**

学号:

*********

班级:

********

任课教师:

***

成绩:

 

1、设计要求

a)系统基本结构:

1个51系列单片机主机、2个51系列单片机从机(从机1和从机2)、采用RS485组成主从式多机系统;

b)系统基本功能:

在主机键盘上按“1”键,从机1的LED数码显示器上显示“1”,此后从机1键盘上每按下1个数字键,主机LED数码显示器上能显示对应的数字,当从机1键盘上按下“0”键时,此次通信结束,从机1键盘上再按下任意数字键,主机不显示相应数字;在主机键盘上按“2”,从机2的LED数码显示器上显示“2”,此后从机2键盘上每按下1个数字键,主机LED数码显示器上能显示对应的数字,当从机2键盘上按下“0”键时,此次通信结束,从机2键盘上按下任意数字键后,主机不显示相应数字;

c)选做:

从机1和从机2可设计成相关物理量的测量系统,当主机呼叫从机时,从机能把最新的测量值发给主机。

2、方案论证

(1)系统组成:

由三个51单片机构成主从通信系统(本组使用的芯片型号是STC89C52,其功能是一致的),每个单片机搭配LED数码管显示器和键盘;通信采用RS-485标准,可使用MAX485芯片作为通信收发器,单片机控制MAX485的使能端进行发送和接受逻辑控制;单主机多从机的通讯系统需要区分地址信息和数据信息,可利用51串口模式中的模式2进行通信,修改主机的SCON.3状态表明主机发送的是否是地址信息,修改某台从机的SM2状态来建立和主机的唯一通信;数据输入使用键盘输入,数据显示可简单的使用数码管显示。

图1系统结构图

(2)串口模式分析:

51单片机串口的2/3模式下是作为11位异步通信用,8位数据位后的第九位是可编程位SCON.3,主机可以对此位进行0或1赋值,进行地址信息和数据信息的区分,通常赋为1表示地址信息,为0表示数据信息;51单片机的串行口控制寄存器SCON的SM2位是专门用来使通信接口具有识别功能的多机控制位,在串行口以方式2/3接收时,若SM2=1,此时出现两种情况:

第一,接收到的第九位为1(单片机接收时可编程位进入SCON.2),则前8位数据装入SBUF,并置RI为1,产生中断标志;第二,接收到的第九位为0,则不产生中断标志,接收信息被弃。

若SM2=0,则接收到的第九位无论为0还是1,RI均为1,产生中断标志,接收到的前8位数据装入SBUF。

所以多机通信可按下述过程进行:

①参与通信的所有从机的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;在数码管上需要显示的数字或字符的共阳极代码如下:

显示

内容

共阳极代码

显示

内容

共阳极代码

显示

内容

共阳极代码

显示

内容

共阳极代码

显示

内容

共阳极代码

0

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

参数:

(unsignedintnumber)

作用:

根据输入的数字点亮显示数码管2

************************************/

voiddisplay_2(unsignedintnumber)

{P0=table[number];

P2_1=0;

}

/***********************************

函数名:

voiddisplay_3

参数:

(unsignedintnumber)

作用:

根据输入的数字点亮显示数码管3

************************************/

voiddisplay_3(unsignedintnumber)

{P0=table[number];

P2_2=0;

}

/***********************************

函数名:

voiddisplay_4

参数:

(unsignedintnumber)

作用:

根据输入的数字点亮显示数码管4

************************************/

voiddisplay_4(unsignedintnumber)

{P0=table[number];

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

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;

break;

case0xD0:

hang=3;

break;

case0xE0:

hang=4;

break;

default:

break;

}

Delay();//延时去抖动

P1=0x0F;//行输出全0

if((P1&0x0F)!

=0x0F)//扫描列,如果不全为0,则确认按键按下

{

switch(P1)//获得列号

{

case0x07:

lie=1;

break;

case0x0B:

lie=2;

break;

case0x0D:

lie=3;

break;

case0x0E:

lie=4;

break;

default:

break;

}

return1;//扫描到按键按下,则返回1

}

}

else

return0;//未扫描到按键按下,返回0

}

③主机程序:

在主机主程序中首先进行串口的配置,需要将串口置为模式3;然后程序一直循环查询是否有按键按下(K1或K2),如果有按键按下,则进入与从机通信的子程序。

主机主程序流程图:

图8主机主程序流程图

主机与从机通信的子程序是主机程序的最关键部分,负责主机与从机建立联系、数据通信和终止连接的任务。

以按下按键K1为例,按下K1表示应与从机1通信,程序进入通信子程序,首先主机向所有从机发送从机1的地址“0x01”,然后主机等待从机1的回应(从机1收到请求会发回本机的地址信号0x01作为回应),接收到回应则继续进行通信;然后主机一直处于接收状态,循环接收从机发送的数据,并将数据通过数码管显示,直到接收到数据0,则退出子程序;注意由于单片机外接MAX485进行通信,所以在发送或接收前需要改变控制脚

、DE改变MAX485的收发状态。

图9主机与子程序通信流程图

主机程序代码:

//主机程序

#include

#include

#include

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>0;x--)

for(y=110;y>0;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;

TI=0;//发送从机地址

TB8=1;//发送地址帧

SBUF=addr;

while(!

TI);

TI=0;

RE=0;//接收状态

DE=0;

RI=0;//接收从机应答信号

while(!

RI);

temp=SBUF;//从机会发送自己的地址作为回应

RI=0;

}//选通从机后跳出循环

display_1(addr);//接通后在数码管上显示1或2

//主机循环接收从机发过来的数字信号并在数码管上显示,直到接收到0

do{

RE=0;//接收状态

DE=0;

RI=0;

while(!

RI);

temp=SBUF;

RI=0;

display_1(temp);//在数码管上显示数字

}while(temp!

=0);

//接收到0,表示此次通信结束,数码管闪烁表示

for(j=0;j<50;j++)

{

display_1(addr);

delay_1ms(10);

P2_0=1;

P0=0x86;

P2_1=0;

delay_1ms(10);

P2_1=1;

P0=0xc8;

P2_2=0;

delay_1ms(10);

P2_2=1;

P0=0xa1;

P2_3=0;

delay_1ms(10);

P2_3=1;

}

}

voidmain()

{

RE=1;

DE=1;//初始为发送状态

serial_init();

while

(1)

{

if(KEY1==0)

{

delay_1ms(5);//消抖

if(KEY1==0)

{

while(!

KEY1);

ADDR_data(0x01);

}

}

if(KEY2==0)

{

delay_1ms(5);

if(KEY2==0)

{

while(!

KEY2);

ADDR_data(0x02);

}

}

RE=1;

DE=1;//重置为发送状态

}

}

④从机程序:

从机首先进行串口初始化,然后处于循环接收状态,即等待主机的请求,如果接收缓存区有数据,判断是否等于本机地址,等于则表明有主机请求,则再向主机发送本机地址作为回应;然后从机进入读键子程序,循环读出键值并将键值发送到主机,直到有0键按下,从机将0发送后退出子程序,即结束此次通信,重新开始主循环。

注意由于单片机外接MAX485进行通信,所以在发送或接收前需要改变控制脚

、DE改变MAX485的收发状态。

 

从机主程序流程图:

图10从机程序流程图

从机程序代码(从机1):

//从机1程序

#include

#include

#include

#include

#defineaddr0x01//从机2的地址

sbitRE=P3^2;//MAX485的控制脚RE和DE

sbitDE=P3^3;//发送时置高,接收时置地

unsignedcharaa=0xff;//主机与从机之间通信标志

 

//延时1ms函数

voiddelay_1ms(unsignedintt)

{

unsignedintx,y;

for(x=t;x>0;x--)

for(y=110;y>0;y--);

}

//串口初始化函数

voidserial_init()

{

TMOD=0x20;//定时器1工作于方式2

TH1=0xfd;

TL1=0xfd;//波特率为9600

PCON=0;

SCON=0xd0;//串口工作于方式3

TR1=1;//开启定时器

TI=0;

RI=0;

}

 

voidmain()

{

unsignedintKey;

unsignedintj;

RE=0;

DE=0;//初始为接收状态

serial_init();

while

(1)

{

SM2=1;//接收地址帧

while(aa!

=addr)//从机等待主机请求自己的地址

{

RE=0;//接收状态

DE=0;

RI=0;

while(!

RI);

aa=SBUF;

RI=0;

}

RE=1;//发送状态

DE=1;

TI=0;//一旦被请求,从机返回自己地址作为应答,等待接收数据

TB8=0;

SBUF=addr;

while(!

TI);

TI=0;

SM2=0;//接收数据帧

for(j=0;j<5;j++)

{

display_1

(1);

delay_1ms(500);

P2_0=1;

delay_1ms(500);

}

//连接成功则进入扫键程序

do//循环扫描键盘

{

Key=KeyScan();

if(Key==1)//如果扫描到按键按下

{

Key_Val=keymap[(hang-1)*4+lie-1];//计算得到键值

display_1(Key_Val);//从机上显示

TI=0;//将按下的数字发送到主机

SBUF=Key_Val;

while(!

TI);

TI=0;

}

}while(Key_Val!

=0x00);

P2_0=1;

Key_Val=1;

aa=0xff;

RE=0;

DE=0;//重置为接收状态

}

}

5、系统调试及测试

系统实物图:

主机

首先按下主机的K1按钮,主机显示“1”,从机1闪烁显示“1”,表示已经接通,然后在从机1键盘上按下任何键,从机和主机同时显示键值,按下0键,则主机显示“1END”表示结束,从机数码管灯灭,再按下键盘无反应;再测试从机2,按下主机的K2按钮,主机显示“2”,从机2闪烁显示“2”,表示已经接通,然后在从机2键盘上按下任何键,从机和主机同时显示键值,按下0键,则主机显示“2END”表示结束,从机数码管灯灭,再按下键盘无反应;在某个从机与主机通信时,按下主机另一从机按钮或在另一从机上按下键盘,不影响通信。

6、结论

测试结果表明设计的系统满足题目要求,完成了RS-485标准的主从式多机系统设计任务。

但是本设计并没有体现出通信接口的识别功能这一点(即利用SM2位进行地址信息和数据信息的区分),这主要是因为主机并不需要向从机发送数据信息,只发送了地址信息进行请求。

 

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

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2