版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
定时/计数器第5章定时/计数器是单片机最重要的资源之一,应用非常广泛,凡是涉及计数、定时有关的操作,都可以用定时/计数器来解决,如定时控制、延时、频率/周期的测量、信号产生、串行通信等。定时/计数器是单片机的学习重点,也是难点之一,使用起来比I/O口应用复杂,只有熟悉其工作原理才能很好地掌握其用法。本章着重介绍定时/计数器的工作原理与不同工作方式的特点及其应用方法。引言目录定时/计数器概述1定时/计数器的基础应用案例2本章小结5定时/计数器的高级应用3本章习题6行业PPT模板/hangye/项目训练数字电子钟设计45.1定时/计数器概述行业PPT模板/hangye/定时器/计数器简介8051单片机内部有两个16位的定时/计数器T0和T1,它们本质上是计数器。在它们作为定时器使用时,计数脉冲来自内部的机器周期(振荡周期的12倍)。当它们作为计数器使用时,用来计引脚上的脉冲信号(下降沿)数。T0和T1的外部引脚是P3口的第二功能,对应的是P3.4和P3.5引脚.定时/计数器是中断系统的一部分。5.1.1与定时/计数器有关的SFR1.定时/计数器的控制寄存器TCONTCON的大部分功能在第4章中已经介绍过,此外,还有两位与定时/计数器的运行有关,即TR0、TR1,如表5-1所示,它们控制定时器的运行。(1)TR0(Timer0Run)——定时/计数器T0运行控制位。TR0=1,启动T0运行(与TMOD中的GATE位有关);TR0=0,T0停止运行。(2)TR1(Timer1Run)——定时/计数器T1运行控制位。它的功能同TR0。TCOND7D6D5D4D3D2D1D0位地址8FH8EH8DH8CH8BH8AH89H88H位定义TF1TR1TF0TR0IE1IT1IE0IT05.1.1与定时/计数器有关的SFR2.定时/计数器的工作方式控制寄存器TMODTMOD用于设定定时/计数器的工作方式。它的高4位控制T1,低4位控制T0;其字节地址是89H,不可位寻址,只能按字节(8位一起)整体赋值。TMOD的各位如表5-2所示。(1)GATE——门控位。GATE一般情况下设置为0,此时,定时/计数器的运行仅受TR0/TR1的控制。如果将GATE设置为1,则定时/计数器的运行还受对应外部中断引脚(INT0/INT1)输入信号的控制。只有在外部中断引脚输入高电平,且TR0/TR1=1时,定时/计数器才运行。有时可以用门控位进行时钟信号的测量。(2)C/T(Counter/Timer)——定时/计数选择位。=0为定时方式,对内部的机器周期脉冲进行计数;=1为计数方式,对引脚上的脉冲信号计数,负跳变有效。5.1.1与定时/计数器有关的SFR2.定时/计数器的工作方式控制寄存器TMOD(3)M1、M0——工作方式选择位。M1和M0的组合可以作为定时/计数器不同的工作方式来使用M1M0位组合方式名称功能备注00方式013位定时/计数器—01方式116位定时/计数器—10方式28位定时/计数器初值自动重装11方式3两个8位定时/计数器仅适用于T05.1.1与定时/计数器有关的SFR3.定时/计数器的计数寄存器定时/计数器内部有一个16位计数器用来计脉冲数,称为计数寄存器。它是由由两个8位寄存器(TH0和TL0)组成的。这两个8位寄存器可以单独进行读/写操作。它们的定义如下。TH0——T0的高8位。TL0——T0的低8位。TH1——T1的高8位。TL1——T1的低8位。5.1.2定时/计数器的工作方式1.方式0当M1M0=00B时,定时/计数器工作于方式0,T0和T1的内部结构类似,以T0为例,其逻辑结构如图5-1所示(以T0为例),它是一个13位的计数器。5.1.2定时/计数器的工作方式1.方式0定时/计数器一般都是利用其计满产生溢出标志产生中断的特性来工作的,通过要定时的时间来计算定时器初始值:
定时时间=(最大计数值‒计数初值)×脉冲周期
计数初值=2N-定时时间/脉冲周期
=2N-t/T方式0中,N=13,t为定时时间,T为机器周期计算得出的13位的二进制数的初值,低5位存放在TL0(TL1)中,高8位存放在TH0(TH1)中。定时/计数器的工作方式2.方式1当M1M0=01B时,定时/计数器工作于方式1方式1的结构和方式0相同,唯一不同的是它的位数是16位,计算初值时得出的16位的二进制数的初值,低8位存放在TL0(TL1)中,高8位存放在TH0(TH1)中。5.1.2定时/计数器的工作方式3.方式2当M1M0=10B时,定时/计数器工作于方式2,其逻辑结构如图所示。方式2是一个8位定时/计数器,其工作原理和方式0类似。只是它内部结构有所改变,它具有初值自动重装功能。TL0为计数寄存器,TH0中存放重装值。当TL0计满产生溢出标志时,将TH0中的值传送到TL0中。其他功能与方式0、方式1一样。方式2的特点是可以自动反复地定时,溢出时自动重装初值。而其它方式都不具备重装功能,当定时器溢出时,如果想再次定时,就需要人为给它装入初值。4.方式3当M1M0=11B时,定时/计数器T0工作于方式3,其逻辑结构如图所示。单片机内部的两个定时器中只有T0可以工作于方式3。T0工作于方式3时将16位定时/计数器拆成两个8位定时/计数器。TL0作为一个8位的计数单元与T0的其他资源构成一个8位定时/计数器,其结构原理与其他工作方式类似。TH0作为另外一个8位的计数单元,用定时/计数器T1的TR1控制计数的启停,用TF1作为TH0计满溢出的标志,构成一个8位定时器。因其启动控制和溢出标志均使用了定时器的启动位(TR1)与溢出位(TF1),因此,T1在此方式下就不能作为定时/计数器来使用了,但T1仍可以工作在其他方式下。5.1.2定时/计数器的工作方式5.1.3定时/计数器的使用方法1.硬件定时/计数器在对外部信息或事件进行计数时,需要通过适当的电路将其转换成脉冲信号后加到定时/计数器的引脚上。外部被测脉冲信号的周期不能小于两个机器周期,即最高频率不能超过系统时钟频率的1/24。例如,对于晶振为12MHz的单片机系统,其机器周期是1µs,对应的频率是1MHz,此时检测外部脉冲的频率就不能超过500kHz。5.1.3定时/计数器的使用方法1.硬件定时/计数器在对外部信息或事件进行计数时,需要通过适当的电路将其转换成脉冲信号后加到定时/计数器的引脚上。外部被测脉冲信号的周期不能小于两个机器周期,即最高频率不能超过系统时钟频率的1/24。例如,对于晶振为12MHz的单片机系统,其机器周期是1µs,对应的频率是1MHz,此时检测外部脉冲的频率就不能超过500kHz。5.1.3定时/计数器的使用方法2.软件(1)初始化。初始化一般包括4部分。一是通过对TMOD进行设置来选择定时/计数器及其工作方式。二是根据设置的工作方式计算计数初值三是启动定时/计数器(TR0、TR1),在有些情况下,其启动/停止受其他程序控制。四是开通有关的中断允许控制位(ET0、ET1、EA)。(2)入口地址。单片机工作在中断方式时,在程序结构上,需要用伪指令定义中断的入口地址,其形式与外部中断一样。例如,T0的入口地址可用下面的汇编指令定义:ORG000BHLJMPINTET0; //转移到T0服务程序如果使用C语言编程,则无须设置入口地址,只需在中断服务程序中指定中断编号即可。5.1.3定时/计数器的使用方法【例5-2】
已知系统晶振是12MHz,在P1.0引脚上输出2ms的方波,编写程序实现。实现方法分析:从例5-1中得知,定时器需要反复产生1ms的定时,机器周期为1µs,计数1000个机器周期即1ms,选择T0,工作于方式1,定时1ms的初值计算见前面部分。方波的实现方法:在中断程序中重新给定时器赋初值,并把P1.0引脚的电平取反后输出。#include<reg51.h>sbitP1_0=P1^0;
//定义方波输出引脚位变量
voidsetup(void)//初始化设置子函数
{TMOD=0x01; //T0,方式1,定时
TH0=0xFC;
//计数初值高位TL0=0x18;
//计数初值低位TR0=1;
//启动运行ET0=1;
//开通定时器0中断允许控制位EA=1;
//开通总的允许位}voidmain(void){setup();//调用设置子程序while(1)
//等待中断{};}voidINTET0(void)interrupt1using1//中断子程序{TH0=0xFC; //重装计数初值TL0=0x18;P1_0=!P1_0;//输出取反}5.1.3定时/计数器的使用方法【例5-2】
已知系统晶振是12MHz,在P1.0引脚上输出2ms的方波,编写程序实现。实现方法分析:从例5-1中得知,定时器需要反复产生1ms的定时,机器周期为1µs,计数1000个机器周期即1ms,选择T0,工作于方式1。方波的实现方法:在中断程序中重新给定时器赋初值,并把P1.0引脚的电平取反后输出。//初始化设置子函数
voidsetup(void) {TMOD=0x01; //T0,方式1,定时
TH0=0xFC;
//计数初值高位TL0=0x18;
//计数初值低位TR0=1;
//启动运行ET0=1;
//开通定时器0中断允许控制位EA=1;
//开通总的允许位}初值计算:定时时间=(最大计数值‒计数初值)×脉冲周期工作方式1,最大计数值为216计数初值=2N-定时时间/脉冲周期
=2N-t/T
=216-1000/1us
=
65536-1000
=
64536=0xFC18因此,TH0=0xFC,TL0=0x18;5.1.3定时/计数器的使用方法#include<reg51.h>sbitP1_0=P1^0; //定义方波输出引脚位变量voidmain(void){setup();//调用设置子程序while(1)//等待中断{};}voidINTET0(void)interrupt1using1//中断子程序{TH0=0xFC; //重装计数初值TL0=0x18;P1_0=!P1_0;//输出取反}仿真视频5.1.3定时/计数器的使用方法【例5-3】在例3-4的基础上设计一个时钟,数码管高2位显示分,低2位显示秒,系统晶振频率为12MHz。时钟实现的方法:首先要产生秒信号,系统机器周期是1µs,能产生的最大定时时间是65536µs,约66ms。可以将定时器的定时时间设置为50ms,通过重复定时来累计定时器中断的次数,20次就是1s。计数初值计算如下: 初值=216-50ms/1µs=65536-50000=15536TH0=15536/256=60,TL0=15536%256=1765.1.3定时/计数器的使用方法主要程序:voidsetup(void) //初始化设置函数声明{TMOD=0x01;
//T0方式1定时
TH0=60; //50ms初值高位TL0=176; //50ms初值低位TR0=1; //启动运行ET0=1;
//开通允许位EA=1; //开通总的允许位
}voidmain(void){
setup(); //调用设置子程序while(1) //等待中断{display();
//显示函数(略)}}voidINTET0(void)interrupt1using1//中断服务子程序{
TH0=60;
//重装计数初值TL0=176;counter++;
//计数加1if(counter!=20)
//判断是否计到1sreturn;
//不到1s退出,继续计时else
//否则1s后,计数清零,秒变量加1{counter=0;second++;
if(second==60)
//判断是否计到60s
{ second=0; //秒清零 minute++; //代表分的值加1 if(minute==60) //判断是否计到60
minute=0; //代表分的值清零
} }}
5.2
定时/计数器
的基础应用案例5.2.1输出矩形波【例5-4】已知系统晶振是12MHz,在P1.0引脚上输出如图5-6所示的矩形波。方法一:用T0反复产生5ms的定时、T1反复产生2ms的定时,如图5-7所示。当T1定时时间到时,使P1.0引脚输出低电平,并停止定时;当T0定时时间到时,使P1.0引脚输出高电平,启动T1,一起开始下一个周期波的定时。
T0中断子程序voidINTET0(void)interrupt1using0{TH0=0xEC; //T0中断服务程序TL0=0x78; //重装5ms初值P1_0=1; //P1.0引脚输出高电平TR1=1; //启动T1}
T1中断子程序voidINTET1(void)interrupt3using1{TR1=0;
//T1停止运行TH1=0xF8;TL1=0x30; //重装2ms初值P1_0=0; //P1.0引脚输出低电平}5.2.1输出矩形波【例5-4】已知系统晶振是12MHz,在P1.0引脚上输出如图5-6所示的矩形波。方法二:用T1产生2ms的定时、T0产生3ms的定时,如图5-8所示。开始时,T1定时、T0不定时,当T1定时时间到时,使P1.0引脚输出低电平,自己停止定时,同时启动T0;当T0定时时间到时,使P1.0引脚输出高电平,自己停止定时,同时启动T1。这样反复进行,可实现要输出的波形。
T0中断子程序voidINTET0(void)interrupt1using1{TR0=0; //T0停止运行TH0=0xF4;TL0=0x48;//重装3ms初值P1_0=1; //P1.0引脚输出高电平TR1=1; //启动T1}
T1中断子程序
voidINTET1(void)interrupt3using2{ TR1=0; //T1停止运行 TH1=0xF8; TL1=0x30; //重装2ms初值 P1_0=0; //P1.0引脚输出低电平 TR0=1; //启动T0}5.2.1输出矩形波【例5-4】已知系统晶振是12MHz,在P1.0引脚上输出如图5-6所示的矩形波。方法三:前面两种方法都用到了两个定时器,本方法只用一个定时器。本方法用T0代替方法二中的T1,即用T0交替产生2ms和3ms的定时,如图所示,用一个位变量a来表示2ms和3ms的状态,如a=0表示2ms定时、a=1表示3ms定时。
T0中断子程序
voidINTET0(void)interrupt1using0{ P1_0=!P1_0; //对P1.0引脚的输出取反 a=!a; //定时状态取反 if(a==0) //如果a=0,则2ms初值重装 {
TH0=0xF8;
TL0=0x30; //重装2ms初值 } else {
TH0=0xF4; //a=1
TL0=0x48; //重装3ms初值 }}5.2.2频率测量【例5-5】如图5-10所示,用定时/计数器测量脉冲信号的频率,系统晶振频率为6MHz。
voidINTET1(void)interrupt3using1//T1中断子程序{ TR0=0;
//停止计数 TR1=0;
//停止定时 freq=TH0;/
//读取计数寄存器的高位值
freq=(freq<<8|TL0)*10;//将高位值和低位值组合后换算为频率 TH1=0x3C; TL1=0xB0;
//重装定时初值 TH0=0; TL0=0;
//计数初值为0 TR1=1;
//启动下一轮定时 TR0=1;
//启动下一轮计数}实现方法分析:频率是指周期信号1s内重复的次数。用单片机测量频率需要用两个定时/计数器,一个用于定时,一个用于计外部脉冲数。选择的闸门(定时)时间为0.1s,T1用于定时,T0用于计数。5.2.3脉冲宽度及周期测量在测量较低的频率时,通常是通过测量信号周期的方法来实现的,由周期计算出频率。图
5-11所示为测量周期示意图。
【例5-6】用定时/计数器测量脉冲信号的周期,系统晶振频率为6MHz。实现方法分析:将脉冲信号加到外部中断引脚上,脉冲的下降沿作为中断的触发信号。定时/计数器工作在计数模式下,在外部中断的服务程序中启动计数器,计内部的机器周期数。外部中断再次触发时停止计数,在两次中断触发的期间内计得的机器周期数就是被测信号的周期。voidINTEX0(void)interrupt0using1//外部中断0子程序{ TR0=1; //启动定时器,开始计数 n++; //中断次数加1 if(n==2)
//判断是否2次中断 {
TR0=0;
//停止计数机器周期
Tp=TH0;
//读取计数寄存器的高位值
Tp=(Tp<<8|TL0)*2;//将高位值和低位值组合后换算为周期(机器周期为2µs)
TH0=0;
//计数值清零
TL0=0;
//为下一轮测量做准备
n=0;
//中断次数清零 }}5.2.3脉冲宽度及周期测量【例5-7】用定时/计数器测量脉冲的宽度,系统晶振频率为6MHz。
将定时器T0的TMOD的GATE位设置为1,即定时器的启动控制除了受到TR0的控制,还受到INT引脚的控制。此时的定时器只有在引脚是高电平期间内才计数,在低电平期间内不计数,故测出的是高电平的宽度。5.2.3脉冲宽度及周期测量【例5-7】用定时/计数器测量脉冲的宽度,系统晶振频率为6MHz。
实现方法:在例5-6的程序上进行修改,即将TMOD设置改为:TMOD=0x09;并修改周期的计算方法,因测得的是半个周期,故整个周期的数值要乘2(仅针对方波信号)。voidINTEX0(void)interrupt0using1
//外部中断0子程序{ TR0=1; //启动定时器,开始计数 n++; //中断次数加1 if(n==2)
//判断是否2次中断 {
TR0=0;
//停止计数机器周期
Tp=TH0;
//读取计数寄存器的高位值
Tp=(Tp<<8|TL0)*2*2;//计算周期
TH0=0;
//计数值清零
TL0=0;
//为下一轮测量做准备
n=0; //中断次数清零 }}5.2.4超声波测距应用
把40kHz的脉冲输入超声波发射器中,超声波元件将脉冲信号转换为超声波信号,以声速(340m/s)向前传播。超声波在遇到障碍物时会被反弹回来,最终被超声波传感器接收。通过记录从发射到接收所经历的时间,就可以计算出超声波到障碍物的距离:距离=340×(t/2)(t是超声波从发射到接收所经历的时间,单程时间要除以2)。图5-12超声波测距原理超声波模块5.2.4超声波测距应用
HC-SR04超声波模块的时序图如图所示。给超声波模块的触发引脚(Trig)一个启动触发信号,模块收到启动信号之后便产生8个连续的40kHz的脉冲信号,通过超声波发射器(T)发射出超声波信号;超声波遇到障碍物后反弹回来被超声波接收器(R)接收,在模块的Echo引脚上产生与距离成正比的高电平回响信号,通过测量此高电平的宽度就可以测得超声波到障碍物的距离。5.2.4超声波测距应用
【例5-8】利用单片机和超声波测距模块进行距离的测量,编写程序实现。实现方法分析:通过超声波测距的原理可知,超声波测距通过一个10µs的脉冲来启动,接收的回响信号由Echo引脚产生高电平指示。测量该高电平信号的宽度就可以获得距离。参考例5-7可以测量高电平的宽度。主要程序:T0中断服务子程序,用来计定时器计满溢出次数voidINTET0(void)interrupt1using1{ Time_Count++; //定时器计满溢出次数加1 TL0=0x00; //设置定时初值低8位 TH0=0x00; //设置定时初值高8位}INT0中断服务子程序,用来停止定时器计数voidINTEX0(void)interrupt0using2{ TR0=0;
//停止计数 END=1;
//置完成标识}//程序功能:测距计算voidmeasure(void){ StartModule(); TR0=1;//开启定时器,等待高电平到来 while(!END);
//等待回响信号结束 END=0; time=TH0; time=time<<8|TL0;
time=time+(Time_Count*65535);
//计算总时长 TH0=0;
//定时/计数器清零 TL0=0; Time_Count=0; //溢出次数清零
S=time/58;//按照给定的公式计算距离,得到以cm为单位的距离}
5.3定时/计数器
的高级应用5.3.1多个时间的延时要实现多个延时也可以借鉴时钟产生的方法,其基本的思想如下。(1)根据给定的定时设置多个时间的最小定时单位。(如50ms)(2)给每个定时时间设置一个启动标识(start_flag)和一个结束标识(end_flag)。(3)通过查看定时的结束标识是否为1(end_flag==1)来判断定时时间到达与否。5.3.2无阻塞延时要实现无阻塞延时,可以参考5.3.1节中介绍的多个时间的定时方法,采用定时器方式来延时,同时配以相关的标识来指示延时结束。如例3-5中的按键扫描程序,给按键扫描设定一个周期,如每5ms扫描一次,用定时器实现定时。设定按键相关标识如下:
key_count=0;
//按键按下计数变量
key_release=0;
//按键释放标识实现延时消抖功能,通过定时器定时5ms中断次数的计数来实现。按键的释放判断通过定义按键释放标识变量key_release来标示是否有按键被按下,以及按键是否被释放。当有按键被按下时,key_release=1,当检测到没有按键被按下时,把按键按下计数变量和按键释放标识清零,表示一次按键动作结束。5.3.3多任务的管理、调度时间片轮询调度算法的程序框架(1)任务结构体。任务结构体包含了一个任务需要的所有信息,包括运行状态标志、计时器、任务运行间隔时间,以及这个任务对应的函数指针。typedefstructTask{unsignedcharRun;//程序运行标志:0表示不运行,1表示运行
unsignedintTimer;//计时器
uinsignedintItvTime;//任务运行间隔时间
void(*TaskHook)(void);//要运行的任务函数}Task_TypeDef;(2)任务数组。任务数组其实就是任务的结构体数组,包含各个任务的参数。当需要添加一个任务到时间片轮询队列中时,只需在任务数组中添加函数指针,并设置好相关参数即可。staticTask_TypeDefTaskComps[]={{0,0,20,Task_DisplayClock}, //显示时钟{0,0,50,Task_KeyScan}, //按键扫描{0,0,100,Task_DispStatus}, //显示工作状态 ...... //在这里添加新的任务};5.3.3多任务的管理、调度时间片轮询调度算法的程序框架(1)任务结构体。任务结构体包含了一个任务需要的所有信息,包括运行状态标志、计时器、任务运行间隔时间,以及这个任务对应的函数指针。typedefstructTask{unsignedcharRun;//程序运行标志:0表示不运行,1表示运行unsignedintTimer;//计时器uinsignedintItvTime;//任务运行间隔时间void(*TaskHook)(void);//要运行的任务函数}Task_TypeDef;(2)任务数组。任务数组其实就是任务的结构体数组,包含各个任务的参数。当需要添加一个任务到时间片轮询队列中时,只需在任务数组中添加函数指针,并设置好相关参数即可。staticTask_TypeDefTaskComps[]={{0,0,20,Task_DisplayClock}, //显示时钟{0,0,50,Task_KeyScan}, //按键扫描{0,0,100,Task_DispStatus}, //显示工作状态 ......
//在这里添加新的任务};5.3.3多任务的管理、调度(3)任务列表。任务列表的作用主要是给任务数组的元素标注名称,用到了C语言的枚举变量enum。枚举变量的元素编号是从0开始的,依次递增。typedefenumTASK_LIST{TAST_DISP_CLOCK,//0,显示时钟TAST_KEY_SAN,//1,按键扫描TASK_DISP_WKST,//2,工作状态显示...... //在这里添加新的任务TASKS_MAX //任务最大值,表明可供分配的定时任务的数目}TASK_LIST_TypeDef;5.3.3多任务的管理、调度(4)标志位处理函数。标志位处理函数是用来更新每个任务的计时器及其运行标志位的,在单片机的定时器中断服务函数中调用它。voidTaskRemarks(void){uint8i;for(i=0;i<TASKS_MAX;i++) //对每个任务的计时时间进行处理{if(TaskComps[i].Timer) //时间不为0{TaskComps[i].Timer--; //采用递减计数方式,减去一个节拍if(TaskComps[i].Timer==0) //计时结束{TaskComps[i].Timer=TaskComps[i].ItvTime;//恢复计时初值TaskComps[i].Run=1; //任务可以运行}}}}5.3.3多任务的管理、调度(5)各个任务函数(略)整个程序的执行流程:定时中断服务函数不断检查并刷新每个任务的状态,实时更新任务数组的数据(时间和标志)。任务处理函数根据这些状态来判断要执行哪些函数,如果条件满足,就调用相应的任务函数执行。时间片轮询调度算法的程序的框架流程图如图所示。5.4
项目训练:
数字电子钟设计5.4.1项目要求本项目的具体任务是用单片机设计一个简单的数字电子钟,能显示时、分、秒,并能进行调整。具体要求如下。(1)开机时,显示12:00:00,开始计时。(2)按键1控制“秒”的调整,每按一次加1s。(3)按键2控制“分”的调整
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 办公区咖啡机租赁协议
- 电网工程承包合同
- 环保设备物流公司聘用合同条款
- 舞台安全承诺书:确保演员安全
- 社会救助不合格品处理
- 温暖话题的作文600字合集五篇
- 2022小学五年级班级工作计划
- 教师年终述职报告范文(合集14篇)
- 2025湖北劳动的合同范本
- 小学教师年终总结六篇
- 曲式与作品分析智慧树知到期末考试答案章节答案2024年内蒙古艺术学院
- 人工智能与未来教育智慧树知到期末考试答案章节答案2024年丽水学院
- 2024年中考英语二轮复习:语法填空讲解
- 数据结构智慧树知到期末考试答案章节答案2024年中央财经大学
- 中国血脂管理指南(基层版2024年)
- 《地方导游基础知识》期末考试试卷及答案(2卷)
- 妇科肿瘤微创手术
- 前列腺癌2024治疗指南
- 生态学概论智慧树知到期末考试答案2024年
- 乡镇综治工作业务培训
- 钢管架搭设施工方案
评论
0/150
提交评论