用Proteus学习51单片机之中断

发布者:Jinghua6666最新更新时间:2017-01-04 来源: eefocus关键字:Proteus  51单片机  中断 手机看文章 扫描二维码
随时随地手机看文章

以52单片机来说,一共有6个中断源,其说明如下(序号用于中断程序的编写):

中断源名称默认级别序号说明
INT0最高0外部中断0,由P3.2端口线引入,低电平或下降沿引起
INT1第32由P3.3端口线引入,低电平或下降沿引起
T0第21定时器/计数器0中断,由T0计数器计满回零引起
T1第43定时器/计数器1中断,由T1计数器计满回零引起
T2最低5定时器/计数器2中断,由T2计数器计满回零引起
TI/RI第54串行口中断,串行端口完成一帧字符发送/接收后引起

 

中断的允许和关闭,由中断允许寄存器IE控制,而IE又细分为7位,详细控制到每一个中断的开关

位序号位符号位地址说明
D0EX0A8HINT0中断允许控制
D1ET0A9HT0中断允许控制
D2EX1AAHINT1中断允许控制
D3ET1ABHT1中断允许控制
D4ESACH串行口中断允许控制
D5ET2ADHT2中断允许控制
D6----
D7EAAFH全局中断控制,关闭则所有中断不可用

说明:上表中,都是把某位设置为1,表示开启对应的中断允许,设0表示关闭对应的中断允许,同时,如果要允许任意中断,首先必须设置EA为允许

还允许设置中断的优先级,在中断优先级寄存器IP中设置。不过对我来说,暂时没用,就不记录了,相信到时候要用的时候,很容易就能找到对应的信息。

在《教程》中,这一章只说了定时器中断,所以这里也只写定时器中断,翻了书的目录,其他中断在后面,一起来期待后续吧。

51单片机内部共有两个16位可编程的定时器,即T0和T1,而52单片机又加了一个T2。这些定时器是单片机内部的独立硬件,并不需要耗费额外的CPU时间去帮它们计时。当定时器的计数器计满后,会产生中断,从而通知CPU处理中断。

T0或T1都有两种模式,定时模式和计数模式,对于定时模式来说,中断时即表示定时时间已到,而对于计数模式来说,中断时表示计数值已满。不管是什么模式,其本质都是+1计数器,它的计数脉冲有两个来源,一是系统的时钟振荡器输出脉冲经过12分频后的值;二是由T0或T1的引脚输入。在计数模式时,对于被计数的频率有一定的要求,即被检测的电平,至少要维持一个机器周期(即12个振荡周期),如当晶振频率为12MHZ时,最高计数超过1/2MHZ。

定时器(计数器)主要由两个寄存器控制,即TCON和TMOD。

TMOD各位意义如下:

位序号D7D6D5D4D3D2D1D0
位符号GATEC/TM1M0GATEC/TM1M0

针对T1针对T0

说明如下:

GATE:门控制位,为0时表示仅受TCON中的TRX控制,为1时表由TRX和外部中断引脚上电平共同控制

C/T:1时表示计数模式,0时表示定时器模式

M1和M0:工作方式选择,如下:

M1M0工作方式
00方式0,13位定时器/计数器
01方式1,16位定时器/计数器
10方式2,8位初值自动重装的8位定时器/计数器
11方式3,仅适用于T0,分成两个8位计数器,T1停止计数

 

TCON各位意义如下(后面数字为1的针对T1,为0的针对T0):

位序号D7D6D5D4D3D2D1D0
位符号TF1TR1TF0TR0IE1IT1IE0IT0

说明如下:

TFX:定时器X溢出标志位,计时器计数满时,该位置1,并申请中断,进入中断服务程序后,由硬件自动清0.如果使用软件查询方式的话,需要手动清0

TRX:定时器X运行控制位。GATE=1时,TRX=1且INTX为高电平时,启动定时器;GATE=0时,TRX=1时启动定时器

IEX:外部中断X请求标志。

ITX:外部中断X触发方式标志。

------------------------------------------------------------------------

程序以T0的工作方式1,即16位定时器,设置GATE=0,此时计数器的运行由TR0控制,当TR0=1时,计数器开始计数。由于是16位计数器,所以共有65535次计数,当计数满后,还要溢出操作一次,所以当触发中断时,共需要65536次。由于中断需要在计数满时才会执行,所以如果计数不是刚好是65536次的话,必然需要给计数器设置一个初始值 。比如我们希望计数1000次时触发中断,那么,就要把计数器的初始值设置为65536-1000=64536.由于计数器每一个机器周期加1,也即12个时钟周期,因此每一个计数代表的时间是12/f,如12MHZ的晶振,一个计数表示12/12000000=1us。若我们希望产生一次中断的时间为t,晶振的频率为f,则初始值为:

t*f/12    注意单位的一致

比如,我希望1ms产生一次中断,我的晶振为12MHZ,则初始值为(注意,把1ms换算成0.001s)

0.001*12000000/12 = 1000

由于计数器实际分高8位TH0和TL0(对应T1的就是TH1和TL1了),所以要把初始值的高位存储在TH0中,而低位存储在TL0中,仍旧以上面的例子来说,则

TH0 = 1000/256 = 3

TL0 = 1000%256 = 232

 

中断程序的格式如下:

1
//using 工作组不是必须的,暂时不使用
//中断号即前面列表中的序号,T0的中断序号是1
void 函数名称 interrupt 中断号 using 工作组
{
    //程序主体
}

 

-----------------------------------------------------------------

前置知道介绍完毕,现在编写程序。本来想显示一个定时器,显示在数码管上,由于在Proteus上实现不了数码管的连续显示(PS:现在我知道了,是可以正常显示的……,不过程序就不改了,反正主要是为了说清楚中断和计时器),所以就简化一下程序,改为LED灯亮一秒钟,灭一秒钟。由于计数器最多能计65535,即60多ms,所以我们让它每50ms触发一次中断,这样20次后,就是一秒了,因此初始值就是15536了。

原理图:

image

 

源程序:

1
#include

#define uchar unsigned char
#define uint unsigned int

uchar total = 0;
sbit led = P2^0;
//中断程序,在中断程序中的操作尽量少,所以把LED之类的操作,放在主函数中
void T0_time() interrupt 1
{
   //每次中断都执行一次初始化,保证每次都是50ms
   TH0 = 15536/256;
    TL0 = 15536%256;

    //中断一次即把计数加1
    total++;
}

void main()
{
   TMOD = 0x01; //设置定时器0,工作方式1
TH0 = 15536/256;//设置初始值高位
   TL0 = 15536%256;//设置初始值低位
   EA = 1;//允许全局中断
ET0 = 1;//允许定时器0的中断
TR0 = 1; //开启定时器0
   while(1)
    {
       if(total==20)
       {
           total=0;
            led=~led;
       }      
    }
}


关键字:Proteus  51单片机  中断 引用地址:用Proteus学习51单片机之中断

上一篇:用Proteus学习51单片机之键盘
下一篇:用Proteus学习51单片机之数码管

推荐阅读最新更新时间:2024-03-16 15:28

AT89S51单片机驱动扬声器实现报警器功能的设计
1. 用P1.0输出1KHz和500Hz的音频信号驱动扬声器,作报警信号,要求1KHz信号响100ms,500Hz信号响200ms,交替进行,P1.7接一开关进行控制,当开关合上响报警信号,当开关断开告警信号停止,编出程序。 2. 电路原理图 “单片机系统”区域中的P1.0端口用导线连接到“音频放大模块”区域中的SPK IN端口上; 在“音频放大模块”区域中的SPK OUT端口上接上一个8欧的或者是16欧的喇叭; 把“单片机系统”区域中的P1.7/RD端口用导线连接到“四路拨动开关”区域中的K1端口上; 3. 程序框图 4. 参考源程序 FLAG BIT 00H ORG 00H START: JB P1.7,STA
[单片机]
AT89S<font color='red'>51单片机</font>驱动扬声器实现报警器功能的设计
STM32CubeMX(Keil5)开发之路——5定时器中断TIM
运行环境 Windows10 STM32CubeMX___Version 5.0.0 Keil5(MDK5)___Version 5.15 简介 本例程主要讲解如何使用定时器实现一个定时器中断,每秒打印一串数据 STM32CubeMx基本配置 基础配置过程请参考 STM32CubeMx(Keil5)开发之路—配置第一个项目 为了方便调试,重定向printf,进行usart设置 1——点击USART1进行设置 2——模式选择Asynchronous异步传输 3——可以看到右边自动出现了Tx和Rx 4——可以自行设置波特率,停止位,校验位等参数 1——点击Clock Configuration进行设置 2——注意这几个地
[单片机]
STM32CubeMX(Keil5)开发之路——5定时器<font color='red'>中断</font>TIM
51单片机学习笔记———4.两个按键控制LED小灯
两个按键的控制LED的程序: /* * @Author: 王云龙 * @Date: 2020-02-23 12:48:51 * @Last Modified by: 王云龙 * @Last Modified time: 2020-02-23 15:37:24 */ #include reg52.h #define LED P0;//设置LED引脚 sbit KEY1 = P3^4;//设置按键1引脚 sbit KEY2 = P3^5;//设置按键2引脚 void LightLed1();//点亮方式1 void LightLed2();//点亮方式2 void delay(unsigned int n);//n
[单片机]
51单片机(一)——总览
一、前言 之前花了一点时间阅读了编译器sdcc的man文档,算是对这款交叉编译器有了基本的了解。但要写重新写单片机程序,还要对相应的知识做进一步的复习。下面我将阅读芯片的datasheet和application guide,结合一些实际的应用,对单片机的知识进行复习。我开发板上的芯片是stc90c51,不同型号的51芯片可能会略有差异。 二、外围电路 要使单片机正常工作,需要在VCC脚上给予5v/3.3v的电压,将GND脚接地。为了滤波 ,VCC和GND之间接两个电容。XTAL上接一个外部振荡器,RST脚上接外部复位电路。 虽然这些都已经标准化,无关编程。但在某些特殊情况下(比如晶振、稳压芯片坏了,虚焊等等),需要配合示波器等
[单片机]
8051单片机教程第二十二课:串行口应用编程实例
1.串口方式0应用编程8051单片机串行口方式0为移位寄存器方式,外接一个串入并出的移位寄存器,就可以扩展一个并行口。 例:用8051串行口外接CD4094扩展8位并行输出口,如图所示,8位并行口的各位都接一个发光二极管,要求发光管呈流水灯状态。串行口方式0的数据传送可采用中断方式,也可采用查询方式,无论哪种方式,都要借助于TI或RI标志。串行发送时,可以靠TI置位(发完一帧数据后)引起中断申请,在中断服务程序中发送下一帧数据,或者通过查询TI的状态,只要TI为0就继续查询,TI为1就结束查询,发送下一帧数据。在串行接收时,则由RI引起中断或对RI查询来确定何时接收下一帧数据。无论采用什么方式,在开始通讯之前,都要先对控制寄存
[单片机]
80<font color='red'>51单片机</font>教程第二十二课:串行口应用编程实例
理解51单片机串口通信的波特率与USB转串口通信
串口通信的基本认识 通信分为并行通信和串行通信,并行通信时的数据各个位同时传送,可以实现字节为单位通信,但通信线多占用资源,成本高。以前用到的的P1=0x55,一次给P1口的8个管脚分别赋值,同时进行信号输出,类似于8个车道可以过去8辆车,这样的形式是并行的,一般称P0,P1,P2,P3为51单片机的4组并行总线。 串行通信,就是一个车道,一个只能通过一辆车,如果一个0x55这样一个字节的数据要传输过去的话,假如低位在前,高位在后的话,那发送方式是:0-1-0-1-0-1-0-1,一位一位的进行传输,要发送8次才能发送完一个字节 STC89C52有两个引脚是专门用来做串口通信的,一个是P3.0(RXD),一个是P3.1(TXD
[单片机]
理解<font color='red'>51单片机</font>串口通信的波特率与USB转串口通信
Stm32f407 key外部中断
硬件平台: stm32f407ve 软件平台: win10 (OS Name: Microsoft Windows 10 Enterprise OS Version: 10.0.18363 N/A Build 18363) Keil5 5.26.2 HAL库版本: 2.14.0(目前下载的最新的) 中断这个部分需要参考中文手册和权威指南。 这里我还是提一下NVIC这个东西,全称是Nested vectored interrupt controller,即嵌套向量中断控制器。这个器件是用来管理stm32所有中断的(在现实
[单片机]
Stm32f407 key外部<font color='red'>中断</font>
用ST16C2552实现DSP高速串行通讯扩展
1 引言 随着大规模集成电路工艺技术的迅速发展,DSP已经越来越广泛地应用于工业场合。工业现场由于许多场合通讯双方相距较远,为了保证通讯成本和可靠性,必须采用串行方式进行通讯。目前TI公司DSP都只有一个UART口,比如TMS320LF2407,当同时需要与上位机和下面的被控对象进行通讯,或者同时连接几个上位机时,则需要对DSP进行串行通讯口扩展,而使用可编程的ST16C2552可以一次扩展两组相互独立的串口,满足各种条件下串行通讯的要求。 2 ST16C2552介绍 ST16C2552是Exar公司生产的通用异步通讯扩展器件,并与飞利浦公司的SC16C2552相兼容,可扩展2路独立的串行通讯,可编程设定通讯起始位、停止位和
[应用]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved