历史上的今天

今天是:2024年11月02日(星期六)

2021年11月02日 | STC89C52之中断终结篇 ---- 自学笔记

发布者:beta12 来源: eefocus关键字:STC89C52  中断  寄存器 手机看文章 扫描二维码
随时随地手机看文章

一、概述

1.1、五个中断

外部中断0                                INT0

定时器/计数器(C/T)中断0         T0

外部中断1                                 INT1

定时器中断1                              T1

串行通信中断                             RX  and  TX


1.2、中断允许寄存器(IE)

 

1.3中断请求标志(TCON)

 

ITO(TCON.0):外部中断0触发控制位。


  当IT0=0时,为电平触发方式      低电平

  当IT0=1时,为边沿触发方式(下降沿有效)

IE0(TCON.1):外部中断0中断请求标志位。


IT1(TCON.2):外部中断1触发方式控制位。


IE1(TCON.3):外部中断1中断请求标志位。


TF0(TCON.5):定时/计数器T0溢出中断请求标志位。    置1溢出


TF1(TCON.7):定时/计数器T1溢出中断请求标志位。

1.4、控制寄存器(TCON)

1.5、工作方式寄存器(TMOD)

方式0时,N=13(此为TH为8位,TL为5位)

方式1时,N=16(此为TH为8位,TL为8位)

方式2时,N=8(此为TH为8位,TL为0位)

方式3时,N=8(此为TH为8位,TL为8位,只适用于T0,且T0被分成两个独立的8位计数器TH与TL)

 

12M的晶振   定时1ms

第一种  THx,TLx表达方式

定时=(2的13次方-计数初值)*12/晶振频率 

       = (8192-计数初值)*12/12

       = 8192-计数初值    ( 单位:微秒)

 计数初值 = T0 = 8192-定时 + 1 = 7193  = 0x1c19     TH0 = 0x1c   TL0 = 0x19

不知道第一种方式对不对,我设置成TH0=0x1c;TL0=0x19,这样LED能闪烁

 

第二种  THx,TLx表达方式        此种方式网上摘抄

因为寄存器是13位的,高位8bit,低位5bit, 2^5=32

定时=5ms = 5000微秒

所以有: TH0 = (8192-定时)/32; TL0 = (8192-定时)%32

 

 

TH0和TL0的赋值是定时器T0装填初值,TH0是高位,TL0是低位,连起来看就是定时器T0装填了初值。

除以32或者除以256是用来求高位的初值,同理取余就是求低位初值,

至于为什么有32和256是因为定时器工作方式不同,工作方式在之前的TMOD赋值的时候设定,256对应工作方式2,而32对应方式0

0000 0000                       TMOD |= 0x00               方式1           常用


0000 0001                        TMOD |=0x01               方式2            常用


0000 0010                        TMOD |=0x02              方式3            不常用


0000 0011                        TMOD |=0x03            方式4             不常用


 


二、代码

2.1、方式0

方式 0 为 13 位计数,由 TL0 的低 5 位(高 3 位未用)和 TH0 的 8 位组成。 TL0 的低 5 位溢出时向 TH0 进位,TH0 溢出时,置位 TCON 中的 TF0 标志,向 CPU 发出中断请求。


#include

#define uchar unsigned char      //  #define宏定义关键字

#define uint  unsigned int

/*

typedef unsigned int u16;      //  关键字 typedef 可以为类型起一个新的别名 

typedef unsigned char u8;

                               

 */

//  sbit led=P2^0;     第一个led灯闪烁

//  sbit led = P2^1; 第二个led灯与DA1切换灯闪烁

//  sbit led = P2^2; 第三个led灯闪烁,数码管第一位与数码管第二位来回跳动

//  sbit led = P2^3;    第四个led灯闪烁,数码管第一位与数码管第三位来回跳动

//  sbit led = P2^4;    第五个led灯闪烁,数码管第一位与数码管第五位来回跳动 

//  sbit led = P2^5;    第六个led灯闪烁并且有滴答滴答的声音

//  sbit led = P2^6;    第七个led灯闪烁

    sbit led = P2^7;    // 第八个LED灯闪烁

uchar num;

// u8 num =0;

 

void TIM0init()

{

/*

1、选择工作方式

TMOD |= 0x00;   工作方式0

计数器是13位的,计数范围1~8192(2^13=8192)

定时=(2的13次方-计数初值)*12/晶振频率   = 2^16 -1000 +1 = 7193 = 0x1c19

T0  or T1  = 0x1c19                    

TH1 or TH0 = 0x1c                       

TL1 or TL0 = 0x19

工作方式0:寄存器为13为   THx为8位  TLx为5位(高三位未用)

除以32用来求高八位(THx)的初值,取余就是求低位初值

例子:方式0是13位定时器,其最大计数值是8192,51单片机定时器/计数器是加法计数,因此如果要计数1000个脉冲,定时器的初值应该是8192-1000 ,

如果要计数100个脉冲,定时器的初值应该是8192-100

该16位定时器又分成了高8 位和低8位,其中低8位只用了5位,最大装回值是31,超过32则装入高8 位,高8位的1代表32。

因此高8位装的是32的整数倍,低8位装32的余数,

上例的求模和求余就 是这个意思,很明显答上例设定的计数值是100个脉冲,

如果晶振是12M,一个脉冲是1us,那么定时时间就是100us。

TMOD |= 0x01; 工作方式1

TMOD |= 0x10;   工作方式2

TMOD |= 0x11;   工作方式3

*/

 

 

     TMOD|=0x00;   

/*

2、选择定时器/计数器(C/T)

T1(16位C/T+1) = TH1(八位) + TL1(八位)

T0(C/T)  = TH0(高八位寄存器)   + TL0(低八位寄存器)

TH1 =

TH1 =

*/         

     TH0= (8192-1000)/32;             //0x1c;//(8192-5000)/32;   //装入初值,怎么计算,下面分析

     TL0=  (8192-1000)%32;            //0x19;//(8192-5000)%32;    

     EA=1;    //开总中断

     ET0=1;   //开定时器中断

     TR0=1;   //启动定时器0

}

/*

interrupt 0  指明是外部中断0;

interrupt 1  定时器中断0; 

interrupt 2  外部中断1;

interrupt 3  定时器中断1;

interrupt 4  串行口中断;

*/

void T0_time()  interrupt 1      

{

     TH0= 0x1c;        //(8192-5000)/32; //重装初值,如果不重装,中断只触发一次

     TL0= 0x19;       //(8192-5000)%32;

     num++;

}

  

void main()

{

    TIM0init(); 

    while(1)

    {

  if(num==200)     //如果到了200,说明一秒时间到

          {

             num=0;

     led=~led;   //闪灯

  }

    }

}

计数初值与计数个数的关 系为:X=2(13)-N


方式0的例子

2.2、方式1

方式 1 的计数位数是 16 位,由 TL0 作为低 8 位,TH0 作为高 8 位,组成了 16 位加 1 计数器。


 

#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器

 

typedef unsigned int u16;   //对数据类型进行声明定义

typedef unsigned char u8;

 

sbit led=P2^0; //定义P20口是led

 

 

void Timer0Init()

{

TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。

 

TH0=0XFC; //给定时器赋初值,定时1ms

TL0=0X18;

ET0=1;//打开定时器0中断允许

EA=1;//打开总中断

TR0=1;//打开定时器

}

 

/*******************************************************************************

* 函 数 名       : main

* 函数功能 : 主函数

* 输    入       : 无

* 输    出    : 无

*******************************************************************************/

void main()

{

Timer0Init();  //定时器0初始化

while(1);

}

 

 

void Timer0() interrupt 1

{

static u16 i;

TH0=0XFC; //给定时器赋初值,定时1ms

TL0=0X18;

i++;

if(i==1000)

{

i=0;

led=~led;

}

}

2.3、方式2

自动重装初值的 8 位计数方式。工作方式 2 特别适合于用作较精确的脉冲信号发生器


#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器

 

typedef unsigned int u16;   //对数据类型进行声明定义

typedef unsigned char u8;

 

 

u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值

u8 n=0;

 

void Timer1Init()

{

 // TMOD   |=0X01;              速度快//选择为定时器1模式,工作方式1,仅用TR1打开启动。

   TMOD    |=0x02;

 // TMOD   |=0x00;

 //  TMOD  |= 0x03;

TH1=0XFC; //给定时器赋初值,定时1ms

TL1=0X18;

ET1=1;//打开定时器1中断允许

EA=1;//打开总中断

/***************************************************************

** * TCON的中断请求标志       

** *  

** *       位:    7      6      5      4      3      2     1      0  

** *   

** * 字节地址:   TF1     TR1    TF0   TR0    IE1    IT1   IE0    ITO 

** *     说明:   

** *ITO(TCON.0):外部中断0触发控制位。   

** *    当IT0=0时,为电平触发方式   低电平      

** *    当IT0=1时,为边沿触发方式(下降沿有效)   

** *IE0(TCON.1):外部中断0中断请求标志位。

** *IT1(TCON.2):外部中断1触发方式控制位。   

** *IE1(TCON.3):外部中断1中断请求标志位。   

** *TF0(TCON.5):定时/计数器T0溢出中断请求标志位。置1溢出   

** *TF1(TCON.7):定时/计数器T1溢出中断请求标志位。   

** ****************************************************************   

** *   

** *****************************************************************

** * 控制寄存器(TCON)   

   

** * TCON的低四位用于控制外部中断,   

** * TCON的高四位用于控制定时器计数器的启动和中断  

** *     

          位:  7    6    5     4     3   2    1   0    

字节地址: TF1  TR1  TF0   TR0    

   

    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相同。    

   

  

   

** ********************************************************************************/

TR1=1;//打开定时器

}

 

 

void main()

{

Timer1Init();  //定时器1初始化

while(1);

}

 

 

void Timer1() interrupt 3

{

static u16 i;

TH1=0XFC; //给定时器赋初值,定时1ms

TL1=0X18;

i++;

if(i==10000)

{

i=0;

P0=smgduan[n++];

if(n==16)n=0;

}

}

#include

 

#define uchar unsigned char

#define uint  unsigned int

 

sbit led1=P2^0;

uint num;

 

void TIM0init(void)

{

     TMOD|=0x02;    //设置定时器0为工作方式2

/*

TOMD=0x02,是定时器工作方式3,分为两个8位定时器,每个定时器计数最大值为255,

[1] [2]
关键字:STC89C52  中断  寄存器 引用地址:STC89C52之中断终结篇 ---- 自学笔记

上一篇:51单片机之串口通信 ---- 自学笔记
下一篇:51单片机12分频 ----- 学习笔记

推荐阅读

专注于引入新品并提供海量库存的电子元器件分销商贸泽电子 (Mouser Electronics) 即日起开始备货TE Connectivity (TE) 的AmbiMate传感器模块MS4开发套件。TE是连接和传感器领域的全球领导者,其开发套件允许全球工程设计和开发团队为具有TE先进AmbiMate MS4系列传感器模块的系统构建原型和评估板。 贸泽备货的TE AmbiMate传感器模块MS4开...
区块链有望作为作为核心技术自主创新的重要突破口,加速迎来技术与产业创新发展。 数字金融、数字资产交易、电力能源、供应链管理等领域在商业模式升级方向上,天然契合区块链技术。行业内已着手布局区块链技术的企业,未来有望享受区块链技术推广红利。 区块链有望成为下一个自主创新风口 10月24日下午,中共中央政治局就区块链技术发展现状和趋势...
芯片封装早已不再仅限于传统意义上为独立芯片提供保护和I/O扩展接口,如今有越来越多的封装技术能够实现多种不同芯片之间的互联。先进封装工艺能提高器件密度并由此减小空间占用,这一点对于手机和自动驾驶汽车等电子设备的功能叠加来说至关重要。芯片封装行业的发展使国际电气电子工程师协会电子元件封装和生产技术学会(IEEE-CPMT)意识到必须要拓展自身的...
集微网消息,中国台湾地区网络芯片供应商瑞昱预计,在2021年第三季度实现可观的收入和利润增长后,其出货量增长势头将持续到2022 年上半年。据digitimes报道,瑞昱的财报显示,该公司第三季度收入同比增长29.2% 至289.55 亿元新台币(单位下同),同期净利润同比增长 94.8% 至48.9 亿元。瑞昱将收入和利润的大幅增长归因于高单价和高毛利率的高端产品...

史海拾趣

问答坊 | AI 解惑

Linux下C语言编程入门

很对不起,前段时间有点忙,以后我会经常传资料的…

查看全部问答∨

pspic教程

经典的pspice教程,图文并茂,让你快速掌握pspice仿真!本人就是靠这个小教程学会用它仿真的…

查看全部问答∨

向坛有征询,5月份我们工控版块讨论点啥?

春暖花开的四月过去了,进入夏季的5月,我们工控爱好者要讨论点啥东西?请大家热议!…

查看全部问答∨

美国百盛成功布线盐城汽车客运北站

盐城汽车客运站白马分站位于市开放大道355号,站务基本设施功能齐全,设售票处、侯车处、旅客下客区、出口处等区域,与盐城汽车客运站联网售票,近斯将有发往全国京、津、渝等地班车进站配载,日配载班次达300余班。该站的设立是根据市委、市政府 ...…

查看全部问答∨

MapX Mobile平台有免费的吗?给一个下载地址

MapX Mobile平台有免费的吗?给一个下载地址…

查看全部问答∨

求TC35外围电路连接图及收发短信源代码

求TC35外围电路连接图及收发短信源代码 !! 各位大虾帮帮忙吧,刚接触这东西,急需这些来熟悉熟悉,买了个TC35模块,想自己焊个板子玩下。 如果有的话,麻烦发我邮箱fjchen_ok@126.com 谢谢了~…

查看全部问答∨

大家有玩过camera模块的没有

我现在在用三星的ARM11做一个项目,要用到camera模块,有做过的在这里留下个联系方式啊。…

查看全部问答∨

急!!!!!!!!!!!!!(高分请教!!!)EVC中得到ADO连接对象对应ClassID总是有问题

我的程序在运行到获得ADO对象对应的classID的时候,总是不能成功,不知道为什么?麻烦指点一下. m_ProgID = _T ("ADOCE.Connection.3.1"); CLSID        m_ClsID; hr = CLSIDFromProgID(m_ProgID, &m_ClsID); if(FA ...…

查看全部问答∨

bootloader

Msp430系列bootloader.....…

查看全部问答∨

ATmega16-ICCAVR7.14-Proteus7.5

本帖最后由 paulhyde 于 2014-9-15 03:42 编辑    …

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved