PC与单片机串口通信LCD显示其接收字符Word下载.docx
《PC与单片机串口通信LCD显示其接收字符Word下载.docx》由会员分享,可在线阅读,更多相关《PC与单片机串口通信LCD显示其接收字符Word下载.docx(20页珍藏版)》请在冰豆网上搜索。
对于两个进行通信的端口,这些参数必须匹配。
a,波特率:
这是一个衡量通信速度的参数。
它表示每秒钟传送的位的个数。
例如300波特表示每秒钟发送300个位。
通常电话线的波特率为14400,28800和36600。
波特率可以远远大于这些值,但是波特率和距离成反比。
高波特率常常用于放置的很近的仪器间的通信,典型的例子就是GPIB设备的通信。
b,数据位:
这是衡量通信中实际数据位的参数。
当计算机发送一个信息包,实际的数据不会是8位的,标准的值是6、7和8位。
如何设置取决于你想传送的信息。
比如,标准的ASCII码是0~127(7位)。
扩展的ASCII码是0~255(8位)。
如果数据使用简单的文本(标准ASCII码),那么每个数据包使用7位数据。
每个包是指一个字节,包括开始/停止位,数据位和奇偶校验位。
由于实际数据位取决于通信协议的选取,术语“包”指任何通信的情况。
c,停止位:
用于表示单个包的最后一位。
典型的值为1,1.5和2位。
由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。
因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。
适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。
d,奇偶校验位:
在串口通信中一种简单的检错方式。
有四种检错方式:
偶、奇、高和低。
当然没有校验位也是可以的。
对于偶和奇校验的情况,串口会设置校验位(数据位后面的一位),用一个值确保传输的数据有偶个或者奇个逻辑高位。
例如,如果数据是011,那么对于偶校验,校验位为0,保证逻辑高的位数是偶数个。
如果是奇校验,校验位为1,这样就有3个逻辑高位。
高位和低位不真正的检查数据,简单置位逻辑高或者逻辑低校验。
这样使得接收设备能够知道一个位的状态,有机会判断是否有噪声干扰了通信或者是否传输和接收数据是否不同步。
一AT89C52:
AT89C52是51系列单片机的一个型号,它是ATMEL公
司生产的。
AT89C52是一个低电压,高性能CMOS8位单片机,片内含8kbytes的可反
复擦写的Flash只读程序存储器和256bytes的随机存取数据存储器(RAM),器
件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,功能强大的AT89C52单片机可为您提供许多较复杂系统控制应用场合。
AT89C52有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2
个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2个读写口
线,AT89C52可以按照常规方法进行编程,但不可以在线编程(S系列的才支持在
线编程)。
其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写
的Flash存储器可有效地降低开发成本。
AT89C52有PDIP、PQFP/TQFP及PLCC等三种封装形式,以适应不同产品的需求。
二MAX232芯片:
是MAXIM公司生产的、包含两路接收器和驱动器的IC芯片,适用于各种EIA-232C和V.28/V.24的通信接口。
MAX232芯片的功能:
MAX232内部有一个电源电压变换器,可以把输入的
+5V电源电压变换成为RS-232C输出电平所需的±
10V电压。
所以,采用此芯片接口的串行通信系统只需单一的+5V电源就可以了。
对于没有±
12V电源的场合,其适应性更强
图4中,上半部分的的电容C1,C2,C3,C4以及V+,V-是电源变换电路部分。
在实际应用中,器件对电源噪声很敏感。
因此,VCC必须要对地加去耦电容C5,电容C1,C2,C3和C4取同样数值的钽电容,用以提高抗干扰能力。
在连接时必须尽量靠近器件。
下半部分为发送和接收部分。
实际应用中T1IN和T2IN可直接接TTL/CMOS电平的89C52单片机的串行发送端TXD;
R1OUT和R2OUT可直接接TTL/CMOS电平的89C52单片机的的串行接收端;
T1OUT和T2OUT可直接接PC的RS-232串口的接收端RXD;
R1IN和R2IN直接接PC的RS-232串口的发送端TXD。
三9针串口:
一个完整的RS-232接口是一个25针的D型插头座,25
针的连接器实际上只有9根连接线,所以就产生了一个简化的9针D型RS-232
插头座,常用的就是一个9针的D型插头座。
EIA-RS-232C对电器特性、逻辑电平和各种信号线功能都作了规定:
在TxD和RxD上:
逻辑1(MARK)=-3V~-15V
逻辑0(SPACE)=+3~+15V
在RTS、CTS、DSR、DTR和DCD等控制线上:
信号有效(接通,ON状态,正电压)=+3V~+15V
信号无效(断开,OFF状态,负电压)=-3V~-15V
介于-3~+3V之间的电压无意义,低于-15V或高于+15V的电压也认为无意义。
因此如果要进行通信,还要对信号的电平进行转换,比如使用MAX3232芯片来转换电平。
使用串口进进行通信时,我们最主要关心的时以下这三个引脚:
5
GND
2
RXD
3
TXD
我们还要注意串口插座有公母两种类型其中:
公的串口插座是带有插针的
(有针)
母的串口插座是不带有插针的(有洞).
工作方式寄存器TMOD用于设置定时/计数器的工作方式,低四位用于T0,高四位用于T1。
其格式如下:
GATE:
门控位。
GATE=0时,只要用软件使TCON中的TR0或TR1为1,就可以启动定时/计数器工作;
GATA=1时,要用软件使TR0或TR1为1,同时外部中断引脚或也为高电平时,才能启动定时/计数器工作。
即此时定时器的启动多了一条件。
C/T:
定时/计数模式选择位。
=0为定时模式;
=1为计数模式。
M1M0:
工作方式设置位。
定时/计数器有四种工作方式,由M1M0进行设置。
TCON的低4位用于控制外部中断,已在前面介绍。
TCON的高4位用于控制定时/计数器的启动和中断申请。
▪TF1(TCON.7):
T1溢出中断请求标志位。
T1计数溢出时由硬件自动置TF1为1。
CPU响应中断后TF1由硬件自动清0。
T1工作时,CPU可随时查询TF1的状态。
所以,TF1可用作查询测试的标志。
TF1也可以用软件置1或清0,同硬件置1或清0的效果一样。
▪TR1(TCON.6):
T1运行控制位。
TR1置1时,T1开始工作;
TR1置0时,T1停止工作。
TR1由软件置1或清0。
所以,用软件可控制定时/计数器的启动与停止。
▪TF0(TCON.5):
T0溢出中断请求标志位,其功能与TF1类同。
▪TR0(TCON.4):
T0运行控制位,其功能与TR1类同。
定时/计数器应用举例
初始化程序应完成如下工作:
▪对TMOD赋值,以确定T0和T1的工作方式。
▪计算初值,并将其写入TH0、TL0或TH1、TL1。
▪中断方式时,则对IE赋值,开放中断。
▪使TR0或TR1置位,启动定时/计数器定时或计数。
中断请求标志
▪1、TCON的中断标志
▪
▪IT0(TCON.0),外部中断0触发方式控制位。
▪当IT0=0时,为电平触发方式。
▪当IT0=1时,为边沿触发方式(下降沿有效)。
▪IE0(TCON.1),外部中断0中断请求标志位。
▪IT1(TCON.2),外部中断1触发方式控制位。
▪IE1(TCON.3),外部中断1中断请求标志位。
▪TF0(TCON.5),定时/计数器T0溢出中断请求标志位。
▪TF1(TCON.7),定时/计数器T1溢出中断请求标志位。
中断允许控制
CPU对中断系统所有中断以及某个中断源的开放和屏蔽是由中断允许寄存器IE控制的。
▪EX0(IE.0),外部中断0允许位;
▪ET0(IE.1),定时/计数器T0中断允许位;
▪EX1(IE.2),外部中断0允许位;
▪ET1(IE.3),定时/计数器T1中断允许位;
▪ES(IE.4),串行口中断允许位;
▪EA(IE.7),CPU中断允许(总允许)位。
中断响应条件和时间
中断响应条件
▪中断源有中断请求;
▪此中断源的中断允许位为1;
▪CPU开中断(即EA=1)。
以上三条同时满足时,CPU才有可能响应中断。
二串口控制寄存器SCON设置
串行口控制寄存器SCON
字节地址98H,可位寻址,格式如图所示。
scon寄存器结构
scond7d6d5d4d3d2d1d0
sm0sm1sm2rentb8rb8tiri
位地址9fh9eh8dh9ch9bh9ah99h98h
(1)SM0、SM1——串行口4种工作方式的选择位
表串行口的4种工作方式
SM0SM1方式功能说明
000同步移位寄存器方式(用于扩展I/O口)
0118位异步收发,波特率可变(由定时器控制)
1029位异步收发,波特率为fosc/64或fosc/32
1139位异步收发,波特率可变(由定时器控制)
(2)SM2——多机通信控制位
用于方式2或方式3中。
当串行口以方式2或方式3接收时,
如果SM2=1,只有当接收到的第9位数据(RB8)为“1”时,才将接收到的前8位数据送入SBUF,并置“1”RI,产生中断请求;
当接收到的第9位数据(RB8)为“0”时,则将接收到的前8位数据丢弃。
如果SM2=0,则不论第9位数据是“1”还是“0”,都将前8位数据送入SBUF中,并置“1”RI,产生中断请求。
在方式1时,如果SM2=1,则只有收到停止位时才会激活RI。
在方式0时,SM2必须为0。
(3)REN——允许串行接收位
由软件置“1”或清“0”。
REN=1允许串行口接收数据。
REN=0禁止串行口接收数据。
(4)TB8——发送的第9位数据
方式2和3时,TB8是要发送的第9位数据,可作为奇偶校验位使用,也可作为地址帧或数据帧的标志。
=1为地址帧,=0为数据帧
(5)RB8——接收到的第9位数据
方式2和3时,RB8存放接收到的第9位数据。
在方式1,如果SM2=0,RB8是接收到的停止位。
在方式0,不使用RB8。
(6)TI——发送中断标志位
方式0时,串行发送第8位数据结束时由硬件置“1”,其它工作方式,串行口发送停止位的开始时置“1”。
TI=1,表示一帧数据发送结束,可供软件查询,也可申请中断。
CPU响应中断后,向SBUF写入要发送的下一帧数据。
TI必须由软件清0。
(7)RI——接收中断标志位
方式0时,接收完第8位数据时,RI由硬件置1,其它工作方式,串行接收到停止位时,该位置“1”。
RI=1,表示一帧数据接收完毕,并申请中断,CPU从接收SBUF取走数据。
该位状态也可软件查询。
RI必须由软件清“0”。
特殊功能寄存器PCON
字节地址为87H,没有位寻址功能。
spcond7d6d5d4d3d2d1d0
SMODxxxxxxxxxxxxxx
SMOD:
波特率选择位。
例如:
方式1的波特率的计算公式为:
方式1波特率=(2SMOD/32)×
定时器T1的溢出率
也称SMOD位为波特率倍增位。
串行口的4种工作方式
方式0
同步移位寄存器输入/输出方式,常用于外接移位寄存器,以扩展并行I/O口。
8位数据为一帧,不设起始位和停止位,先发送或接收最低位。
波特率固定为fosc/12。
帧格式如下:
d0d1d2d3d4d5d6d7........
1.方式0发送
当CPU执行一条将数据写入发送缓冲器SBUF的指令时,产生一个正脉冲,串行口即把SBUF中的8位数据以
fosc/12的固定波特率从RXD引脚串行输出,低位在先,TXD引脚输出同步移位脉冲,发送完8位数据置“1”中断标志位TI。
2.方式0接收
REN=1,接收数据,REN=0,禁止接收。
REN=1,允许接收。
向串口的SCON写入控制字(置为方式0,并置“1”REN位,同时RI=0)时,产生一个正脉冲,串行口即开始接收数据。
RXD为数据输入端,TXD为移位脉冲信号输出端,接收器也以fosc/12的固定波特率采样RXD引脚的数据信息,当收到8位数据时置“1”RI。
表示一帧数据接收完.
方式0下,SCON中的TB8、RB8位没有用到,发送或接收完8位数据由硬件置“1”TI或RI,CPU响应中断。
TI或RI须由用户软件清“0”,可用如下指令:
CLRTI;
TI位清“0”
CLRRI;
RI位清“0”
方式0时,SM2位必须为0。
方式1
SM0、SM1=01
方式1一帧数据为10位,1个起始位(0),8个数据位,1个停止位
(1),先发送或接收最低位。
方式1波特率=(2^SMOD/32)×
SMOD为PCON寄存器的最高位的值(0或1)。
1.方式1发送
方式1输出时,数据由TXD输出,
一帧信息为10位,1位起始位0,8位数据位(先低位)和1位停止位1。
当执行一条数据写发送缓冲器SBUF的指令,就启动发送。
。
发送开始时,内部发送控制信号变为有效。
将起始位向TXD输出,此后,每经过一个TX时钟周期,便产生一个移位脉冲,并由TXD输出一个数据位。
8位数据位全部发送完毕后,置“1”TI。
2.方式1接收
数据从RXD(P3.0)脚输入。
当检测到起始位的负跳变时,开始接收数据。
定时控制信号有两种):
接收移位时钟(RX时钟,频率和波特率相同)和位检测器采样脉冲(频率是RX时钟的16倍,1位数据期间,有16个采样脉冲),当采样到RXD端从1到0的跳变时就启动检测器,接收的值是3次连续采样(第7、8、9个脉冲时采样)进行表决以确认是否是真正的起始位(负跳变)的开始。
当一帧数据接收完,须同时满足两个条件,接收才真正有效。
⑴RI=0,即上一帧数据接收完成时,RI=1发出的中断请求已被响应,SBUF中的数据已被取走,说明“接收SBUF”已空。
⑵SM2=0或收到的停止位=1(方式1时,停止位已进入RB8),则收到的数据装入SBUF和RB8(RB8装入停止位),且置“1”中断标志RI。
若这两个条件不同时满足,收到的数据将丢失。
方式2
9位异步通信接口。
每帧数据均为11位,1位起始位0,8位数据位(先低位),1位可程控的第9位数据和1位停止位。
帧格式如下。
方式2波特率=(2^SMOD/64)×
fosc
1.方式2发送
发送前,先根据通讯协议由软件设置TB8(例如,双机通讯时的奇偶校验位或多机通讯时的地址/数据的标志位)。
2.方式2接收
SM0、SM1=10,且REN=1。
数据由RXD端输入,接收11位信息。
当位检测到RXD从1到0的负跳变,并判断起始位有效后,开始收一帧信息。
在接收器完第9位数据后,需满足两个条件,才能将接收到的数据送入SBUF。
(1)RI=0,意味着接收缓冲器为空。
(2)SM2=0或接收到的第9位数据位RB8=1时。
当上述两个条件满足时,接收到的数据送入SBUF(接收缓冲器),第9位数据送入RB8,并置“1”RI。
若不满足两个条件,接收的信息将被丢弃。
方式3
SM0、SM1=11,串口为方式3。
波特率可变的9位异步通讯方式,除波特率外,方式3和方式2相同。
方式3波特率=(2^SMOD/32)×
多机通讯
要保证主机与所选择的从机实现可靠地通讯,必须保证串口具有识别功能。
SCON中的SM2位就是满足这一条件而设置的多机通讯控制位。
原理:
在串行口以方式2(或方式3)接收时,若SM2=1,表示置多机通讯功能位,这时有两种可能:
(1)接收到的第9位数据为1时,数据才装入SBUF,并置中断标志RI=1向CPU发出中断请求;
(2)接收到的第9位数据为0时,则不产生中断标志,信息将抛弃。
若SM2=0,则接收的第9位数据不论是0还是1,都产生RI=1中断标志,接收到的数据装入SBUF中。
应用上述特性,便可实现MCS-51的多机通讯。
设多机系统中有一主机和3个8031从机,如下图。
主机的RXD与从机的TXD相连,主机TXD与从机的RXD端相连。
从机地址分别为00H、01H、02H。
多机通讯工作过程:
(1)从机串行口编程为方式2或方式3接收,且置“1”SM2和REN位,使从机只处于多机通讯且接收地址帧的状态。
(2)主机先将从机地址(即准备接收数据的从机)发给各从机,主机发出的地址信息的第9位为1,
各从机接收到的第9位信息RB8为1,且由于SM2=1,则置“1”RI,各从机响应中断,执行中断程序。
在中断服务子程序中,判主机送来的地址是否和本机地址相符合,相符则该从机清“0”SM2位,准备接收主机的数据或命令;
若不符,则保持SM2=1状态。
(3)接着主机发送数据帧,此时各从机串行口接收到
的RB8=0,只有地址相符合的从机系统(即已清“0”SM2位的从机)才能激活RI,从而进入中断,在中断程序中接收主机的数据(或命令);
其它的从机因SM2=1,又RB8=0不激活中断标志RI,不能进入中断,接收的数据丢失。
前图所示的多机系统是主从式,由主机控制多机之间的通讯,从机和从机的通讯只能经主机才能实现。
7.4波特率的制定方法
方式0、方式2的波特率是固定的;
方式1、方式3波特
率由定时器T1的溢出率来确定。
7.4.1波特率的定义
波特率的定义。
对于定时器的不同工作方式,波特率的范围不一
7.4.2定时器T1产生波特率的计算
(1)方式0波特率=时钟频率fosc×
1/12,不受SMOD位的值的影响。
若fosc=12MHz,波特率为fosc/12即1Mb/s。
(2)方式2波特率=(2SMOD/64)×
fosc
若fosc=12MHz:
SMOD=0波特率=187.5kb/s;
SMOD=1波特率=375kb/s
(3)方式1或方式3时,波特率为:
波特率=(2SMOD/64)×
T1的溢出率
实际设定波特率时,T1常设置为方式2定时(自动装初值)这种方式不仅操作方便,也可避免因软件重装初值而带来的定时误差。
实际使用时,为避免烦杂的初值计算,常用的波特率和初值X间的关系列成表7-2(P148),以供查用。
表7-2有两点需要注意:
(1)时钟振荡频率为12MHz或6MHz时,表中初值X和相应的波特率之间有一定误差。
例如,FDH的对应的理论值是10416波特(时钟6MHz)。
与9600波特相差
816波特,消除误差可以调整时钟振荡频率fosc实现。
例如采用的时钟振荡频率为11.0592MHz。
(2)如果串行通讯选用很低的波特率,例如,波特率选为55,可将定时器T1设置为方式1定时。
但在这种情况下,T1溢出时,需用在中断服务程序中重新装入初值。
中断响应时间和执行指令时间会使波特率产生一定的误差,可用改变初值的方法加以调整。
组成:
驱动器,
控制器,
液晶板。
引脚:
第1脚:
VSS为地电源。
第2脚:
VDD接5V正电源。
第3脚:
VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。
第4脚:
RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
第5脚:
R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。
当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。
第6脚:
E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
第7~14脚:
D0~D7为8位双向数据线。
第15脚:
背光源正极。
第16脚:
背光源负极。
命令:
指令1:
清显示,指令码01H,光标复位到地址00H位置。
指令2:
光标复位,光标返回到地址00H。
指令3:
光标和显示模式设置I/D:
光标移动方向,高电平右移,低电平左移S:
屏幕上所有文字是否左移或者右移。
高电平表示有效,低电平则无效。
指令4:
显示开关控制。
D:
控制整体显示的开与关,高电平表示开显示,低电平表示关显示C:
控制光标的开与关,高电平表示有光标,低电平表示无光标B:
控制光标是否闪烁,高电平闪烁,低电平不闪烁。
指令5:
光标或显示移位S/C:
高电平时移动显示的文字,低电平时移动光标。
指令6:
功能设置命令DL:
高电平时为4位总线,低电平时为8位总线N:
低电平时为单
行显示,高电平时双行显示F:
低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符。
指令7:
字符发生器RAM地址设置。
指令8:
DDRAM地址设置。
指令9:
读忙信号和光标地址BF:
为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。
指令10:
写数据。
指令11:
读数据。
#include<
reg52.h>
#defineucharunsignedchar
#defineuintunsignedint
sbitRS=P2^5;
sbitRW=P2^6;
sbitEN=P2^7;
sbitLED=P3^6;
uchar