基于51单片机的串口通讯系统课程设计论文.docx
《基于51单片机的串口通讯系统课程设计论文.docx》由会员分享,可在线阅读,更多相关《基于51单片机的串口通讯系统课程设计论文.docx(33页珍藏版)》请在冰豆网上搜索。
基于51单片机的串口通讯系统课程设计论文
基于51单片机的串口通讯系统
引言
人类社会已经进入信息化时代,信息社会的发展离不开电子产品的进步。
单片机的出现使人类实现利用编程来代替复杂的硬件搭建电路,它靠程序运行,并且可以修改。
通过不同的程序实现不同的功能,尤其是特殊的独特的一些功能,这是别的器件需要费很大力气才能做到的,有些则是花大力气也很难做到的。
一个不是很复杂的功能要是用美国50年代开发的74系列,或者60年代的CD4000系列这些纯硬件来搞定的话,电路一定是一块大PCB板!
但是如果要是用美国70年代成功投放市场的系列单片机,结果就会有天壤之别!
只因为单片机的通过你编写的程序可以实现高智能,高效率,以及高可靠性!
单片机应用的主要领域非常广,智能化家用电器、办公自动化设备商业营销设备、工业自动化控制、智能化仪表、智能化通信产品、汽车电子产品、航空航天系统和国防军事、尖端武器等领域。
单片机应用的意义不仅在于它的广阔范围及所带来的经济效益,更重要的意义在于,单片机的应用从根本上改变了控制系统传统的设计思想和设计方法。
以前采用硬件电路实现的大部分控制功能,正在用单片机通过软件方法来实现。
以前自动控制中的PID调节,现在可以用单片机实现具有智能化的数字计算控制、模糊控制和自适应控制。
这种以软件取代硬件并能提高系统性能的控制技术称为微控技术。
随着单片机应用的推广,微控制技术将不断发展完善。
电路的集成化不仅对硬件电路的设计相关,与电路的布局同样相关。
印刷版的出现使得电路产品更加规范,体积更小。
Protel99se是一款专业的绘制电路及印刷版的软件,近年来的不断升级使得其功能更加完善,出现了AltiumDesigner、ProtelDXP等升级版本。
设计内容及要求
1.1功能要求
(1)下位机选用89S51或89S52单片机;
(2)下位机接收上位机的数据并显示在LED或LCD上;
(3)下位机显示数据可以显示固定数据、位移数据、循环位移;
1.2硬件要求
制作串口线和下位机及外围电路;
1.3软件要求
KeilC或汇编编程设计,串口调试助手或Labview串口通信编程。
2设计原理及单元硬件模块
2
2.1上位机设计
2.1.1RS232串口介绍
经过多年的发展,现今已经形成了许多串行通信接口的标准。
其中本次课程设计用到的RS-232标准是美国EIA(电子工业联合会)与BELL公司一起开发的通信协议。
它适合于数据传输速率在0—20000bit/s的范围内通信。
目前比较常用的串口有9针串口(DB9)和25针串口(DB25),近距离通信可以直接将通信接口用相应的线缆直接相连。
2.1.2串口调试助手介绍
串口调试助手是串口调试相关工具,有多个版本。
如:
友善串口调试助手,支持9600,19200等常用各种波特率及自定义波特率,可以自动识别串口,能设置校验、数据位和停止位,能以ASCII码或十六进制接收或发送任何数据或字符,可以任意设定自动发送周期,并能将接收数据保存成文本文件,能发送任意大小的文本文件。
可实现功能如下所示:
(1)自动搜索串口,并打开串口;
(2)支持多串口;
(3)支持自定义波特率,支持非标准波特率;
(4)支持发送历史记录;
(5)接收数据可以进行十六进制和ASCII切换;
(6)接收数据时,光标可定位在指定行或在最后一行;
(7)可以以十六进制或ASCII格式,向指定串口发送数据;
(8)定时发送数据;
(9)接收数据可以保存为文件,也可打开已保存数据文件;
(10)串口打开过程中,可修改通讯参数,如波特率;
(11)自动记录上次操作参数,如串口号、波特率等。
2.2下位机硬件设计
2.2.1设计原理及方法
下位机设计可分为单片机最小系统、RS232电平转换部分、数据显示部分。
其系统框图大致图2-1所示。
图2-1系统框图
本次设计采用LCD显示由上位机发送的数据,并完成固定数据、位移数据、循环位移的数据显示。
由上位机经RS232串口发送数据,经电平转换,转换成单片机可以接收的信号电压,通过单片机内烧制的程序逻辑运算得出上位机所发送的数据,并在数据显示部分依次显示固定数据、位移数据、循环位移数据。
电平转换由MAX232AEPE芯片完成,单片机最小系统使用的是AT89S52芯片,数据显示部分则由1602LCD液晶显示器完成。
2.2.2
单片机最小系统
图2-2最小系统电路
单片机采用AT89S52,最小系统包括复位电路和时钟电路两部分,其中复位电路采用按键手动复位和上电自动复位组合,电路如图2-2左下部分所示:
其中REST为单片机复位端,电容C3按键S1构成上电复位和手动复位电路。
时钟电路如图2-2右下部分所示:
晶振Y1频率采用的是11.0592MHZ,C1、C2为33p瓷片电容,X1和X2分别为单片机18和19脚。
(1)单片机各引脚功能说明:
AT89S52管脚图如图2-3所示。
VCC:
供电电压。
GND:
接地。
P0口:
P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门流。
当P1口的管脚第一
次写1时,被定义为高阻输入。
P0能够用于外部图2-3AT89S52管脚图
程序数据存储器,它可以被定义为数据/地址的第八位。
在FIASH编程时,P0口作为原码输入口,当FIASH进行。
校验时,P0输出原码,此时P0外部必须被拉高。
P1口:
P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。
P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。
在FLASH编程和校验时,P1口作为第八位地址接收。
P2口:
P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。
并因此作为输入时,P2口的管脚被外部拉低,将输出电流。
这是由于内部上拉的缘故。
P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。
在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。
P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口:
P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。
当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。
作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
P3口也可作为AT89S52的一些特殊功能口,P3口同时为闪烁编程和编程校验接收一些控制信号。
RST:
复位输入。
当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG:
当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。
在FLASH编程期间,此引脚用于输入编程脉冲。
在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。
因此它可用作对外部输出的脉冲或用于定时目的。
然而要注意的是:
每当用作外部数据存储器时,将跳过一个ALE脉冲。
如想禁止ALE的输出可在SFR8EH地址上置0。
此时,ALE只有在执行MOVX,MOVC指令是ALE才起作用。
另外,该引脚被略微拉高。
如果微处理器在外部执行状态ALE禁止,置位无效。
/PSEN:
外部程序存储器的选通信号。
在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。
但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
/EA/VPP:
当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。
注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。
在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
XTAL1:
反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:
来自反向振荡器的输出。
(2)USBASP下载口说明
本次课程设计程序烧写使用USBASP下载口,下载电路如图2-2左上部分所示。
USBASP是一种基于ATMEL公司的AVR系列RISC单片机的高性价比和一个由纯软件的USB通信协议栈而构成的一个可以向51系列,AVR系列单片机下载(烧写)程序的下载器。
这种下载器工作稳定,速度很快,而且成本相当的低,是一种适合初学者的下载器。
特点如下:
(1)支持USB1.1、USB2.0通信;支持WIN98、WINME、WIN2000、WINXP、VISTA、WIN7操作系统;
(2)采用USB口供电、并带有500mA的自恢复保险丝。
保护电脑不会烧毁或损坏。
(3)对目标板芯片编程时,可采用此下载线供电,也可以采用目标板本身供电,下载结果不影响目标板运行。
(4)支持AT89S51、AT89S52和AVR全系列单片机的程序下载,速度更快,更稳定。
(5)支持的烧录文件格式:
格式为HEX文件、二进制BIN文件。
(6)使用IDC10接口。
2.2.3RS232电平转换部分
(1)工作原理
本设计采用MAX232芯片进行电平转换,MAX232芯片是美信公司专门为电脑的RS232标准串口设计的接口电路,使用+5V单电源供电,它的作用就是完成TTL电平与RS232电平的转换。
PC机的串行口采用的是标准的RS232接口,单片机的串行口电平是FTL电平,而TTL电平特性与RS232的电气特性不匹配,因此为了使单片机的串行口能与RS232接口通信,必须将串行口的输入/输出电平进行转换。
通常用MAX232芯片来完成电平转换。
(2)MAX232芯片各引脚功能
MAX232各管脚如图2-4所示。
第一部分是电荷泵电路。
由1、2、3、4、5、6脚和4只电容构成。
功能是产生+12v和-12v两个电源,提供给RS-232串口电平的需要。
第二部分是数据转换通道。
由7、8、9、10、11、12、13、14脚构成两个数据通道。
图2-4MAX232管脚图
其中13脚(R1IN)、12脚(R1OUT)、11脚(T1IN)、14脚(T1OUT)为第一数据通道。
8脚(R2IN)、9脚(R2OUT)、10脚(T2IN)、7脚(T2OUT)为第二数据通道。
TTL/CMOS数据从11引脚(T1IN)、10引脚
(T2IN)输入转换成RS-232数据从14引脚(T1
OUT)、7脚(T2OUT)送到电脑DB9插头;DB9插头的RS-232数据从13引脚(R1IN)、8引脚(R2IN)输入转换成TTL/CMOS数据后从12引脚(R1OUT)、9引脚(R2OUT)输出。
第三部分是供电。
15脚GND、16脚VCC(+5v)。
(3)MAX232芯片用法
MAX芯片用法如图2-5所示。
电容器应选择1μF的电解电容。
在使用过程中本人曾用过10μF的代替。
注意,由于RS232电平较高,在接通时产生的瞬时电涌非常高,很有可能击毁max232,所以在使用中应尽量避免热插拔。
图2-5MAX232应用电路
2.2.4数据显示部分
(1)LCD1602工作原理
1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。
它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此所以它不能很好地显示图形。
1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。
(2)LCD1602各引脚功能
1602采用标准的16脚接口,如图2-6所示,其中:
第1脚:
VSS为电源地。
第2脚:
VCC接5V电源正极。
第3脚:
V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。
图2-6LCD1602引脚图
第4脚:
RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。
第5脚:
RW为读写信号线,高电平
(1)时进行读操作,低电平(0)时进行写操作。
第6脚:
E(或EN)端为使能(enable)端,高电平
(1)时读取信息,负跳变时执行指令。
第7~14脚:
D0~D7为8位双向数据端。
第15~16脚:
空脚或背灯电源。
15脚背光正极,16脚背光负极。
2.3下位机软件设计
2.3.1编程方案选择
本设计单片机的编程选择C语言编写,因为它简洁紧凑、灵活方便、运算符丰富、数据结构丰富、C是结构式语言、C语法限制不太严格,程序设计自由度大、C语言允许直接访问物理地址,可以直接对硬件进行操作、C语言程序生成代码质量高,程序执行效率高,一般只比汇编程序生成的目标代码效率低10へ20%、C语言适用范围大,可移植性好C语言有一个突出的优点就是适合于多种操作系统,如DOS、UNIX,也适用于多种机型。
C语言具有绘图能力强,可移植性,并具备很强的数据处理能力,因此适于编写系统软件,三维,二维图形和动画它是数值计算的高级语言。
所以我选用C语言来编写此程序。
2.3.2程序流程图
如图2-7所示,为下位机程序流程图。
图2-7程序流程图
为了实现系统固定显示以及位移显示的功能要求,在初始化单片机和LCD之后,系统首先判断是否接收到串口传来的数据。
如果接收到数据,则关闭串口中断,并将接收到的十六进制数据转换成十进制和二进制数据,显示在LCD上5秒。
然后,将二进制数据依次向右位移,并间隔一秒显示在LCD上,共位移8次。
在位移8次之后,将二进制数据依次向右循环位移,并间隔一秒显示在LCD上,共位移8次。
完成全部位移显示之后,打开串口中断,继续判断串口是否接受数据,循环实现系统功能。
2.3.3子程序设计
(1)固定显示定义,LCD控制口定义程序实现如下:
#include
#defineucharunsignedchar//宏定义
#defineuintunsignedint
/*******************************************************************/
sbitlcden=P0^2;//液晶控制口RS和EN
sbitlcdrs=P0^0;
sbitlcdwr=P0^1;
/*******************************************************************/
ucharjieshou,number,biaozhi,xunhuan;
/*******************************************************************/
ucharcodetable1[]={"RX:
"};//液晶固定显示内容
ucharcodetable2[]={"guding"};
ucharcodetable3[]={"weiyi"};
ucharcodetable4[]={"xunhuanweiyi"};
ucharcodetable5[]={"RX:
READY"};
/*******************************************************************/
(2)串口接收,参数设置程序实现如下:
voidserial_chushihua()//串口初始化
{
TMOD=0x20;//定时器1:
计时,方式2
TH1=0xfd;//定时器1初值,波特率9600
TL1=0xfd;
TR1=1;//启动定时器1
REN=1;//设置SCON串行口控制寄存器
SM0=0;//允许接收
SM1=1;//方式1:
10位异步收发
EA=1;//开总中断
ES=1;//开串口中断
}
voidchushihua()//初始化
{
lcd_chushihua();//液晶初始化
serial_chushihua();//串口初始化
lcd_guding();//写入液晶固定显示部分
}
3系统硬件和软件调试
3.1调试所需仪器
数字万用表1个
直流稳压源1台
数字万用表1个
信号发生器1台
示波器1台
3.2硬件调试
硬件调试主要:
(1)在AltiumDesigner仿真软件中进行仿真论证整个串口通信系统的正确性。
计算并确定各个电阻、电容大小。
(2)绘制好原理图后,根据原理图去印刷制板。
在这个过程中要小心焊盘的大小是否合适,是否有短接或断路的线,然后进行修正工作。
打孔时要对好孔,以及不要漏孔没有钻。
(3)在焊接电路的过程中,需要检查是否有虚焊或短路的线。
这里要认真细致的检查,否则严重的影响到后续的调试。
(4)焊接完毕就是上电检查,看是否有短路或开路的地方。
检查各元件否正常工作。
3.3软件调试
在硬件没有问题的情况下,进行软件部分的调试。
单片机的程序部分用C语言进行编写,程序稍微简单,容易调试。
写好程序后,用KEIL软件进行编译以及调试得到“*.HEX”文件,然后用USBASP进行下载。
(1)下载进单片机后,观察系统能否正常运行。
首先运行一个简单的测试程序检测单片机最小系统能否正常运行。
(2)测试串转并电路能否正确运行,看LCD是否按照程序控制指令工作。
4系统不足与改进方法
本次课程设计因前期对系统功能分析不透彻,导致实现功能方式过于单一,没能实现实时控制数据位移,循环位移。
只能通过下位机程序,基本实现系统功能。
可以通过以下改进方法,完善系统功能。
(1)通过增加按键,手动控制数据位移,循环位移方向。
(2)完善程序,增加返回值,实时接收单片机处理数据状态。
谢辞
在黎老师的悉心教导和同学的帮助下,通过这两周的课程设计我对AT89S52单片机做下位机的串行通信实现的设计和内容有了更多的了解,通过自己的努力,编写了自己最完整的一套程序,虽然功能不是很完善,但我从中学到了很多东西。
在整个设计中我学会了在复杂的问题面前怎样去分析,找到问题的关键所在,而且认识到这种能力的重要性。
比如在设计的前几天,我对设计中所用到的软件、控制装置都不太了解,感觉什么都不会,无从下手,但当我了解到这些东西在设计的系统中所起的作用后,从整体上看时,整个系统的流程就明了了,就明白了系统设计的需求,知道我应该做什么了,我觉得这就算是抓住了问题的关键吧。
通过这次设计我了解了单片机的发展概况、特点、应用,各个部件的原理,串行口的通信方式,LCD的工作原理,认识AT89C52与PC机串行通信的原理。
懂得了软件设计流程,通信协议,波特率计算等。
最后再次衷心的感谢黎老师和帮助我的朋友。
有了你们的支持和无私帮助,我才得以顺利完成课程设计。
参考文献
[1]王选民.智能仪器原理及设计[M].北京:
清华大学出版社,2008.
[2]李建中.单片机原理及运用[M].西安:
西安电子科技大学出版社,2001.
[3]康华光.电子技术基础模拟部分(第五版)[M].北京:
高等教育出版社,2006.
[4]谭浩强.C程序设计第三版[M].北京:
清华大学出版社,2006.6.
[5]李惠昇.电梯控制技术[M].北京:
机械工业出版社,2003.
附录
附录1系统原理图:
附图1系统原理图
附录2下位机PCB图:
附图2PCB图
附录3元器件清单
附图3元器件清单
附录4下位机KeilC程序代码
#include
#defineucharunsignedchar//宏定义
#defineuintunsignedint
/*******************************************************************/
sbitlcden=P0^2;//液晶控制口RS和EN
sbitlcdrs=P0^0;
sbitlcdwr=P0^1;
/*******************************************************************/
ucharjieshou,number,biaozhi,xunhuan;
/*******************************************************************/
ucharcodetable1[]={"RX:
"};//液晶固定显示内容
ucharcodetable2[]={"guding"};
ucharcodetable3[]={"weiyi"};
ucharcodetable4[]={"xunhuanweiyi"};
ucharcodetable5[]={"RX:
READY"};
/*******************************************************************/
voiddelay(uintz)//延时z毫秒
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidwrite_com(ucharcom)//液晶写命令
{
lcdrs=0;//写指令
P2=com;
delay(5);
lcden=1;//E端一个正脉冲
delay(5);
lcden=0;
}
voidwrite_data(uchardate)//液晶写数据
{
lcdrs=1;//写数据
P2=date;
delay(5);
lcden=1;//E端一个正脉冲
delay(5);
lcden=0;
}
voidlcd_chushihua()//液晶初始化
{
lcden=0;
lcden=0;
lcdwr=0;
write_com(0x38);
write_com(0x0c);//不打开光标
write_com(0x06);//指针后移
write_com(0x01);//清屏
write_com(0x80);//第一位
}
voidlcd_guding()//写入液晶固定显示部分
{
uinti;
write_com(0x80);//第一行
for(i=0;i<16;i++)
{
write_data(table1[i]);
delay
(2);
}
}
voidlcd_guding1()//写入液晶固定显示部分
{
uinti;
write_com(0x80+0x40);//第二行
for(i=0;i<16;i++)
{
write_data(table2[i]);
delay
(2);
}
}
voidlcd_guding2()//写入液晶固定显示部分
{