锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

单片机基础04

时间:2022-09-16 04:30:00 二极管250rbe3t系列传感器二极管i6k120触发二极管二极管用来发送脉冲3055d5t加速度传感器

单片机基础(04)

4.1 单片机并行IO口的使用

McS-51单片机的内部资源主要有并行1/0口、定时器/计数器、串行接口以及中断系统,MCS-单片机的大部分功能都是通过利用这些资源来实现的。

  1. 并行I/O口实现8位数字输入输出;
  2. 定时器/计数器实现周期性动作或计数外部事件:
  3. 串行接口实现单片机与其他设备的数据通信;
  4. 中断系统及时响应外部事件。

MCS-51单片机有4个8位并行输入/输出接口:P0、P1、P2和P三口。这四个端口可以并行输入或输出8位数据,也可以按位置使用,即每个端口可以独立用作输入或输出接口。

用C51语言编程时,端口输出时,端口号在等号左端,读取时,端口号在等号右端。

PO = 0x80//输出10000000电平到P0口 P1 = OxFF; //读入P1口电平前,输出高电平 i= P1;   //读入P1口电平保存到变量i 

使用单片机P0口接8个发光二极管,P一口接八个开关,编程实现,开关动作时,相应的发光二极管亮或灭。

043018560nXp0Y

# include  void main(void){ 
           unsigned char i;   P1=0xFF;   for( ; ; ){ 
             i=P1;     P0=i;   } } 

4.2 定时器计数器的工作原理和工作模式

定时/计数器的主要特性

  1. 51系列51子系列有两个16位的可编程定时/计数器:TO和T除了52子系列TO,T1,还多一个T2。
  2. 每个模块可以通过编程设置计算系统时钟(定时器)或外部信号(计数器)。
  3. 每个定时/计数器有多种工作方式,不同的工作方式对应于计数长度和初始装载方式。

定时/计数器T0、T1的结构

注意要点:

  1. 因为是加法计数器,每个计数脉冲,加法器内容加1,当从全1加到全0时溢出。如果要计N个单位,则计数器的初始值应为X:

    初值X = 最大计数值(满值)M - 计数值N

    最大计数值(满值)在不同的计数方法下是不同的。一般来说,当定时器/计数器在R位计数方法中工作时,其最大计数值(满值)为2的R次幂。

  2. 当定时/计数器以计数方式工作时,芯片引脚T0-P3.4(或T1-P3.5)输入脉冲计数。

    计数过程:每个机器周期S5P2时刻对T0或T1上电平采样一次,当上一个机器周期采样到高电平,下一个机器周期采样到低电平时,计数器在下一个机器周期S3P2时加1计数一次。

定时/计数器和控制寄存器的方式

一、定时/计数器寄存器TMOD

TMOD D7 D6 D5 D4 D3 D2 D1 D0
(89H) GATE C/T M1 M0 GATE C/T M1 M0
定时器1 定时器0

其中:M1、M0为工作择工作模式的位置T0的四种工作方式,T1选择三种工作方式,选择如下

M1 M0 工作方式 方式说明
0 0 0 定时/计数器13位
0 1 1 定时/计数器16位
1 0 2 计数器
1 1 3 只有两个8位定时/计数器T0有)

C/T:定时或计数选择位,当C/T=1时工作于计数方法;C/T=定时工作0点。

GATE:门控位用于控制定时/计数器的启动是否被外部中断 (INTO,INT1)的影,INTx为高电平时才运行。

二、定时/计数器的控制寄存器TCON

TMOD D7 D6 D5 D4 D3 D2 D1 D0
(88H) TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0

TF1(TF0):定时/计数器T1(T0)的溢出你忑位,当定时/计数器T1计满时,由硬件使它置位。
TR1(TR0):定时/计数器T1(T0)的启动位,当TR1=1时启动;TR1=0时停止。

定时/计数器的工作方式

方式0

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CsD6QlSL-1651326091018)(https://raw.githubusercontent.com/liufiercing/Upic/master/Upic/04 30 19 21 M25vBE.png)]

方式0是13位的定时/计数方式,因而最大计数值(满值)为2的13次幂,等于8192。如计数值为N,则置入的初值X为:
X=8192-N

如定时/计数器T0的计数值为1000,则初值为7192,转换成二进制数为
1110000011000B(1C18H),则TH0=11100000B(E0H ),TL0=00011000B(18H)。

方式1

方式1的结构与方式o结构相同,只是把13位变成16位,16位的加法计数器被全部用上。

由于是16位的定时/计数方式,因而最大计数值(满值)为2的16次幂,等于65536。如计数值为N,则置入的初值X为:
X=65536-N

如定时/计数器TO的计数值为1000,则初值为65536-1000=64536,转换成二进制数为1111110000011000B(FC18H),则TH0=11111100B(FCH),TL0=00011000B(18H)。

方式2

方式2下,16位的计数器只用了8位来计数,用TL0(或TL1)来进行计数,而TH10(或TH1)用于保存初值。当TL0(或TL1)计满时则溢出,一方面使TF0(或TF1)置位,另一方面溢出信号又会触发开关,将TH0(或TH1的值就自动装入TL0(或TL1)。

由于是8位的定时/计数方式,因而最大计数值(满值)为2的8次幂,等于256。如计数值为N,则置入的初值X为:
X=256-N
如定时/计数器T0的计数值为100,则初值为256-100=156,转换成二进制数为10011100B(9CH),则THO=TLO=10011100B。

方式3

方式3只有定时/计数器T0才有,当M1M0两位为11时,定时/计数器T0工作于方式3,方式3的结构如下图。

方式3下,定时/计数器T0被分为两个部分TL0和TH0,其中,TL0可作为定时/计数器使用,占用T0的全部控制位:GATE、C/T、TR0和TF0;而TH0固定只能作定时器使用,对机器周期进行计数,这时它占用定时/计数器T1的TR1位、TF1位和T1的中断资源。

4.3 单片机的定时器的控制接口

定时/计数器的初始化编程及应用

一、定时/计数器的编程

  1. 根据要求选择方式,确定方式控制字,写入TMOD寄存器。
  2. 根据要求计算定时/计数器的计数值,再求得计数初值,写入初值寄存器。
  3. 根据需要,开放定时/计数器中断选项。
  4. 设置定时/计数器控制寄存器TCON,启动定时器。
  5. 等待定时时间到,如用查询处理则编写查询程序判断溢出标志,溢出标志等于1。

如用中断方式处理,编写中断服务程序。

二、定时/计数器的应用举例

利用定时器产生周期性的动作的基本思想:产生周期性的定时,定时时间到做相
应的处理,例如产生周期性的方波,只须定时对输出端取反一次即可。

设系统时钟频率为12MHZ,用定时/计数器T0编程实现从P1.0输出周期为500us的方波。

分析:
从P1.0输出周期为500us的方波,只需P1.0每250ps取反一次则可。当系统时钟为12MHZ,定时器T0工作于方式2时,最大的定时时间为256us,满足250ps的定时要求。

方式控制字应设定为00000010B(02H)。
系统时钟为12MHZ,定时250us,计数值N为250,
初值X=256-250=6,
则TH0=TL0=06H。

硬件电路

采用查询方式处理的程序

#include  //包含特殊功能寄存器库
sbit P1_0=P1^0; 
void main(){ 
        
  char i; 
  TMOD=0x02; 
  TH0=0x06;TL0=0x06; 
  TR0=1; 
  for( ; ; ){ 
        
    if (TF0){ 
        
      TF0=0; 
      P1_0=! P1_0; 
    }//查询计数溢
  }
}

采用中断处理方式的程序

#include  //
sbit P1_0=P1^0;
void main(){ 
        
  TMOD=0x02; 
  TH0=0x06;TL0=0x06; 
  EA=1; 
  ET0=1; 
  TR0=1;
  while(1);
}
void time0_int(void) interrupt 1 { 
        
  P1_0=!P1_0;
}//中断服务程序

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-keYi5FcU-1651326091019)(https://raw.githubusercontent.com/liufiercing/Upic/master/Upic/04 30 19 39 NaYU3y.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i6WuCgwk-1651326091019)(https://raw.githubusercontent.com/liufiercing/Upic/master/Upic/04 30 19 39 9j5M0y.png)]

如果定时时间大于65536us,这时用一个定时/计数器直接处理不能实现,这时可用两个定时/计数器共同处理或一个定时/计数器配合软件计数方式处理。

【例7-3】设系统时钟频率为12MHZ,编程实现从P1.1输出周期为1s的方波。

由于定时时间较长,一个定时/计数器不能直接实现,可用定时/计数器T0产生周
期性为10ms的定时,然后用一个寄存器R2对10ms计数50次或用定时/计数器T1对10ms计数50次实现。

系统时钟为12MHZ,定时/计数器TO定时10ms,计数值N为10000,只能选方式1,方式控制字为00000001B(01H),初值x:

X=65536-10000 =55536 =1101 1000 1111 0000B

则TH0=1101 1000B=D8H TL0=1111 0000B=F0H

用某变量i对计数器溢出中断次数进行软件计数

#include  //包含特殊功能寄存器库
sbit P1_1=P1^1; 
char i; 
void main(){ 
        
  TMOD=0x01; TH0=0xD8;TL0=0xf0; 
  EA=1;ET0=1; 
  i=0; 
  TR0=1; 
  while(1);
}
void time0_int(void) interrupt 1 { 
         //中断服务程序
  TH0=0xD8;TL0=0xf0; 
	i++; 
	if (i= =50) { 
        
    P1_1=! P1_1;
    i=0;
  }
}

4.4 单片机串行通讯的概念和工作原理

串行接口

通讯的基本概念

根据信息传送的方向,通信分为:单工、半双工和全双工三种。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t3p2MhTK-1651326091019)(https://raw.githubusercontent.com/liufiercing/Upic/master/Upic/04 30 19 46 xjddfc.png)]

并行通信和串行通信

同步通信和异步通信

串行通信按信息的格式

串行异步通信

根据通信双方各自的时钟基准,按照约定好的速率传输串行数据。

串行异步通信

通信双方按照同一个时钟信号为基准,根据时钟信号传输串行数据。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XJ0RS8O3-1651326091020)(%E5%9B%BE/image-20220430195037285.png)]

未传送时线路处于空闲状态,空闲线路约定为高电平"1",传送时每一个字符前加一个低电平的起始位,然后是8位数据位,低位在前,高位在后,最后是停止位,停止位用高电平表示。格式如图:

由千一次只传送一个字符,因而一次传送的位数比较少,对发送时钟和接收时钟
的要求相对不高,线路简单,但传送速度较慢。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zfQ9EE3N-1651326091020)(%E5%9B%BE/image-20220430195238642.png)]

串行通信电平标准及硬件接口协议

MCS-51单片机是标准数字电路芯片,其输入输出引脚电平符合TTL电平规则(高电平逻辑3-5V,低电平逻辑0-1V),该电平标准有效传输距离较短(15米以内),不适于远距离通信信号传输。

为了提高串行通信可靠性,增大通信距离,人们定义了各种新的通信电平标准。后经美国电子工业协会(EIA)指定标准规范化,形成RS422,RS232,RS485三种异步串行通信电平标准和硬件接口协议。

RS232接口标准是一种用于短距离或带调制解调器(Modem)的串行通信接口标准,1970年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F0NtmEI5-1651326091020)(https://raw.githubusercontent.com/liufiercing/Upic/master/Upic/04 30 19 54 FEZQEJ.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GC5rwPmB-1651326091021)(https://raw.githubusercontent.com/liufiercing/Upic/master/Upic/04 30 19 55 EFJ8HB.png)]

4.5单片机的串行口工作方式及应用

串行口结构

MCS-51单片机串行口主要由发送数据寄存器、发送控制器、输出控制门、接收数据寄存器、接收控制器、输入移位寄存器等组成

串行口控制寄存器SCON

SCON D7 D6 D5 D4 D3 D2 D1 D0
98H SM0 SM1 SM2 REN TB8 RB8 TI RI

SM0、 SM1:串行口工作方式选择位。

SM0 SM1 方式 功能 波特率
0 0 方式0 移位寄存器方式 f o s c / 12 f_{osc}/12 fosc/12
0 1 方式1 8位异步通信方式 可变
1 0 方式2 9位异步通信方式 f o s c / 32 f_{osc}/32 fosc/32 f o s c / 64 f_{osc}/64 fosc/64
1 1 方式3 9位异步通信方式 可变

SM2:多机通信控制位。
REN:允许接收控制位。
TB8:发送的第9位数据
RB8:接收的第9位数据。
TI:发送中断标志位。
RI:接收中断标志位。

电源控制寄存器PCON

PCON D7 D6 D5 D4 D3 D2 D1 D0
87H SM0D

当SMOD位为1,则串行口方式1、方式2、方式3的波特率加倍。

串行口的工作方式

方式0

方式o通常用来外接移位寄存器,用作扩展I/O口。方式0工作时波特率固定为:
f o s c / 12 f_{osc} /12 fosc/12。工作时,串行数据通过RXD输入和输出,同步时钟通过TXD输出。

发送过程

在TI=0时,当CPU执行一条向SBUF写数据的指令时,启动发送过程。从RXD依次发送出去,同步时钟从TXD送出。8位数据发送完后,发送中断标志TI置位,并向CPU申请中断。

接收过程

在RI=0的条件下,将REN置 “1”就启动一次接收过程。

在移位脉冲的控制下,RXD上的串行数据依次移入移位寄存器。当8位数据全部移入移位寄存器后,8位数据送入接收数据缓冲器SBUF中,同时,接收中断标志RI置位,向CPU申请中断。

利用方式0扩展并行I/O口

MCS-51单片机的串行口在方式0时,当外接一个串入并出的移位寄存器,就可以扩展并行输出口,当外接一个并入串出的移位寄存器时,就可以扩展并行输入口。

用8051单片机的串行口外接串入并出芯片CD4094扩展并行输出口控制一组发光二极管,从左至右延时轮流显示。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CzcQgwQV-1651326091021)(%E5%9B%BE/image-20220430201531453.png)]

4094是一块8位的串入并出的芯片,共16个引脚:

4094的工作过程一般如下:

  1. 使锁存端STB =0,在串行时钟信号CLK的作用下,数据从输入端D按一个时钟周期一位依次串行输入。
  2. 8位数据输入后,使控制端STB=1,输入的内容锁存到内部锁存器。
  3. 使数据输出允许端OE=1,锁存的数据送Q0~Q7行输出;
#include  //包含特殊功能寄存器库
sbit P1_0=P1^0; 
void main(){ 
        
  unsigned char i; 
  unsigned int j; 
	SCON=0x00; //串口初始化方式0
	i=0x01; 
	for (; ;){ 
        
    P1_0=0; //4094串入
    SBUF=i; //51单片机串口发送
    while (!TI) { 
         ;} //等待发送
    P1_0=1;TI=0; //4094并出显示
    for (j=0;j<=254;j++){ 
        
      ;
    } 
 		i=i*2; 
  	if (i==0x00)
    	i=0x01;
  }
}

方式1

方式1为8位异步通信方式,在方式1下,一帧信息为10位:1位起始位(0),8位数据位(低位在前)和1位停止位(1)。

(1)发送过程

在TI=0时,向SBUF写数据,启动发送过程。数据由TXD引1脚送出,在发送时钟的作用下,先通过TXD端送出数据,当一帧数据发送完毕后,由硬件使发送中断标志TI置位。

(2)接收过程

当允许接收控制位REN被置1,启动接收控制器开始接收数据。在接收移位脉冲的控制下依次把所接收的数据移入移位寄存器,当8位数据及停止位全部移入后,进行响应操作。

TXD发送数据端,RXD为接收数据端。波特率可变,由定时/计数器T1的溢出率和电源控制寄存器PCON中的SMOD位决定。

波 特 率 = 2 S M O D ∗ ( T 1 的 溢 出 率 ) / 32 波特率=2SMOD * (T1的溢出率)/32 =2SMOD(T1)/32
T 1 的 溢 出 率 = 波 特 率 × 32 / 2 S M O D T1的溢出率=波特率×32/2^{SMOD} T1=×32/2SMOD

而T1工作于方式2的溢出率可表示为:

T 1 的 溢 出 率 = f o s c / ( 12 × ( 256 − 初 值 ) T1的溢出率=fosc/(12×(256-初值) T1=fosc/(12×256

所以:

T 1 的 初 值 = 256 − f o s c ∗ 2 S M O D / ( 12 ∗ 波 特 率 ∗ 32 ) T1的初值=256 - fosc * 2^{SMOD} /(12*波特率*32) T1=256fosc2SMOD/(1232)

Fosc = 12MHz(12000000Hz)波特率=9600bps SMOD =0 T1的初值=252.744
Fosc = 11.0592MHz(11059200Hz) 波特率-9600bps SMOD =0 T1的初值=253

串行口的编程及应用

设计双机通信系统。要求:甲机P1口开关的状态通过串行口发送到乙机,乙机接收到后通过P2口的发光二极管显示。

甲、乙两机都选择方式1:8位异步通信方式,波特率为1200bps,甲机发送,乙机接收,因此甲机的串口控制字为40H,乙机的串口控制字为50H。

由于选择的是方式1,波特率由定时/计数器T1的溢出率和电源控制寄存器PCON中的SMOD位决定。则须对定时/计数器T1初始化。

设SMOD=0,甲、乙两机的振荡频率为12MHZ,由于波特率为1200。定时/计数器T1选择为

方式2,则初值为:

初 值 = 256 − f o s c ∗ 2 S M O D / ( 12 ∗ 波 特 率 ∗ 32 ) = 256 − 12000000 / ( 12 ∗ 1200 ∗ 32 ) = 230 = E 6 H 初值=256 - fosc *2^{SMOD} /(12 *波特率*32) =256-12000000/(12 *1200*32)=230=E6H =256fosc2SMOD/(1232)=25612000000/(12120032)=230=E6H
根据要求定时/计数器T1的方式控制字为20H。

甲机发送方程序

#include  
void main(void) { 
         
  unsigned char i; 
  SCON=0x40; 
  TMOD=0x20; 
  TL1=0xE6; 
  TH1=0xE6; 
  TR1=1; 
  P1=0xFF;
  while(1){ 
         //发送
    i=P1;
    SBUF=i; 
    while (TI==0);
    TI=0;
    }
}

乙机接收方程序

#include  
void main(void) 
{ 
         
  unsigned char i; 
  SCON=0x50; 
  TMOD=0x20; 
  TL1=0xE6; 
  TH1=0xE6; 
  TR1=1; 
  EA=1; 
  ES=1;
  while(1){ 
         //发送
    ; 
  }
}
void funins(void) interrupt 4 { 
         //接收
  if(RI){ 
        
    RI=0;
    P2=SBUF; 
  }
}

4.6 MCS51单片机中断系统介绍

中断系统

中断的基本概念

当CPU正在处理某一件事A时,发生了另一件事件B,CPU暂时正在执行的程序,转去执行预先设定的处理事件B的程序;处理完毕后,再回到事件A被暂停的程序位置继续处理。这一过程,称之为中断。

  1. 中断源
  2. 中断的嵌套与优先级处理
  3. 中断的响应过程

一、中断源

1.外部中断 INT0和 INT1

外部引脚P3.2和P3.3输入,有两种触发方式:电平触发及跳变(边沿)触发。由特殊功能寄存器TCON来管理。

TCON D7 D6 D5 D4 D3 D2 D1 D0
(88H) TF1 TR1 TF0 TR0 1E1 IT1 IE0 IT0

IT0(IT1):外部中断触发方式设置位
被设置为0,则选择外部中断为电平触发方式;
被设置为1,则选择外部中断为边沿触发方式。
IE0(TE1):外部中断0(或1)的中断请求标志位。

光电式自动迎宾器

在门框两侧安装对射式光电传感器,当顾客进出时,其身体遮挡了光源发出红外光,传感器输出的高低电平,单片机检测到电平变化,进而播放不同的提示音。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ljLbvuAY-1651326091021)(https://raw.githubusercontent.com/liufiercing/Upic/master/Upic/04 30 21 30 K0E3xi.png)]

在电平触发方式时,CPU在每个机器周期采样P3.2,若引脚为低电平,则IE0(E1)置1,向CPU请求中断;CPU响应后能够由硬件自动将IE0(或IE1清零。

在边沿触发方式时,若第一个机器周期采样到P3.2引脚为高电平,第二个机器周期采样为低电平时,由IE0(或IE1)置1,向CPU请求中断。

2. 定时/计数器T0和T1中断

当定时/计数器T0(或T1)溢出时,由硬件置TF0(或TF1)为“1”,向CPU发送中断请求,当CPU响应中断后,将由硬件自动清除TF0(或TF1)。

3.串行口中断

Mcs-51的串行口中断源对应两个中断标志位:串行口发送中断标志位T1和串行口接收中断标志位RI。无论哪个标志位置“1”,都请求串行口中断,到底是发送中断TI还是接收中断RI,只有在中断服务程序中通过指令查询来判断。

4.定时/计数器T2中断

只针对52系列单片机,当定时/计数器T2溢出时,向CPU发送中断请求。

二、中断允许控制

MCS-51单片机中没有专门的开中断和关中断指令,对各个中断源的允许和屏蔽是由内部的中断允许寄存器IE的各位来控制的。

IE D7 D6 D5 D4 D3 D2 D1 D0
(A8H) EA ET2 ES ET1 EX1 ET0 EX0

EA(Enable ALL):中断允许总控位。
ET2, ET1,ETO:定时器/计数器T2,T1,TO的溢出中断允许位。
ES:串行口中断允许位。
EX1,EXO: 外部中断 INT1,INTO 的中断允许位。

系统对各中断源,默认给出优先权顺序

三、优先权控制

每个中断源有两级控制:高优先级和低优先级。通过由内部的中断优先级寄存器IP来设置。中断优先级寄存器IP(Interrupt Priority)的字节地址为B8H,可以进行位寻址。

IP D7 D6 D5 D4 D3 D2 D1 D0
(B8H) PT2 PS PT1 PX1 PT0 PX0

PT2,PT1,PTO:定时器T2,T1,T0的中断优先级控制位。
PS:串行口的中断优先级控制位。
PX1,PX0:外部中断INT1,INTO的中断优先级控制位。
如果IP中某一位被置"1",表示对应中断源被设为高优先级;否则为低优先级。

对于中断优先权和中断嵌套,MCS-51单片机有以下三条

  1. 正在进行的中断过程不能被新的同级

相关文章