51单片机中断详解(下)

发布者:BlossomSunrise最新更新时间:2018-07-16 来源: eefocus关键字:51单片机  中断详解 手机看文章 扫描二维码
随时随地手机看文章

一.定时器相关寄存器

  1. 工作方式寄存器(TMOD) 
    这里写图片描述

    该寄存器用于设置定时/计数器的工作方式,低四位用于定时器0,高四位用于定时器1。 
    GATE:门控位。GATE=0时,只要用软件使TCON中的TR0或TR1为1,就可以启动定时/计数器工作;GATA=1时,要用软件使TR0或TR1为1,同时外部中断引脚INT0/1也为高电平时,才能启动定时/计数器工作。即此时定时器的启动条件,加上了INT0/1引脚为高电平这一条件。 
    C/T:定时/计数模式选择位。C/T=0为定时模式;C/T=1为计数模式。

    这里写图片描述

  2. 定时器/计数器控制寄存器控制寄存器(TCON) 
    这里写图片描述

    该寄存器的低4位用于控制外部中断,已在前面介绍,高4位用于控制定时/计数器的启动和中断申请。 
    TF1:T1溢出中断请求标志位。T1计数溢出时由硬件自动置TF1为1。CPU响应中断后TF1由硬件自动清0。 
    TR1:T1运行控制位。TR1置1时,T1开始工作;TR1置0时,T1停止工作。TR1由软件置1或清0。所以,用软件可控制定时/计数器的启动与停止。 
    TF0:T0溢出中断请求标志位,其功能与TF1类同。 
    TR0:T0运行控制位,其功能与TR1类同。

  3. 中断允许控制寄存器(IE) 
    这里写图片描述 
    ET0:定时/计数器T0中断允许位; 
    ET1:定时/计数器T1中断允许位; 
    EA :CPU中断允许(总允许)位。

二.定时器溢出中断的处理过程

1、设置定时器工作方式 
2、为定时器装入初值 
3、定时器中断允许位置为1 
4、开总中断 
5、开定时器,等待产生溢出中断请求

三.实现简单时钟

说明: 
1.使用动态数码管显示 
2.选择工作方式1,以16位的定时器0进行工作,即TMOD=0x01,中断编号为1; 
3.定时50ms,即每隔50ms产生一次中断: 
TH0=(65536-50000)/256; //16位定时器的高8位 
TL0=(65536-50000)%256; //16位定时器的低8位 
具体的时间与单片机的晶振有关,请了解机器周期、指令周期、时钟周期等相关知识。

#include

#define uchar unsigned char

#define uint unsigned int

uchar hour,min,sec;

uchar code wei[8]= {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};  //共阴极数码管位选编码

uchar code duan[11]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x01};  //共阴极数码管段选编码


void delay(uint z)

{

    uint i,j;

    for(i=z;i>0;i--)

        for(j=110;j>0;j--);

}


void timer0_init()

{

     TMOD=0X01;

     TH0=(65536-50000)/256;

     TL0=(65536-50000)%256;

     ET0=1;

     TR0=1;

     EA=1; 

}


void main()

{  

  uchar i; 

  timer0_init(); 

  while(1)

  {  

      num[0]=duan[hour/10];

      num[1]=duan[hour%10];

      num[2]=0x40;   //显示一横

      num[3]=duan[min/10];

      num[4]=duan[min%10];

      num[5]=0x40;   //显示一横


      num[6]=duan[sec/10];

      num[7]=duan[sec%10];


      for(i=0; i<8; i++)       //显示部分

      { 

          P0=wei[i];    //位选 

          P1=num[i];    //段选

         delay(2);

         P1=0x00; //消隐

      }  

  }

/*启动定时器后,没次计数溢出就会进入中断服务函数,重新赋初值,再进行计数,来达到定时的效果*/     

void timer0() interrupt 1      //定时器中断服务函数

{

     TH0=(65536-50000)/256;

     TL0=(65536-50000)%256;

     t++;

     if(hour==24)

        hour=0;

     if(min==60)

     {

        hour++;

        min=0;

     } 

     if(sec==60)

     {

        min++;

        sec=0;

     }

     if(t==20)

     {

        sec++;

        t=0;

     }

}


关键字:51单片机  中断详解 引用地址:51单片机中断详解(下)

上一篇:51单片机之——中断的概念
下一篇:第一篇:51单片机的中断和定时

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

基于STC89C51单片机的电子琴设计
0 引言 随着计算机在社会各领域的渗透,单片机的应用正在不断地走向深入,同时带动着工业、农业、商业、家电以及玩具的日新月异更新,极大地提高了电子电路及系统设计质量和效率。本设计是以主控芯片STC89C5l为中心器件,辅以小键盘、LCD显示和功放电路及扬声器等来设计电子琴系统。同时详细论述了该系统的设计过程及关键技术。 1 系统硬件组成 电子琴的控制电路分为单片机STC89C51、工作指示LED、LCD显示器、按键输入、喇叭接口等几部分。其硬件电路结构框图如图1所示。 1.1 单片机STC89C51简介 STC单片机是一款增强型5l单片机,完全兼容MCS-51。STC89C51可以代替AT89C51,而且功
[单片机]
51单片机不适合做数据采集吗
想做一个简易数据采集卡。包含一个TLC1543(10位串行AD转换),一个51单片机以及其他一些小零件。关键是使用串行通信发送给计算机。由于我没有基础,是通过做这个设计来学习单片机的,所以对结果的预料不足。在我花费了很长时间做,到现在接近尾声时发现,要走自定协议的话51串行通信的速度跟不上!! 以下是我做过的两个通信测试实验: (1)不使用协议 我正确地把AD转换器与单片机相连,采集一个电压(例如3.2V)。我的程序大概如下: while(1) { TLC1543(); //进行AD转换 sent(); //把转换结果发送给计算机 } TLC1543是10位转换器,所以要用2个字节来保存。但我只发送高8
[单片机]
51单片机使用DAC0832编程输出方波,锯齿波,三角波,正弦波
#include reg51.h #include math.h #define uchar unsigned char #define uint unsigned int #define PI 3.1415925 float alph; void delayms(uint x) { uchar i; while(x--); { for(i=0;i 123;i++); } } main() { uchar i; while(1) { for(alph=0;alph 2*PI;alph+=0.1) { P2=1
[单片机]
<font color='red'>51单片机</font>使用DAC0832编程输出方波,锯齿波,三角波,正弦波
基于51单片机的红外线遥控器解码程序设计
描述 下面是一个对51实验板配套的红外线遥控器的解码程序,它可以把红外遥控器每一个按键的键值读出来,并且通过实验板上P1口的8个LED显示出来,在解码成功的同时并且能发出“嘀嘀嘀”的提示音。 ;================================================= ; 红外遥控接收 ;================================================= ; ew51仿真编程器 配套实验板学习例程 ; ; 中山单片机学习网 智佳科技 逸风 ; ; http://www.zsMCU.com ; E-mail:info@zsmcu.com ;===============
[单片机]
基于<font color='red'>51单片机</font>的红外线遥控器解码程序设计
基于AT89S51单片机的动态数码显示设计
1. 实验任务 如图所示,AT89S51单片机 P0端口接动态数码管的字形码笔段,P2端口接动态数码管的数位选择端,P1.7接一个开关,当开关接高电平时,显示“12345”字样;当开关接低电平时,显示“HELLO”字样。 2. 电路原理图 3. 系统板上硬件连线 (1. 把“单片机系统”区域中的P0.0/AD0-P0.7/AD7用8芯排线连接到“动态数码显示”区域中的a-h端口上; (2. 把“单片机系统”区域中的P2.0/A8-P2.7/A15用8芯排线连接到“动态数码显示”区域中的S1-S8端口上; (3. 把“单片机系统”区域中的P1.7端口用导线连接到“独立式键盘”区域中的SP1端口上; 4. 程序设计内容
[单片机]
基于AT89S<font color='red'>51单片机</font>的动态数码显示设计
AT89C2051单片机驱动步进电机的电路和源码
程序 stepper.c stepper.hex /* * STEPPER.C * sweeping stepper''s rotor cw and cww 400 steps * Copyright (c) 1999 by W.Sirichote */ #include c:\mc51\8051io.h /* include i/o header file */ #include c:\mc51\8051reg.h register unsigned char j,flag1,temp; register unsigned int cw_n,ccw_n; unsigned char step =
[单片机]
AT89C20<font color='red'>51单片机</font>驱动步进电机的电路和源码
51单片机【四】蜂鸣器 晶振 单片机频率
莫名想起小时候电脑开机自检时的声音 当然平时洗衣机空调什么的也有 蜂鸣器原理就是两个铁片让其中一个的一端正负极不停的变换从而拍击另一个产生声音 蜂鸣器分有源和无源蜂鸣器 有源指的是外部只需要供电即可响 无源指的是外部必须给一个变化的供电 ULN2003D 是类似于74HC573的一个放大器 蜂鸣器的BZ接在它的OUT5上 而CPU一端接在P15 因此使用P15控制 void BuzzerOnOff(void) { gBuz = 1; delay1ms(); gBuz = 0; delay1ms(); } 文末有晶振很具体的原理介绍,简要来说就是利用石英给它外部电压它能向表一样来计时给处理器参考
[单片机]
<font color='red'>51单片机</font>【四】蜂鸣器 晶振 单片机频率
STM32中断系统详解
1.中断的基本概念 1.1处理器中的中断:在处理器中,CPU正在执行某一段代码时遇到内部或者外部的紧急事件需要处理,暂停当前执行的代码、转而去处理紧急事件,处理完毕后继续执行之前的代码。 1.2中断的意义:中断可以提高CPU运行的效率、避免对某一事件状态的不断轮询损耗CPU资源,同时可以对紧急事件做实时处理;中断在计算机多任务处理中尤为重要(如:uCOS、FreeRTOS),可以实现多线程、多任务的处理; 1.3中断处理的过程:进入中断之前处理器将自动保存现场到堆栈中(现场:程勋运行的当前位置、变量的值等),根据中断向量表中的地址运行对应的中断服务程序,在退出中断前处理器会将之前保存在堆栈中的现场进行恢复(称之为出栈)、完
[单片机]
STM32<font color='red'>中断</font>系统<font color='red'>详解</font>
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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