51单片机笔记:定时器/计数器

news2025/7/20 9:44:16

单片机笔记

定时器/计数器

定时器/计数器的结构

AT89S51内部两个16位定时器/计数器:T0(P3.4),T1(P3.5),定时器/计数器T0由特殊寄存器TH0,TL0构成,T1由特殊功能寄存器TH1,TL1构成

T0,T1都有定时器和计数器两种工作模式,两种模式实质都是对脉冲信号进行计数,只不过技术信号来源不同。

  • 计数器模式 是对T0(P3.4)和T1(P3.5)两个引脚上的外部脉冲进行计数

  • 定时器模式是对系统时钟信号(fosc)经12分频后的内部脉冲信号(机器周期Tcy)计数.由于系统时钟频率fosc是定值,可根据数值计算出定时时间T(定时时间T = n * Tcy).

振荡周期Tosc = 1/fosc, 机器周期Tcy = 12Tosc = 12/fosc)

例如:fosc = 12Hz, Tcy = 1us

T0,T1属于加1计数器,即每记一个脉冲,计数器加1.(51单片机)

T0,T1具有4种工作方式(方式0,1,2,3)

特殊功能寄存器TMOD用于选择定时器/计数器T0,T1的工作模式和工作方式.

特殊功能寄存器TCON用于控制T0,T1的启动和停止计数,同时包含了T0,T1状态.

计数器起始计数从初值开始,单片机复位时计数器初值为0,也可给计数器装入一个新的初值(0 ~ 2^16 - 1).

若计数器溢出会产生中断,称溢出中断,最大计数值2^16 = 65536, 此时刻发生溢出中断, 最大初值2^16 - 1 = 65535

工作方式控制寄存器TMOD

寄存器地址89H, 不可按位操作, 高4位控制T1, 低4位控制T0.

D7D6D5D4D3D2D1D0
GATEC/T’M1M0GATEC/T’M1M0

D7-D4 : T1方式字段, D3-D0 : T0方式字段

M1, M0工作方式选择位
M1M0工作方式
00方式0, 13位定时器/计数器
01方式1, 16位定时器/计数器
10方式2, 8位的常数自动重新装载的定时器/计数器
11方式3, 仅适用于T0, 此时T0分成2个8位计数器, T1停止计数

方式0为兼容早期8048的13位定时器/计数器

GATE - 门控位
  • GATE = 0, 定时器是否计数, 由启动控制位TRx(x = 0, 1)来控制. (TRx = 1 时启动)
  • GATE = 1, 定时器是否计数, 由外部中断引脚INTx’上的电平与运行控制位TRx共同控制.(1 == INTx’ & 1 == TRx 为真时启动)
C/T’ - 计数器模式和定时器模式选择位

**C : Counter, T : Timer **

  • C/T’ = 0, 定时器模式, 对系统时钟12分频后的脉冲(fosc/12)进行计数.
  • C/T’ = 1, 计数器模式, 对计数器外部输入引脚T0(P3.4)或T1(P3.5)的外部脉冲(负跳变, 即对下降沿计数)计数.

定时器/计数器控制寄存器TCON

TCON字节地址88H, 位地址为88H~8FH.

D7D6D5D4D3D2D1D0
TF1TR1TF0TR0IE1IT1IE0IT0
TF1, TF0 - 计数溢出标志位

当计数器计数溢出时, 该位置1. 使用查询方式时, 此位可提供CPU查询, 但应注意查询后, 用软件及时该位清0. 使用中断方式时, 作为中断请求标志位, 进入终端服务程序后由硬件自动清0.

TR1, TR0 - 计数运行控制位
  • TR1/TR0位 = 1, 启动计数器计数的必要条件.
  • TR1/TR0位 = 0, 停止计数器计数.

该位可由软件置1和清0

定时器/计数器的4种工作方式

方式1(M1 = 0, M0 = 1)

定时器计数器方式1的逻辑结构框图

方式1和方式0差别仅存在于计数器的位数不同, 方式1为16位计数器, 由THx高8位和TLx低8位构成(x = 0,1), 方式0为13位计数器, 有关控制状态位含义(GATE, C/T’, TFx, TRx)与方式0相同.

方式0(M1 = 0, M0 = 0)

定时器计数器方式0的逻辑结构框图

该方式为13位定时/计数器的计数最大值位2^13 = 8196

方式2

方式0和方式1最大特点是计数溢出后, 计数器为全0. 因此在循环定时或循环计数应用时就存在用指令反复装入计数初值的问题, 这会影响定时精度(指令本身执行也需要时间), 方式2就是为解决此问题而设置的.

M1, M0 = 1, 0时, 工作方式2. 8位自动重装载方式

方式2的逻辑结构框图

低8位用来计数/定时, 高8位用来保存初值, 硬件自动完成装入初值的操作

最大计数/定时范围2^8 = 256

方式3

方式3是为增加一个附加的8位定时器/计数器而设置的, 从而使AT89S51具有3个定时器/计数器. 方式3只适用于T0, T1不能工作在方式3
T0在方式3下, 分为了两个8位定时器/计数器

方式3的逻辑结构框图

对外部输入的计数信号的要求

计数器模式时, 计数脉冲来自外部输入引脚T0或T1. 当输入信号产生负跳变时, 计数值增1.

由于确认一次负跳变要花2个机器周期, 即24个振荡周期, 因此外部输入的计数脉冲的最高频率为系统振荡器频率的1/24

对外输入信号占空比没有限制, 但为确保某一给定电平在变化前能被采样1次, 该电平至少保持1个机器周期.

方式1应用 : P1口控制8只LED每0.5s闪亮一次
分析

设置晶振频率12MHz, 则机器周期为1us, 一次溢出中断时间的总耗时计算65536 * 1us = 65…ms

题目要求0.5s即500ms, 500ms > 65ms,故需软件计数, 500ms约溢出中断次数为100次

可用软件编写计时器对中断次数进行计数

设置TMOD寄存器
  1. TMOD寄存器的M1 = 0, M0 = 1则T0工作在方式1
  2. 设置C/T’ = 0, 为定时器模式
  3. GATE为0, 对T0的运行控制仅由TR0来控制
  4. 定时器T1不使用, 各相关位均设为0
D7D6D5D4D3D2D1D0
GATEC/T’M1M0GATEC/T’M1M0
00000001

TMOD初始化值则为0x01

计算定时器T0的计数初值

设定时时间5ms(即5,000us), 设T0计数初值为X, 假设晶振频率为11.0592MHz, 则定时时间为:

定时时间 = (2^16 - X) * Tcy = (2^16 - X) * 12/晶振频率

则 5000 = (2^16 - X) * 12 / 11.0592, 得X = 60,928

转换成16进制为0xee00, 其中0xee装入TH0, 0x00装入TL0.

X --> 65536(产生溢出)

个数n = 65536 - X

定时时间T = n * Tcy == 5ms == 5,000us

机器周期Tcy =  12 / 11.0592 us
设置IE寄存器

本例采用定时器T0中断, 因此需将IE寄存器中的EA,ET0位置1

启动T0

将定时器控制寄存器TCON中的TR0置1, 则启动定时器T0

方式1定时中断控制LED闪亮的仿真图

源码
/* 
 * 功能实现: 使用方式1定时中断控制LED闪亮
 * 编写环境: Keil5
 * 硬件仿真: Proteus 8 Professional
 * 日期: 2022-11-05
 */

#include <reg51.h>

char i = 100; // 用于软件计数

int main(void)
{
    TMOD = 0x01; // 定时器T0为方式1
    TH0 = 0xee; // 设置定时器初值
    TL0 = 0x00;
    P1 = 0x00; // P1口8个LED点亮
    EA = 1; // 总中断开
    ET0 = 1; // T0中断开
    TR0 = 1; // 启动T0

    while(1) // 循环等待
    {
        ;
    }

    return 0;
}

void timer0() interrupt 1 // T0中断程序
{
    TH0 = 0xee; //重新赋初值
    TL0 = 0x00;

    // 软件计数, 100次溢出中断后, LED状态进行转换	
    i--; // 循环次数减1
    if (i <= 0)
    {
        P1 = ~P1; // P1口按位取反, LED状态转换
	i = 100; // 重置循环次数
    }

    return;
}
计数器应用

如图,T1采用计数模式,方式1中断,计数输入引脚T1(P3.5)上外接按钮开关,作为计数信号输入。按4次按钮开关后,P1口的8只LED闪烁不停。

计数器应用硬件仿真图

设置TMOD寄存器
  1. T1工作在方式1,应使TMOD的M1,M0 = 0,1
  2. 设置C/T’=1,为计数器模式
  3. 对T0运行控制仅由TR0来控制启动,应使GATE0=0.
  4. 定时器T0不使用,各相关位均设0.

所以, TMOD寄存器应初始化为0x50.

计算定时器T1的计数初值

由于每按1次按钮开关,计数1次,按4次后,P1口的8只LED闪烁不停. 因此计数器初值为65536 - 4 = 65532, 所以, TH1 = (65536 - 4) / 256, TL1 = (65536 - 4) % 256.

设置IE寄存器

由于采用T1中断,因此需将IE寄存器的EA, ET1位置1.

启动和停止定时器T1

将寄存器TCON中TR1 = 1, 则启动T1计数.

源码
#include <reg51.h>

void Delay(unsigned int i);

int main(void)
{
    TMOD = 0x50;	// 设置定时器T1位方式1计数
    TH1 = (65536 - 4) / 256;	// 向TH1写入初值的高8位
    TL1 = (65536 - 4) % 256;	// 向TL1写入初值的低8位
    EA = 1;	// 总中断允许
    ET1 = 1;	// 定时器T1中断允许
    TR1 = 1;	// 启动定时器T1

    while (1)
    {
        ;
    }

    return 0;
}

void Delay(unsigned int i)
{
    unsigned int j;
    for ( ; i > 0; i--)
    {
        for (j = 0; j < 125; j++)
	{
	    ;
	}
    }

    return;
}

void T1_int(void) interrupt 3 // T0中断时interrupt为0, T1中断时interrupt为3
{
    while (1)	// 一般中断函数不会设置为死循环
    {
    	// 单次的计数中断所以不需要重新赋初值
        P1 = 0xff;	// 8位LED全灭
	Delay(500);	// 延时500ms
	P1 = 0;		// 8位LED全亮
	Delay(500);	// 延时500ms
    }

    return;
}

习题

习题7-1

采用T0方式1的定时中断方式, 控制AT89C51的P1.1引脚输出100Hz的方波.

分析

f = 100Hz, T = 10ms, 定时时间为10/2 = 5ms(单高电平或低电平的时间) < 65ms, 所以定时时间T = 5ms

假设时钟频率fosc = 12MHz, 工作在方式1时最大时间为65536ms

TMOD = 0x01

5ms = 5000us = (2^16 - X) * 12 / 12, 解得X = 60,536

转换为16进制, 则初值X = 0xEC78, TH0 = 0xEC, TL0 = 0x78

因操作为P1.1需提前定义,如下

sbit Pulse =  P1^1;

// LED状态转换
Pulse = !Pulse;
源码
/* 
 * 功能实现: 采用T0方式1的定时中断方式, 控制AT89C51的P1.1引脚输出100Hz的方波.
 * 编写环境: Neovim + Keil5
 * 硬件仿真: Proteus 8 Professional
 * 日期: 2022-11-05
 */

#include <reg51.h>

sbit Pulse = P1^1; // 定义P1.1口为Pulse

int main(void)
{
    TMOD = 0x01; // 定时器T0为方式1

    TH0 = 0xEC; // 设置定时器初值
    TL0 = 0x78;
    /*
     * 计算过程: 
     * f = 100Hz, T = 10ms, 定时时间为10/2 = 5ms(单高电平或低电平的时间) < 65ms, 所以定时时间T = 5ms
     * 假设时钟频率fosc = 12MHz, 工作在方式1时最大时间为65536ms
     * 5ms = 5000us = (2^16 - X) * 12 / 12, 解得X = 60,536
     * 转换为16进制, 则初值X = 0xEC78, TH0 = 0xEC, TL0 = 0x78
     * TH0 = (65536-5000)/256, TL0 = (65536-5000)%256
     */

    Pluse = 0; // P1.1输出低电平
    EA = 1; // 总中断开
    ET0 = 1; // T0中断开
    TR0 = 1; // 启动T0

    while(1) // 循环等待
    {
        ;
    }

    return 0;
}

void timer0() interrupt 1 // T0中断程序
{
    TH0 = 0xEC; //重新赋初值, 循环计时的时候需要重新赋初值
    TL0 = 0x78;

    P1 = ~P1; // P1口按位取反, LED状态转换
    Pluse = !Pluse; // P1.1口按位取反, 高低电平转换

    return;
}

习题7-2

采用T0方式1的定时中断方式, 控制AT89C51的P1.1引脚输出100Hz, 占空比为20%的脉冲.

分析

高电平时间1/5 * T, T = 1/100 = 10ms; 所以高电平持续时间为2ms, 低电平持续时间为8ms.

定时器定时2ms, 设计软件计数器在中断一次后计4次中断(即8ms
)后置低电平

TMOD = 0x01;
/*
 * 2ms = 1us * 2000, 故n = 2000
 * TH0 = (2^16 - n) / 256
 */
TH0 = (65536 - 2000) / 256;
TL0 = (65536 - 2000) % 256;
源码
/* 
 * 功能实现: 采用T0方式1的定时中断方式, 控制AT89C51的P1.1引脚输出100Hz, 占空比为20%的脉冲
 * 编写环境: Neovim + Keil5
 * 日期: 2022-11-15
 */

#include <reg51.h>

sbit Pulse = P1^1; // 定义P1.1口为Pulse

unsigned char count = 0;

int main(void)
{
    TMOD = 0x01; // 定时器T0为方式1

    TH0 = (65536 - 2000) / 256; // 设置定时器初值
    TL0 = (65536 - 2000) % 256;

    Pluse = 0; // P1.1输出低电平
    EA = 1; // 总中断开
    ET0 = 1; // T0中断开
    TR0 = 1; // 启动T0

    while(1) // 循环等待
    {
        ;
    }

    return 0;
}

void timer0() interrupt 1 // T0中断程序
{

    TH0 = (65536 - 2000) / 256; //重新赋初值
    TL0 = (65536 - 2000) % 256;

    count++;

    if (1 == count) // 2ms过后, 高电平持续时间结束, 需将P1.1变为低电平
    {
        Pluse = 0;
    }
    else if (5 == count) // (5-1) * 2ms过后, 低电平持续时间结束, 需将P1.1变为高电平
    {
        Pluse = 1;
	count = 0; // 一个脉冲周期结束, 将count清零 
    }

    return;
}

课后题7-5

Proteus虚拟仿真. 使用T0, 采用方式2定时中断, 在P1.0引脚上输出周期为400us, 占空比为25%的矩形脉冲, 要求在P1.0引脚上接有虚拟示波器, 观察P1.0引脚输出的矩形脉冲波形.

分析

TMOD = 0000 0010

  • D0 = 0
  • D1 = 1 D1D0 = 10 为方式2
  • D3(C/T’) = 1, Counter计数器模式, 对计数器外部输入引荐T0(P3.4)或T1(P3.5)的外部脉冲(负跳变)计数
  • D3(GATE) = 0, 定时器是否计数, 由启动控制位TR0/TR1来控制(置1时启动)

高电平持续时间为1/4 * 400us = 100us, 低电平持续时间为300us

中断定时为100us, 设计软件计数器, 中断次数为1时跳变为低电平, 中断次数为(4 - 1)时, 跳变为高电平, 循环往复

12MHz时:

n = 100us / 1us = 100

TL0 = 2^8 - 100, TL1 = 2^8 - 100

方式2为8位, 且TH0用于储存初值, 故TL0和TH0二者数值相同, 不存在将十六进制数分位的问题

课后题7-5硬件仿真原理图
课后题7-5波形图

源码
/* 
 * 功能实现:  使用T0, 采用方式2定时中断, 在P1.0引脚上输出周期为400us, 占空比为25%的矩形脉冲 
 * 编写环境: Neovim + Keil5
 * 硬件仿真: Proteus 8 Professional
 * 日期: 2022-11-15
 */

#include <reg51.h>

sbit Pluse = P1^0; // 定义P1.0口为Pulse

unsigned char count = 0;

int main(void)
{
    TMOD = 0x01; // 定时器T0为方式1

    TH0 = 256 - 100; // 设置定时器初值
    TL0 = 256 - 100; 

    Pluse = 0; // P1.1输出低电平
    EA = 1; // 总中断开
    ET0 = 1; // T0中断开
    TR0 = 1; // 启动T0

    while(1) // 循环等待
    {
        ;
    }

    return 0;
}

void timer0() interrupt 1 // T0中断程序
{

    TH0 = 256 - 100; // 重新赋值
    TL0 = 256 - 100; 

    count++;

    if (1 == count) // 100us过后, 高电平持续时间结束, 需将P1.1变为低电平
    {
        Pluse = 0;
    }
    else if (4 == count) // (4-1) * 100us过后, 低电平持续时间结束, 需将P1.1变为高电平
    {
        Pluse = 1;
		count = 0; // 一个脉冲周期结束, 将count清零 
    }

    return;
}

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

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

相关文章

DuckDB学习-初识tpcds

DuckDB学习-1 文章目录DuckDB学习-1跑TPC-DS编译DuckDB支持TPC-DS扩展执行数据生成及查询TPC-DS简单分析&#xff08;v3.2.0&#xff09;事实表维度表跑TPC-DS 编译DuckDB支持TPC-DS扩展 下载代码&#xff0c;然后进源码目录&#xff0c;执行下面两个步骤。 export BUILD_TPC…

Word控件Spire.Doc 【文本】教程(19) ;如何在 C#、VB.NET 中通过 Word 中的正则表达式查找和替换文本

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下&#xff0c;轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具&#xff0c;专注于创建、编辑、转…

【附源码】计算机毕业设计JAVA车辆调度管理系统

【附源码】计算机毕业设计JAVA车辆调度管理系统 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; JAVA my…

计算机毕业设计ssm+vue基本微信小程序的健康食谱交流共享平台

项目介绍 当今社会健康食谱交流共享买卖是必不可少的,人们不管走到哪里都需要有一个健康的身体,有一个强迫的体质,所以健康食谱交流共享市场也是非常火爆&#xff01;不管是健康食谱交流共享公司或者是个人都需要一套完整的管理系统来掌握整个市场信息。针对这一需求,本文设计并…

一步一步教你安装部署 Jenkins,不信你安不上

1、可以去官网 Jenkins 下载jenkins.war包 这里有个坑&#xff1a;jenkins下载的版本需要和jdk版本匹配 我的jdk是1.8,这里选择jenkins版本为2.332.4&#xff0c;下面的链接是jenkins.war安装包直接用 链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;8bxy 2、使…

【C++】模板template

前言&#xff1a;本教程使用到的工具是vs2010&#xff1b; 目录 为什么要使用模板&#xff1f; template模板 函数模板 类的模板 template模板的本质 总结 为什么要使用模板&#xff1f; 我们先来大概了解一下模板的概念&#xff0c;下面是菜鸟教程对于模板给出的解释&am…

每天5分钟快速玩转机器学习算法:带有核函数的支持向量机模型

本文重点 硬间隔和软间隔都是在说样本的完全线性可分或者大部分样本点的线性可分。但我们可能会碰到的一种情况是样本点不是线性可分的,比如: 那么这个时候支持向量机软硬不吃,此时要想解决这个问题,我们可以使用一种魔法,我们将他们映射到一个高维空间中,然后再高维空…

链表相关OJ及方法总结

目录​​​​​​​ 第一类&#xff1a;改变链接关系 第二类&#xff1a;快慢指针 第一类&#xff1a;改变链接关系 1. 删除链表中等于给定值 val 的所有结点。 (1)原地删除 struct ListNode* removeElements(struct ListNode* head, int val){if(headNULL){return head…

一般人我劝你还是要不自学软件测试.....

软件测试基础真的很简单&#xff0c;是个人稍微认真点都能懂&#xff0c;这就是好多人说软件测试简单、易懂、好学&#xff0c;然后就是一顿浮夸的言论&#xff0c;误导那些小白&#xff0c;这里我就给那些轻浮的人泼一桶冷水&#xff0c;懂和学会是一码事吗&#xff1f; 这里…

如何高效填写软件测试缺陷报告?

软件缺陷的描述是软件缺陷报告的基础部分&#xff0c;需要使用简单、准确、专业的术语来描述缺陷。否则&#xff0c;它就会含糊不清&#xff0c;可能会误导开发人员&#xff0c;影响开发人员的效率&#xff0c;也会影响测试人员自身的声誉&#xff0c;准确报告缺陷是非常重要的…

[附源码]java毕业设计基于SSM的酒店管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

高新技术企业的认定条件(三)

十、企业创新能力评价 企业创新能力主要从知识产权、科技成果转化能力、研究开发组织管理水平、企业成长性等四项指标进行评价。各级指标均按整数打分&#xff0c;满分为100分&#xff0c;综合得分达到70分以上&#xff08;不含70分&#xff09;为符合认定要求。具体分值如下&…

opencv4.5.5安装的坑

opencv4.5.5安装的坑 Package opencv was not found in the pkg-config search path. Perhaps you should add the directory containing opencv.pc’ to the PKG_CONFIG_PATH environment variable No package ‘opencv’ found 我把对应目录的opencv4.pc修改成了opencv.pc,运…

记录<一个多SDK中引入ffmpeg出现的top1的crash问题>解决方案

文章目录一. 背景二. 分析、定位crash源代码三. 分析汇编四. 分析源码五. 思考一. 背景 App从某个版本开始突然收到一例高频crash&#xff0c;&#xff0c;crash信息如下 crash栈如下&#xff1a; crash栈信息很少&#xff0c;只能看出是线程刚启动就crash了&#xff0c;内存…

Java【类和对象】,你还没对象?我教你new一个!

文章目录前言一、初识面向对象1.什么是面向对象2.面向对象过程二、类的定义与使用1.什么是类2.如何定义类3.示例三、类的实例化1.什么是类的实例化2.类和对象的说明四、this引用1.为什么要有this引用第一种情况第二种情况2.什么是this引用3.this引用的特征五、对象的构造及初始…

ubuntu上运行make menuconfig两种报错

1&#xff09; 如果如上报错&#xff0c;没有target&#xff0c;这是因为运行这个make的时候没在对应的目录下运行&#xff0c;通常是有make的目录&#xff0c;这种系统性的编译的&#xff0c;则是应该在代码的根目录。在根目录下用根目录下的make。 2&#xff09;然后我来到根…

Restful 接口设计-前言(手把手教你入门到精通)

文章目录前言一&#xff1a;什么是API分类一分类二前言二&#xff1a;Web的发展前言三&#xff1a;传统开发模式VS前后端分离传统的开发模式前后端分离了解API和Web的发展有利于帮助你掌握Restful接口设计 前言一&#xff1a;什么是API API&#xff08;Application Programmi…

第三章 多维随机变量及其分布

思维导图 基础知识 二维随机变量 我们研究一个多维的东西&#xff0c;往往先从较低的维度比如说二维作为主要的研究对象&#xff0c;一个是因为维度低会比较简单&#xff0c;易于理解&#xff1b;另一个则是考试中低维的问题往往更加常见 定义与分布函数 定义上其实很简单&am…

双亲委派机制

Java 虚拟机对 class 文件采用的是按需加载的方式&#xff0c;也就是说当需要使用该类时才会将它的 class 文件加载到内存生成 class 对象。而且加载某个类的 class 文件时&#xff0c;Java 虚拟机采用的是双亲委派模式&#xff0c;即把请求交由父类处理&#xff0c;它是一种任…

【Pytorch with fastai】第 6 章 :其他计算机视觉问题

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…