郭天祥51单片机开发教程学习(5)定时器中断

定时器中断

书中P60例子:让LED1每秒闪烁1次

#include <reg52.h>
#include <intrins.h>

#define uint unsigned int   //宏定义
#define uchar unsigned char   //宏定义

sbit led1 = P1 ^ 0;

void main()
{
    TMOD = 0X01; //设置定时器0为工作方式1
    TH0 = (65536 - 45872) / 256;
    TL0 = (65536 - 45872) % 256;
    EA = 1; //开总中断
    ET0 = 1; //开定时器0中断
    TR0 = 1; //启动定时器0

    while(1);   //程序停止,等待中断发生
}

//设置定时器中断
uchar num;
void T0_time() interrupt 1
{
    TH0 = (65536 - 45872) / 256; //重装初值
    TL0 = (65536 - 45872) % 256;

    num++;

//到了1秒的时间
    if(num == 20)
    {
        num = 0;
        led1 = ~led1; //发光状态取反
    }

}

代码优化

书中P61例子

#include <reg52.h>
#include <intrins.h>

#define uint unsigned int   //宏定义
#define uchar unsigned char   //宏定义

sbit led1 = P1 ^ 0;
uchar num;

void main()
{
    TMOD = 0X01; //设置定时器0为工作方式1
    TH0 = (65536 - 45872) / 256;
    TL0 = (65536 - 45872) % 256;
    EA = 1; //开总中断
    ET0 = 1; //开定时器0中断
    TR0 = 1; //启动定时器0

    while(1)
    {
        //到了1秒的时间
        if(num == 20)
        {
            num = 0;
            led1 = ~led1; //发光状态取反

        }
    };
}

//设置定时器中断
void T0_time() interrupt 1
{
    TH0 = (65536 - 45872) / 256; //重装初值
    TL0 = (65536 - 45872) % 256;

    num++;
}

LED和数码管同时工作

书中P62例子

#include <reg52.h>

#define uint unsigned int   //宏定义
#define uchar unsigned char //宏定义

sbit dula = P2 ^ 6; //U1锁存器的锁存端
sbit wela = P2 ^ 7;
sbit led1 = P1 ^ 0;
//U2锁存器的锁存端
uchar code table[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71}; //共阴极数码管编码表

uchar num, num1, num2, shi, ge;

//延时
void sleep(uint delay)
{
    uint i, j;

    for (i = delay; i > 0; i--)
    {
        for (j = 110; j > 0; j--)
            ;
    }
}

//数码管显示内容
void display(uchar shi, uchar ge)
{
    dula = 1;
    P0 = table[shi];

    dula = 0;
    P0 = 0xff;

    wela = 1;
    P0 = 0xfe;

    wela = 0;
    sleep(5);

    dula = 1;
    P0 = table[ge];

    dula = 0;
    P0 = 0xff;

    wela = 1;
    P0 = 0xfd;

    wela = 0;
    sleep(5);
}

void main()
{
    TMOD = 0x11; //设置定时器0为工作方式1
    TH0 = (65536 - 45872) / 256;
    TL0 = (65536 - 45872) % 256;

    TH1 = (65536 - 45872) / 256;
    TL1 = (65536 - 45872) % 256;

    EA = 1;  //开总中断
    ET0 = 1; //开定时器0中断
    TR0 = 1; //启动定时器0

    ET1 = 1; //开定时器1中断
    TR1 = 1; //启动定时器1

    while (1)
    {
        display(shi, ge);
    }
}

//设置定时器中断
void T0_time() interrupt 1
{
    TH0 = (65536 - 45872) / 256; //重装初值
    TL0 = (65536 - 45872) % 256;

    num1++;

    if (num1 == 4)
    {
        num1 = 0;
        led1 = ~led1; //状态取反
    }
}

//设置定时器中断
void T1_time() interrupt 3
{
    TH1 = (65536 - 45872) / 256; //重装初值
    TL1 = (65536 - 45872) % 256;

    num2++;

    if (num2 == 20)
    {
        num2 = 0;
        num++;

        //把数字送到数码管显示。数字满60归零
        if (num == 60)
        {
            num = 0;
            shi = num / 10; //十位数
            ge = num % 10;  //个位数
        }
    }
}

代码编写完成后,对着书反复排查了几遍,发现LED是在不停闪烁,但是数码管前两位始终显示00,并没有按照预设的进行倒计时走动。因此飞云怀疑书中的代码存在bug,或者是因为硬件升级,导致代码变动。暂时放在这里,留待以后解决。

1. 官方交流QQ群,添加多个不批。建议使用安卓手机或电脑申请。
IOS免越狱自动化测试群:691997586
Auto.js学习交流①群:291981338
EasyClick学习交流①群:737066890
2. 盗版,破解有损他人权益和违法作为,请各位会员支持正版。
3. 本站部分资源来源于用户上传和网络搜集,如有侵权请提供版权证明并联系站长删除。
4.如未特别申明,本站的技术性文章均为原创,未经授权,禁止转载/搬运等侵权行为。
5.全站所有付费服务均为虚拟商品,购买后自动发货。售出后概不接受任何理由的退、换。注册即为接受此条款。 6.如果站内内容侵犯了您的权益,请联系站长删除。
飞云脚本 » 郭天祥51单片机开发教程学习(5)定时器中断

企业级大数据智能营销管理系统

了解详情