美文网首页
51单片机之定时器中断

51单片机之定时器中断

作者: David_Rao | 来源:发表于2019-09-26 12:34 被阅读0次

各寄存器知识回顾



需要用到ET0位



什么是T0溢出呢?T0溢出是指TH0、TL0计数位计数溢出。溢出会使溢出标志位TF0由0置1.



要用到中断入口1

void timer0() interrupt 1  //定时计数器0中断处理函数
{
中断处理语句
}
#include <reg52.h>

#define uint unsigned int
#define uchar unsigned char

sbit DU = P2^6;  //数码管段选
sbit WE = P2^7;  //数码管位选
uchar mSec, Sec;  //毫秒,秒

uchar code table[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f} ;  //code表示存在code区,数据不能被修改

void delay(unsigned int z)
{
    unsigned int x, y;
    for(x = z; x > 0; x--)
        for(y = 114; y >0; y--);
}

void display(uchar i)
{
    uchar bai, shi, ge;
    bai = i / 100;
    shi = i / 10 % 10;
    ge = i % 10;
    /*******************************************************/
    P0 = 0xff;  //清除断码
    WE = 1;  //打开位选
    P0 = 0XFE;  //1111 1110选择第一个数码管
    WE = 0;  //锁住位选数据
    
    DU = 1;  //打开段选
    P0 = table[bai];  //显示百位
    DU = 0;  //锁住段选数据
    delay(5);  
    /*******************************************************/
    P0 = 0xff;  //清除断码
    WE = 1;  //打开位选
    P0 = 0XFD;  //1111 1101选择第二个数码管
    WE = 0;  //锁住位选数据
    
    DU = 1;  //打开段选
    P0 = table[shi];  //显示十位
    DU = 0;  //锁住段选数据
    delay(5); 
    /*******************************************************/
    P0 = 0xff;  //清除断码
    WE = 1;  //打开位选
    P0 = 0XFB;  //1111 1011选择第三个数码管
    WE = 0;  //锁住位选数据
    
    DU = 1;  //打开段选
    P0 = table[ge];  //显示个位
    DU = 0;  //锁住段选数据
    delay(5);  
}
//定时器0初始化
void timer0Init()
{
    EA = 1;  //打开总中断
    ET0 = 1;  //允许T0中断
    TR0 = 1;  //启动定时器0
    TMOD = 0x01;  //定时器工作模式 M1=0;M0=1;
    TH0 = 0x4b;  //高八位
    TL0 = 0xfd;  //低八位
}

void main()
{
    timer0Init();  //定时器0初始化
    while(1)
    {
        display(Sec);
    }
}

// 定时器0中断函数
void timer0() interrupt 1
{
    TH0 = 0x4b;  //重放初值
    TL0 = 0xfd;
    mSec++;  //50ms到
    if(mSec == 20)  //20个50ms到
    {
        mSec = 0;
        Sec++;  //1秒到
    }
}



用定时器中断实现数码管扫描

#include <reg52.h>

#define uint unsigned int
#define uchar unsigned char

sbit DU = P2^6;  //数码管段选
sbit WE = P2^7;  //数码管位选
sbit key_s2 = P3^0;//S2按键位定义
sbit key_s3 = P3^1;//S3按键位定义

 //数码管段选码表
uchar code SMGduan[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f} ;
//数码管位选码表
uchar code SMGwei[] = {0xfe, 0xfd, 0xfb};
uchar num = 0;

void delay(unsigned int z)
{
    unsigned int x, y;
    for(x = z; x > 0; x--)
        for(y = 114; y >0; y--);
}

void display(uchar i)
{
    static uchar wei;  //退出函数后变量得到保留
    /*******************************************************/
    P0 = 0xff;  //清除断码
    WE = 1;  //打开位选
    P0 = SMGwei[wei]; 
    WE = 0;  //锁住位选数据
    switch(wei)
    {
        case 0 : DU = 1; P0 = SMGduan[i / 100]; DU = 0; break;
        case 1 : DU = 1; P0 = SMGduan[i / 10 % 10]; DU = 0; break;
        case 2 : DU = 1; P0 = SMGduan[i % 10]; DU = 0; break;
    }
    wei++;
    if(wei == 3)
        wei = 0;
}
//定时器0初始化
void timer0Init()
{
    EA = 1;  //打开总中断
    ET0 = 1;  //允许T0中断
    TR0 = 1;  //启动定时器0
    TMOD = 0x01;  //定时器工作模式 M1=0;M0=1;
    TH0 = 0xed;
    TL0 = 0xff;  //5ms
}

void main()
{
    timer0Init();  //定时器0初始化
    while(1)
    {
        if(key_s2 == 0)//判断S2是否按键
        {
            delay(5);//软件延时
            if(key_s2 == 0)
            {
                if(num != 9) //当等于255时不再加1
                    num++; //加1
            }
            while(!key_s2); //松手检测
        }
        if(key_s3 == 0)//判断S3是否按键
        {
            delay(5);//软件延时
            if(key_s3 == 0)
            {
                if(num != 0)    //当等于0时,不再减1
                    num--; //减1
            }
            while(!key_s3); //松手检测
        }
    }
}

// 定时器0中断函数
void timer0() interrupt 1
{
    TH0 = 0xed;//重放初值
    TL0 = 0xff; 
    display(num);
}

相关文章

  • 51单片机之定时器中断

    各寄存器知识回顾 需要用到ET0位 什么是T0溢出呢?T0溢出是指TH0、TL0计数位计数溢出。溢出会使溢出标志位...

  • 十四章 选择题

    1 MCS-51单片机在同一级别里除INTO外,级别最高的中断源是() A. 外部中断1 B.定时器T0 C...

  • 51单片机常用波特率初值表(12M晶振)

    为什么51单片机的晶振一般使用11.0592? 用11.0592晶振的原因是51单片机的定时器导致的。用51单片机...

  • 51单片机采用中断进行串口通信

    51单片机采用中断方式的串口通信过程及程序分析: 所谓中断方式,就是串口收/发标志位出发中断后,在中断中执行既定操...

  • 18 定时器中断

    单片机STC89C52学习——18 定时器中断 汇总:00 单片机STC89C52学习参考教程:普中科技 接上篇:...

  • 51单片机中断

    (2)EX1:IT1=0电平触发,低电平有效;IT1=1下降沿触发;IE1=0中断请求标志位2.单片机内部有两个1...

  • 命题-第13章-填空

    对采用电平触发方式的外部中断,必须在中断返回前( 撤销中断请求信号 )。 CS-51单片机有( 2 )个16位可...

  • 命题-第一章-填空

    对采用电平触发方式的外部中断,必须在中断返回前( 撤销中断请求信号 )。 CS-51单片机有( 2 )个16位可...

  • Keil方法类_中断实验

    中断系统和外部中断 实现一个C51单片机中断需要在中断请求标志位、中断允许标志位和 中断优先级控制位进行组合的实现...

  • 51定时器和计数器

    一、MCS-51单片机的定时器/计数器概念 单片机中的定时器和计数器其实是同一个物理的电子元件,只不过计数器记录的...

网友评论

      本文标题:51单片机之定时器中断

      本文链接:https://www.haomeiwen.com/subject/nbtkuctx.html