//首先定时器根据时钟的输出信号每隔一段时间对计数单元进行加1
//当计数单元加1到设定提醒时间就进行中断申请,使程序跳转到中断函数中执行//1.工作模式寄存器TMOD,不可位寻址TMOD &= 0xF0;      //设置定时器模式TMOD |= 0x01;     //设置定时器模式//配置上述的每隔一段时间进行加1计数操作TL0 = 0x66;      //设置定时初值TH0 = 0xFC;        //设置定时初值
//2.控制寄存器TCON,可位寻址,可以单独赋值TF0 = 0;//清除TF0.标志,TF0 = 1时溢出,可以不配置,硬件即可自动配置TR0 = 1;        //定时器0开始计时
//3.中断
//3.1中断允许控制寄存器IEEA = 1;//CPU的总中断允许控制位,EA = 1,CPU开放中断ET0 = 1;//定时器0中断允许控制寄存器
//3.2中断优先级控制寄存器IP,针对普通的89c52
//stc89c52有四个优先级选择,还需配置寄存器IPHPT0 = 0;//设置中断优先级

一.对于几点对于51单片机代码的建议

1.模块化代码

2.熟练运用软件STC-ISP

二.定时器时钟代码(LCD显示)

1.main函数:

#include <REGX52.H>
#include "Delay.h"
#incldue "LCD1602.h"
#include "Timer0.h"//unsigned char Sec = 0;//秒
//unsigned char Min = 0;//分
//unsigned char Hour = 0;//时
//unsigned char Day = 0;//天//验证代码能不能进位
unsigned char Sec = 50;
unsigned char Min = 59;
unsigned char Hour = 23;
unsigned int Day = 363;void LCD_Init();
void LCD_ShowString(unsigned char Line,unsigned char Column,char *String);
void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);
void LCD_ShowChar(unsigned char Line,unsigned char Column,char Char);void main()
{//初始化LCD_Init();Timer0_Init();//lcd显示//LCD_ShowString(1,1,"Clock:");LCD_ShowString(1,1,"Hour:Min:Sec");LCD_ShowString(1,14,"Day");while(1){LCD_ShowNum(2,7,Sec,2);LCD_ShowChar(2,6,':');LCD_ShowNum(2,4,Min,2);LCD_ShowChar(2,3,':');LCD_ShowNum(2,1,Hour,2);LCD_ShowNum(2,14,Day,3);}
}void Timer0_Rountine() interrupt 1
{static unsigned int T0count;//局部变量,static子函数结束后依然保留占据空间//每次运行中断都重新赋初值保证不溢出和计数间隔//重新赋初值TL0 = 0x66;      //设置定时初值,由stc生成TH0 = 0xFC;      //设置定时初值T0count++;//计数if(T0count>=1000)//1000*1ms = 1s{T0count = 0;Sec++;if(Sec>=60){Sec = 0;Min++;if(Min>=60){Min = 0;Hour++;if(Hour>=24){Hour = 0;Day++;}}}}
}

2.配置定时器函数(解析)

​
#include <REGX52.H>
/***@brief 定时器0初始化 1ms@11.0592hz*@param 无*@retval 无*/void Timer0_Init()
{//TMOD不可位寻址,所以其必须八位直接赋值//如果同时使用定时器0和定时器1的时候,会刷新中断配置//TMOD = 0x01;//模式1,就是M1 = 0,M0 = 1,即0000 0001//0-65535,每隔1us计数+1,所以需要设置初始值//16位定时器最大时间间隔 = 2^16 = 65.536ms//TMOD = TMOD&0xF0;//与同1才为1,其余均为0,所以低4位清零,高4位保持不变//TMOD = TMOD|0x01;//只要有1就是1,同0才为0.所以除了最后一位均不变,最后一位置1//这样就是高4位依然不变,改变的只是低4位,即定时器0//TF0 = 0;//TF是溢出标志,表明没有溢出//TR0 = 1;//定时器0的运行控制位//设置每次计数时间//TH0使用8位,TL0使用8位,//虽然我们合在一起成了16位定时器,但是我们写的时候得分开写//TH0 = 64535/256;//(65535-1000)/256,1000us等于1ms,//TL0 = 64535%256;//为刚好1ms//定时器设置,每隔1ms发起一次中断//比如64535离计数器溢出差值是1000,所以计时时间是1ms//比如65535/256 = 255,刚好是1111 1111,高八位//65535%256 = 0,刚好是0000 0000,低八位//对于以上的/与%有1us的延迟,为什么//TL0 = 64535%256,计算出来是0x17,stc配置出来时0x18,相差1us//因为65535并没有溢出,离计数器溢出差值应该是1001usTMOD &= 0xF0;        //设置定时器模式TMOD |= 0x01;     //设置定时器模式TL0 = 0x66;       //设置定时初值TH0 = 0xFC;        //设置定时初值TF0 = 0;       //清除TF0标志TR0 = 1;      //定时器0开始计时//中断EA = 1;//CPU的总中断允许控制位,EA = 1,CPU开放中断ET0 = 1;//定时器0中断允许控制寄存器PT0 = 0;//设置中断优先级
}​

3.定时器配置代码(具体见第三第四概念总结)

89c51单片机内部有两个16位的定时/计数器,即定时器T0和定时器T1,单片机的定时功能其实就是通过计数来实现的,当单片机每一个机器周期产生一个脉冲时,计数器就加一。

一个16位的定时器,它所能计数的范围是0~65535,如果单片机采用的是12M的晶振,那么定时器单次最长的时间为65535*((1/12)*12),因为一个一个机器周期等于12个振荡周期,那么定时器加一所用的时间是1/12M*12是1us,也就是一个12MHz晶振的51单片机单次最长时间约为65ms.

即普通的51单片机所能配置中断的最长时间是65ms,正常情况下,0-65535,每隔1us计数+1,所以需要配置定时初值。

定时器模式可见下图:

具体代码由stc-isp生成:

//首先定时器根据时钟的输出信号每隔一段时间对计数单元进行加1
//当计数单元加1到设定提醒时间就进行中断申请,使程序跳转到中断函数中执行//1.工作模式寄存器TMODTMOD &= 0xF0;       //设置定时器模式TMOD |= 0x01;     //设置定时器模式TL0 = 0x66;       //设置定时初值TH0 = 0xFC;        //设置定时初值
//2.控制寄存器TCONTF0 = 0;//清除TF0.标志,TF0 = 1时溢出,可以不配置,硬件即可自动配置TR0 = 1;      //定时器0开始计时
//3.中断
//3.1中断允许控制寄存器IEEA = 1;//CPU的总中断允许控制位,EA = 1,CPU开放中断ET0 = 1;//定时器0中断允许控制寄存器
//3.2中断优先级控制寄存器IP,针对普通的89c52
//stc89c52有四个优先级选择,还需配置寄存器IPHPT0 = 0;//设置中断优先级

三.中断

  1. 什么是中断:

2.中断嵌套:   

3.中断优先级

4.中断查询次序

 

5.中断结构

6.中断请求标志位

7.中断触发

8.中断寄存器

9.中断允许寄存器

 10.中断优先级控制寄存器

11.中断优先级

四.定时器

1.定时器/计数器0/1

89c51单片机内部有两个16位的定时/计数器,即定时器T0和定时器T1,单片机的定时功能其实就是通过计数来实现的,当单片机每一个机器周期产生一个脉冲时,计数器就加一。

如,一个16位的定时器,它所能计数的范围是0~65535,如果单片机采用的是12M的晶振,那么定时器单次最长的时间为65535*((1/12)*12),因为一个一个机器周期等于12个振荡周期,那么定时器加一所用的时间是1/12M*12是1us,也就是一个12MHz晶振的51单片机单次最长时间约为65ms.

2.定时器工作模式

3.定时器/计数器工作模式寄存器TMOD

当GATE = 1开门,定时器开启与关闭由外部与内部一起控制,对于定时器1来说,GATE = 1,当INT1引脚为高且TR1 = 1时才开启定时器。

当C/T位为1时工作在定时器模式,当M1与M0取值不同代表不同的计数模式,当M1 = 0,M0=1是16位定时器,最多可以存放2^16=65536个计数值,51单片机每计数一个值的时间是一个机器周期,也就是12个时钟周期,T = 12t = 12*(1/12000000)= 1us,所以可以知道最大的计数时间为65.536ms.

M1=1,M0=0时,是一个8位具有重载初值功能的定时器,自动重载初值就是在计数器里面的值计满后,单片机会产生一个溢出中断,自动将计数值清0,因此每次在中断服务程中都需要进行重新赋计数值,而这种模式就省去了重新幅值这一步,由单片机自动进行赋值。

51单片机配置中断与定时器应用相关推荐

  1. 吴鉴鹰51单片机学习—中断、定时器同时点亮数码管和LED各种效果

    LED闪烁有5种效果,数码管点亮有3种效果,包含小彩蛋哟 实现代码如下: //#include <reg52.h> #include <REGX52.H>//typedef u ...

  2. 10 51单片机汇编:让定时器产生中断(使用Keil模拟器)[系列教程之10]

    10 51单片机汇编:让定时器产生中断(使用Keil模拟器)[系列教程之10] 该系列主仓库地址:https://gitee.com/langcai1943/8051-from-boot-to-app ...

  3. PIC16F877A单片机 (中断与定时器Timer1)

    PIC16F877A单片机 (中断与定时器Timer1) 1 基本原理 2 实现代码 1 基本原理 上图中,如果RC0左边外接了外部的晶振,那么T1OSCEN必须置一.这个外部的晶振频率一般都比较低. ...

  4. 51单片机 (九)定时器

    什么是定时器? 定时器是单片机的重要功能模块之一,在检测.控制领域有广泛应用.定时器常用作定时时钟,以实现定时检测,定时响应.定时控制,并且可以产生ms宽的脉冲信号,驱动步进电机.定时和计数的最终功能 ...

  5. AutoLeaders控制组——51单片机学习笔记(定时器、串口通信)

    本篇内容是观看B站江科大自化协UP主的教学视频所做的笔记,对其中内容有所引用,并结合自己的单片机板块进行了更改调整. 以下笔记内容以一个视频为一个片段(内容较多,可能不适合速食,望见谅) 一些内容涉及 ...

  6. 51单片机之中断系统

    51单片机之中断系统 中断系统 四种中断类型: 外部中断: 定时器/计数器T0.T1中断: 串行口中断: 定时器/计数器T2中断: 中断入口: 与中断相关的特殊功能寄存器: 中断优先级: 中断响应时间 ...

  7. PIC16F15323单片机 (中断与定时器Timer0)

    PIC16F15323单片机 (中断与定时器Timer0) 1 基本原理 2 实现代码 开发环境选择的是 MPLAB X IDE v5.50和 xc8-v2.32-full-install-windo ...

  8. PIC16F877A单片机 (中断与定时器Timer2)

    PIC16F877A单片机 (中断与定时器Timer2) 1 基本原理 2 实现代码 1 基本原理 2 实现代码 主要根据定时器2的逻辑框图和中断的逻辑框图来编写代码,这样代码的可读性强,也便于理解. ...

  9. 51单片机 | 外部中断实验

    文章目录 一.外部中断介绍 二.外部中断配置 三.硬件设计 四.软件设计 五.实验现象    51 单片机外部中断有 2 个,外部中断 0 和外部中断 1,它们的使用方法是一样的,所以只要学会一个即可 ...

最新文章

  1. redux-form的学习笔记二--实现表单的同步验证
  2. 菜鸟教程 之 JavaScript 教程
  3. 嵌入式linux 零基础-实践起步 --- 001 --- linux的版本
  4. Android中 广播发送 和 接受 的简单示例
  5. 当下,所有工程师都要具备技术变现思考和能力【赢在CSDN】
  6. 3.5 向量化实现的解释
  7. java随机抽题系统_2020税务师机考模拟系统全新上线,智能题库 随机组卷,快来试手...
  8. 苹果x和xs买哪个好_苹果12和苹果11哪个值得买-苹果12和11哪个更值得买
  9. C语言中scanf和printf格式化输入输出
  10. Eclipse优化设置技巧
  11. 解决cmd命令行乱码问题
  12. 深度学习——SSR网络配置环境
  13. 浏览器API 文字转语音
  14. Centos7 安装奔跑的小火车
  15. UCloud宗泽:区块链安全现状堪忧,泡沫与价值并存
  16. 1.EKL在项目中担当的位置
  17. java 弹幕 原理_Flutter 实现虎牙/斗鱼 弹幕效果
  18. U盘启动制作及系统安装
  19. 热敏电阻PTC和NTC的区别
  20. Android源码编译详解【四】:Android 6.0_源码的下载与编译

热门文章

  1. 数字系统设计————打地鼠游戏设计
  2. 条码编码方式-----Code 39与code 128条形码的区别
  3. 天池比赛短租数据集分析之数据图表
  4. 【RPA】Word 文档生成器(Python 篇)
  5. 【转载】程序员如何爱护眼睛
  6. SHELL体系知识I
  7. 浅谈32位和64位操作系统与内存的关系
  8. 【笔记】雷达原理-第五版:第四章——雷达终端
  9. Android设置Edittext只能输入数字字母并弹出英文键盘
  10. 手游联运市场的游戏类型分为哪几种?