当前位置: 首页 > news >正文

51单片机入门_江协科技_17~18_OB记录的笔记

17. 定时器

  • 17.1.
    定时器介绍:51单片机的定时器属于单片机的内部资源,其电路的连接和运转均在单片机内部完成,无需占用CPU外围IO接口;

    定时器作用:
    (1)用于计时系统,可实现软件计时,或者使程序每隔一固定时间完成一项操作;
    (2)替代长时间的Delay,提高CPU的运行效率和处理速度,因为delay程序占用CPU资源,同时导致CPU无法处理外部诸如按键的操作;
    (…)

  • 17.2. STC89C52 定时器相关扩展阅读:STC89C52的介绍手册
    官方链接地址: https://www.stcmcu.com/datasheet/stc/STC-AD-PDF/STC89C51RC-RD+_GUIDE-CHINESE.pdf

  • 17.3. STC89C52定时器资源
    •定时器个数:3个(T0、T1、T2),T0和T1与传统的51单片机兼容,T2是此型号单片机增加的资源
    •注意:定时器的资源和单片机的型号是关联在一起的,不同的型号可能会有不同的定时器个数和操作方式,但一般来说,T0和T1的操作方式是所有51单片机所共有的

  • 17.4. 51单片机定时器内部工作原理
    •定时器在单片机内部就像一个小闹钟一样,根据时钟的输出信号,每隔“一秒”,计数单元的数值就增加一,当计数单元数值增加到“设定的闹钟提醒时间”时,计数单元就会向中断系统发出中断申请,产生“响铃提醒”,使程序跳转到中断服务函数中执行
    在这里插入图片描述

  • 17.5. 定时器工作模式:
    •STC89C52的T0和T1均有四种工作模式:
    模式0:13位定时器/计数器
    模式1:16位定时器/计数器(常用)
    模式2:8位自动重装模式
    模式3:两个8位计数器
    •工作模式1框图:
    在这里插入图片描述

    •SYSclk:系统时钟,即晶振周期,本开发板上的晶振为12MHz

  • 17.6. 中断系统

    • 中断系统是为使CPU具有对外界紧急事件的实时处理能力而设置的。
    • 当中央处理机CPU正在处理某件事的时候外界发生了紧急事件请求,要求CPU暂停当前的工作,转而去处理这个紧急事件,处理完以后,再回到原来被中断的地方,继续原来的工作,这样的过程称为中断。实现这种功能的部件称为中断系统,请示CPU中断的请求源称为中断源。微型机的中断系统一般允许多个中断源,当几个中断源同时向CPU请求中断,要求为它服务的时候,这就存在CPU优先响应哪一个中断源请求的问题。通常根据中断源的轻重缓急排队,优先处理最紧急事件的中断请求源,即规定每一个中断源有一个优先级别。CPU总是先响应优先级别最高的中断请求。
    • 当CPU正在处理一个中断源请求的时候(执行相应的中断服务程序),发生了另外一个优先级比它还高的中断源请求。如果CPU能够暂停对原来中断源的服务程序,转而去处理优先级更高的中断请求源,处理完以后,再回到原低级中断服务程序,这样的过程称为中断嵌套。这样的中断系统称为多级中断系统,没有中断嵌套功能的中断系统称为单级中断系统。
  • 17.7. 中断程序流程:
    在这里插入图片描述

  • 17.8. 中断资源:
    •中断源个数:8个(外部中断0、定时器0中断、外部中断1、定时器1中断、串口中断、定时器2中断、外部中断2、外部中断3)
    •中断优先级个数:4个
    •中断号:
    在这里插入图片描述

•注意:中断的资源和单片机的型号是关联在一起的,不同的型号可能会有不同的中断资源,例如中断源个数不同、中断优先级个数不同等等

  • 17.9. 定时器和中断系统;
    在这里插入图片描述

  • 17.10. 定时器相关寄存器:

在这里插入图片描述

18. 按键控制LED流水灯模式&定时器时钟

  • 18.1. 计时器子函数与中断子函数测试程序:
#include <REGX52.h>void TimerR0_Init() //定时器初始化子函数
{//TMOD=0x01; //0000 0001;如果同时使用T0与T1则此TMOD赋值方式有问题//TMOD=TMOD&0xf0;//把TMOD低4位清0,高4位不变;与清0;//TMOD=TMOD|0x01;//把TMOD最低位置1,高4位不变;或置1;TMOD&=0xf0;//上述简写TMOD|=0x01;//上述简写TF0=0;TR0=1;TH0=64535/256; //高8位数值,从64535到65535需要1000us,超出65535后溢出TL0=64535%256; //低8位数值ET0=1;EA=1;PT0=0;
}void main() //主程序
{TimerR0_Init();while(1){}}unsigned int T0_Count;
void TimerR0_Routine() interrupt 1 //中断子函数
{TH0=64535/256; //重新赋予初值,防止从0开始计数TL0=64535%256; //重新赋予初值,防止从0开始计数	T0_Count++;if(T0_Count>=1000){T0_Count=0;P2_0=~P2_0;}
}
  • 18.2. STC-ISP中定时器的相关配置
    上述程序与STC-ISP中的示例定时器计算器中的程序有1us的差距,同时需要注意STC-ISP中的软件的配置:
    在这里插入图片描述

此时的C代码为:

void Timer0_Init(void)		//1毫秒@12.000MHz
{//AUXR &= 0x7F;			//定时器时钟12T模式,新版本问题此语句删除TMOD &= 0xF0;			//设置定时器模式TMOD |= 0x01;			//设置定时器模式TL0 = 0x18;				//设置定时初始值 计算后与64535%256=17不同;TH0 = 0xFC;				//设置定时初始值 计算后与64535/256相同; TF0 = 0;				//清除TF0标志TR0 = 1;				//定时器0开始计时
}
  • 18.3. 示例18.1中的程序更新后如下:
#include <REGX52.h>void TimerR0_Init() //定时器0初始化子函数
{TMOD&=0xf0;//上述简写TMOD|=0x01;//上述简写TF0=0;TR0=1;TH0=0xfc; //高8位数值,从64535到65535需要1000us,超出65535后溢出TL0=0x18; //低8位数值ET0=1;EA=1;PT0=0;
}void main() //主程序
{TimerR0_Init();while(1){}}unsigned int T0_Count;
void TimerR0_Routine() interrupt 1 //中断子函数
{TH0=64535/256; //重新赋予初值,防止从0开始计数TL0=64535%256; //重新赋予初值,防止从0开始计数	T0_Count++;if(T0_Count>=1000){T0_Count=0;P2_0=~P2_0;}
}
  • 18.4. 定时器函数模块化(模块化定时器的初始化程序)
  • TimeR0.c
#include <REGX52.H>
/*** @brief 定时器初始化子函数,1ms,12MHz* @param 无* @retval 无*/void TimeR0_Init() //定时器初始化子函数
{//AUXR &= 0x7F;			//定时器时钟12T模式TMOD &= 0xF0;			//设置定时器模式TMOD |= 0x01;			//设置定时器模式TL0 = 0x18;				//设置定时初始值TH0 = 0xFC;				//设置定时初始值TF0 = 0;				//清除TF0标志TR0 = 1;				//定时器0开始计时ET0=1;EA=1;  //PT0=0; //中断优先级
}//以下程序全部注释方便后续调用,定时器中断函数模板
//
//void TimeR0_Routine() interrupt 1 //中断子函数
//{
//	static unsigned int T0Count //设置静态子函数用T0Count,防止T0Count丢失
//	TL0=0x18;				//设置定时初始值
//	TH0=0xFC;				//设置定时初始值
//	T0Count++;
//	if(T0Count>=1000)
//	{
//		T0Count=0;
//		
//	}
//}
  • TimeR0.h
#ifndef _TIMER0_H_ 
#define _TIMER0_H_  void TimeR0_Init();#endif
  • 18.5. 4个独立按键的模块化程序:
  • Four_Key.c
#include <REGX52.h>
#include "delay_xms.h"
/*** @brief 4个独立按键按下判断程序,按键松手返回KeyNum* @param 无* @retval KeyNum 的返回值,0~4,无按键按下时返回值为0*/unsigned char Four_Key()
{unsigned char KeyNum=0;if(P3_1==0){delay_xms(20);while(P3_1==0);delay_xms(20);KeyNum=1;}if(P3_0==0){delay_xms(20);while(P3_0==0);delay_xms(20);KeyNum=2;}if(P3_2==0){delay_xms(20);while(P3_2==0);delay_xms(20);KeyNum=3;}if(P3_3==0){delay_xms(20);while(P3_3==0);delay_xms(20);KeyNum=4;}return KeyNum;
}
  • Four_Key.h
#ifndef __H_ 
#define __H_  unsigned char Four_Key();#endif
  • 针对建立好的模块化程序进行简单测试,按下相应按键,P2的相应的LED灯亮起;
#include <REGX52.h>
#include "TimeR0.h"
#include "Four_Key.h"unsigned char keynum;
void main() //主程序
{TimeR0_Init();while(1){keynum=Four_Key();if(keynum){if (keynum==1){P2_0=!P2_0;}if (keynum==2){P2_1=!P2_1;}if (keynum==3){P2_2=!P2_2;}if (keynum==4){P2_3=!P2_3;}		}}}void TimerR0_Routine() interrupt 1 //中断子函数
{static unsigned int T0Count; //设置静态子函数用T0Count,防止T0Count丢失TL0=0x18;				//设置定时初始值TH0=0xFC;				//设置定时初始值T0Count++;if(T0Count>=1000){T0Count=0;}
}
  • 测试程序Proteus中测试没有问题,按键按一下相应LED灯亮起,再按一下熄灭;同时测试了独立按键检测程序和中断函数模块程序没有问题。
    在这里插入图片描述

  • 18.6. LED流水灯控制的实现

  • 通过包含 INTRINS.h的函数库中的_cror_与_crol_循环左移与循环右移函数来实现;

#include <REGX52.h>
#include "TimeR0.h"
#include "Four_Key.h"
#include <INTRINS.h>unsigned char keynum,LED_Mode; //增加LED_Mode变量控制LED灯模式void main() //主程序
{TimeR0_Init();P2=0xfe; //P2口LED灯赋予初始值,保证至少1个LED灯亮起;while(1){keynum=Four_Key();if(keynum){if (keynum==1) //当S1按下松开后{LED_Mode++; //LED_Mode数值自动更新if (LED_Mode>=2) LED_Mode=0;}}}}void TimerR0_Routine() interrupt 1 //中断子函数
{static unsigned int T0Count; //设置静态子函数用T0Count,防止T0Count丢失TL0=0x18;				//设置定时初始值TH0=0xFC;				//设置定时初始值T0Count++;if(T0Count>=500){T0Count=0;if (LED_Mode==0)P2=_crol_(P2,1);//通过_crol_(P2,1)函数控制LED左移if (LED_Mode==1)P2=_cror_(P2,1);//通过_cror_(P2,1)函数控制LED右移}
}
  • 18.7. 通过LCD1602来制作一个定时器时钟程序
  • 定时器时钟程序如下:
#include <REGX52.h>
#include "LCD1602.h"
#include "TimeR0.h"unsigned char sec=55,min=59,hour=23;
void main()
{TimeR0_Init();LCD_Init();LCD_ShowString(1,1,"Clock:");//1行1列显示Clock:LCD_ShowString(2,1,"  :  :");//2行中需要显示的分割冒号while(1){LCD_ShowNum(2,7,sec,2);//秒显示LCD_ShowNum(2,4,min,2);//分钟显示LCD_ShowNum(2,1,hour,2);//小时显示}}void TimeR0_Routine() interrupt 1 //中断子函数
{static unsigned int T0Count; //设置静态子函数用T0Count,防止T0Count丢失TL0=0x18;				//设置定时初始值TH0=0xfc;				//设置定时初始值T0Count++;if(T0Count>=1000){T0Count=0;sec++;if(sec>=60){sec=0;min++;if(min>=60){min=0;hour++;if(hour>=24){hour=0;}}}}}
  • proteus测试结果没问题;
    在这里插入图片描述

相关文章:

51单片机入门_江协科技_17~18_OB记录的笔记

17. 定时器 17.1. 定时器介绍&#xff1a;51单片机的定时器属于单片机的内部资源&#xff0c;其电路的连接和运转均在单片机内部完成&#xff0c;无需占用CPU外围IO接口&#xff1b; 定时器作用&#xff1a; &#xff08;1&#xff09;用于计时系统&#xff0c;可实现软件计时&…...

xss.pwnfunction-Ah That‘s Hawt

<svg/onloadalert%26%2340%3B1%26%2341%3B> <svg/>是一个自闭合形式 &#xff0c;当页面或元素加载完成时&#xff0c;onload 事件会被触发&#xff0c;从而可以执行相应的 JavaScript 函数...

Python学习从0开始——005数据结构

Python学习从0开始——005数据结构 一、列表list二、元组和序列三、集合四、字典五、循环技巧六、条件控制七、序列和其它类型的比较 一、列表list 不是所有数据都可以排序或比较。例如&#xff0c;[None, ‘hello’, 10] 就不可排序&#xff0c;因为整数不能与字符串对比&…...

力扣每日一题:LCR112--矩阵中的最长递增路径

题目 给定一个 m x n 整数矩阵 matrix &#xff0c;找出其中 最长递增路径 的长度。 对于每个单元格&#xff0c;你可以往上&#xff0c;下&#xff0c;左&#xff0c;右四个方向移动。 不能 在 对角线 方向上移动或移动到 边界外&#xff08;即不允许环绕&#xff09;。 示例…...

树莓派部署yolov5实现目标检测(ubuntu22.04.3)

最近两天搞了一下树莓派部署yolov5&#xff0c;有点难搞&#xff08;这个东西有点老&#xff0c;版本冲突有些包废弃了等等&#xff09; 最后换到ubuntu系统弄了&#xff0c;下面是我的整体步骤&#xff08;建议先使能一下ssh&#xff08;最下面有&#xff09;&#xff0c;结合…...

2024 年最新使用 Wechaty 开源框架搭建部署微信机器人(微信群智能客服案例)

读取联系人信息 获取当前机器人账号全部联系人信息 bot.on(ready, async () > {console.log("机器人准备完毕&#xff01;&#xff01;&#xff01;")let contactList await bot.Contact.findAll()for (let index 0; index < contactList.length; index) {…...

Redis从入门到精通(九)Redis实战(六)基于Redis队列实现异步秒杀下单

↑↑↑请在文章开头处下载测试项目源代码↑↑↑ 文章目录 前言4.5 分布式锁-Redisson4.5.4 Redission锁重试4.5.5 WatchDog机制4.5.5 MutiLock原理 4.6 秒杀优化4.6.1 优化方案4.6.2 完成秒杀优化 4.7 Redis消息队列4.7.1 基于List实现消息队列4.7.2 基于PubSub的消息队列4.7.…...

什么是多路复用器滤波器

本章将更深入地介绍多路复用器滤波器&#xff0c;以及它们如何用于各种应用中。您将了解到多路复用器如何帮助设计人员创造出更复杂的无线产品。 了解多路复用器 多路复用器是一组射频(RF)滤波器&#xff0c;它们组合在一起&#xff0c;但不会彼此加载&#xff0c;可以在输出之…...

Severt和tomcat的使用(补充)

打包程序 在pom.xml中添加上述代码之后打包时会生成war包并且包的名称是test 默认情况打的是jar包.jar里量但是tomcat要求的是war包. war包Tomcat专属的压缩包. war里面不光有.class还有一些tomcat要求的配置文件(web.xml等)还有前端的一些代码(html, css, js) 点击其右边的m…...

JavaEE初阶——多线程(一)

T04BF &#x1f44b;专栏: 算法|JAVA|MySQL|C语言 &#x1faf5; 小比特 大梦想 此篇文章与大家分享多线程的第一部分:引入线程以及创建多线程的几种方式 此文章是建立在前一篇文章进程的基础上的 如果有不足的或者错误的请您指出! 1.认识线程 我们知道现代的cpu大多都是多核心…...

MongoDB主从复制模式基于银河麒麟V10系统

MongoDB主从复制模式基于银河麒麟V10系统 背景介绍 MongoDB自4.0版本开始已经不再建议使用传统的master/slave复制架构,而是全面采用了复制集(Replica Sets)作为标准的复制和高可用性解决方案。 复制集是MongoDB的一种数据复制和高可用性机制,通过异步同步数据至多个服务…...

Vue使用高德地图

1.在高德平台注册账号 2.我的 > 管理管理中添加Key 3.安装依赖 npm i amap/amap-jsapi-loader --save 或 yarn add amap/amap-jsapi-loader --save 4.导入 AMapLoade import AMapLoader from amap/amap-jsapi-loader; 5.直接上代码&#xff0c;做好了注释&#xff08;初始化…...

2024-04-07(复盘前端)

---HTML 1.HTMl骨架 html&#xff1a;整个网页 head&#xff1a;网页头部&#xff0c;用来存放给浏览器看的信息&#xff0c;如css body&#xff1a;网页主体&#xff0c;用来存放给用户看的信息&#xff0c;例如图片和文字 2.标题标签中h1标签只能使用一次&#xff0c;其…...

SpringCloud学习(10)-SpringCloudAlibaba-Nacos服务注册、配置中心

Spring Cloud Alibaba 参考文档 Spring Cloud Alibaba 参考文档 nacos下载Nacos 快速开始 直接进入bin包 运行cmd命令&#xff1a;startup.cmd -m standalone 运行成功后通过http://localhost:8848/nacos进入nacos可视化页面&#xff0c;账号密码默认都是nacos Nacos服务注…...

OKCC外呼中心配置的电话系统规则

OKCC外呼中心配置电话系统规则可能涉及多个方面&#xff0c;包括呼叫路由、自动化流程、电话接听策略等。以下是一般步骤及注意事项&#xff1a; 呼叫路由配置&#xff1a; 确定呼叫中心的呼叫路由策略&#xff0c;包括如何分配呼叫给不同的坐席或部门。设置呼叫路由规则&#…...

AI推介-大语言模型LLMs论文速览(arXiv方向):2024.03.31-2024.04.05

文章目录~ 1.AutoWebGLM: Bootstrap And Reinforce A Large Language Model-based Web Navigating Agent2.Training LLMs over Neurally Compressed Text3.Unveiling LLMs: The Evolution of Latent Representations in a Temporal Knowledge Graph4.Visualization-of-Thought …...

性能测试工具 ab(Apache Bench)使用详解

Apache Bench (ab) 是一个由 Apache 提供的非常流行的、简单的性能测试工具&#xff0c;用于对 HTTP 服务器进行压力测试。下面是 ab 工具的一些基本使用方法。 安装 在大多数 Unix 系统中&#xff0c;ab 通常作为 Apache HTTP 服务器的一部分预装在系统中。你可以通过在终端…...

智能网联汽车自动驾驶数据记录系统DSSAD数据元素

目录 第一章 数据元素分级 第二章 数据元素分类 第三章 数据元素基本信息表 表1 车辆及自动驾驶数据记录系统基本信息 表2 车辆状态及动态信息 表3 自动驾驶系统运行信息 表4 行车环境信息 表5 驾驶员操作及状态信息 第一章 数据元素分级 自动驾驶数据记录系统记录的数…...

Ubuntu 20.04.06 PCL C++学习记录(十八)

[TOC]PCL中点云分割模块的学习 学习背景 参考书籍&#xff1a;《点云库PCL从入门到精通》以及官方代码PCL官方代码链接,&#xff0c;PCL版本为1.10.0&#xff0c;CMake版本为3.16 学习内容 PCL中实现欧式聚类提取。在点云处理中,聚类是一种常见的任务,它将点云数据划分为多…...

细雨踏春日,新会公安护平安

春雨起&#xff0c;清明至。又是一年春草绿&#xff0c;又是一年清明时。细雨踏春日&#xff0c;思怀故人时&#xff0c;是哀思&#xff0c;亦是相聚。新会公安一抹抹葵乡春日“警”色坚守岗位&#xff0c;确保清明祭扫平稳有序&#xff0c;为人民群众的平安保驾护航。 为确保2…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全&#xff08;Thread Safety&#xff09; 线程安全是指在多线程环境下&#xff0c;某个函数、类或代码片段能够被多个线程同时调用时&#xff0c;仍能保证数据的一致性和逻辑的正确性&#xf…...

【生成模型】视频生成论文调研

工作清单 上游应用方向&#xff1a;控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

深度学习水论文:mamba+图像增强

&#x1f9c0;当前视觉领域对高效长序列建模需求激增&#xff0c;对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模&#xff0c;以及动态计算优势&#xff0c;在图像质量提升和细节恢复方面有难以替代的作用。 &#x1f9c0;因此短时间内&#xff0c;就有不…...

Java数值运算常见陷阱与规避方法

整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...

uniapp手机号一键登录保姆级教程(包含前端和后端)

目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号&#xff08;第三种&#xff09;后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...

Golang——6、指针和结构体

指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...