51定时器中断程序编写

发布者:FreeSpirit123最新更新时间:2018-12-19 来源: eefocus关键字:51定时器  中断程序 手机看文章 扫描二维码
随时随地手机看文章

上篇笔记记录到51单片机的中断允许寄存器、定时器/计数器工作方式寄存器(TMOD)、定时器/计数器控制寄存器(TCON)各位的作用。这些寄存器都是用来为编写定时器中断程序编写的初始化部分而服务的。然后今天再这里补填中断函数的编写格式,以后就可以编写定时器中断程序了。


1.中断服务程序的写法

C51的中断函数格式如下:


void  函数名()  中断号 using 工作组


{


        中断服务程序内容


}


与一般的C语言程序相比,中断服务程序有一下特点


中断函数不能返回任何值,所以函数名前用void;

函数名随便起,但不能与C51语言中的关键字同名(同C语言函数要求)

中断函数不能带任何参数,故函数名后的括号内为空

中断号是指单片机中的几个中断源的序号,列表如下(红方框内内容)

图1.51单片机中的中断源

        

        此序号是编译器识别不同中断的唯一符号,在程序编写中定要写正确。

“using 工作组”是指这个中断函数使用单片机内存中4组工作寄存器中的哪一组,C51编译器在编译程序时会自动分配工作组,因此这句话经常被省略不写。


2.定时器1中断程序编写

#include


#define uint unsigned int



#define MANY_KEY_DELAY  1

#define TOTAL_TIME_NUM  5

#define ONE_SECOND      20


uint num;

uint num1;


uint flag_key;


//流水灯的第一列

sbit led1 = P1^0;

//第一个按钮位

sbit key = P3^1;

//按钮的接地端

sbit h_key6 = P3^6;


//函数申明

void T1_end_AND_change_status();

void delayms(uint xms);

void init_timer();

void data_init();

void key_scan();


void main()

{

        //初始化数据变量

        data_init();


        //初始化T1定时器

        init_timer();


        while(1){


                //不断检测此按钮是否被按下

                key_scan();


                //检测一个大周期定时是否完成

                //使按下按钮后相应的位发生电平反转

                T1_end_AND_change_status();

        }

}


//自定义函数:数据初始化

void data_init()

{

     num        = 1;

     num1       = 1;

     flag_key   = 0;

     h_key6     = 0;   

}


//自定义函数:初始化TMOD、TCON、中断寄存器,并装入计数初值

void init_timer()

{

        //选中定时器1

        TMOD    = 0x10;


        //定时器1的初值

        TH1     = (65536 - 45872) / 256;

        TL1     = (65536 - 45872) % 256;

        

        //开总中断,     

        //定时器1中断

        EA         = 1;

        ET1        = 1;

}


//自定义函数:延迟xms ms

void delayms(uint xms)

{

        uint i, j;


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

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

}


//自定义函数:检测哪一个按键被按下

void key_scan()

{

        if(key == 0){

                //<1>.待按钮被按下后的稳定状态

                delayms(10);

    

                //<2>.操作:

                //开启定时器,由T1时间到达关闭T1定时器

                TR1 = 1;

    

                //记住按钮已被按下

                flag_key    = 1;

    

                //点亮响应的流水灯

                led1        = 0;

    

                //<3>.等待按键的释放

                while(!key);    

        }      

}


void T1_end_AND_change_status()

{

        //T1计时完成

        if(num >= TOTAL_TIME_NUM * ONE_SECOND){

                num     = 0;

                

                //检测有哪些按钮被按下,结束其高低电平的转换

                if(flag_key){

                        flag_key       = 0;


                        //按钮信号以低电平结束

                        led1    = 1;

                                

                        //一旦检测到总的计时时间到则关闭定时功能

                        //当有任何按钮再次被按下时,T1定时器再被开启

                        //需要在按钮被按下的前提下设置此语句,防止没有任何按钮按下时到达定时器时间设置

                        TR1     = 0;

                 }

        }

        

        //按钮的电平反转

        if(num1 >= MANY_KEY_DELAY * ONE_SECOND){

                num1    = 0;

                if(flag_key){

                        led1    = ~led1;

                }

        }

             

}


//中断函数编写

void T1_time() interrupt 3

{

     TH1        = (65536 - 45872) / 256;

     TL1        = (65536 - 45872) % 256; 

     

     num++;

     num1++;    

}


此源程序经编译链接生成可执行文件后,下载到单片机中,按下key对应的按键时,流水灯1就会以1s的高低电平交换显示。照片一张作为纪念:

图2.闪烁的流水灯

3.程序分析

程序从main函数出开始运行。自在main函数中对个寄存器初始化后,待按键按下(TR1=1)时,定时器1开始从当前值开始计时,当计数计满溢出时,TCON的TF1向CPU申请中断从而进入中断函数内执行中断函数内的语句,当把中断函数内的语句执行完毕后,再返回到main函数开始中断处。当在中断函数中重新给定时器赋新值后(若不赋新值,则从0开始计),则将又会过与原来一样长的时间后发生中断。

此程序的中断周期是50ms(晶振频率为11.0592)。此程序随时等待按钮被按下,只有按钮被按下时才开始计时,中断程序才会生效。定时器被启动后,将会以50ms的周期进行中断产生,当计满1s时,流水灯的状态反转一次。当计满5s后定时器再次被关闭。程序重新等待按钮被按下。


4.总结

使用定时器中断的方式可以得到以高低电平反转的方波。在现实生活中我们可以用这种方波做很多事情,如红外遥控器就是采用的此种原理对不同按钮进行编码,经发射电路将此方波发射出去,再由相应的接收电路接受此方波,然后对其进行解码,得到原信号进而可以判断此信号是想要做出什么样的操作。

当然,使用单片机编写程序不再是单纯的写代码,还需要会阅读各种电路图和电器件的特性。


关键字:51定时器  中断程序 引用地址:51定时器中断程序编写

上一篇:C51 单片机的中断号以及中断向量
下一篇:C51单片机学习(二):中断系统和定时器

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

AT89S51中断服务子程序的设计
  中断系统的运行必须与中断服务子程序配合才能正确使用。设计中断服务子程序需要首先明确以下几个问题。      中断服务子程序设计的任务      中断服务子程序设计的基本任务有下列4条:      (1)设置中断允许控制寄存器IE,允许相应的中断请求源中断。      (2)设置中断优先级寄存器IP,确定并分配所使用的中断源的优先级。      (3)若是外部中断源,还要设置中断请求的触发方式IT1或IT0,以决定采用 电平 触发方式还是跳沿触发方式。      (4)编写中断服务子程序,处理中断请求。      前3条一般放在主程序的初始化程序段中。      举例如下:例1、假设允许外部中断0中断,并设定它为高优先级中断,其
[单片机]
AT89S<font color='red'>51</font><font color='red'>中断</font>服务子<font color='red'>程序</font>的设计
AT89C51单片机定时器应用设计
一、设计目的 1、学习并掌握定时器/计数器的工作原理; 2、学习并掌握定时器/计数器控制程序设计方法; 3、学习并掌握矩阵键盘工作原理与程序设计方法; 4、学习并掌握显示程序设计; 二、实验设备 1、计算机; 2、单片机开发板; 3、Keil C51编程软件; 4、Proteus仿真软件; 三、设计内容 1、功能 必须使用定时器完成以下功能。 功能1:4位数码管显示“分钟.秒” 功能2:K1设置键、K2加1键、K2减1键 (1)正常情况:显示“分钟.秒” (2)按下K1:第一次按下调整分钟状态、第二次按下调整秒状态、第三次按下正常显示状态 (3)按下K2:分钟或秒加1 (4)按下K3:分钟或秒减1 选做功能:闹钟功能(请先完成
[单片机]
AT89C<font color='red'>51</font>单片机<font color='red'>定时器</font>应用设计
你不知道的PIC单片机中断程序的设计技巧
所有的中档系列PIC单片机,PORTB端口最高的4个引脚(RB7~RB4)在设为输入模式时,当输入电平由高到低或由低到高发生变化时,可以让单片机产生中断。这就是通常所说的引脚状态变化中断。 在设计引脚中断程序时,有三个需要特别注意的地方。一是,在清除P0RTB中断标志位RBIF之前,必须安排一条必不可少的,以PORTB端口数据寄存器PORTB为源寄存器的读操作指令。放置这一指令的目的有时并不只是为了读取有用的数据,而是为了取消状态变化的硬件信号,以便顺利清除RBIF标志位,为下一次中断做好准备。二是,由于端口PORTB是引脚电子变化中断,即无论引脚出现上升沿还是下降沿都会产生中断请求,所以必须处理好不需要的虚假中断。三是,
[单片机]
51单片机学习:定时器0实验
实验名称:定时器0实验 接线说明: 实验现象:下载程序后,D1指示灯间隔1s闪烁 注意事项: ***************************************************************************************/ #include reg52.h typedef unsigned int u16; //对系统默认数据类型进行重定义 typedef unsigned char u8; //定义LED1管脚 sbit LED1=P2^0; /********************************************************************
[单片机]
C51单片机定时器/计数器中断功能详细分析(二)
一.外部中断相关寄存器 1.定时器/计数器控制寄存器控制寄存器(TCON) IT0:外部中断0触发方式控制位 当IT0=0时,为电平触发方式(低电平有效) 当IT0=1时,为边沿触发方式(下降沿有效) IT1:外部中断1触发方式控制位 当IT1=0时,为电平触发方式(低电平有效) 当IT1=1时,为边沿触发方式(下降沿有效) 2.中断允许控制寄存器(IE) EX0:外部中断0允许位; EX1:外部中断1允许位; EA :CPU中断允许(总允许)位。 二.外部中断的处理过程 1、设置中断触发方式,即IT0=1或0,IT1=1或0 2、开对应的外部中断,即EX0=1或EX1=1; 3、开总中断,即EA=1; 4、等待外部设
[单片机]
C<font color='red'>51</font>单片机<font color='red'>定时器</font>/计数器<font color='red'>中断</font>功能详细分析(二)
总结C51、STM32和S3C2440的时钟体系和定时器
/* 名称:总结C51、STM32和S3C2440的时钟体系和定时器 说明:对于C51单片机来说,其谈不上什么时钟体系。片上运行的所有东西都靠一个时钟脉冲提供–外部晶振。 对于STM32来说,其时钟体系比较复杂。为了达到降低能耗的目的,再设计STM32时,其厂商特地设计了一个STM32的时钟树。就连最简单的点亮一个LED灯,都必须配置其时钟树,再打开对应的时钟开关。 在这里简单介绍一些STM32的时钟树的主要部分: 对于这个复杂的时钟树,它的来源可以为外部高速时钟、外部低速时钟、内部低速时钟、内部高速时钟(HSE、HSI、LSI、LSE)。当然,具体选择哪个需要根据需要。在这里选择一个主要的来讲:就是外部高速时钟(HSE)。然
[单片机]
51单片机 】定时器的初始值计算 详解
首先值得一提的是:51单片机定时器与主程序是并行工作的,就是主程序在运行的时候,定时器也在计数,计数溢出后定时器中断主程序的运行,转而执行中断服务程序。此外还有串行口、中断系统…,都独立的工作,不用 CPU 干预。 正文部分: 好了,我们先来看初始值计算公式: 公式:(216– X)× 12 ÷ 晶振频率 = 定时时间(默认单位us) ————————————————————————————————— X是未知量 ————————————————————————————————— 216是根据方式选择的,可以自行选择,方式1为16位 方式0 :213 (少用) 方式1 :216 (最常用) 方式2 :28 (常用) 假
[单片机]
【<font color='red'>51</font>单片机 】<font color='red'>定时器</font>的初始值计算 详解
AVR128 外部中断 C程序
/*ATavr 128 功能:外部中断INT0、INT1*/ /*GCC编译器*/ #include avr/io.h #include util/delay.h #include avr/interrUpt.h #define SET_1(a,b) a|=(1 b) #define CLE_0(a,b) a&=~(1 b) #define uchar unsigned char #define uint unsigned int /*中断初始化,INT0、INT1、定义为下降沿触发*/ void int_init( void ) { cli(); EICRA|=(1 ISC11)|(1 ISC10); EIMSK|=
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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