定时中断笔记

title: 定时中断笔记
date: 2020-04-13 09:57:21
tags:
- 单片机
- C语言
- 定时中断
categories:
- 单片机笔记


单片机定时中断笔记

中断在使用前都是有一些启动的信号和条件的,这就开始:

先要开启所有中断EA=1;
定时器的总额度是不可变的(65536um),所以你如果想要定时20mm(20000um)的,所以你必须一开始就指定好开始时间。

开启定时中断的全部代码都在下面了:

EA=1;
ET0=1;
TH0=(65536-20000)/256;
TL0=(65536-20000)%256;
TMOD=0x01;
TR0=1;

必要解释:

  • 其中的EA上面已经说过了,是所有中断指令的必开开关。
  • ET0:这个是定时器内部元件的开关。
  • TH0/TL0:这两个是初始时间设定开关。(微秒为单位)
  • TMOD:是储存器的开关,它是八进制的;所以 0x 必须加上,后面按照现在来估计就是加上 1 了。
    -- 例如,开启定时器0,你设定是TMOD=0x01;
    -- 开启定时器1,你设定是TMOD=0x10;
    -- 如果两个都开启了,你设定是TMOD=0x11;

正文

中断在正文中要先开启定时,TR0或者是TR1要设置为1,这样才可以真正触发定时器。

中断指令的代码框架

void timer0 interrupt 1
{
        led0=~led0;
}

必要解释:

这个中断指令框架,后面的1是一个序号:
外部中断0的序号是:0;
定时器0序号是:1;
外部中断1的序号是:2;
定时器1的序号是:3;
串口的序号是4;
而内部代码随便你怎么写了。

举例

例如:定时20毫秒灯的亮灭;

#include<reg51.h>
sbit led0_7=P0^7;

void main()
{
    EA=1;
    ET0=1;
    TH0=(65536-20000)/256;   //初始时间设置
    TL0=(65536-20000)%256;
    TMOD=0x01;
    TR0=1;   //开启定时
    while(1);   
}

void timer0 interrupt 1
{
    led0=~led0;
    TH0=(65536-20000)/256;
    TL0=(65536-20000)%256;
}

改题目为定时1秒,但是定时器还没有1秒那么大的,所以只能重复使用定时器了,来一个叠加。

修改中断中的内容,预设的都不变:

void timer0 interrupt 1
{
    count++;
    if(count==10)
    {
        led0=~led0;
        count=0;
    }       
    TH0=(65536-20000)/256;
    TL0=(65536-20000)%256;
}

在上文的基础上加入按钮控制

原有的东西不变,就是补充一点东西。

sbit k5=P1^4;
sbit k6=P1^5;

void main()
{
    // 预设都不变;
    while(1)
    {
        if(k5==0)
        {
            TR0=1;          
        }
        else if(k5==0)
        {
            TR0=0;
        }
}

将按钮也加入到定时中断中,每10毫秒扫描一次:

原有的东西不变,就是补充一点东西。

    ET1=1;
    TH0=(65536-10000)/256;   //初始时间设置
    TL0=(65536-10000)%256;
    TMOD=0x11;
    TR1=1;   //开启定时
    
    void timer1 interrupt 3
    {
        if(k5==0)
        {
            TR0=1;          
        }
        else if(k5==0)
        {
            TR0=0;
        }   
    }

补充

如果你觉得直接数字填入不方便,你还可以提前定义好,例如:

#define a_time 20000 
#define b_time 10000

20000um就是你想要定时的时间了,而在程序中,你就可以使用a_time 来代替原先你想要设定的时间了。

如同下面的代码:

#define a_time 20000 
#define b_time 10000

EA=1;
ET0=1;
TMOD=0x01;
TR0=1;     //开启定时
TH0=(65536-a_time)/256;    //初始时间设置
TL0=(65536-a_time)%256;

ET1=1;
TH0=(65536-b_time)/256;   //初始时间设置
TL0=(65536-b_time)%256;
TMOD=0x11;
TR1=1;   //开启定时
sbit k5=P1^4;
sbit k6=P1^5;

void main()
{
    // 预设都不变;
    while(1)
    {
        if(k5==0)
        {
            TR0=1;          
        }
        else if(k5==0)
        {
            TR0=0;
        }
}

void timer0 interrupt 1
{
    count++;
    if(count==10)
    {
        led0=~led0;
        count=0;
    }       
    TH0=(65536-20000)/256;
    TL0=(65536-20000)%256;
}
    
void timer1 interrupt 3
{
    if(k5==0)
    {
        TR0=1;          
    }
    else if(k5==0)
    {
        TR0=0;
    }   
}

这样就是这节单片机课的所有了,祝大家好运!

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 单片机STC89C52学习——17 定时器和计数器 汇总:00 单片机STC89C52学习参考教程:普中科技 1 ...
    aaa小菜鸡阅读 5,078评论 0 0
  • 请设想一个场景:你正在公司码字,上司说开会。你有两个选择,一是继续码字,二是去会议室开会。大脑大概率会停下手头工作...
    风情云阅读 3,865评论 0 1
  • 0x06 LED矩阵 74HC595 工作原理 D0到D7从下到上P0到P7从右往左 代码示例 0x07 驱动直流...
    叶局长阅读 4,474评论 0 2
  • 交通灯控制设计 一、选题背景 每个城市的交通就犹如人体的血管,人类生命的持续需要心脏为血液提供动力,依靠血液来在人...
    Rik_personal阅读 5,800评论 0 0
  • 夜已静,雨未停。从隐约听见嘀嘀嗒嗒的小雨声到现在稀里哗啦地下大雨了。 结束了一天的奋战:工作已完成,孩子们也已安然...
    香茶榴莲阅读 2,910评论 0 3