51单片机嵌入式开发:6、 STC89C52RC 定时器0-1-2-看门狗 操作

news2024/11/16 3:31:01

STC89C52RC 定时器0-1-2-看门狗 操作

  • 1 定时器介绍
    • 1.1 定时器概述
    • 1.2 课程思路
  • 2 定时器类型
    • 2.1 定时器0、1
    • 2.2 定时器2
    • 2.3 看门狗定时器
    • 2.4 中断介绍
  • 3 定时器操作
    • 3.1 定时器0操作
    • 3.2 定时器1操作
    • 3.3 定时器2操作
    • 3.4 看门狗定时器操作
  • 4 定时器总结


1 定时器介绍

1.1 定时器概述

单片机定时器是一种在嵌入式系统中常见的硬件模块,用于生成精确的时间延迟和时间计数。它通常由一个计数器和一些相关的控制寄存器组成,可以用来实现各种定时和计时功能。
定时器在单片机中的应用非常广泛,包括测量时间间隔、产生精确的时间延迟、生成脉冲和周期性触发等。通过配置定时器的计数器和相关参数,可以满足各种实时应用的需求。
以下是单片机定时器的一般概述:

  1. 定时器计数器:定时器的核心是一个计数器,它可以递增或递减。计数器的值可以用来表示经过的时间或者计数的次数,取决于定时器的工作模式。
  2. 定时器工作模式:定时器可以以不同的工作模式运行,以满足不同的应用需求。常见的模式包括定时模式、计数模式、输入捕获模式和输出比较模式。
    • 定时模式:定时器按照设定的时间间隔进行计数,并在计数到一定值时触发中断或执行某个操作。
    • 计数模式:定时器按照外部事件的触发进行计数,可以用来计数外部信号的脉冲数量或频率。
    • 输入捕获模式:定时器可以捕获外部事件的时间戳,用于测量时间间隔或频率。
    • 输出比较模式:定时器可以与一个或多个输出引脚关联,当计数器的值与设定的比较值相等时,可以触发输出操作。
  3. 定时器预分频器:定时器通常具有一个可配置的预分频器,用于将系统时钟分频以降低计数速度。预分频器的设置可以影响定时器的分辨率和范围。
  4. 中断和事件触发:定时器可以配置为在计数达到某个特定值时触发中断,以便处理时间敏感的任务。此外,定时器还可以触发其他硬件或软件事件,以实现特定的功能。
  5. 寄存器配置:通过写入特定的寄存器,可以配置定时器的工作模式、计数器初始值、预分频器设置和比较值等参数。

1.2 课程思路

定时器章节我们围绕定时器不同的类型及用途,分别进行展开介绍。

2 定时器类型

在这里插入图片描述

2.1 定时器0、1

模式定义:

在这里插入图片描述

(1)模式0:
★模式0是选择定时器(T0或T1)高8位加低5位的—个13位定时器/计数器。
★在这种模式下,16寄存器(TH0和TL0)只用13位,其中TL0的高3位末用,其余位占整个13位的低5位,TH0占高8位。
★当TL0的低5位溢出时向TH0进位而TH0溢出时向中断标志位TF0进位(硬件置位TF0),并申请中断。
★ T0溢出否可查询TF0是否置位,以产生T0中断。

在这里插入图片描述

★ C/T=0时,控制开关接通振荡器十二分频输出端,就是定时工作方式。其定时时间为:
t=(213一T0初值)×振荡周期×12

★当C/T=1时,控制开关使引脚T0(P3.4)与13位计数器相连,外部计数脉冲由引脚T0〔P3.4〕输入,当外部信号电平发生“1”到“0”跳变时.计数器加1,这时,T0成为外部事件计数器。这就是计数工作方式。
★ GATE=0时,使或门输出A点电位为常“1”,或门被封锁,于是,引脚INT0输入信号无效。这时或门输出的常“1”打开与门,B点电位取决于TR0状态,于是由TR0一位就可控制计数开关K开启或关断T0。
若软件使TR0置1,便接通计数开关K,启动T0在原值上加1计数,直至溢出。溢出时,13位寄存器清0,TF0置位,并申请中断,T0仍从0重新开始计数。
若TR0=0。则关断计数开关K,停止计数。
★当GATE =1时,A点电位取决于(P3.4)引脚的输入电平。仅当(P3.4)输入高电平时TR0=l时,B点才是高电平,计数开关K闭合T0开始计数,当INT0由1变0时,T0停止计数。这一特性可以用来测量在(P3.4)端出现的正脉冲的宽度。
(2)模式1
★该模式是一个16位定时器/计数器。
其结构与操作几乎与模式0完全相同,唯一的差别是:在模式1中,寄存器TH0和TL0是以全16位参与操作,
★用于定时工作方式时,定时时间为:
t=(216一T0初值) ×时钟周期×12
★用于计数工作方式时,计数长度为216=65536(个外部脉冲)
(3)模式2
★模式2把T0(或T1)配置成—个可以自动重装载的8位定时器/计数器。
★ TL0计数溢出时,不仅使溢出中断标志位TF0置1,而且还自动把TH0中的内容重装载到TL0中。
★这时16位的计数器被拆成两个8位;
TL0用作8位计数器,TH0用以保持初值。
★在程序初始化时,TL0和TH0由软件赋予相同的初值。
★—旦TL0计数溢出,置位TF0,并将TH0中的初值再自动装入TL0,继续计数,循环重复。
★用于定时器工作方式时,其定时时间(TF0溢出周期)为;
t=(28—TH0初值)×振荡周期×12
★用于计数器工作方式时,最大计数长度(TH0初值=0)为:
28=256(个外部脉冲)。
★这种工作方式可省去用户软件中重装常数的程序,并可产生相当精度的定时时间。特别适用作串行口波待率发生器。
(4)模式3
★操作模式3对T0和T1是大不相同的。
★若将T0设置为模式3,TL0和TH0被分成为两个互相独立的8位计数器。
其中TL0用原T0的各控制位、引脚和中断源。即C/T、GATE、TR0、TF0和T0 (P3.4)引脚、 (P3.2)引脚。
★ TL0除仅用8位寄存器外,其功能和操作与模式0(13位计数器)、模式1(16位计数器)完全相同。
TL0也可工作为定时器方式或计数器方式。
★ TH0只可用作简单的内部定时功能,它占用了定时器T1的控制位TR1和T1的中断标志位TF1,其启动和关闭仅受TRl的控制。
★ 定时器T1无操作模式3状态。

2.2 定时器2

定时器 2 定时器 2 是一个 16 位定时/计数器,它既可以做定时器,又可以做事件计数器。其工作 方式由特殊寄存器 T2CON 中的 C/T2 位选择(如表 2 所示)。定时器 2 有三种工作模式: 捕捉方式、自动重载(向下或向上计数)和波特率发生器。如表 3 所示,工作模式由 T2CON 中的相关位选择。定时器 2 有 2 个 8 位寄存器:TH2 和 TL2。在定时工作方式 中,每个机器周期,TL2 寄存器都会加 1。由于一个机器周期由 12 个晶振周期构成, 因此,计数频率就是晶振频率的 1/12。

在这里插入图片描述在这里插入图片描述

2.3 看门狗定时器

在这里插入图片描述

2.4 中断介绍

TC89C52是一款常用的单片机型号,它基于8051内核,并具有一些扩展的功能和特性。以下是关于STC89C52中断的介绍:

  1. 中断源:STC89C52支持多种中断源,包括外部中断、定时器中断、串口中断和其他特定硬件中断。具体的中断源数量和类型取决于单片机的具体型号和配置。
  2. 中断向量表:STC89C52使用中断向量表来管理中断服务例程。中断向量表是一组特定的内存地址,每个地址对应一个中断源的中断服务例程入口点。当中断触发时,单片机会根据中断源的标识符查找相应的中断向量表地址,并跳转到对应的中断服务例程。
  3. 中断优先级:STC89C52支持中断优先级的设置,以决定各个中断源的触发顺序和优先级。具有更高优先级的中断源将在较低优先级的中断源之前得到处理。中断优先级可以通过设置特定的寄存器来实现,通常是通过IP(Interrupt Priority)寄存器来配置。
  4. 中断控制和使能:STC89C52提供了相关的寄存器用于控制和使能中断。例如,EA(全局中断使能)位用于启用或禁用所有中断,INT0、INT1等位用于控制特定外部中断的使能,定时器相关寄存器用于配置定时器中断等。
  5. 中断服务例程(ISR):对于每个中断源,需要编写相应的中断服务例程来处理中断事件。中断服务例程应位于中断向量表所指定的地址处,它们负责执行与中断相关的任务和操作。在中断服务例程中,可以执行特定的代码、读取和处理相关寄存器、更新状态等。
  6. 中断返回:在STC89C52中,中断服务例程的返回是通过执行中断返回指令(RETI)来实现的。RETI指令会将程序的执行流程返回到中断触发的地方,并继续执行主程序的下一条指令。
    中断寄存器介绍:

在这里插入图片描述

3 定时器操作

工程创建,在原有工程基础上,增加C51_TIMER.C和C51_TIMER.h,并在includes.h中引用头文件C51_TIMER.h。
借用流水灯程序需要将计时函数去掉。

/********************************************************
函数名称:sys_led_test
函数功能:led流水灯
入口参数:
出口参数:
修    改:
内    容:
********************************************************/
void sys_led_test1(void)
{
//	delay(30000);//延时程序
	P1<<=1;      //左移一位 该语句等效于 P1=P1<<1
	P1|=0x01;    //最后一位补1,该语句等效于 P1=P1|0x01 符号"|"表示"或"
	if(P1==0xff) //检测是否移到最左端?"=="表示检测符号2端的值是否相等
	{ 
//		delay(30000);
		P1=0xfe; //重新赋值
	}
}

3.1 定时器0操作

根据定时器0的模式,我们选择16位寄存器模式:在主程序中引用初始化函数
C51_TIMER.C:

#include "includes.h"


/*------------------------------------------------
                    定时器初始化子程序
------------------------------------------------*/
void sys_timer0_init(void)
{
	TMOD |= 0x01;	  //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响		     
	TH0=0x00;	      //给定初值,这里使用定时器最大值从0开始计数一直到65535溢出
	TL0=0x00;
	EA=1;            //总中断打开
	ET0=1;           //定时器中断打开
	TR0=1;           //定时器开关打开
}


/*------------------------------------------------
                 定时器中断子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1 using 1
{
	TH0=0x00;		  //重新赋值
	TL0=0x00;

	sys_led_test1(); //流水灯操作
}

C51_TIMER.h中:

#ifndef __C51_TIMER_H__
#define __C51_TIMER_H__

extern void sys_timer0_init(void);
extern void Timer0_isr(void);

#endif

protues仿真图,指示灯在闪烁:

在这里插入图片描述

3.2 定时器1操作

操作同定时器0一样,不过我们选择模式2,TH重装在给TL。



#include "includes.h"


/*------------------------------------------------
                    定时器初始化子程序
------------------------------------------------*/
void sys_timer0_init(void)
{
	TMOD |= 0x01;	  //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响		     
	TH0=0x00;	      //给定初值,这里使用定时器最大值从0开始计数一直到65535溢出
	TL0=0x00;
	//EA=1;            //总中断打开 等最后一个中断打开
	ET0=1;           //定时器中断打开
	TR0=1;           //定时器开关打开
}

/*------------------------------------------------
                    定时器初始化子程序
------------------------------------------------*/
void sys_timer1_init(void)
{
	TMOD |= 0x20;	  //使用模式2,	     
	TH1=0x05;	      //给定初值,这里使用定时器最大值从5开始计数一直到255溢出
	TL1=0x00;
	EA=1;            //总中断打开
	ET1=1;           //定时器中断打开
	TR1=1;           //定时器开关打开
}



/*------------------------------------------------
                 定时器中断子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1 using 1
{
	TH0=0x00;		  //重新赋值
	TL0=0x00;

	//sys_led_test1(); //流水灯操作
}


/*------------------------------------------------
                 定时器中断子程序
------------------------------------------------*/
void Timer1_isr(void) interrupt 3 using 1
{

	sys_led_test1(); //流水灯操作
	
}	![

Protues 仿真效果。

在这里插入图片描述

3.3 定时器2操作

#include "includes.h"


/*------------------------------------------------
                    定时器初始化子程序
------------------------------------------------*/
void sys_timer0_init(void)
{
	TMOD |= 0x01;	  //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响		     
	TH0=0x00;	      //给定初值,这里使用定时器最大值从0开始计数一直到65535溢出
	TL0=0x00;
	//EA=1;            //总中断打开 等最后一个中断打开
	ET0=1;           //定时器中断打开
	TR0=1;           //定时器开关打开
}

/*------------------------------------------------
                    定时器初始化子程序
------------------------------------------------*/
void sys_timer1_init(void)
{
	TMOD |= 0x20;	  //使用模式2,	     
	TH1=0x05;	      //给定初值,这里使用定时器最大值从5开始计数一直到255溢出
	TL1=0x00;
	//EA=1;            //总中断打开
	ET1=1;           //定时器中断打开
	TR1=1;           //定时器开关打开
}


/*------------------------------------------------
                    定时器初始化子程序
------------------------------------------------*/
void sys_timer2_init(void)
{
  RCAP2H = 0/256;//
  RCAP2L = 0/256;
  ET2=1;                     //打开定时器中断
  EA=1;                      //打开总中断
  TR2=1;                     //打开定时器开关
}


/*------------------------------------------------
                 定时器中断子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1 using 1
{
	TH0=0x00;		  //重新赋值
	TL0=0x00;

	//sys_led_test1(); //流水灯操作
}


/*------------------------------------------------
                 定时器中断子程序
------------------------------------------------*/
void Timer1_isr(void) interrupt 3 using 1
{

	//sys_led_test1(); //流水灯操作
	
}	




/*------------------------------------------------
                 定时器中断子程序
------------------------------------------------*/
void Timer2_isr(void) interrupt 5 using 1//定时器2中断
{
    TF2=0;
    sys_led_test1(); //流水灯操作
}

在这里插入图片描述

3.4 看门狗定时器操作

根据看门狗寄存器的说明:

在这里插入图片描述
手册中有介绍:

在这里插入图片描述

看门狗用protues无法仿真,所以我在开发板上验证可以成功,根据自己的需要配置PS0、1、2即可。

void sys_wdog_init(void)
{ 
	WDT_CONTR = 0x35;
}

void clr_wdg(void)
{
	WDT_CONTR = 0x35;
}
看门狗用protues无法仿真,所以我在开发板上验证可以成功,根据自己的需要配置PS0、12即可。
void sys_wdog_init(void)
{ 
	WDT_CONTR = 0x35;
}

void clr_wdg(void)
{
	WDT_CONTR = 0x35;
}

4 定时器总结

单片机定时器在嵌入式系统中有广泛的应用,以下是一些常见的用途:

  1. 时间测量和延时:定时器可以用于测量时间间隔或产生指定的时间延迟。例如,可以使用定时器来测量外部事件的持续时间,或者生成精确的时间延迟,用于控制设备的动作或执行特定的任务。
  2. 脉冲和频率计数:定时器可以用于计数外部信号的脉冲数量或频率。这对于测量传感器信号、计算输入信号的频率或周期以及进行频率调制等应用非常有用。
  3. 定时中断:定时器可以配置为在计数到达指定值时触发中断。这对于实现实时任务和时间敏感的操作非常重要。例如,可以使用定时中断来定期执行某个任务、更新显示或进行数据采集等。
  4. 脉冲宽度调制(PWM):定时器可以用于生成脉冲宽度调制信号。PWM 技术常用于控制电机速度、调光、音频合成和通信协议等应用。通过调整定时器的计数值和比较值,可以生成具有不同占空比的脉冲信号。
  5. 输入捕获和输出比较:定时器可以用于输入捕获和输出比较功能。输入捕获允许定时器记录外部事件的时间戳,用于测量时间间隔或频率。输出比较允许定时器与一个或多个输出引脚关联,当计数器的值与设定的比较值相等时触发输出操作。
  6. 软件定时器:除了硬件定时器,单片机还可以使用软件实现定时器功能。通过编写相应的软件代码,可以模拟定时器的计数和中断功能,实现定时和计时的需求。
    这些只是单片机定时器的一些常见用途,实际上,其灵活性和可编程性使得定时器可以应用于许多其他领域和应用中。具体使用定时器的方式和配置取决于具体的嵌入式系统设计和应用需求。在使用定时器之前,请仔细阅读单片机的技术文档和相关资料,了解其具体的定时器功能和使用方法。
    请注意,此处提供的是单片机定时器的一般概述,具体的实现和应用细节可能因单片机型号和厂商而异。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1910032.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

金蝶API取数+JSON解析,FDL助力高效数据处理

目录 一、企业介绍 二、业务难题与挑战 商管预算管理瓶颈凸显&#xff1a;金蝶数据手工导出&#xff0c;跨库关联分析时效受限 金蝶API数据提取&#xff1a;挑战重重的技术攻坚战 三、解决方案 商管预算管理升级&#xff1a;API取数JSON解析&#xff0c;FineDataLink助力高效数…

uni-app三部曲之二: 封装http请求

1.引言 前面一篇文章写了使用Pinia进行全局状态管理。 这篇文章主要介绍一下封装http请求&#xff0c;发送数据请求到服务端进行数据的获取。 感谢&#xff1a; 1.yudao-mall-uniapp: 芋道商城&#xff0c;基于 Vue Uniapp 实现&#xff0c;支持分销、拼团、砍价、秒杀、优…

k8s核心操作_Deployment的扩缩容能力_Deployment自愈和故障转移能力---分布式云原生部署架构搭建022

然后我们上面说了k8s中的deployment的多副本能力 然后,我们再来看 k8s中的deployment的扩缩容能力 可以看到,对于扩容,要使用 kubectl scale 命令 对于缩容 要使用kubectl scale 命令都是使用这个命令对吧 来试试,可以看到上面命令 首先看看 kubectl get pod 可以看到有…

u-boot的主要目录结构

arch 各种芯片架构的相关代码,u-boot入口代码 board 各种单板相关的代码,主要包含存储器驱动等 board/hi3516a hi3516a单板相关的代码 arch/xxx/lib 各种体系结构的相关的代码,如ARM include 头文件 include/configs 各种单板的配置文件 common 各种功能实…

springboot篮球馆管理系统-计算机毕业设计源码21945

目 录 摘要 1 绪论 1.1选题背景 1.2研究意义 1.3论文结构与章节安排 2 篮球馆管理系统系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系统用例分析 2.4 …

SSO单点登录-1-同浏览器进行单点登录

前端同域 客户端前端同域&#xff0c;则cookie可以存在相同的域名或顶级域名下&#xff0c;一个客户端登录成功后&#xff0c;将token信息保存到域名下的cookie中其他不同客户端访问时&#xff0c;因为域名或者顶级域名相同&#xff0c;也能取到域名下的cookie中的token信息并…

华三m-lag三层转发+VRRP配置案例

目录 一、相关理论介绍 1.1 华三M-LAG介绍 1.2 DRCP协议 1.3 keepalive机制 1.4 MAD机制 1.5 一致性检查功能 二、M-LAG系统建立及工作过程 三、实验组网案例 3.1 组网需求 3.2 组网拓扑 3.3 设备接口及地址规划 四、具体配置命令 4.1 S6850-1的配置 4.2 S6850-2…

python爬虫和用腾讯云API接口进行翻译并存入excel,通过本机的Windows任务计划程序定时运行Python脚本!

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a;定时爬取外网的某个页面&#xff0c;并将需要的部分翻译为中文存入excel 接下了的&#xff0c;没学过的最好看一下 基本爬虫的学习 【爬虫】requests 结合 BeautifulSoup抓取网页数据_requests beauti…

Visual Studio 安装Python 环境

前言 我在使用Visual Studio作为Python工具的时候&#xff0c;碰到了一些环境问题和依赖包安装问题&#xff0c;现将问题和方法总结出来&#xff0c;供大家学习和参考。 一、Python 安装 Python官网&#xff1a; Welcome to Python.org 可以下载左侧的稳定发布版本 下载完成之…

昇思25天学习打卡营第21天 | Diffusion扩散模型

内容介绍&#xff1a; 扩散模型&#xff08;Diffusion Models&#xff09;有很多种理解&#xff0c;本文的介绍是基于denoising diffusion probabilistic model &#xff08;DDPM&#xff09;&#xff0c;DDPM已经在&#xff08;无&#xff09;条件图像/音频/视频生成领域取得…

The Quinfall昆法尔卡顿延迟高怎么办?快速降低昆法尔延迟

The Quinfall昆法尔中&#xff0c;玩家可以选择数十种不同的职业&#xff0c;体验从战士到法师&#xff0c;从猎人到工匠的丰富人生。每个职业都有其独特的技能和装备&#xff0c;玩家可以根据自己的喜好和游戏风格来自由搭配。而游戏中的战斗系统更是丰富多彩&#xff0c;无论…

【深度学习实战(44)】Anchor based and Anchor free(无锚VS有锚)

1 anchor-based 深度学习目标检测通常都被建模成对一些候选区域进行分类和回归的问题。在单阶段检测器中&#xff0c;这些候选区域就是通过滑窗方式产生的 anchor&#xff1b;在两阶段检测器中&#xff0c;候选区域是 RPN 生成的 proposal&#xff0c;但是 RPN 本身仍然是对滑窗…

gen_cross_contour_xld 为每个输入点生成一个十字形状的XLD轮廓。

gen_cross_contour_xld Name 名称 gen_cross_contour_xld — Generate one XLD contour in the shape of a cross for each input point. 为每个输入点生成一个十字形状的XLD轮廓。 Signature 签名 gen_cross_contour_xld( : Cross : Row, Col, Size, Angle : ) Descripti…

SQL创建一个actor_name表

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 描述 对于如下表ac…

微信投票小程序源码系统 带礼物功能 完整的源代码包以及搭建部署教程

系统概述 随着移动互联网的快速发展&#xff0c;微信小程序以其便捷性、轻量化及强大的社交属性&#xff0c;已成为众多企业和个人进行品牌宣传、活动推广的重要工具。其中&#xff0c;微信投票小程序更是因其独特的互动性和参与感&#xff0c;深受用户喜爱。然而&#xff0c;…

matlab 花瓣线绘制

matlab 花瓣线绘制 clc,clear,close all; % 创建一个范围内的 x 和 y 值 x linspace(-1.5, 1.5, 100); y linspace(-1.5, 1.5, 100);% 创建一个网格来表示 x 和 y 值的组合 [X, Y] meshgrid(x, y);% 计算方程的左边和右边的值 LHS1 X.^2 Y.^2; RHS1 X.^4 Y.^4;LHS2 X.…

内网信息收集:手动、脚本和工具查IP、端口

1.手动查IP和端口 2.工具查IP 3.工具查端口 我们在内网中拿下目标机器后&#xff0c;需要进行一系列的信息收集&#xff0c;以下为总结的收集方法 1.手动信息收集&#xff1a; 以下命令在CS执行时命令前须加shell,如&#xff1a;shell ipconfig 1.收集IP网卡&#xff1a; ip…

node-gyp 重新安装,解决编译遇到的问题【超详细图解】

一、报错信息 npm ERR! gyp info it worked if it ends with ok npm ERR! gyp info using node-gyp10.0.1 npm ERR! gyp info using node18.19.0 | darwin | arm64 npm ERR! gyp info find Python using Python version 3.12.2 found at "/opt/homebrew/opt/python3.12/…

js实现移动蒙版层

移动蒙版层 可在整个页面拖动方块&#xff0c;但方块不能超出页面 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0">…

人工智能算法工程师(中级)课程1-Opencv视觉处理之基本操作

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能算法工程师(中级)课程1-Opencv视觉处理之基本操作。OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉和机器学习软件库。它提供了各种视觉处理函数&#xff0c;并…