当前位置:文档之家› 单片机双机通信系统的课程设计

单片机双机通信系统的课程设计

一.课程设计的目的及基本要求:实践课程是使学生融会贯通本课程所学专业理论知识,完成一个较完整的设计计算和安装调试过程,以加深学生对所学理论的理解与应用,认识和熟悉元器件和电子测量仪器的性能指标,了解解决实际问题的一般过程,培养学生综合运用基础理论知识和专业知识去解决实际工程设计问题的能力。

通过电子技术的综合性工程训练,使学生达到以下的目的和要求:1、结合模拟电路、数字电路、可编程逻辑器件、单片机电子线路CAD等课程中所学的理论知识,按要求独立设计方案,培养学生独立分析与解决问题的能力;2、学会查阅相关手册和资料,通过查阅手册和资料,进一步熟悉常用电子器件的类型和特性,并掌握合理选用的原则;3、学会使用常用电子元器件(包括中规模芯片、专用芯片和可编程器件);4、掌握基本的现代电子技术设计工具和EDA(Electronic design automation)技术;5、掌握电子电路的安装与调试技术,进一步熟悉电子仪器的使用方法;6、认真撰写总结报告,培养严谨的作风和科学的态度;二.课程设计的主要内容:课题十九单片机双机通信系统基本要求:设计两个单片机最小系统,能实现有线通信,一方为发送,另一方为接收。

提高要求:两个单片机最小系统能相互通信,并能实现校验。

三.具体要求和时间安排:每一个学生在教师指导下,独立完成一个应用系统。

工作量如下:1、电路原理图(A3幅面)1张,要求Protel软件绘制;2、pcb版图(A3及以上幅面)1张;3、设计说明书(20-30页)1本,内含能编译通过的源程序(有必要的注释)。

目录一、前言 (4)二、键盘设计 (5)1、硬件接线部分 (5)2、4×4矩阵键盘识别处理 (7)3、键盘识别处理程序 (8)三、单片机的选择及其程序设计 (10)1、单片机型号的选择 (10)2、协议设计 (10)3、双机连接电路图 (11)4、甲机程序 (11)5、乙机程序 (16)四、数码管显示设计 (16)五、总体电路图 (21)六、设计小结 (22)七、参考文献 (23)一.前言由于MCS51系列单片机具有性能稳定、工作可靠、价格低廉等特点,因此其应用相当广泛。

一个MCS51系列的单片机(如Atmel89c**)内部包含有RAM、FLASH ROM、两个或者三个16位的定时器/计数器、一个通用异步串行通信控制器(UART)等多种资源。

但即便如此,在一些相对复杂的单片机应用系统中,仅仅一个单片机资源还是不够的,因此而常常需要扩充I/O接口、定时器/计数器、串行通信接口、RAM、ROM等。

采用通用的标准器件进行扩充是通常的做法,但将单片机本身作为一个通用的扩充器件来使用,也不失为一个好的方法。

在这种情况下,一个系统中就使用了两个或两个以上的单片机,而单片机之间就要通过互连来进行数据通信。

MCS51系列的单片机(以下简称单片机)都带有串口,利用串口进行互连通信极为方便,其各种连接方式在许多书籍和资料上都有介绍,在此不再重述。

但如果系统要求扩充的资源是对外连接的串口,或对相互之间的数据传送有一定的速度要求,则单片机的串口就不能用作系统内两单片机的通信接口了。

所幸的是,单片机的并行端口也能相互连接来进行数据通信。

根据单片机端口内部结构的特点,这些端口的端口线可以直接相连,从而使两单片机之间并行通信接口的实现不用另外的硬件电路设备。

此次设计就是针对上述情况展开的。

系统结构框图如图(1)所示:二、键盘设计(1)硬件接线部分考虑到此次设计要求用到的按键数比较多(0~9,A~F共16个按键),为了节约I/O资源,采用行列式键盘,如图(1)所示图(1)按键编排如图(2)所示图(2)(2)4×4矩阵键盘识别处理按键设置在行列式交点上,行列线分别连接到按键开关的两端。

当行线通过上拉电阻接+5伏时,被钳位在高电平状态,事先认为设定好行线和列线的序号。

此处设行号为i,从上到下编为0-3对应于p1.0-p1.3口,列线设为j,从左到右编为0-3对应于p1.4-p1.7口。

每个按键有它的行值和列值,行值和列值的组合就是识别这个按键的编码。

事先有数组存放好对应键值的段选码。

矩阵的行线和列线分别通过两并行接口和CPU通信。

每个按键的状态同样需变成数字量“0”和“1”,开关的一端(列线)通过电阻接V CC,而接地是通过程序输出数字“0”实现的。

键盘处理程序的任务是:确定有无键按下,判断哪一个键按下,键的功能是什么;还要消除按键在闭合或断开时的抖动。

两个并行口中,一个输出扫描码,使按键逐行动态接地,另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软件查表,查出该键的功能。

(3)键盘识别处理程序键盘实现程序如下:void scanf(void) /*键盘扫描子程序*/{uchar i,j,k=0;/*i为行号,j为列号*/unsigned charnum[4][4]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x84};/ *采用共阳极输出*/while(1){for(k=0;k<8;k++)/*循环8次,取得8个键盘键值*/{/*存入TAB[]数组*/P1=0x0F;delay();/*软件延时去抖动*/if((P1&0x0F)!=0x0F){switch(P1) /*确定行号*/{case 0x07: i=3;break;case 0x0b: i=2;break;case 0x0d: i=1;break;case 0x0e: i=0;break;default: break;}}P1=0xF0; //反转行和列上的电平if((P1&0xF0)!=0xF0){switch(P1) /*确定列号*/{case 0x70: j=3; break;case 0xb0: j=2; break;case 0xd0: j=1; break;case 0xe0: j=0; break;default: break;}TAB[k]=num[j][i]; /*P1输出对应的按键值*/}}}三、单片机的选择及其程序设计(1)单片机型号的选择单片机选用两片Atmel公司的常用芯片AT89C51,一片用于接收键盘的输入并做出判断,一片用于接收数据并驱动8个七段数码管实现动态显示。

AT89C51完全可以满足功能要求,而且价格便宜,容易获得。

(2)协议设计规定协议内容如下:数据传输的双方均使用2400bps的速率传送数据,使用主从通信方式,主机发送数据,从机接收数据,双方在发送数据和接收数据时使用查询方式。

(此处设计甲机发送,乙机接收)双方开始数据传输时,甲机先发送AAH给乙机,当乙机接收到AAH之后,向甲机回答BBH。

甲机收到BBH后就把数码表TAB[8]中的8个数据发送给乙机,并发送校验和。

乙机收到8个数据并计算收到的数据的校验和,与甲机发送过来的校验和进行比较,若校验和相同(正确)则发送00H给甲机;否则发送FFH(错误)甲机,重新接收。

乙机接收到8个数据后送8个数码管动态显示。

(3)双机连接电路图如图(4)所示图(4)(4)甲机程序#include<reg52.h>#define uchar unsigned char uchar TAB[8];uchar i,sum; /*sum为求和校验*/void delay(void) /*延时程序*/{ int j;for(j=0;j<12000;j++);}void scanf() /*键盘扫描程序*/{uchar i,j,k=0;unsigned charnum[4][4]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};while(1){for(k=0;k<8;k++){P1=0x0F;delay(); /*软件去抖动*/if((P1&0x0F)!=0x0F){switch(P1){c ase 0x07: i=3; break;c ase 0x0b: i=2; break;c ase 0x0d: i=1; break;c ase 0x0e: i=0; break;d efault: break;}}P1=0xF0; /*反转行和列上的电平*/if((P1&0xF0)!=0xF0){switch(P1){case 0x70: j=3; break;case 0xb0: j=2; break;case 0xd0: j=1; break;case 0xe0: j=0; break;default: break;}TAB[k]=num[j][i];/*P1输出对应的按键值*/}}}}void init(void) /*初始化程序*/{TMOD=0x20;TH1=0xf3;/*波特率为2400bps*/TL1=0xf3;PCON=0x00;/*SMOD=0*/TR1=1;/*开T1中断*/SCON=0x50;/*接收允许*/}void send(void) /*发送函数*/{do{SBUF=0xaa;/*发送握手信号0XAA*/while(!TI);/*等待接收*/TI=0;/*传送完复位*/while(!RI);/*等待接收*/RI=0;/*接收完复位*/}while(SBUF!=0xbb); /*甲机收到BBH后就把数码表*/TAB[8] /*中的8个数据发送给乙机,并发送校验和*/do{sum=0;for(i=0;i<=7;i++){SBUF=TAB[i]; /*发送段选码*/sum+=TAB[i]; /*和校验*/while(!TI);TI=0;}SBUF=sum; /*发送校验和*/while(!TI);TI=0;while(!RI);RI=0;}while(SBUF!=0);//等待接收}main()//主程序{init();scanf();send();}(5)乙机程序#include<reg52.h>#define uchar unsigned charvoid init(void) //初始化程序{TMOD=0x20;TH1=0xf3;//波特率为2400bpsTL1=0xf3;PCON=0x00;TR1=1;SCON=0x50;}void delay(void) /*延时程序*/{uchar j;for(j=0;j<12000;j++);}void receive(void) //接收函数{ uchar i,sum;uchar TABS[8]; //定义接收数组do { while(!RI);RI=0;}while(SBUF!=0xaa); //接收完0XAA则向主机发送0XBBSBUF=0xbb; while(!TI);TI=0;while(1){ sum=0;for(i=0;i<=7;i++){ while(!RI);RI=0;TABS[i]=SBUF;//装人接收的数据sum+=TABS[i];}while(!RI);RI=0;if (SBUF==sum) //和校验{ SBUF=0X00;while(!TI);TI=0;break;}else{ SBUF=0xff;while(!TI);TI=0;}}while(1)//p2口为位选码P2=0xfe;{ for(i=0;i<=7;i++){ P0=TABS[i]; //p0口输出段选码P2=P2<<1|0x01; //位选码左移,并或0X01实现动态显示delay(); } //延时}}void main(void) //接收主函数{ init();receive();}四、数码管显示设计为了显示所需字符,我们必须先查的对应字符的段选码,如图()所示。

相关主题