双机间的串口双向通信设计说明.docx
《双机间的串口双向通信设计说明.docx》由会员分享,可在线阅读,更多相关《双机间的串口双向通信设计说明.docx(22页珍藏版)》请在冰豆网上搜索。
双机间的串口双向通信设计说明
单片机应用课程设计任务书
学院
计算机与信息工程
专业
网络工程
课程名称
单片机应用课程设计
题目
双机间的串口双向通信设计
完成期限
自2014年12月22日至2015年1月4日
容
及
任
务
一、设计容及要求:
两个单片机(称为甲机和乙机)之间采用方式1双向串行通信。
(1)甲机的K1按键可通过串口控制乙机的LED1点亮,LED2灭,甲机的K2按键控制乙机LED1
灭,LED2点亮,甲机的K3按键控制乙机的LED1和LED2全亮。
(2)乙机的K2按键课控制串口向甲机发送按下的次数,按下的次数通过串口显示在甲机P0口的数码管上。
二、项目设计思路
1、查找资料,熟悉单片机。
2、设计单片机电路图以及程序。
3、编译软件,烧写软件,调试,最后完成工作。
三、具体成果形式和要求
1.甲机的K1按键可以控制乙机的LED1点亮,LED2灭;
2.甲机的K2按键可以控制乙机的LED2点亮,LED1灭;
3.甲机的K3按键可以控制乙机的LED1、LED2点亮;
4.乙机的K2按键按下的次数可显示在甲机P0口数码管上。
四、具体成果形式和要求
完成设计说明书,提交仿真电路和可执行代码。
进
度
安
排
起止日期
工作容
12.22-12.24
查找资料
12.25-12.27
绘制仿真电路图并编写代码
12.28-12.29
调试并修改代码
12.29-1.4
答辩并进行文档的书写及修改
主
要
参
考
资
料
[1]毅峰,龙江.单片机原理及应用[M].:
理工大学,2010.
[2]广第.单片机基础.第1版.:
航空航天大学,1999
[3]何立民.单片机高级教程.第1版.:
航空航天大学,2001
[4]堂敏.焕平主编.单片机原理与应用[M].:
理工大学,2007.
[5]美明.温动蝉编著.IBM-PC汇编语言程序设计[M].:
清华大学,1994.
[6]戴佳.51单片机C语言应用程序设计[M].:
电子工业,2008
[7]文涛.单片机语言C51典型应用设计[M].:
人民邮电, 2005
[8]勇.μVision2单片机应用程序开发指南[M].:
科学,2005
指导教师
意见
(签字):
年月日
系(教研室)主任意见
(签字):
年月日
单片机应用课程设计任务书
学院名称:
计算机与信息工程学院
班级名称:
学生:
学号:
题目:
双机间的串口双向通信设计
指导教师:
起止日期:
一、绪论
1.1设计背景
随着电子技术的飞速发展,单片机也步如一个新的时代,越来越多的功能各异的单片机为我们的设计提供了许多新的方法与思路。
对于一些场合,比如:
复杂的后台运算及通信与高实时性前台控制系统、软件资源消耗大的系统、功能强大的低消耗系统、加密系统等等。
如果合理使用多种不同类型的单片机组合设计,可以得到极高灵活性与性能价格比,因此,多种异型单片机系统设计渐渐成为一种新的思路,单片机技术作为计算机技术的一个重要分支,由于单片机体积小,系统运行可靠,数据采集方便灵活,成本低廉等优点,在通信中发挥着越来越重要的作用。
但在一些相对复杂的单片机应用系统中,仅仅一个单片机资源是不够的,往往需要两个或多个单片机系统协同工作。
这就对单片机通信提出了更高要求。
单片机之间的通信可以分为两大类:
并行通信和串行通信。
串行通信传输线少,长距离传输时成本低,且可以利用数据采集方便灵活,成本低廉等优点,在通信中发挥着越来越重要的作用。
所以本系统采用串行通信来实现单片机之间可靠的,有效的数据交换。
二、相关知识
2.1双机通信简介
两台机器的通信方式可分为单工通信、半双工通信、双工通信,他们的通信原理及通信方式为:
1.单工通信:
是指消息只能单方向传输的工作方式。
单工通信信道是单向信道,发送端和接收端的身份是固定的,发送端只能发送信息,不能接收信息;接收端只能接收信息,不能发送信息,数据信号仅从一端传送到另一端,即信息流是单方向的。
通信双方采用单工通信属于点到点的通信。
根据收发频率的异同,单工通信可分为同频通信和异频通信。
2.半双工通信:
这种通信方式可以实现双向的通信,但不能在两个方向上同时进行,必须轮流交替地进行。
也就是说,通信信道的每一段都可以是发送端,也可以是接端。
但同一时刻里,信息只能有一个传输方向。
如日常生活中的例子有步话机通信等。
3.双工通信:
双工通信是指在同一时刻信息可以进行双向传输,和打一样,说的同时也能听,边说边听。
这种发射机和接收机分别在两个不同的频率上能同时进行工作的双工机也称为异频双工机。
双工机的特点是使用方便,但线路设计较复杂,价格也较高。
2.2单片机AT89C51介绍
AT89C51是一个低功耗,高性CMOS8位单片机,片含8kBytesISP(In-systemprogrammable)的可反复擦1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片集成了通用8位中央处理器和ISPFlash存储单元功能强大的微型计算机AT89C51可为许多嵌入式控制应用系统提供高性价比的解决方案。
AT89C51具有如下特点:
40个引脚,8kBytesFlash片程序存储器,256bytes的随机存取数据存储器(RAM),32个外部双向输入/输出(I/O)口,5个中断优先级2层中断嵌套中断,2个16位可编程定时计数器,2个全双工串行通信口,看门狗(WDT)电路,片时钟振荡器。
另外,AT89C51可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。
空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。
掉电保护方式下,RAM容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
AT89C51芯片DIP双列直插式封装引脚如图2.1所示。
图2.1AT89C51引脚排列
2.3串口通信
串口通信(SerialCommunications)的概念非常简单,串口按位(bit)发送和接收字节。
尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。
它很简单并且能够实现远距离通信。
比如IEEE488定义并行通行状态时,规定设备线总长不得超过20米,并且任意两个设备间的长度不得超过2米;而对于串口而言,长度可达1200米。
典型地,串口用于ASCII码字符的传输。
通信使用3根线完成,分别是地线、发送、接收。
由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。
其他线用于握手,但不是必须的。
串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。
串口通信的程序设计也是相对比较简单的,容易上手,串口通信的基本程序框图如下图2.3所示:
图2.2串口通信的程序框图
三、总体设计
3.1设计要求
本次设计是用两个单片机(称为甲机和乙机)之间采用方式1双向串行通信。
甲机的K1按键可通过串口控制乙机的LED1点亮,LED2灭,甲机的K2按键控制乙机LED1灭,LED2点亮,甲机的K3按键控制乙机的LED1和LED2全亮。
乙机的K2按键课控制串口向甲机发送按下的次数,按下的次数通过串口显示在甲机P0口的数码管上。
根据以上要求,我所设计的系统框架如图3.1所示:
图3.1系统框架图
四、硬件设计
4.1.整体电路
根据设计要求,我们在Proteus仿真软件平台下,选取元件at89c51两个、开关四个、LED两个、8位数码管一个以及其它元件若干,画出系统整体电路如图3.2.1所示:
图4.1系统整体电路
在电路中,我们将数码管与单片机U1的P0口连接构成系统的开关记数显式电路的部分;将开关与单片机P3接口连接组成系统的按键电路,用来对显示器的控制;LED的段选端与单片机U2的P2口连接构成系统的LED显示系统;单片机左边部分电路与单片机构成系统的复位电路。
4.2、复位电路
将元器件如电路设计图如图3.2所示连接并与单片机相连,构成复位电路。
如果实现了灯的亮灭控制,点击图3.2中的开关,使电路恢复到未开始状态.
图4.2复位电路
4.3.控制电路
将开关K2,K3分别连接两个反相器,并分别把两个开关连接P1.0和P1.1;将K1连接P3.2,三个开关接地,此电路为开关分别控制两个LED灯亮。
开关控制电路设计图如图3.2.3所示。
图4.3控制电路
五、软件设计
本系统是通过利用AT89c51芯片进行的模拟电路实现的,利用八位晶体显示器来计数乙机的按键按下次数,利用两个LED来给出甲机按键按下的相应动作。
具体过程如下:
先初始化显示器和LED,然后甲机或者乙机选择发送或者接收,发送方发送的数据通过缓冲池将数据传递给接收方,接收方接收到数据后,随即给出相应的动作。
双机间的串口双向通信设计的流程图如图5.1所示:
图5.1串口双向通信设计的流程图
5.1甲机软件设计
本模块主要是甲机的发送和接收程序,发送和接收数据都会在是sbuf缓冲池中,其主要代码如下:
switch(NUM)//甲机发送给乙机的数据
{case1:
TRANSPORT('1');
break;
case2:
TRANSPORT('2');
break;
case3:
TRANSPORT('3');
break;
}
}
}
voidS()interrupt4//甲机接收乙机发送的数据
{if(RI)
{RI=0;
if(SBUF>=0&&SBUF<=9)P0=C[SBUF];
elseP0=0x00;
}
甲机的函数流程图如5.2所示:
图5.2甲机流程图
5.2乙机软件设计
本模块主要是乙机发送并接收甲机的数据,其数据也是在sbuf缓冲池中,主要代码如下:
if(K2==0)//乙机发送给甲机的数据
{
while(K2==0);
NumX=++NumX%11;
SBUF=NumX;
while(TI==0);
TI=0;
}
voidS()interrupt4//中断
{
if(RI)
{
RI=0;
switch(SBUF)//乙机接收甲机的数据,并给出相应的LED动作,其中LED低电平有效
{case'1':
LED1=0;LED2=1;break;
case'2':
LED1=1;LED2=0;break;
case'3':
LED1=0;LED2=0;break;
}
乙机程序流程图如下4.2所示:
开始
接收或者发送
初始化
甲机是否发送
判断接收数据
LED显示
结束
按下按键
发送给甲机
图5.3乙机流程图
六、测试及运行
打开Proteus软件,将在keil中建立好的工程打开。
然后将程序编译所生成的.Hex文件烧写到单片机芯片中。
点击甲机的K1按键可发送字符“1”,通过缓冲池,乙机接收到甲机发送的字符“1”,乙机会使LED1点亮,LED2灭,如图6.1所示:
图6.1乙机结果图
点击甲机的K1按键可发送字符“2”,通过缓冲池,乙机接收到甲机发送的字符“2”,乙机会使LED2点亮,LED1灭,如图6.2所示:
图6.2乙机结果图
点击甲机的K1按键可发送字符“3”,通过缓冲池,乙机接收到甲机发送的字符“3”,乙机会使LED2、LED1均点亮,如图6.3所示:
图6.3乙机结果图
点击乙机的K2键,通过sbuf,甲机会记下乙机K2的点击次数,甲机的数码管上就会出现乙机的K2键按下次数的相应的数字,如图6.4所示:
图6.4甲机的数码管显示结果
心得与感受
两周的课程设计结束了,通过此次课程设计,使我更加扎实的掌握了有关单片机设计方面的知识,在设计过程中虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍的检查终于找出了原因所在,也暴露出了前期我在这方面的知识欠缺和经验不足。
实践出真知,通过亲自动手制作,使我们掌握的知识不再是纸上谈兵。
过而能改,善莫大焉。
在课程设计过程中,我们不断发现错误,不断改正,不断领悟,不断获取。
最终的检验修改环节,本身就是在践行“过而能改,善莫大焉”的知行观。
这次课程设计终于顺利完成了,在设计中遇到了很多问题,最后在不懈的努力下,终于迎刃而解。
在今后社会的发展和学习实践过程中,一定要不懈努力,不能遇到问题就想到要退缩,一定要不厌其烦的发现问题所在,然后一一进行解决,只有这样,才能成功的做成想做的事,才能在今后的道路上劈荆斩棘,而不是知难而退,那样永远不可能收获成功,收喜悦,也永远不可能得到社会及他人对你的认可!
参考文献
[1]毅峰,龙江.单片机原理及应用[M].:
理工大学,2010.
[2]广第.单片机基础[M].:
航空航天大学,1999
[3]何立民.单片机高级教程[M].:
航空航天大学,2001
[4]堂敏.焕平主编.单片机原理与应用[M].:
理工大学,2007.
[5]美明.温动蝉编著.IBM-PC汇编语言程序设计[M].:
清华大学,1994.
[6]戴佳.51单片机C语言应用程序设计[M].:
电子工业,2008
[7]文涛.单片机语言C51典型应用设计[M].:
人民邮电, 2005
[8]勇.μVision2单片机应用程序开发指南[M].:
科学,2005
学生签名:
填表日期:
年月日
指导教师评语
成绩评定
指导教师签名:
填表日期:
年月日
附录:
源程序
1.甲机源程序
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitK1=P3^2;
sbitK2=P3^3;
sbitK3=P1^1;
ucharNUM=0;
ucharcodeC[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
voidDelay(uintms)
{
uchari;
while(ms--)
for(i=0;i<120;i++);
}
voidTRANSPORT(ucharc)
{SBUF=c;
while(TI==0);
TI=0;
}
voidmain()
{P0=0x00;
SCON=0x50;
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
PCON=0x00;
RI=0;
TI=0;
TR1=1;
IE=0x90;
while
(1){
Delay(100);
if(K1==0){
NUM=1;
}
if(K2==0){
NUM=2;
}
if(K3==0){
NUM=3;
}
switch(NUM)
{case1:
TRANSPORT('1');
break;
case2:
TRANSPORT('2');
break;
case3:
TRANSPORT('3');
break;
}
}
}
voidS()interrupt4
{if(RI)
{RI=0;
if(SBUF>=0&&SBUF<=9)P0=C[SBUF];
elseP0=0x00;
}
}
2.乙机源程序
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitLED1=P2^0;
sbitK2=P3^3;
sbitLED2=P2^1;
ucharNumX=-1;
voidDelay(uintms)
{uchari;
while(ms--)
for(i=0;i<120;i++);
}
voidmain()
{
LED1=1;
LED2=1;
SCON=0x50;
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
PCON=0x00;
RI=0;
TI=0;
TR1=1;
IE=0x90;
while
(1)
{
Delay(100);
if(K2==0)
{
while(K2==0);
NumX=++NumX%11;
SBUF=NumX;
while(TI==0);
TI=0;
}
}
}
voidS()interrupt4
{
if(RI)
{
RI=0;
switch(SBUF)
{case'1':
LED1=0;LED2=1;break;
case'2':
LED1=1;LED2=0;break;
case'3':
LED1=0;LED2=0;break;
}
}