51单片机中断与计时器
文章目录
- 1、配置下图中各寄存器
- 1. 定时器/计数器控制寄存器TCON
- 2.定时器、计数器模式控制寄存器TMOD
- 3.TH0及TL0
- 2、中断设置
- 二、中断程序
51单片机中断与计时器 # 一、定时器初始化
1、配置下图中各寄存器
1. 定时器/计数器控制寄存器TCON
该寄存器可以进行位寻址。TCON寄存器用来控制定时器的启、停,标志定时器的溢出和中断情况。单片机复位时TCON全部清0。这个寄存器的给位定义如下表所示。其中TF1、TR1、TF0和TR0位用于定时器/计数器的设置。(IE1、IT1、IE0和IT0位用于外部中断的设置。【暂时不需要了解,且现在只单了解TF0、TR0即可】)
TF0—定时器0溢出标志位
TR0—定时器0运行控制位
TF0和TRO设置在文章后面有快速方法
2.定时器、计数器模式控制寄存器TMOD
TMOD:
TMOD是定时器、计数器模式控制寄存器(TIMER/COUNTER MODE CONTROL REGISTER)
不能位寻址,TMOD用来确定定时器T0和T1的工作方式及功能选择,单片机复位时,TMOD全部被清0,TMOD寄存器的定义如下。
定时器/计数器工作方式寄存器TMOD
这个寄存器的高4位用来设置定时器T1,低4位用来设置定时器T0。
M1:M0—工作方式选择位
每个定时器/计数器由4中工作方式,他们由M1和M0设定,对应关系如下表所示。
定时器/计数器的4种工作方式
M1 | M0 | 工作方式 |
---|---|---|
0 | 0 | 方式0:13位定时器/计数器 |
0 | 1 | 方式1:16位定时器/计数器 (常用) |
1 | 0 | 方式2:8位初始值自动重置的8位定时器/计数器 |
1 | 1 | 方式3:仅适用于T0,分成两个8位计数器,T1停止计数 |
模式0(13位定时器/计数器)(很少用)
将定时器设置成模式0时类似8048定时器,即8位计数器带32分频的预分频器。下图所示
模式1
(本不想放模式0的,但我发现我模式1的笔记记模式0上了,哈哈)
TMOD设置在文章后面有快速方法
3.TH0及TL0
TH0和TL0是用于设置定时初始值,让每次定时器记我们想要的特定时间,设置方法可在STC-ISP中快捷、准确的复制(哈哈,有现成的)
前文讲到的快速方法:
2、中断设置
最后的定时器初始化程序:
void Timer0_Init() //1毫秒@11.0592MHz
{ TMOD &= 0xF0; //设置定时器模式TMOD |= 0x01; //设置定时器模式TL0 = 0x66; //设置定时初始值TH0 = 0xFC; //设置定时初始值TF0 = 0; //清除TF0标志TR0 = 1; //定时器0开始计时ET0 = 1;EA = 1;PT0 = 0;
}
二、中断程序
例子一:
每隔一秒P2_0控制的LED亮一次
例子二:
按键控制流水灯模式,按下(同一个个按键,P3_1)按键,流水灯转换流动方向
main.c
#include <REGX52.H>
#include <Timer0.H>
#include <Key.H>int LedMode;
void main()
{Timer0_Init();while(1){LedMode = Key();}
}int i = 0;
void Timer0_Routine() interrupt 1
{char LedMode1[] ={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};static Timer0Count;Timer0Count++;if(Timer0Count == 1000){P2 = LedMode1[i];if (LedMode == 0){i++;if(i >= 8 ){i = 0;}}if (LedMode == 1){i--;if(i <= -1 ){i = 7;}}Timer0Count =0;}TL0 = 0x66; //设置定时初始值TH0 = 0xFC; //设置定时初始值
}
Key.c
#include <REGX52.H>
#include <delay.H>int KeyNumber = 0;
int Key()
{if (P3_1 == 0){delay(20);while(P3_1 == 0);delay(20);KeyNumber = ~KeyNumber;if(KeyNumber == -1){KeyNumber = 1;}if(KeyNumber == -2){KeyNumber = 0;}}return KeyNumber;}
Timer0.c
#include <REGX52.H>void Timer0_Init() //1毫秒@11.0592MHz
{TMOD &= 0xF0; //设置定时器模式TMOD |= 0x01; //设置定时器模式TL0 = 0x66; //设置定时初始值TH0 = 0xFC; //设置定时初始值TF0 = 0; //清除TF0标志TR0 = 1; //定时器0开始计时ET0 = 1;EA = 1;PT0 = 0;
}
delay.c
void delay(int x) //0.001 s
{ unsigned char i, j;for (;x > 0;x--){i = 2;j = 119;do{while (--j);} while (--i);;}}
.h文件不再一一列出,只列出Key.h,其余格式一样
#ifndef __KEY_H__
#define __KEY_H__
int Key(void);
#endif
例子二全部文件列表:
注:本文程序使用测试单片机为STC89C52RC
51单片机中断与计时器相关推荐
- 59s计时器C语言程序步骤详解,51单片机00-59秒计时器 0-59s Timer
51单片机00-59秒计时器 0-59s Timer 1. 实验任务 如下图所示,在AT89S51单片机的P0和P2端口分别接有两个共阴数码管,P0口驱动显示秒时间的十位,而P2口驱动显示秒时间的个 ...
- 51单片机中断interrupt……using……
51单片机中断细节的一些问题. interrupt0:外部中断0 interrupt1:定时器中断0 interrupt2:外部中断 interrupt3:定时器中断1 interrupt4:串口 u ...
- 单片机c语言reti的用法,基于51单片机中断跳出指令“RETI”浅议
原标题:基于51单片机中断跳出指令"RETI"浅议 =RET指令+通知CPU中断服务已结束. 最近在基于编程的过程中出现了个很奇怪的问题"程序执行中在寄存器EA=1,ET ...
- c语言编写51单片机中断程序,执行过程是怎样的?
Q:c语言编写51单片机中断程序,执行过程是怎样的? 例如程序: #include<reg52.h> void main(void) { EA=1; //开放总中断 ...
- 用51单片机中断控制LED灯亮灭
用51单片机中断控制LED灯亮灭 #include<reg51.h>//头文件 sbit LED=P2^0;//位定义LED灯 sbit k3=P3^2;//位定义按键 void dela ...
- c语言T1中断程序编写步骤,用51单片机中断编写的4x4键盘程序
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章 用51单片机中断编写的4x4键盘程序 作者:未知 来源:山涧一溪流 点击数:- 更新时间:2014年06 ...
- 51单片机 | 中断系统
文章目录 一.中断介绍 1.中断概念 二.中断结构及相关寄存器 1.中断结构 2.中断相关寄存器 这一节专门介绍 51单片机的中断系统,为后面学习外部中断.定时器中断.串口中断做好铺垫. 一.中断 ...
- 51单片机中断系统实验
51单片机中断系统实验 一.实验内容 INT0端接单次脉冲发生器.按一次脉冲产生一次中断,CPU使P1.0状态发生一次反转,P1.0接LED灯,以查看信号反转. 根据实验内容编写一个程序,并在实验系统 ...
- 51单片机中断与定时器计数器,基于普中科技HC6800-ESV2.0
目录 寄存器 置位复位 中断系统 中断概念 中断系统 中断系统构造 外部中断 计时器.定时器中段 串口中断 中断允许控制(控制中断方式) 总中断 各个中断 中断请求标志(控制触发方式) 外部中断触发方 ...
最新文章
- ajax和map返回数据类型,ajax请求后台返回map类型并如何展示
- 程序员如何避免陷入内卷?
- .NET Compact Framework下的蓝牙开发
- vue子组件改变父组件的值
- jboss修改服务器端口,改了默认端口的jboss不能用shutdown.sh关闭,怎样解决
- SurfaceFlinger draw/render/display流程(fps)
- openssl中算法的组织方式
- 冬日暖阳!网易大数据应用与分析实践分享沙龙【北京站 12.16】
- ubuntu 14.04 server 安装virtualbox (虚拟机)deb
- 向量函数具有固定模的充要条件
- 第二十三期:你用的Windows操作系统是不是盗版?微软知道吗
- 边境的悍匪—机器学习实战:第八章 降维
- 【WPS自动签到】利用云函数实现WPS自动签到获得WPS免费会员
- 【双足轮机器人】Ascento技术详解--(5)实验--(7)总结【翻译】
- Taro小程序跨端开发入门实战
- 星罗棋布:关于VPS测试脚本集锦内容
- 如何分辨真假LV包包
- 如何训练GAN?训练GAN的技巧和方法
- Caesar密码的生成与破解
- php对字节base64编码,Base64编码包含空字节的输入
热门文章
- 掌优刷脸支付刷出移动支付新热度
- BTC100白新学堂——货币流通的双重巧合
- 深拷贝工具类DeepCopyUtil
- 关于ArrayList和LinkedList的插入,遍历,删除时间比照
- LeetCode 三维形体的表面积
- 如何构建智能车联网主动防御体系
- 无人驾驶汽车的工作原理
- 个人作业-Week3
- Java 题目:编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数1/1+1/3+...+1/n
- java计算机毕业设计舞蹈网站源码+lw文档+系统+数据库