www.eeworld.com.cn
讲座专家:EEWORLD 专家——老练
工作单位:南京华岳电子(www.njhuayue.com)
【高手坐堂】“让我们学习 AVR”零起点入门讲座 正在进行中(10.06-10.10)……
http://bbs.eeworld.com.cn/thread-66668-1-1.html
【高手坐堂】之万人学习 51 单片机!(9.12-9.19)已经完毕,资料已整理齐备,仍接受提问。
http://bbs.eeworld.com.cn/thread-66169-1-1.html
【高手坐堂】系列之可配置处理器技术入门 即将(10.13-10.17)举行,敬请期待!
http://bbs.eeworld.com.cn/thread-66904-1-1.html
希望所有学习单片机、对单片机有兴趣的朋友,一起加入单片机阵营!讲座不收费!
51 讲座
记录
混凝土 养护记录下载土方回填监理旁站记录免费下载集备记录下载集备记录下载集备记录下载
:
第一讲 单片机 IO 口的使用
单片机的 IO 口控制是单片机初学者最为关心的问题,如何快速学会使用 IO 是初学者
最为困难的地方。
众多的教科书上面介绍了很多 IO 的原理,这些长篇大论让很多初学者看起来难以理解,
同时也会止步于单片机门外。我们现在所要学习的使用 IO 就是很简单的使用就可以了,IO
无非就是 4 种状态,输出为高、输出为低、输入为高、输入为低。
我们只要把握这四个方面就可以了,先看看我们的单片机接口,单片机共有 32 个 io。
分别为 P0、P1、P2、P3 口,P0 口如果当作 IO 来使用时,必须要使用上拉电阻,因为 51
单片机内部没有上拉这一功能。
在这个学习板上面,大家可以看到 40 个 io 对应的位置,并且在数码管下面就增加了上
拉电阻,使得 io 可以实现。
现在我们以 P1 口接的 led 指示灯来说明输出高低电平的功能,当我们使用汇编程序:
ORG 0000H
LJMP MAIN
ORG 0100H
www.eeworld.com.cn
MAIN: MOV P1,#00H
JMP MAIN
END
这样,P1 口的 led 就会变亮,因为 P1 口赋值#00h 以后,就是将 led 的所有 io 都设置为
低电平了。
如果将 MOV P1,#00H 改成 MOV P1,#0FFH,那么 io 就设置成了高电平,led 就会被熄
灭。当然 C51 中也比较简单。
#include
Main()
{
P1=#00H;
While(1)
{;}
}
这个同样的道理,如果 P1=#0FFH,就是熄灭 led。
当我们对键盘的程序如下图解释:
这个就是我们板子上面的键盘的接线图,当我们单独使用键盘的时候,我们要将 P3.4
置低电平,此时,我们也是根据前面 led 设置 io 的方式进行设置。
如下程序:
ORG 0000H
JMP MAIN
ORG 0100H
MAIN: CLR P3.4
MOV P1,#0FFH
JNB P2.7, MAIN
MOV P1,#00H
JMP MAIN
END
C51 中:
#include
www.eeworld.com.cn
Main()
{
P3^4=0;
While(1)
{
P1=0x0FF;
while(P2^7==0)
{
P1=0x00;
}
}
}
从这 2 个程序都可以看出 io 为低电平和高电平的效果。
第二讲 单片机外部中断使用
很多人都知道 51 单片机中中断的重要性,但是书中的长篇累牍让我们一下子理解有点
很不适应。所以我们尽可能简化 51 单片机的中断,目前我们是要学会单片机中断的使用就
可以了,而不是从原理基本说起。
在 51 单片机中有 2 个外部中断,这两个外部中断口处于低电平的时候开始触发中断信
号,使得程序可以进入中断处理中断部分的程序。
我们还是老规矩,先看看硬件电路:
在图上的单片机原理图中,S0,S1 分别接的是单片机的外部中断 1 和外部中断 2,我们特意
将两个发光二极管放在上面进行指示,以便我们可以看到中断运行的情况,此时我们可以设
置中断程序的要求:
1、 指示灯平时没有中断按下的时候不进行工作,保持原有状态;
2、 当外部中断 0 响应的时候,我们就点亮 D0,让外部中断 0 响应的条件就是按下 S0 按键。
下面就是汇编程序:
www.eeworld.com.cn
ORG 0000H
LJMP MAIN ;主程序
ORG 0003H
LJMP W_INT0 ;进入中断子程序
ORG 0100H
MAIN:MOV SP, #50H ;设置堆栈指针
SETB EA ;CPU 所有中断开(IE 最高位 MSB)
SETB EX0 ;INT0 中断开
CLR IT0 ;INT0 低电平触发(为 1 则为下降沿触发)
MOV P1, #0FFH
JMP $
W_INT0:CLR P1.0
RETI
END
如下是 c51 的程序:
//---------------------------------------------------
#include
//---------------------------------------------------
//重定义 I/0 引脚名称
sbit led1=P1^0;
//---------------------------------------------------
//固定函数声明
void int_0(); //外部中断 0
//---------------------------------------------------
void main(){
P1=0X0FF;
EA=1; // CPU 所有中断开(IE 最高位 MSB)
EX0=1; // INT0 中断开
IT0=0; // INT0 低电平触发(为 1 则为下降沿触发)
while(1){
{
;
}
}
//-------------------------------------------------------------------
//INT0 中断 由 P3.2 引脚产生
void int_0() interrupt 0 using 0
{
led0=0;
}
在上面的程序中,我们可以看出外部中断使用的方法,现在我们学会了使用中断 0,那么我
们现在开始学使用外部中断 1 吧。
首先我们来设置程序的要求:
1、 外部中断 0 点亮 D0,关闭 D1
www.eeworld.com.cn
2、 外部中断 1 点亮 D1,关闭 D0
我们先看看汇编语言的程序:
;---------------------------------------------------------------------
LED0 EQU P1.0
LED1 EQU P1.1
ORG 0000H
LJMP main
ORG 0003H
LJMP W_INT0
ORG 00013H
LJMP W_INT1
ORG 0100H
main:
SETB EA ;CPU 所有中断开(IE 最高位 MSB)
SETB EX0 ;INT0 中断开
CLR IT0 ;INT0 低电平触发(为 1 则为下降沿触发)
SETB EX1 ;INT1 中断开
CLR IT1 ;INT1 低电平触发(为 1 则为下降沿触发)
MOV P1, #0FFH
JMP $
W_INT0:
SETB LED1 ;关闭 LED1
CLR LED0 ;点亮 LED0
RETI
W_INT0:
CLR LED1 ;点亮 LED1
SETB LED0 ;关闭 LED0
RETI
END
这是 c51 的程序:
//---------------------------------------------------
#include
//---------------------------------------------------
//重定义 I/0 引脚名称
sbit LED0=P1^0;
sbit LED1=P1^1;
//---------------------------------------------------
//固定函数声明
void int_0(); //外部中断 0
void int_1(); //外部中断 1
//---------------------------------------------------
www.eeworld.com.cn
void main(){
EA=1; // CPU 所有中断开(IE 最高位 MSB)
EX0=1; // INT0 中断开
IT0=0; // INT0 低电平触发(为 1 则为下降沿触发)
EX1=1; // INT1 中断开
IT1=0; // INT1 低电平触发(为 1 则为下降沿触发)
while(1){
{
;
}
}
//-------------------------------------------------------------------
void initial(){
EA=1; // CPU 所有中断开(IE 最高位 MSB)
EX0=1; // INT0 中断开
IT0=0; // INT0 低电平触发(为 1 则为下降沿触发)
EX1=1; // INT1 中断开
IT1=0; // INT1 低电平触发(为 1 则为下降沿触发)
return;
}
//-------------------------------------------------------------------
//INT0 中断 由 P3.2 引脚产生
void int_0() interrupt 0 using 0
{
Led1=1; //关闭 D1
LED0=0; //点亮 D0
}
//-------------------------------------------------------------------
//INT1 中断 由 P3.3 引脚产生
void int_1() interrupt 2 using 1
{
LED0=1; //关闭 D0
LED1=0; //点亮 D1
}
这样,通过程序和实践,我们就可以很轻易学会了外部中断的使用方法。
第三讲 定时器的使用
www.eeworld.com.cn
关于定时器中断,我们简单介绍一下原理就可以了,因为具体介绍已经有很多资料都已经提
供了。
80C51 单片机内部设有两个 16 位的可编程定时器/计数器。可编程的意思是指其功能
(如工作方式、定时时间、量程、启动方式等)均可由指令来确定和改变。在定时器/计数
器中除了有两个 16 位的计数器之外,还有两个特殊功能寄存器(控制寄存器和方式寄存器)。
我们可以看出,16 位的定时/计数器分别由两个 8 位专用寄存器组成,即:T0 由 TH0 和 TL0
构成;T1 由 TH1 和 TL1 构成。其访问地址依次为 8AH-8DH。每个寄存器均可单独访问。这
些寄存器是用于存放定时或计数初值的。此外,其内部还有一个 8 位的定时器方式寄存器
TMOD 和一个 8 位的定时控制寄存器 TCON。这些寄存器之间是通过内部总线和控制逻辑电路
连接起来的。TMOD 主要是用于选定定时器的工作方式; TCON 主要是用于控制定时器的启动
停止,此外 TCON 还可以保存 T0、T1 的溢出和中断标志。当定时器工作在计数方式时,外部
事件通过引脚 T0 (P3.4)和 T1(P3.5)输入。定时计数器的原理:
当定时器/计数器为定时工作方式时,计数器的加 1 信号由振荡器的 12 分频信号产生,
即每过一个机器周期,计数器加 1,直至计满溢出为止。显然,定时器的定时时间与系统的
振荡频率有关。因一个机器周期等于 12 个振荡周期,所以计数频率 fcount=1/12osc。如果
晶振为 12MHz,则计数周期为:
T=1/(12×106)Hz×1/12=1μs
这是最短的定时周期。若要延长定时时间,则需要改变定时器的初值,并要适当选择
定时器的长度(如 8 位、13 位、16 位等)。
当定时器/计数器为计数工作方式时,通过引脚 T0 和 T1 对外部信号计数,外部脉冲的
下降沿将触发计数。计数器在每个机器周期的 S5P2 期间采样引脚输入电 平。若一个机器周
期采样值为 1,下一个机器周期采样值为 0,则计数器加 1。此后的机器周期 S3P1 期间,新
的计数值装入计数器。所以检测一个由 1 至 0 的跳 变需要两个机器周期,故外部事年的最
高计数频率为振荡频率的 1/24。例如,如果选用 12MHz 晶振,则最高计数频率为 0.5MHz。
虽然对外部输入信号 的占空比无特殊要求,但为了确保某给定电平在变化前至少被采样一
次,外部计数脉冲的高电平与低电平保持时间均需在一个机器周期以上。
当 CPU 用软件给定时器设置了某种工作方式之后,定时器就会按设定的工作方式独立
运行,不再占用 CPU 的操作时间,除非定时器计满溢出,才可能中断 CPU 当前操作。CPU
也可以重新设置定时器工作方式,以改变定时器的操作。由此可见,定时器是单片机中效率
高而且工作灵活的部件。
综上所述,我们已知定时器/计数器是一种可编程部件,所以在定时器/计数器开始工
作之前,CPU 必须将一些命令(称为控制字)写入定时/计数器。将控制字写入定时/计数器
的过程叫定时器/计数器初始化。在初始化过程中,要将工作方式控制字写入方式寄存器,
工作状态字(或相关位)写入控制寄存器,赋定时/计 数初值。下面我们就提出的控制字的
格式及各位的主要功能与大家详细的讲解。
控制寄存器 定时器/计数器 T0 和 T1 有 2 个控制寄存器-TMOD 和 TCON,它们分别用来
设置各个定时器/计数器的工作方式,选择定时或计数功能,控制启动运行,以及作为运行
状态的标志等。其中,TCON 寄存器中另有 4 位用于中断系统。
www.eeworld.com.cn
TMOD 定时器/计数器方式寄存器
定时器方式控制寄存器 TMOD 在特殊功能寄存器中,字节地址为 89H,无位地址。TMOD
的格式如下图所示。
由图可见,TMOD 的高 4 位用于 T1,低 4 使用于 T0,4 种符号的含义如下:
GATE:门控制位。GATE 和软件控制位 TR、外部引脚信号 INT 的状态,共同控制定时器
/计数器的打开或关闭。
C/T:定时器/计数器选择位。C/T=1,为计数器方式;C/T=0,为定时器方式。
M1M0:工作方式选择位,定时器/计数器的 4 种工作方式由 M1M0 设定。
M1M0 工作方式 功能描述
00 工作方式 0 13 位计数器
01 工作方式 1 16 位计数器
10 工作方式 2 自动再装入 8位计数器
11 工作方式 3 定时器 0:分成两个 8位计数器; 定时器 1:停止计数
定时器/计数器方式控制寄存器 TMOD 不能进行位寻址,只能用字节传送指令设置定时
器工作方式,低半字节定义为定时器 0,高半字节定义为定时器 1。复位时,TMOD 所有位均
为 0。
例:设定定时器 1 为定时工作方式,要求软件启动定时器 1 按方式 2 工作。定时器 0
为计数方式,要求由软件启动定时器 0,按方式 1 工作。
我们怎么来实现这个要求呢?
大家先看上面 TMOD 寄存器各位的分布图
第一个问题:控制定时器 1 工作在定时方式或计数方式是哪个位?通过前面的学习,
我们已知道,C/T 位(D6)是定时或计数功能选择位,当 C/T=0 时定时/计数器就为定时工
作方式。所以要使定时/计数器 1 工作在定时器方式就必需使 D6 为 0。
第二个问题:设定定时器 1 按方式 2 工作。上
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
中可以看出,要使定时/计数器 1 工作
在方式 2,M0(D4) M1(D5)的值必须是 1 0。
www.eeworld.com.cn
第三个问题:设定定时器 0 为计数方式。与第一个问题一样,定时/计数器 0 的工作方
式选择位也是 C/T(D2),当 C/T=1 时,就工作在计数器方式。
第四个问题:由软件启动定时器 0,前面已讲过,当门控位 GATE=0 时,定时/计数器的
启停就由软件控制。
第五个问题:设定定时/计数器工作在方式 1,使定时/计数器 0工作在方式 1,M0(D0)
M1(D1)的值必须是 0 1。
从上面的分析我们可以知道,只要将 TMOD 的各位,按规定的要求设置好后,定时器/
计灵敏器就会按我们预定的要求工作。我们分析的这个例子最后各位的情况如下:
D7 D6 D5 D4 D3 D2 D1 D0
0 0 1 0 0 1 0 1
二进制数 00100101=十六进制数 25H。所以执行 MOV TMOD,#25H 这条指令就可以实现上
述要求。
TCON 定时器/计数器控制寄存器
TCON 在特殊功能寄存器中,字节地址为 88H,位地址(由低位到高位)为 88H 一 8FH,由
于有位地址,十分便于进行位操作。
TCON 的作用是控制定时器的启、停,标志定时器溢出和中断情况。
TCON 的格式如下图所示。其中,TFl,TRl,TF0 和 TR0 位用于定时器/计数器;IEl,
ITl,IE0 和 IT0 位用于中断系统。
各位定义如下:
TF1:定时器 1 溢出标志位。当字时器 1 计满溢出时,由硬件使 TF1 置“1”,并且申
请中断。进入中断服务程序后,由硬件自动清“0”,在查询方式下用软件清“0”。
TR1:定时器 1 运行控制位。由软件清“0”关闭定时器 1。当 GATE=1,且 INT1 为高电
平时,TR1 置“1”启动定时器 1;当 GATE=0,TR1 置“1”启动定时器 1。
TF0:定时器 0 溢出标志。其功能及操作情况同 TF1。
TR0:定时器 0 运行控制位。其功能及操作情况同 TR1。
www.eeworld.com.cn
IE1:外部中断 1 请求标志。
IT1:外部中断 1 触发方式选择位。
IE0:外部中断 0 请求标志。
IT0:外部中断 0 触发方式选择位。
TCON 中低 4位与中断有关,我们将在下节课讲中断时再给予讲解。由于 TCON 是可以位
寻址的,因而如果只清溢出或启动定时器工作,可以用位操作命令。例 如:执行“CLR TF0”
后则清定时器 0 的溢出;执行“SETB TR1”后可启动定时器 1 开始工作(当然前面还要设置
方式定)。
定时器/计数器的初始化
由于定时器/计数器的功能是由软件编程确定的,所以一般在使用定时/计数器前都要
对其进行初始化,使其按设定的功能工作。初始货的步骤一般如下:
1、确定工作方式(即对 TMOD 赋值);
2、预置定时或计数的初值(可直接将初值写入 TH0、TL0 或 TH1、TL1);
3、根据需要开放定时器/计数器的中断(直接对 IE 位赋值);
4、启动定时器/计数器(若已规定用软件启动,则可把 TR0 或 TR1 置“1”;若已规定
由外中断引脚电平启动,则需给外引脚步加启动电平。当实现了启动要求后,定时器即按规
定的工作方式和初值开始计数或定时)。
下面介绍一下确定时时/计数器初值的具体方法。
因为在不同工作方式下计数器位数不同,因而最大计数值也不同。
现假设最大计数值为 M,那么各方式下的
最大值 M 值如下:
方式 0:M=213=8 192
方式 1:M=216=65 536
方式 2:M=28=256
方式 3:定时器 0 分成两个 8 位计数器,所以两个 M 均为 256。
因为定时器/计数器是作“加 1”计数,并在计数满溢出时产生中断,因此初值 X 可以
这样计算:
X=M-计数值
www.eeworld.com.cn
下面举例说明初值的确定方法。
例 1、选择 T1 方式 0 用于定时,在 P1.1 输出周期为 1ms 方波,晶振 fosc=6MHz。
解:根据题意,只要使 P1.1 每隔 500us 取反一次即可得到 1ms 的方波,因而 T1 的定
时时间为 500us,因定时时间不长,取方式 0 即可。则 M1 M0=0;因是定时器方式,所以 C/T=0;
在此用软件启动 T1,所以 GATE=0。T0 不用,方式字可任意设置,只要不使其进入方式 3 即
可,一般取 0, 故 TMOD=00H。系统复位后 TMOD 为 0,可不对 TMOD 重新清 0。
下面计算 500us 定时 T1 初始值:
机器周期 T=12/fosc=12/(6×106)Hz=2μs
设初值为 X,则:
(1013-X)×2×10-6s=500×10-6s
X=7942D=1111100000110B=1F06H
因为在作 13 位计数器用时,TL1 的高 3 位未用,应填写 0,TH1 占用高 8 位,所以 X
的实际填写应为:
X=111100000000110B=F806H
结果:TH1=F8H,TL1=06H
源程序如下:
ORG 2000H
MOV TL1,#06H ;给 TL1 置初值
MOV TH1,#0F8H ;给 TH1 置初值
SETB TR1 ;启动 T1
LP1:JBC TF1,LP2 ;查询计数溢出否?
AJMP LP1
LP2:MOV TL1,#06H ;重新设置计数初值
MOV TH1,#0F8H
CPL P1.1 ;输出取反
AJMP LP1 ;重复循环
看了上面的介绍,我们现在应该会计算定时器的初值和设置相关的参数了,下面我们先看看
www.eeworld.com.cn
硬件如何
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
,在 protel99se 中,我们可以设计成如下 led 电路图:
我们在这里还是要设计自己的要求:
使用定时器 0,定时 1s,工作在方式 1,使用 16 位计数方式,让 D0 在 1s 后取反闪烁。
现在我们计算一下:在定时器中最大的延时只能做到 65 多 ms,无法做到 1s,那么我们只
能通过寄存器进行计算,定时器为 50ms,累加到 1s,然后对 D0 进行取反操作。
看如下汇编程序:
LED0 BIT P1.0 ;灯的输出信号
LED1 BIT P1.1
MSS EQU 30H ;20=1s
MS1 EQU 31H
;**************************************************
;主程序
;**************************************************
ORG 0000H
NOP
NOP
LJMP MAIN
ORG 00BH ;计数器
NOP
NOP
LJMP SCAN \
ORG 01BH ;计数器
NOP
NOP
LJMP SCAN1
ORG 0100H
www.eeworld.com.cn
MAIN: MOV P1, #0FFH
MOV P3, #0FFH
MOV SP, #60H ;设置堆栈
MOV MSS, #00H
MOV TH0, #3CH ;50ms
MOV TL0, #0B0H
MOV TH1, #3CH ;50ms
MOV TL1, #0B0H
MOV TMOD, #11H
SETB EA ;打开定时中断
SETB TR0
SETB ET0
SETB TR1
SETB ET1
MOV P1, #0FFH
AJMP $
NOP
;***********************************************
;定时子程序
;***********************************************
SCAN: MOV TH0, #3CH
MOV TL0, #0B0H
PUSH ACC
INC MSS
MOV A, MSS
CJNE A, #20, SCA_E
MOV MSS, #00
CPL LED0 ;1S 到了对 LED0 取反
AJMP SCA_E
SCA_E: POP ACC
RETI
SCAN1: MOV TH1, #3CH
MOV TL1, #0B0H
PUSH ACC
INC MS1
MOV A, MS1
CJNE A, #20, SCA_E1
MOV MS1, #00
CPL LED1 ;1S 到了对 LED0 取反
AJMP SCA_E
SCA_E1: POP ACC
RETI
END
www.eeworld.com.cn
如下为 c51 的程序:
//---------------------------------------------------
#include
//---------------------------------------------------
//重定义 I/0 引脚名称
sbit LED0=P1^0;
sbit LED1=P1^1;
//---------------------------------------------------
//全局变量及位标志定义
unsigned char MSS;
unsigned char MS1;
//---------------------------------------------------
//固定函数声明
void timer_0(); //定时器中断 0
void timer_1(); //定时器中断 1
//---------------------------------------------------
void main(){
TH0= 0x3C ;50ms
TL0=0x0B0;
TH1= 0x3C ;50ms
TL1=0x0B0;
EA=1; ;打开定时中断
TR0=1;
ET0=1;
TR1=1;
ET1=1;
TMOD=0X11;
while(1){
{
;
}
}
//-------------------------------------------------------------------
//定时器 0 中断
void timer_0() interrupt 1 using 2
{
TH0= 0x3C ;50ms
TL0=0x0B0;
MSS=MSS+1;
If(MSS>=20)
{
LED0=!LED0;
}
www.eeworld.com.cn
}
//-------------------------------------------------------------------
//定时器 1 中断
void timer_1() interrupt 3 using 3
{
TH1= 0x3C ;50ms
TL1=0x0B0;
MS1=MS1+1;
If(MS1>=20)
{
LED1=!LED1;
}
}
以上就是定时器的用法,有问题欢迎交流。
第四讲 串口中断知识讲解
MCS-51 单片机的串行口具有两条独立的数据线——发送端 TXD 和接收端 RXD,它允许
数据同时往两个相反的方向传输。一般通信时发送数据由 TXD 端输出,接收数据由 RXD 端输
入。MCS-51 单片机的串行口既可以用于网络通信,亦可实现串行异步通信,还可以用作同
步移位寄存器。如果在串行口的输入输出引脚上加上电平转换器,就可方便地构成
标准
excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载
的
RS-232 接口。MCS-51 单片机的串行接口是一个全双工通信接口,它有两个物理上独立的接
收、发送缓冲器 SBUF,可以同时发送和接收数据。但是发送缓冲器只能写入,不能读出;
接收缓冲器只能读出,不能写入。两个缓冲器共用一个地址(99H)。
数据通信的基本概念
常用于数据通信的传输方式有单工、半双工、全双工和多工方式。
• 单工方式:数据仅按一个固定方向传送。因而这种传输方式的用途有限,常用于串
行口的打印数据传输与简单系统间的数据采集。
• 半双工方式:数据可实现双向传送,但不能同时进行,实际的应用采用某种协议实
现收/发开关转换。
• 全双工方式:允许双方同时进行数据双向传送,但一般全双工传输方式的线路和设备
较复杂。
• 多工方式:以上三种传输方式都是用同一线路传输一种频率信号,为了充分地利用
线路资源,可通过使用多路复用器或多路集线器,采用频分、时分或码分复用技术,
即可实现在同一线路上资源共享功能。
根据同步方式,串行数据通信有两种形式,如图 5-5 所示。
www.eeworld.com.cn
• 异步通信。在这种通信方式中,接收器和发送器有各自的时钟,它们的工作是非同
步的。异步通信用一帧来表示一个字符,其内容是一个起始位,紧接着是若干个数
据位。
• 同步通信。同步通信格式中,发送器和接收器由同一个时钟源控制,在异步通信中,
每传输一帧字符都必须加上起始位和停止位,占用了传输时间,若要求传送数据 量
较大,速度就会慢得多。同步传输方式去掉了这些起始位和停止位,只在传输数据
块时先送出一个同步头(字符)标志即可。
• 同步传输方式比异步传输方式速度快,这是它的优势。但同步传输方式也有其缺点,
即它必须要用一个时钟来协调收发器的工作,所以它的设备也较复杂。
MCS-51 的串行口控制寄存器
在完成串行口初始化后,发送数据时,采用MOV SBUF,A指令,将要发送的数据写入SBUF,
则 CPU 自动启动和完成串行数据的输出;接收数据时,采用 MOV A,SBUF 指令,CPU 就自动
将接收到的数据从 SBUF 中读出。
控制 MCS-51 单片机串行接口的控制寄存器有两个——特殊功能寄存器 SCON 和 PCON,
用以设置串行端口的工作方式、接收/发送的运行状态、接收/发送数据的特征、数据传输率
的大小,以及作为运行的中断标志等,其格式如下:
① 串行口控制寄存器 SCON。SCON 的字节地址是 98H,位地址(由低位到高位)
分别是 98H 一 9FH。SCON 的格式如下:
SM0、SMl:串行口工作方式控制位。
00——方式 0;01——方式 1;
10——方式 2;11——方式 3。
SM2:仅用于方式 2 和方式 3 的多机通信控制位。
发送机 SM2=1(要求程控设置)。
当为方式 2 或方式 3 时:
接收机 SM2=1 时,若 RB8=1,可引起串行接收中断;若 RB8=0,不引起串行接收中
断。SM2=0 时,若 RB8=1,可引起串行接收中断;若 RB8=0,亦可引起串行接收中断。
• REN 串行接收允许位:0——禁止接收;1——允许接收。
• TB8:在方式 2、3 中,TB8 是发送机要发送的第 9 位数据。
• RB8:在方式 2、3 中,RB8 是接收机接收到的第 9 位数据,该数据正好来自发送机
的 TB8。
www.eeworld.com.cn
• TI:发送中断标志位。发送前必须用软件清零,发送过程中 TI 保持零电平,发送完
一帧数据后,由硬件自动置 1。如要再发送,必须用软件再清零。
• RI:接收中断标志位。接收前,必须用软件清零,接收过程中 RI 保持零电平,接收
完一帧数据后,由片内硬件自动置 1。如要再接收,必须用软件再清零。
② 电源控制寄存器 PCON。PCON 的字节地址为 87H,无位地址,其格式如下:
PCON 是为在 CMOS 结构的 MCS-51 单片机上实现电源控制而附加的,对于 HMOS 结构的
MCS-51 系列单片机,除了第 7 位外,其余都是虚设的。与串行通信有关的也就是第 7 位,
称作 SMOD,它的用处是使数据传输率加倍。
SMOD:数据传输率加倍位。在计算串行方式 1,2,3 的数据传输率时;0表示不加倍;
1 表示加倍。
其余有效位说明如下。
GF1、GF2:通用标志位。
PD:掉电控制位,0 表示正常方式,1 表示掉电方式。
IDL:空闲控制位,0 表示正常方式,1 表示空闲方式。
除了以上两个控制寄存器外,中断允许寄存器 IE 中的 ES 位也用来作为串行 I/O 中断
允许位。当 ES=1,允许 串行 I/O 中断;当 ES=0,禁止串行 I/O 中断。中断优先级寄存器
IP 的 PS 位则用作串行 I/O 中断优先级控制位。当 PS=1,设定为高优先级;当 PS =0,设定
为低优先级。
工作方式
MCS-51 单片机可以通过软件设置串行口控制寄存器 SCON 中 SM0(SCON.7)和 SMl
(SCON.6)来指定串行口的 4 种工作方式。串行口操作模式选择如表 5-2 所示。
表 5-2 串行口操作模式选择表
SM0 SM1 模 式 功 能 波 特 率
0 0 0 同步移位寄存器 fOSC/12
0 1 1 8 位 UART 可变(T1 溢出率)
www.eeworld.com.cn
1 0 0 9 位 UART fOSC/64 或
fOSC/32
1 1 1 9 位 UART 可变(T1 溢出率)
其中,fosc是振荡器的频率,UART为通用异步接收和发送器的英文缩写。下面对这 4 种
工作模式作进一步介绍。
1.方式 0
当设定 SM1、SM0 为 00 时,串行口工作于方式 0,它又叫同步移位寄存器输出方式。在
方式 0 下,数据从 RXD(P3.0)端串行输出或输入,同步信号从 TXD(P3.1)端输出,发送
或接收的数据为 8 位,低位在前,高位在后,没有起始位和停止位。数据传输 率固定为振
荡器的频率 1/12,也就是每一机器周期传送一位数据。方式 0 可以外接移位寄存器,将串
行口扩展为并行口,也可以外接同步输入/输出设备。
执行任何一条以 SBUF 为目的的寄存器指令,就开始发送。
2.方式 1
当设定 SM1、SM0 为 01 时,串行口工作于方式 1。方式 1 为数据传输率可变的 8 位异步
通信方式,由 TXD 发 送,RXD 接收,一帧数据为 10 位,1 位起始位(低电平),8 位数据
位(低位在前)和 1 位停止位(高电平)。数据传输率取决于定时器 1 或 2 的溢出速率 (1/
溢出周期)和数据传输率是否加倍的选择位 SMOD。
对于有定时器/计数器 2的单片机,当 T2CON 寄存器中 RCLK 和 TCLK 置位时,用定时器
2 作为接收和发送的数据传输率发生器,而 RCLK=TCLK=0 时,用定时器 1作为接收和发送的
数据传输率发生器。两者还可以交叉使用,即发送和接收采用不同的数据传输率。
类似于模式 0,发送过程是由执行任何一条以 SBUF 为目的的寄存器指令引起的。
3.方式 2
当设定 SM0、SM1 二位为 10 时,串行口工作于方式 2,此时串行口被定义为 9位异步通
信接口。采用这种方式 可接收或发送 11 位数据,以 11 位为一帧,比方式 1 增加了一个
数据位,其余相同。第 9 个数据即 D8 位用作奇偶校验或地址/数据选择,可以通过软件来
控制它,再加特殊功能寄存器 SCON 中的 SM2 位的配合,可使 MCS-51 单片机串行口适用
于多机通信。发送时,第 9 位数据为 TB8,接收时,第 9 位数据送入 RB8。方式 2 的数据传
输率固定,只有两种选择,为振荡率的 1/64 或 1/32 ,可由 PCON 的最高位选择。
4.方式 3
www.eeworld.com.cn
当设定 SM0、SM1 二位为 11 时,串行口工作于方式 3。方式 3 与方式 2 类似,唯一的区
别是方式 3 的数据传输率是可变的。而帧格式与方式 2 一样为 11 位一帧。所以方式 3 也适
合于多机通信。
数据传输率的确定
串行口每秒钟发送(或接收)的位数就是数据传输率。
对方式 0 来说,数据传输率已固定成 fosc/12,随着外部晶振的频率不同,数据传输率
亦不相同。常用的 fosc 有 12MHz 和 6MHz,所以数据传输率相应为 1000×103 和
500×103bit/s。在此方式下,数据将自动地按固定的数据传输率发送/接收,完全不用设置。
对方式 2 而言,数据传输率的计算式为 2SMOD·fosc/64。当 SMOD=0 时,数据传输率
为 fm/64;当 SMOD=1 时,数据传输率为 fosc/32。在此方式下,程控设置 SMOD 位的状态后,
数据传输率就确定了,不需要再作其他设置。
对方式 1 和方式 3 来说,数据传输率和定时器 1 的溢出率有关,定时器 1 的溢出率为:
定时器 1 的溢出率=定时器 1 的溢出次数/秒
方式 1 和方式 3 的数据传输率计算式为:
2SMOD/32×T1 溢出率
根据 SMOD 状态位的不同,数据传输率有 Tl/32 溢出率和 T1/16 溢出率两种。由于 T1
溢出率的设置是方便的,因而数据传输率的选择将十分灵活。
前已叙及,定时器 Tl 有 4 种工作方式,为了得到其溢出率,而又不必进入中断服务程
序,往往使 T1 设置在工作方式 2 的运行状态,也就是 8 位自动加入时间常数的方式。
表 5-3 所示常用数据传输率的设置方法。
表 5-3 常用数据传输率设置方法
定时器 1
数据传输率
/Hz fOSC/MHz SMOD
C/T 方 式 重新装入值
方式 0最大:
1M
方式 2最大:
12
12
X
1
X
X
X
X
X
X
www.eeworld.com.cn
375k
方式 1、3:
62.5k
19.2k
9.6k
4.8k
2.4k
1.2k
110
12
11.0592
11.0592
11.0592
11.0592
11.0592
12
1
1
0
0
0
0
0
0
0
0
0
0
0
0
2
2
2
2
2
2
1
FFH
FDH
FDH
FAH
F4H
E8H
0FEEH
串行通信实例
我们先看看实例图形,我们先设计一个串口通讯的电路,一端和单片机连接,另一端和电脑
连接。如下的 protel 所示:
此图中,使用的晶振是 11.0592mhz 的晶振,和电脑进行通讯,电脑上面
下面是汇编程序
www.eeworld.com.cn
LED0 BIT P1.0
ORG 0000H
LJMP MAIN
ORG 0023H
LJMP TRX
ORG 0100H
MAIN: MOV SP, $50H
MOV TMOD, #21H
MOV SCON, #80H
MOV TH1, #0fdh ;9600bit
MOV TL1, #0fdh
SETB ES
SETB REN
SETB EA
MOV SBUF, #30H ;发送数据第一位
JNB TI, $
CLR TI
MOV SBUF, #31H ;发送数据第一位
JNB TI, $
CLR TI
MOV SBUF, #32H ;发送数据第一位
JNB TI, $
CLR TI
JMP $
TRX: PUSH PSW ;串行中断
www.eeworld.com.cn
PUSH ACC
PUSH DPL
PUSH DPH
JNB RI,ENDRX
clr tb8
CLR RI
MOV A,SBUF
CJNE A,#30H,ENDRX
SETB LED0
ENDRX: POP DPH
POP DPL
POP ACC