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;
}
}