用 C学习51单片机——记录 4、中断系统
用 C 学习51单片机过程与自我拓展——记录(STC89C52芯片)
前言——其实51并不太难,多看 多写代码,多调试,就一定会有所感悟。
所以我在此留下一些代码以供自己重复记忆,也希望能够帮到你!
今天又找到时间更新了,来! 😀☞
(2)定时/计数器中断
定时/计数器中断是51中十分重要和基础的内容,大家一定要学习好这部分!
一、简单认识:
1、51单片机有2个16位定时/计数器
定时/计数器0 | 定时/计数器1 |
---|---|
引脚:T0 (P3^4) | 引脚:T1 (P3^5) |
2、定时/计数器独立于CPU外,CPU可与其同时工作
3、定时/计数器需要用到寄存器;
4、定时/计数器设定的时间最大值在71ms左右(若需要更大的时间间隔,需要自己在程序配置进制)
二、定时/计数器中断步骤:
说明: 要学会通过查看芯片手册完成以下步骤
1、初始化:
(1)启动定时/计数器(配置TCON控制器)
(2)选择其工作模式(配置TMOD)
常用的两种模式有 (以定时器0为例) :
TMOD = 0x01 | TMOD = 0x10 |
---|---|
16位定时/计数器 | 8位自动重装载定时器 |
(3)设置中断允许寄存器IE (eg:ET0 = 1、ET1 = 0 )
(4)设置定时/计数时间(eg:TH0 = 0x4b、TL0 = 0xfd)
⏰:设定定时/计数时间方法:
eg: 设定50ms
①把50ms 转化成微秒:50 000微秒
②50 000/1.085 =46082 (1.085微秒是每执行一次程序所需时间)
③65536 -46082的结果可以化成16进制,高两位放在TH0,低两位放在TL0
可以像示例程序那样写
2、写中断函数 ( 格式如:void timer1 ( ) interrupt 3 )
三、示例程序:
程序说明:每隔一秒蜂鸣器响一次
#include <reg52.h>
sbit beep = P2^3;
void timer0Init() //定时器0中断初始化
{
EA = 1;//打开总中断
ET0 = 1;//允许定时器0中断
TR0 = 1; //打开定时器0
TMOD = 0x01;//选择定时器0的工作模式(16位定时器模式)
TH0 = (65536-46082)/256;//设置50ms中断一次
TL0 = (65536-46082)%256;
}
void main ()
{
timer0Init(); //定时器0中断初始化
while(1);
}
void timer0 () interrupt 1 //定时器0中断函数
{
static unsigned char temp;//静态变量
TH0 = (65536-46082)/256;//设置50ms中断一次
TL0 = (65536-46082)%256;
temp++;
if(temp == 20) //够1秒响一次
beep = 0;
if(temp == 40) //再过一秒后关闭蜂鸣器
{
temp = 0; //清零,重新计数
beep = 1;
}
}