当前位置:文档之家› 智能仪器课程设计报告

智能仪器课程设计报告

智能仪器设计课程设计报告―――采用RS 485标准的主从式多机系统设计学生姓名:王**学号:*********班级:********任课教师:***成绩:1、设计要求a) 系统基本结构:1个51系列单片机主机、2个51系列单片机从机(从机1 和从机2)、采用RS 485组成主从式多机系统;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所示:图2 MAX485工作电路其中管脚RE、DE是收发器的控制脚,根据MAX485的逻辑功能表,RE、DE 都置为高电平,则发送器可工作,接收器不工作;RE、DE 都置为低电平,则接收器可工作,发送器不工作(发送器和接收器无法同时工作),所以可用单片机的io口使能RE、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;在数码管上需要显示的数字或字符的共阳极代码如下:程序代码:#define uchar unsigned charsbit P2_0 = P2^0; //用来点亮数码管1sbit P2_1 = P2^1; //用来点亮数码管2sbit P2_2 = P2^2; //用来点亮数码管3sbit P2_3 = P2^3; //用来点亮数码管4uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90 };//液晶查询表void display_1(unsigned int number);void display_2(unsigned int number);void display_3(unsigned int number);void display_4(unsigned int number); /***********************************函数名:void display_1参数:(unsigned int number)作用:根据输入的数字点亮显示数码管1 ************************************/ void display_1(unsigned int number) { P0=table[number];P2_0 = 0;}/***********************************函数名:void display_2参数:(unsigned int number)作用:根据输入的数字点亮显示数码管2 ************************************/ void display_2(unsigned int number) { P0=table[number];P2_1 = 0;}/***********************************函数名:void display_3参数:(unsigned int number)作用:根据输入的数字点亮显示数码管3************************************/void display_3(unsigned int number){ P0=table[number];P2_2 = 0;}/***********************************函数名:void display_4参数:(unsigned int number)作用:根据输入的数字点亮显示数码管4************************************/void display_4(unsigned int number){ 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<stdio.h>int hang;//定义行号int lie; //定义列号unsigned int Key_Val=1;//保存键值unsigned int keymap[] = {1,2,3,0,4,5,6,0,7,8,9,0,0,0,0,0};//设置键盘逻辑键值int KeyScan();//扫键子函数void Delay(); //延时/*************************************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) **************************************/void Delay()//延时子函数{long i;for(i=1000;i>0;i--);}int KeyScan()//扫键子函数{P1=0xF0;//列输出全0;if((P1&0xF0)!=0xF0)//扫描行,如果不全为0,则进入{switch(P1)//获得行号{case 0x70:hang=1;break;case 0xB0:hang=2;break;case 0xD0:hang=3;break;case 0xE0:hang=4;break;default:break;}Delay();//延时去抖动P1=0x0F;//行输出全0if((P1&0x0F)!=0x0F)//扫描列,如果不全为0,则确认按键按下{switch(P1)//获得列号{case 0x07:lie=1;break;case 0x0B:lie=2;break;case 0x0D:lie=3;break;case 0x0E:lie=4;break;default:break;}return 1;//扫描到按键按下,则返回1 }}elsereturn 0;//未扫描到按键按下,返回0 }③主机程序:在主机主程序中首先进行串口的配置,需要将串口置为模式3;然后程序一直循环查询是否有按键按下(K1或K2),如果有按键按下,则进入与从机通信的子程序。

相关主题