找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1787|回复: 2
打印 上一主题 下一主题
收起左侧

利用单片机中断按键计数(key)源程序

[复制链接]
跳转到指定楼层
楼主
ID:983884 发表于 2021-11-23 18:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
定时器中断是由单片机中的定时器溢出而申请的中断。

51单片机中有两个定时器T0和T1:

TF0:定时器T0溢出中断请求。当定时器TO产生溢出时,TO中断请求标志TF0置1,请求中断处理。

TF1:定时器T1溢出中断请求。当定时器Tl产生溢出时,T1中断请求标志TF1置1,请求中断处理。

Stm32共有11个定时器:

1.两个高级定时器:TIM1、TIM8-------------------------APB2

2.四个通用定时器:TIM2~TIM5-------------------------APB1

3.两个基本定时器:TIM6、TIM7-------------------------APB1

4.两个看门狗

5.一个系统嘀嗒定时器(SysTick)


定时/计数器
编辑

定时/计数器T0和T1分别是由两个8位的专用寄存器组成,即定时/计数器T0由TH0和TL0组成,T1由TH1和TL1组成。此外,其内部还有2个8位的特殊功能寄存器TMOD和TCON,TMOD负责控制和确定T0和T1的功能和工作模式,TCON用来控制T0和T1启动或停止计数,同时包含定时/计数器的状态。 [1]

TF1:定时器1溢出标志。定时/计数器溢出时由硬件置位。中断处理时由硬件清除。或用软件清除。

TF0:定时器0溢出标志。定时/计数器溢出时由硬件置位。中断处理时由硬件清除,或用软件清除。

工作流程
编辑

定时器工作的流程可以按照这个顺序(以51为例用定时器0方式一产生10毫秒的定时)

1、确定使用哪个定时器,使用哪种方式,这一步通过TMOD设置,TMOD的低四位是设置定时器0的,高四位是用来设置定时器1的,其中的M0,M1是用来设置定时器工作在哪种方式,GATE一般用不要设置,C/T是选择计数模式还是定时模式的,如:TMOD = 0X01,就说明定时器0工作在方式1。

2、接下来就要设置定时的时间,用定时器定时50毫秒,可以用这种方式TH0 = (65535 - 10000) / 256,TL0 = (65535 - 10000) % 256;可以这样理解:因为这是定时器的初值,也就是说计数脉冲就是在这个数的基础上向上递增,到达65535后就溢出产生中断。

3、第三步打开中断,使用IE寄存器,首先打开总中断EA = 1,这一步是所有中断所必须的,然后打开定时器0中断,ET0 =1。

4、这时准备工作结束,启动定时器,使用TCON寄存器,TR0 = 1,实现了一个10毫秒的定时。



代码如下:(中断时间根据情况改变)

#include <reg51.h>
#include <delay.h>
sbit key1 = P0^0;
sbit LED1 = P3^0;
#define DataPort P1     //宏定义,如果换接口,需要修改这里
sbit Seg_Latch = P2^2;   //段锁存
sbit Bit_Latch = P2^3;   //位锁存
unsigned char code Seg_Code[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};  //段码
unsigned char code Bit_Code[] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};  //位码
void Display(unsigned char m,unsigned char num,unsigned int n);
unsigned char i;
void main()
{

        TMOD = 0x01;

        EA = 1;        //开中断
        ET0 = 1;
        //因为只有一个中断,所以IP不用设置
        TH0 = (65536 - 400) / 256;   
        TL0 = (65536 - 400) % 256;        
        TR0 = 1;   //开启定时器0,等待中断的到来
        while(1)
        {               
                key1 = 1;
                if(!key1)  //按下key1
                {
                        DelayMs(50);   
                        if(!key1)   //判断key1是否持续按下,进行防抖测试
                        {
//                                while(!key1) //
                                {
                                        LED1 = ~LED1;

                                }
                                while(!key1);
                                LED1 = 1;
                        }
                        i++;
                        if(i > 19)
                        {
                                i = 0;
                        }

                        Display(1,2,i);                       

                }

        }
}

void Display(unsigned char m,unsigned char num,unsigned int n)   //两位共阴极数码管显示数字
{
      unsigned char j,a[5];

        a[0] = n / 10;
        a[1] = n % 10;

        for(j = m-1;j < num;j++)
        {
                DataPort = 0;
                Seg_Latch = 1;  //段开门
                Seg_Latch = 0;   //段关门

                DataPort = Bit_Code[j];  //送位码,锁定第m位
                Bit_Latch = 1;    //位开门
                Bit_Latch = 0;    //位关门

                DataPort = Seg_Code[a[j]];  //送段码
                Seg_Latch = 1;  //段开门
                Seg_Latch = 0;   //段关门
        }

}   
void T0_ISR(void) interrupt 1
{
        unsigned char j;

        EA = 0;   //如果你不想被其他中断打断,屏蔽中断
        TH0 = (65536 - 400) / 256;   //
        TL0 = (65536 - 400) % 256;        
        Display(1,2,i);


        EA = 1;
}


评分

参与人数 1黑币 +30 收起 理由
admin + 30 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:298123 发表于 2021-11-29 13:55 | 只看该作者
不要再发这样的程序了,误人子弟!
回复

使用道具 举报

板凳
ID:983884 发表于 2021-11-30 21:25 | 只看该作者
hz_dyg 发表于 2021-11-29 13:55
不要再发这样的程序了,误人子弟!

抱歉,抱歉
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表