51单片机之 IE,TCON,TMOD 寄存器 (超详细解读-内含详细代码)

        因为肝了一天,对单片机寄存器有点了解,特地来分享一下。这篇文章主要带大家讲解 51单片机 IE,TCON,TMOD 寄存器 的含义 及 外部中断 和 定时器的使用。

首先是 中断允许寄存器IE:

中断允许寄存器IE

 

位序号

7

6

5

4

3

2

1

0

位符号

EA

-

-

ES

ET1

EX1

ET0

EX0

 

总允许位

 

 

串行口中断允许位

定时器T1溢出中断允许位

外部中断1允许位

定时器T0溢出中断允许位

外部中断 INT0允许位

 

EA=1,CPU开放中断

 

 

ES=1,允许串行口中断

ET1=1,允许T1中断

EX1=1,允许外部中断1中断

ET0=1,允许T0中断

EX0=1,允许外部中断0中断


EX0:外部中断 INT0 允许位。当 EX0 = 1,允许外部中断INT 0 中断。当 EX0 = 0 ,不允许外部中断 0 中断。EX1 同上。

ET0:定时器T0溢出中断允许位.。当 ET0 = 1, 允许 T0 中断。当 ET0 = 0, 不允许 T0 中断。ET1同上。

ES:串行口中断允许位。当 ES = 1,  允许串口中断。当 ES = 0,  不允许串口中断。

EA:总允许位。当 EA = 1, CPU开开放中断。当 EA = 0, CPU 不开放中断。

 

然后是

定时器/计数器控制寄存器: TCON

 

寄存器

 

TCON

 

 

定时/计数

外部中断

位序号

7

6

5

4

3

2

1

0       

位符号

TF1

TR1

TF0

TR0

IE1

IT1

IE0

IT0

 

T1溢出标志位

定时计数器1控制位

T0溢出标志位

定时计数器0控制位

外部中断INT1请求中断标志位

外部中断INT1触发方式控制位

外部中断0请求中断标志位

外部中断INT0触发方式控制位

 

TF1=1表示T1有中断产生(硬件控制)

TR1=1表示T1开始运行

TF0=1表示T0有中断产生(硬件控制)

TR0=1表示T0开始运行

IE1=1,INT1有中断产生(硬件控制)

IT1=1时,INT1为跳变沿触发方式

IE1=1,INT0有中断产生(硬件控制)

IT0=1时,INT0为跳变沿触发方式

注意:IE0 IE1 TF0 TF1 是标志位,可以理解为由单片机控制,不用我们控制。

IT1:  当 IT1 = 1  时,为跳变沿触发方式,INT1上的电平从高到低的负跳变有效

                                (可以由按键button触发);

             IT1 = 0 时,电平触发方式,INT1上低电平有效。

IT0同上。

注意:IT1 IT0 只是来设置方式。

IE1:

当 IT1 = 1  (方式!!!) 时,若 INT1 为由高电平向低电平的跳变时则将 IE1 置1 (IE1 = 1)

         IE1 = 1  时,外部中断1正在向CPU申请中断。CPU响应时,转向中断服务程 序时,该            位由硬件清 0( IE1 = 0)。

当IT1 = 0  (方式!!!)时,若INT1为低电平时,则置1 (IE1 = 1),否则IE1清0 (IE1=0)。

IE0同上。 注意:(可以无需人为控制,由单片机控制)

TR1:

定时器T1的运行控制位。

当 GATE = 0, TR1 =1  时就允许T1开始计数,TR1=0时禁止T1计数。

当 GATE = 1,TR1 = 1 且外部中断1输入位高电平时,才允许T1计数。

TR0同上。

TF1:

      T1被允许计数以后,从初值开始加1计数。当最高位产生溢出时由硬件置‘1’(TF1=1),此时向CPU请求中断,一直保持到CPU响应中断时,才由硬件清‘0’ (TF1=0)。

TF0同上。注意:(可以无需人为控制,由单片机控制)

下面以外部中断 0 为例讲一下使用步骤:

  1. 开总中断打开   EA = 1
  2. INT0 中断打开  EX0 = 1
  3. 选择触发方式:IT0=1 
  4. 写中断程序: void int0(void) interrupt 0 { 我是程序 } 

讲了那么多,接下来我们开始上代码吧。

#include "reg52.h"  //注意:如果是keil5需把头文件换成  #include <REGX52.H> typedef unsigned int u16;typedef unsigned char u8;//定义P1led为P1口 注意:如果是P0口需上拉电阻#define P1led P1//延时函数void Delay(u16 i){while(i--);}//数码管u8 code Leds[] = {0x3F, // 00x06, // 10x5B, // 20x4F, // 30x66, // 40x6D, // 50x7D, // 60x07, // 70x7F, // 80x6F, // 9};//定义,通过for遍历 共阳接法点亮需输出低电平u8 led_status_g[] = { 0xFE, //0 1111 11100xFD, //1 1111 11010xFB, //2 1111 10110xF7, //3 1111 01110xEF, //4 1110 11110xDF, //5 1101 11110xBF, //6 1011 11110x7F  //7 0111 1111};void int0Init(){   EA = 1; //总中断打开 EX0 = 1; //外部中断0打开IT0 = 1; //INT0为跳变沿触发方式}void int1Init(){EA = 1;EX1 = 1;IT1 = 1;}void main(){int0Init();int1Init();IP = 0x01;   //IP=0x01是外部中断0设置为高优先级中断P2 = 0x3f;   //数码管一开始显示0while(1){u16 i;for(i = 0; i < 10; i++) {P1led = led_status_g[i];Delay(50000);  //延时}}}//外部中断 0 由 button01 控制 void int0(void) interrupt 0 { u16 i; for(i = 0;i < 10; i++){P2 = Leds[i];         Delay(50000);}P2 = 0x3f; }//外部中断 1 由 button02 控制void int1(void) interrupt 2{int j;for(j = 1; j < 5; j++) {//P1口P1led = 0x00;  //此时P1口灯全亮Delay(50000);    P1led = 0xFF;  //此时P1口灯全暗 Delay(50000);}}

下面是仿真图:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6L-b5Ye755qE57yW56iL54ix5aW96ICFX-mAkOm5vw==,size_19,color_FFFFFF,t_70,g_se,x_16

因为设置了 IP = 0x01; 所以 外部中断 0的优先级别高。按下button01,外部中断0开始执行。

 

最后讲一下

定时器/计数器工作方式寄存器 TMOD:

TMOD

 

 

定时器1

定时器0

7

6

5

4

3

2

1

0

位符号

GATE

C/T

M1

M0

GATE

C/T

M1

M0

 

门控制

C/T=0,定时器模式。C/T=1,计数器模式。

用来选择定时计/计数器的工作方式

用来选择定时计/计数器的工作方式

门控制

C/T=0,定时器模式。C/T=1,计数器模式。

用来选择定时计/计数器的工作方式

用来选择定时计/计数器的工作方式

 注意:对GATE:

当GATE=0, TR1=1时就允许T1开始计数,TR1=0时禁止T1计数。

当GATE=1,TR1=1且外部中断1输入位高电平时,才允许T1计数。

注意:

C/T=1时为计数功能: 加1计数器对来自输入引脚T0(P3.4)和T1(P3.5)的外信号脉冲进行计                   数,每来一个脉冲,计数器加1,直到计时器TF1或TF0满溢出

C/T=0时为定时功能: 加1计数器对脉冲f进行计数,每来一个脉冲,计数器加1,

          直到计时器TF1或TF0满溢出

M1

M0

TMOD-T0

TMOD-T1

工作模式

说明

0

0

0x00

0x00

方式0

13位计时计数器 (8192)

0

1

0x01

0x10

方式1(常用)

16位计时计数器 (65536)

1

0

0x02

0x20

方式2

8位计时计数器,可自动重新载入计数值 (256)

1

1

0x03

0x30

方式3

仅适用于T0,分成两个8位计数器,T1停止计数

注意: 

如何定时:

方式1时, 此时定时器的位数为16, (高8位送给TH 1/0,低8位送给TL 1/0 )

注意:

因为完成一条指令需要一个机器周期,一个机器周期有12个振荡周期,振荡周期可以理解为晶振周期,如 12MHz的晶振,振荡周期 = 1 / 12M ,那么

机器周期 = 12 * 1/12 M = 1us 。

计算:

用方式1,定时器为16位,16位最大值为2^16 = 65536。

如果我们要定时1ms = 1000us,12MHz的单片机其机器周期为1us ,

初始值大小x = 65536 - 1000 = 64536 ,

此时把64536 换算成16进制 为fc18, 此时高八位为fc送给TH1=0xfc, 低八位送给TL1=0x18 .

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6L-b5Ye755qE57yW56iL54ix5aW96ICFX-mAkOm5vw==,size_17,color_FFFFFF,t_70,g_se,x_16

       或者:

       TH1 = (65536-1000)/256 ; // 1ms 12MHz

       TL1 = (65536-1000)%6 ;

(T1被允许计数以后,从初值开始加1计数。 当定时器1计满溢出时,由硬件使TF1置1,此时向CPU请求中断,进入中断服务程序后,由硬件自动清0。 )

 

当启动T1时,T1从初始值64536开始计数,超过65536则溢出,申请中断。那么该过程就是1ms。

              如果需要1s,可以定义u16 n,n++,  if (n==1000)  n=0;

 

定时器的使用:

1.工作方式1 定时器T0 / T1 选择控制方式GATE = 0 / 1

定时模式C/T=0 or计数模式 C/T=1. (TMOD=0x01)

2.定时器设初值(设置TH0=0xfc与 T0=0x18)看具体要求

3.开启定时器中断(设置ET0=1或ET1=1)

4.开启总中断(EA=1)

5.定时器/计数器选择T0 / T1?(设置TR1=1 or TR0=1的值)

最后上代码,因为比较多,所以上部分代码。

//定时器0void Timer0Init(void){    //使用方式0  1ms12MHz    TMOD |= 0x01;     TH0 = (65536-1000)/256; //0xfcTL0 = (65536-1000)%6; //0x18ET0 = 1;  //定时器0中断打开EA = 1;  //总中断打开TR0 = 1;  //定时器0开关打开 }//定时器1void Timer1Init(void) {    //使用方式1,16位TMOD |=0x10;定时器TH1 = (65536-50000)/256; //50msTL1 = (65536-50000)%6;ET1 = 1;   //定时器1中断打开EA =  1;  //总中断打开TR1 = 1;   //定时器1打开} //定时器0中断void Timer0(void) interrupt  1{static u16 i;//1ms  12MHzTH0 = (65536-1000)/256; //0xfc  TL0 = (65536-1000)%6; //0x18i++;if(i == 1000)  //1000ms{num0 ++;i = 0;}}//定时器1中断void Timer1(void) interrupt  3{   static u16 i;TH1 = (65536-50000)/256;  //50msTL1 = (65536-50000)%6;i++;if(i == 20)  // 1s{num0++;i = 0;}}

 最后呢,如果有错误请大家指出来,加以改正。只是为了分享一下理解,同时也借鉴了其他博主的文章,非常感谢。

其他文章借鉴:

http://t.csdn.cn/KWRGB

http://t.csdn.cn/xYyGl

http://t.csdn.cn/bnd96

 

 

  • 53
    点赞
  • 307
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
ACC: 累加器,用于存放运算结果或数据。初值为0。内部位的作用如下: - ACC.7: 符号位,用于表示结果的正负。 - ACC.6-ACC.0: 数据位,用于存放运算结果或数据。 PC: 程序计数器,用于存放下一条指令的地址。初值为0。内部位的作用如下: - PC.7-PC.0: 地址位,用于存放指令的地址。 PSW: 程序状态字,用于存放程序的运行状态和标志位。初值为0。内部位的作用如下: - PSW.7: 符号位,用于表示运算结果的正负。 - PSW.6: OV溢出志位,用于表示运算结果是否溢出。 - PSW.5: AC位标志位,用于表示运算结果是否进位。 - PSW.4: F0标志位,可由用户自定义使用。 - PSW.3: RS1标志位,可由用户自定义使用。 - PSW.2: RS0标志位,可由用户自定义使用。 - PSW.1: P标志位,用于表示运算结果的奇偶性。 - PSW.0: CY进位标志位,用于表示运算结果是否进位。 SP: 堆栈指针,用于指向堆栈的栈顶。初值为07H。内部位的作用如下: - SP.7-SP.0: 地址位,用于存放堆栈的地址。 IE: 中断使能寄存器,用于控制中断的使能。初值为0。内部位的作用如下: - IE.7: EA总中断使能位,用于控制所有中断的总使能。 - IE.6: ET2定时器2中断使能位,用于控制定时器2中断的使能。 - IE.5: ES串行口中断使能位,用于控制串行口中断的使能。 - IE.4: ET1定时器1中断使能位,用于控制定时器1中断的使能。 - IE.3: EX1外部中断1使能位,用于控制外部中断1的使能。 - IE.2: ET0定时器0中断使能位,用于控制定时器0中断的使能。 - IE.1: EX0外部中断0使能位,用于控制外部中断0的使能。 - IE.0: EA总中断使能位,用于控制所有中断的总使能。 TCON: 定时器/计数器控制寄存器,用于控制定时器和计数器的工作方式。初值为0。内部位的作用如下: - TCON.7: TF1定时器1溢出标志位,用于表示定时器1是否溢出。 - TCON.6: TR1定时器1运行控制位,用于控制定时器1的启动和停止。 - TCON.5: TF0定时器0溢出标志位,用于表示定时器0是否溢出。 - TCON.4: TR0定时器0运行控制位,用于控制定时器0的启动和停止。 - TCON.3: IE1外部中断1标志位,用于表示外部中断1是否触发。 - TCON.2: IT1外部中断1触发方式位,用于控制外部中断1的触发方式。 - TCON.1: IE0外部中断0标志位,用于表示外部中断0是否触发。 - TCON.0: IT0外部中断0触发方式位,用于控制外部中断0的触发方式。 TMOD: 定时器/计数器模式寄存器,用于设置定时器和计数器的工作模式。初值为0。内部位的作用如下: - TMOD.7-TMOD.4: T1M1-T1M0定时器1工作模式位,用于设置定时器1的工作模式。 - TMOD.3-TMOD.0: T0M1-T0M0定时器0工作模式位,用于设置定时器0的工作模式。 SCON: 串行口控制寄存器,用于设置串行口的工作方式。初值为0。内部位的作用如下: - SCON.7: SM0串行口工作方式位,用于设置串行口的工作方式。 - SCON.6: SM1串行口工作方式位,用于设置串行口的工作方式。 - SCON.5: SM2串行口工作方式位,用于设置串行口的工作方式。 - SCON.4: REN串行口接收使能位,用于控制串行口的接收使能。 - SCON.3: TB8发送数据位8,用于发送数据的第8位。 - SCON.2: RB8接收数据位8,用于接收数据的第8位。 - SCON.1: TI发送中断标志位,用于表示发送中断是否触发。 - SCON.0: RI接收中断标志位,用于表示接收中断是否触发。 SBUF: 串行口数据寄存器,用于存放串行口发送和接收的数据。初值为0。 PCON: 电源控制寄存器,用于控制单片机的电源和时钟。初值为0。内部位的作用如下: - PCON.7: SMOD串行口波特率倍增位,用于控制串行口的波特率倍增。 - PCON.6: SMOD0串行口波特率倍增位,用于控制串行口的波特率倍增。 - PCON.5: GF1通用标志位1,可由用户自定义使用。 - PCON.4: GF0通用标志位0,可由用户自定义使用。 - PCON.3: PD电源控制位,用于控制单片机的电源模式。 - PCON.2: IDL空闲模式位,用于控制单片机的空闲模式。 - PCON.1: STOP模式位,用于控制单片机的停机模式。 - PCON.0: SMOD1串行口波特率倍增位,用于控制串行口的波特率倍增。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星汇电子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值