文章目录

    • 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单片机中断与计时器相关推荐

  1. 59s计时器C语言程序步骤详解,51单片机00-59秒计时器 0-59s Timer

    51单片机00-59秒计时器 0-59s Timer 1.  实验任务 如下图所示,在AT89S51单片机的P0和P2端口分别接有两个共阴数码管,P0口驱动显示秒时间的十位,而P2口驱动显示秒时间的个 ...

  2. 51单片机中断interrupt……using……

    51单片机中断细节的一些问题. interrupt0:外部中断0 interrupt1:定时器中断0 interrupt2:外部中断 interrupt3:定时器中断1 interrupt4:串口 u ...

  3. 单片机c语言reti的用法,基于51单片机中断跳出指令“RETI”浅议

    原标题:基于51单片机中断跳出指令"RETI"浅议 =RET指令+通知CPU中断服务已结束. 最近在基于编程的过程中出现了个很奇怪的问题"程序执行中在寄存器EA=1,ET ...

  4. c语言编写51单片机中断程序,执行过程是怎样的?

    Q:c语言编写51单片机中断程序,执行过程是怎样的? 例如程序: #include<reg52.h>   void main(void)   {    EA=1;      //开放总中断 ...

  5. 用51单片机中断控制LED灯亮灭

    用51单片机中断控制LED灯亮灭 #include<reg51.h>//头文件 sbit LED=P2^0;//位定义LED灯 sbit k3=P3^2;//位定义按键 void dela ...

  6. c语言T1中断程序编写步骤,用51单片机中断编写的4x4键盘程序

    当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章 用51单片机中断编写的4x4键盘程序 作者:未知   来源:山涧一溪流   点击数:-  更新时间:2014年06 ...

  7. 51单片机 | 中断系统

    文章目录 一.中断介绍 1.中断概念 二.中断结构及相关寄存器 1.中断结构 2.中断相关寄存器   这一节专门介绍 51单片机的中断系统,为后面学习外部中断.定时器中断.串口中断做好铺垫. 一.中断 ...

  8. 51单片机中断系统实验

    51单片机中断系统实验 一.实验内容 INT0端接单次脉冲发生器.按一次脉冲产生一次中断,CPU使P1.0状态发生一次反转,P1.0接LED灯,以查看信号反转. 根据实验内容编写一个程序,并在实验系统 ...

  9. 51单片机中断与定时器计数器,基于普中科技HC6800-ESV2.0

    目录 寄存器 置位复位 中断系统 中断概念 中断系统 中断系统构造 外部中断 计时器.定时器中段 串口中断 中断允许控制(控制中断方式) 总中断 各个中断 中断请求标志(控制触发方式) 外部中断触发方 ...

最新文章

  1. ajax和map返回数据类型,ajax请求后台返回map类型并如何展示
  2. 程序员如何避免陷入内卷?
  3. .NET Compact Framework下的蓝牙开发
  4. vue子组件改变父组件的值
  5. jboss修改服务器端口,改了默认端口的jboss不能用shutdown.sh关闭,怎样解决
  6. SurfaceFlinger draw/render/display流程(fps)
  7. openssl中算法的组织方式
  8. 冬日暖阳!网易大数据应用与分析实践分享沙龙【北京站 12.16】
  9. ubuntu 14.04 server 安装virtualbox (虚拟机)deb
  10. 向量函数具有固定模的充要条件
  11. 第二十三期:你用的Windows操作系统是不是盗版?微软知道吗
  12. 边境的悍匪—机器学习实战:第八章 降维
  13. 【WPS自动签到】利用云函数实现WPS自动签到获得WPS免费会员
  14. 【双足轮机器人】Ascento技术详解--(5)实验--(7)总结【翻译】
  15. Taro小程序跨端开发入门实战
  16. 星罗棋布:关于VPS测试脚本集锦内容
  17. 如何分辨真假LV包包
  18. 如何训练GAN?训练GAN的技巧和方法
  19. Caesar密码的生成与破解
  20. php对字节base64编码,Base64编码包含空字节的输入

热门文章

  1. 掌优刷脸支付刷出移动支付新热度
  2. BTC100白新学堂——货币流通的双重巧合
  3. 深拷贝工具类DeepCopyUtil
  4. 关于ArrayList和LinkedList的插入,遍历,删除时间比照
  5. LeetCode 三维形体的表面积
  6. 如何构建智能车联网主动防御体系
  7. 无人驾驶汽车的工作原理
  8. 个人作业-Week3
  9. Java 题目:编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数1/1+1/3+...+1/n
  10. java计算机毕业设计舞蹈网站源码+lw文档+系统+数据库