版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1单片机与嵌入式系统第八讲本次课主要内容第二章单片机原理(六)2单片机定时/计数器及其应用!单片机原理(六)1.本次课的目标2.单片机定时器/计数器的结构3.定时器的控制4.定时器的四种模式及应用5.定时器初始化过程6.综合实验7.小结31.本次课的目标熟悉单片机定时/计数器的基本概念、基本结构、四种工作模式;熟练掌握其应用;4单片机原理(三)1.本次课的目标2.单片机定时器/计数器的结构3.定时器的控制4.定时器的四种模式及应用5.定时器初始化过程6.综合实验7.小结52.单片机定时器/计数器的结构数字电路中的计数器6时钟来自哪里?溢出之后怎么办?单片机定时器/计数器的结构7核心是16位的加1计数器。T0由TH0和TL0构成。T1由TH1和TL1构成。定时器由特殊功能寄存器TMOD和TCON所控制!定时器可产生中断!计数器可对外部输入脉冲计数!定时器/计数器结构的核心是一个16位的加1计数器。定时器/计数器T0(Timer0)由TH0(TimerHigh0)和TL0(TimerLow0)构成。定时器/计数器T1由TH1和TL1构成。89问题:假设TL0为8位,T0与TH0和TL0有什么样的关系?10T0=TH0×256+TL0TH0=T0/256TL0=T0%256问题:假设TL0为5位,T0与TH0和TL0有什么样的关系?11T0=TH0×32+TL0TH0=T0/32TL0=T0%32单片机的定时器/计数器具有两种功能:定时:计算机器周期的个数,对初始值进行累加,溢出时产生中断。计数:计算外部输入脉冲的个数,对初始值进行累加,溢出时产生中断。12由特殊功能寄存器TMOD(TimerMode)和TCON(TimerControl)所控制。定时器工作不占用CPU时间,除非定时器/计数器溢出,才能中断CPU的当前操作。1314TF1TR1TF0TR0IE1IT1IE0IT0
TCON(88H)8FH8EH8DH8CH8BH8AH89H88H高四位对定时器控制低四位涉及外部中断定时工作方式定时器计数89C51片内振荡器输出经12分频后的脉冲,即在初始值基础上每个机器周期使定时器(T0或T1)的数值加1直至计满溢出。15问题:当89C51采用12MHz晶振时,计数频率为多少?16答案:一个机器周期为1μs,计数频率为1MHz。计数工作方式通过引脚T0(P3.4)和T1(P3.5)对外部脉冲信号计数。当输入脉冲信号产生由1至0的下降沿时计数器的值加1。为了确保某个电平在变化之前被采样一次,要求电平保持时间至少是一个完整的机器周期。17问题:计数器对外部脉冲计数时,最高计数频率与振荡频率有什么关系?18答案:CPU检测一个1至0的跳变需要两个机器周期,故最高计数频率为振荡频率的1/24。问题:当89C51采用12MHz晶振时,所能计数的外部管脚输入频率最大为多少?19答案:最高计数频率为振荡频率的1/24,因此所能计数的最大外部管脚输入频率为500KHz。回忆:外中断源的扩展方法利用定时器/计数器扩充外中断源用中断和查询结合法扩充外中断源20思考:如何利用计数器进行外部中断扩展?由于计数器溢出时会产生中断,因此,可以让计数器初始值为“溢出值-1”,当外部来一个脉冲时,就可以触发中断,进而将2个计数器中断扩展为2个外部中断。21单片机原理(三)1.本次课的目标2.单片机定时器/计数器的结构3.定时器的控制4.定时器的四种模式及应用5.定时器初始化过程6.综合实验7.小结223.定时器的控制3.1工作模式寄存器TMOD(TimerMode)3.2控制器寄存器TCON(TimerControl)2324定时器T1定时器T0TMOD(89H)GATEC/TM1M0GATEC/TM1M03.1工作模式寄存器TMODTMOD用于控制T0和T1的工作模式。特别注意:TMOD不能位寻址,只能用字节设置定时器的工作模式,低半字节设置T0,高半字节设置T1。89C51系统复位时,TMOD所有位被清0。2526定时器T1定时器T0TMOD(89H)D7D6D5D4D3D2D1D0GATEC/TM1M0GATEC/TM1M027M1和M0—操作模式控制位。两位可形成四种编码,对应于四种模式。28TMOD(89H)D7D6D5D4D3D2D1D0GATEC/TM1M0GATEC/TM1M0C/T(Counter/Timer)—计数器/定时器方式选择位。C/T=0,设置为定时方式。定时器计数89C51片内脉冲,即对机器周期计数。C/T=1,设置为计数方式。计数器的输入来自引脚T0(P3.4)或T1(P3.5)端的外部脉冲。29TMOD(89H)D7D6D5D4D3D2D1D0GATEC/TM1M0GATEC/TM1M030GATE(ORgateenablebitwhichcontrolRUN/STOPoftimer)—门控位。GATE=0,只要用软件使TR0(或TR1)置1就可以启动定时器,而不管INT0(或INT1)的电平是高还是低。GATE=1,只有INT0(或INT1)引脚为高电平且由软件使TR0(或TR1)置1时,才能启动定时器工作。31TMOD(89H)D7D6D5D4D3D2D1D0GATEC/TM1M0GATEC/TM1M032问题:TMOD=0x01;是什么含义?33答案:T1工作于定时器、不受INT1控制,工作在模式0。T0工作于定时器、不受INT0控制,工作在模式1。3.2控制器寄存器TCONTCON除可字节寻址外,还可位寻址。89C51系统复位时,TCON的所有位被清0。34TF1TR1TF0TR0IE1IT1IE0IT0TCON(88H)8FH8EH8DH8CH8BH8AH89H88H35TF1(Timer1Overflowflag)—T1溢出标志位。当T1溢出时,由硬件自动使中断触发器TF1置1,并向CPU申请中断。当CPU响应中断进入中断服务程序后,TF1被硬件自动清0。TF1也可以用软件清0。36TF1TR1TF0TR0IE1IT1IE0IT0TCON(88H)8FH8EH8DH8CH8BH8AH89H88H37TF0(Timer0Overflowflag)—T0溢出标志位。其功能和操作情况同TF1。38TR1(Timer1runcontrolbit)—T1运行控制位可通过软件置1(TR1=1)或清0(TR1=0)来启动或关闭T1工作。在程序中用指令“TR1=1”使TR1位置1,定时器T1便开始计数。用“TR1=0”使TR1清0,定时器停止工作。TR0(Timer0Overflowflag)—T0运行控制位。其功能和操作情况同TR1。39TF1TR1TF0TR0IE1IT1IE0IT0TCON(88H)8FH8EH8DH8CH8BH8AH89H88H40问题:当计数器0溢出时,哪个寄存器状态将会发生变化?41答案:当T0溢出时,由硬件自动使中断触发器TF0置1TF1TR1TF0TR0IE1IT1IE0IT0TCON(88H)8FH8EH8DH8CH8BH8AH89H88H问题:下述语句什么含义?TMOD=0x01;TR0=1;42答案:T1工作于定时器、不受INT1控制,工作在模式0。T0工作于定时器、不受INT0控制,工作在模式1。启动定时器0。单片机原理(三)1.本次课的目标2.单片机定时器/计数器的结构3.定时器的控制4.定时器的四种模式及应用5.定时器初始化过程6.综合实验7.小结434.定时器的四种模式及应用4.1模式0及其应用4.2模式1及其应用4.3模式2及其应用4.4模式3简介444.1模式0及其应用在这种模式下,16位寄存器(TH0和TL0)只用了13位。其中TL0的高3位未用,其余5位为整个13位的低5位,TH0占高8位。当TL0的低5位溢出时,向TH0进位;TH0溢出时,向中断标志TF0进位(硬件置位TF0),并申请中断。45×××TH0TL08位5位问题:模式0所能计数的最大值是多少?213=8192问题:模式0计数到多少时产生溢出中断?213=81924647问题:在具有初值的情况下,计数器模式0在多长时间后溢出?这个问题非常重要!!!T=(8192-初值)×时钟周期×12T=(8192-初值)×机器周期问题:单片机外部接12MHz晶振,定时器采用模式0,则定时器最大定时时间为多少?48答案:
模式0用13位计时,机器周期为1us,213×机器周期=8.192ms。问题:单片机外部接12MHz晶振,定时器采用模式0,如何产生1s的定时?49答案:模式0用13位计时,12MHz时钟时,定时器最大定时时间为8.192ms。直接计时,达不到1s的要求。可产生5ms的定时,再由5ms累计200次产生1s的定时。这个问题非常重要!!!定时器工作于模式0,若要产生5ms的定时,计数初值如何选择?50答案:使用公式:(213–初值)×机器周期=5ms,可以计算出初值为:213-5000/1。这个问题非常重要!!!定时器工作于模式0,定时器初值为:213-5000/1,应如何设置TH0和TL0?51答案: TH0=(8192-5000)/32; TH1=(8192-5000)%32;这个问题非常重要!!!问题:如果使用中断处理T0溢出,应如何初始化中断?52答案:EA=1;ET0=1;或 IE=0x82;EA
ESET1EX1ET0EX0问题:如果使用中断处理T0溢出,应如何定义中断处理函数?53INT0:0T0:1INT1:2T1:3串口:4答案:voidTimer_Interrupt()interrupt1{……}例:用单片机驱动一个发光二极管,闪烁周期为1s,振荡频率为12MHz。54演示:Project1例:用单片机驱动一个发光二极管,闪烁周期为1s,振荡频率为12MHz。分析:发光二极管亮的时间为500ms,然后熄灭500ms,之后周期循环。由于模式0最大定时时间为:213×机器周期=8.192ms,达不到500ms的要求。可以定时产生5ms的中断,再根据此中断累加100次达到500ms。55问题:定时器应工作于什么模式?(TimerorCounter?)Timer问题:定时器是否需要INT0来控制?不需要56Step1:若要产生5ms的定时,计数初值如何选择?使用公式:(213–初值)×机器周期=5ms,可以计算出初值为:213-5000/1.57程序设计#include<AT89X51.h>sbitLED=P0^0;unsignedcharT_Count=0;voidmain(){//设置定时器工作在模式0,且不受INT0控制,工作于Timer状态
TMOD=0x00;//TH0和TL0应如何设置?
TH0=(8192-5000)/32; TL0=(8192-5000)%32;//如何初始化中断?
IE=0x82;//如何启动定时器0?
TR0=1;//接下来干什么?
while(1);}58//如何定义T0中断处理函数?voidTimer_Interrupt()interrupt1{//中断处理函数中应做哪些事情?//定时器初值初始化;5ms累加产生500ms;500msLED状态翻转//定时器初值初始化;
TH0=(8192-5000)/32; TL0=(8192-5000)%32;//5ms累加产生500ms;500msLED状态翻转 if(++T_Count==100) { LED=!LED;
T_Count=0; }}59演示:Project1例:如何使用单片机对外部脉冲计数?6061演示:Project7数码管显示按键按下的次数分析:使用T0,工作于模式0,使用外部计数模式;一个数码管仅显示0~9;62voidmain(){ unsignedchari=0;//初始化定时器0,工作于计数模式、模式0,不受INT0控制 TMOD=0x04;//开始计数
TR0=1; P0=0x00; while(1) { P0=~Disp[i]; //TL0内保存了按键次数,只有一个数码管,需处理一下
i=(TL0)%10; }}63TMOD(89H)D7D6D5D4D3D2D1D0GATEC/TM1M0GATEC/TM1M0演示:Project7思考:在刚刚的例子基础上,如何利用T0和T1进行外部中断扩展?6465主任务(让D5一直闪烁)INT0中断(让D1闪烁5次)INT1中断(让D2闪烁5次)T0中断(让D3闪烁5次)T1中断(让D4闪烁5次)INT0中断INT1中断T0扩展中断T1扩展中断演示:Project9问题:要实现T0一次外部脉冲就触发中断(产生定时器溢出中断)初始值应为多少? TH0=(8192-1)/32; TL0=(8192-1)%32;66问题:要实现T0、T1外部中断触发,T0、T1应工作于哪种模式?应工作于计数模式。如何用C语言设置。TMOD=0x4467T0对应的中断处理函数如何定义?voidExternal_Interrupt_t0()interrupt1T0溢出中断处理函数中应执行哪些工作?定时器初始化、LED闪烁控制68INT0:0T0:1INT1:2T1:3串口:4程序应包含几个函数?主函数、4个中断处理函数主程序完成什么功能?中断初始化、定时器初始化、定时器开始、while(1)循环69voidmain(){ //LED初始状态
LED0=1;LED1=1;LED2=1;LED3=1; //T0T1初始化
TMOD=0x44;TH0=(8192-1)/32;TL0=(8192-1)%32; TH1=(8192-1)/32; TL1=(8192-1)%32; //INT0INT1初始化
IT0=1; IT1=1; //初始化中断
EA=1; //打开总中断开关
EX0=1;//打开INT0中断
EX1=1;//打开INT1中断
ET1=1;//打开T1中断
ET0=1;//打开T0中断70//初始化中断优先级
PX0=1; //T0T1开始工作
TR0=1;TR1=1; //主任务
while(1) { LED4=!LED4; DelayX1ms(100); }}71//INT0中断处理函数voidExternal_Interrupt_0()interrupt0{ unsignedint
i; for(i=0;i<10;i++) {
LED0=!LED0; DelayX1ms(200); }}72//INT1中断处理函数voidExternal_Interrupt_1()interrupt2{ unsignedint
i; for(i=0;i<10;i++) {
LED1=!LED1; DelayX1ms(400); }}73//T0中断处理函数voidExternal_Interrupt_t0()interrupt1 //T0{ unsignedint
i;
TH0=(8192-1)/32; TL0=(8192-1)%32; for(i=0;i<10;i++) {
LED2=!LED2; DelayX1ms(300); }}74//T1中断处理函数voidExternal_Interrupt_t1()interrupt3 //T1{ unsignedint
i;
TH1=(8192-1)/32; TL1=(8192-1)%32; for(i=0;i<10;i++) {
LED3=!LED3; DelayX1ms(500); }}754.2模式1及其应用76TH0TL08位8位77问题:在具有初值的情况下,计数器模式1在多长时间后溢出?T=(65536-初值)×时钟周期×12T=(65536-初值)×机器周期问题:单片机外部接12MHz晶振,定时器采用模式1,则定时器最大定时时间为多少?78答案:
模式1用16位计时,机器周期为1us,216×机器周期=65.536ms。例子:流水灯,每隔200ms滚动一次。79演示:Project2分析:模式1最大定时为216×机器周期=65.536ms,无法满足200ms的定时要求,因此同模式0的例子一样,通过另外一个计数器来进行累加。这里我们首先产生40ms的定时,根据公式:(216-初值)×机器周期=40ms可得:初值=216-40000.80#include<AT89X51.h>#include<intrins.h>voidmain(){ unsignedcharT_Count=0; P0=0xFE; P2=0xFE;
TMOD=0x01;
TH0=(65536-40000)/256; TL0=(65536-40000)%256;
TR0=1;
81while(1) { if(TF0==1) { TF0=0; TH0=(65536-40000)/256; TL0=(65536-40000)%256; if(++T_Count==5) { P0=_crol_(P0,1); P2=_crol_(P2,1);
T_Count=0; } } }}82演示:Project2刚刚的代码中,没有使用到中断处理函数,是根据TF0==1来判断T0是否发生了溢出。如何使用中断的方法?83中断模式如下:#include<AT89X51.h>#include<intrins.h>unsignedcharT_Count=0;voidmain(){ P0=0xFE; P2=0xFE; TMOD=0x01; IE=0x82; TH0=(65536-40000)/256; TL0=(65536-40000)%256; TR0=1; while(1); }84voidInterrput_handle()interrupt1{ TH0=(65536-40000)/256; TL0=(65536-40000)%256; if(++T_Count==5) { P0=_crol_(P0,1); P2=_crol_(P2,1);
T_Count=0; }}85演示:Project34.3模式2及其应用TL0计数溢出时,不仅使溢出中断标志位TF0置1,而且还自动把TH0中的内容重新装载到TL0中。TL0用作8位计数器,TH0用以保存初值。86该模式可省去软件中重装常数的语句,并可产生相当精确的定时时间,适合于作串行口波特率发生器。8788问题:单片机外部接12MHz晶振,定时器采用模式2,则定时器最大定时时间为多少?89答案:
模式2用8位计时,机器周期为1us,28×机器周期=256us。例子:流水灯,每隔200ms滚动一次。(模式2来实现)90演示:Project4分析:由于只能8位计数,最大定时时间为28×机器周期=256×1us=256us,可以先用模式3产生200us的中断,再累加1000次达到200ms。91#include<AT89X51.h>#include<intrins.h>unsignedint
T_Count=0;voidmain(){ P0=0xFE; P2=0xFE;
TMOD=0x02;
IE=0x82; TH0=(256-200); TL0=(256-200); TR0=1; while(1); }92voidInterrput_handle()interrupt1{ if(++T_Count==1000) { P0=_crol_(P0,1); P2=_crol_(P2,1);
T_Count=0; }}93演示:Project44.4模式3简介T0设置为模式3,TL0和TH0被分成两个相互独立的8位计数器。TL0:用原T0的各控制位、引脚和中断源,即C/T,GATE,TR0,TF0,T0(P3.4)引脚,INT0(P3.2)引脚。TL0可工作在定时器方式和计数器方式。其功能和操作与模式0、模式1相同(只是8位)。TH0:只可用作简单的内部定时功能。TH0占用了定时器T1的控制位TR1和T1的中断标志TF1,其启动和关闭仅受TR1的控制。9495那么,定时器1怎么办?定时器1将不能产生溢出中断,但可用于其它不需产生中断的场合。如作为波特率发生器或作为定时计数器被软件查询。由于此时T1的TR1归TH0所用,因此T1将自动工作。如果需要停止T1工作,可以将T1设置为模式3。注意:当定时器1设置为工作方式3时,将停止工作。96当系统需要用定时器1来产生波特率而又同时需要两个定时/计数器时,这种工作方式十分有用。97判断下述说法是否正确:在方式3模式下,定时/计数器0可以构成二个定时器正确在方式3模式下,定时/计数器0可以构成一个定时器和一个计数器。正确在方式3模式下,定时/计数器0可以构成二个计数器错误98当T0工作于模式3时,TH0不能用作计数器。正确当T0工作于模式3时,T1工作于模式0~2时,可以使用TR1时T1开始工作。错误当T0工作于模式3时,要使T1停止工作只有将其置于模式3。正确99单片机原理(三)1.本次课的目标2.单片机定时器/计数器的结构3.定时器的控制4.定时器的四种模式及应用5.定时器初始化过程6.综合实验7.小结1005.定时器初始化过程(1)、确定并设定定时器工作模式
TMOD(2)、设置定时/计数器初值
TH0、TL0或TH1、TL1(3)、开启定时器中断
IE:ET0(ET1)和EA101(4)、启动定时器
TCON:TR0(TR1)注:如果采用查询方式控制定时器还需要判断TF0(TF1)102定时器0使用步骤Step1:设置Timer0工作模式103Step2:启动Timer0Step3:Timer0不断累加,直至溢出,TF0置1。然后重新开始累加,依次类推。直至TR0=0停止累加。104单片机原理(三)1.本次课的目标2.单片机定时器/计数器的结构3.定时器的控制4.定时器的四种模式及应用5.定时器初始化过程6.综合实验7.小结105实验一:用定时器0方式1在P1.0上产生周期为2S的方波。晶振频率为12MHz。1、最大定时时间:65536×1
s=65.536ms2、选定定时T=50ms3、
4、TH0=(65536-50000)/256;TL0=(65536-50000)%256;6.综合实验演示:Proteus仿真(Project5)#include<reg51.h>sbitP1_0=P1^0;main(){ unsignedchari=20;//T0工作模式为1
TMOD=0x01;//根据计算设定计数器初值 TH0=(65536-50000)/256; TL0=(65536-50000)%256;//启动定时器 TR0=1;程序(查询方式) while(1) {
if(TF0==1)//判断定时溢出标志 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; TF0=0;//清除标志位
i=i-1;if(i==0)//判断是否计满20次,即定时1秒{
i=20; P1_0=!P1_0;//将P1.0电平翻转} } }}演示:KeilC仿真(Project5)演示:Proteus仿真(Project5)将上述程序改为中断模式:109#include<reg51.h>sbitP1_0=P1^0;unsignedchari=20;main(){ //初始化中断
IE=0x82; //设定T0工作模式为1 TMOD=0x01; TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
//启动定时器 TR0=1; //接下来干什么? while(1){}}110//T0溢出中断处理函数如何定义?voidInterrput_handle()interrupt1{ //T0初始化
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
i=i-1; if(i==0)//判断是否计满20次,即定时1秒
{ i=20; P1_0=!P1_0;//将P1.0电平翻转
}}111演示:KeilC仿真(Project6)实验二:设计制作一个频率计。112演示:Proteus仿真(Project10)基本思路计算1s内脉冲的个数,即为频率按键按下,启动定时器;定时器T1工作于计数模式定时器T0工作于定时模式当计时达到1s时,停止定时器,将T1值显示出来。由50ms扩展得到1s定时113核心代码:初始化部分(中断、定时器初始化)//打开T1、T0中断
IE=0x8A;// T1模式1,计数;T0模式1,定时
TMOD=0x51; TH0=(65536-50000)/256; TL0=(65536-50000)%256;114EAESET1EX1ET0EX0
IE(A8H)AFHAEHADHACHABHAAHA9HA8HTMOD(89H)D7D6D5D4D3D2D1D0GATEC/TM1M0GATEC/TM1M0主程序:按键按下,开始计时
while(1) { if(P1_0==0) { DdelayX1ms(2); if(P1_0==0) { TR1=1; TR0=1; } } else {for(i=0;i<5;i++) { P2=DSY_BIT[i]; P0=~DSY_CODE[Disp_Buffer[i]]; DdelayX1ms(2); } } }115中断服务程序voidTimer_Interrupt()interrupt1{ unsignedint
Tmp; TH0=(65536-50000)/256; TL0=(65536-50000)%256; if(++Count==20) { TR1=TR0=0; Count=0;
Tmp=TH1*256+TL
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年周口市中心医院医护人员招聘考试参考题库及答案详解
- 2026年广发银行(湖州分行)人员招聘考试参考试题及答案详解
- 2026年武汉大学中南医院医护人员招聘笔试备考试题及答案详解
- 2026年邮政储蓄银行(安徽省分行)人员招聘笔试参考题库及答案详解
- 2026年沈阳市妇儿医疗保健中心医护人员招聘考试参考试题及答案详解
- 2026年西安交通大学医学院第二附属医院医护人员招聘笔试参考题库及答案详解
- 2026年重庆永川市中医院医护人员招聘笔试备考题库及答案详解
- 2026年铜陵市皮肤病防治所医护人员招聘笔试备考题库及答案详解
- 2026年哈尔滨市红十字中心医院医护人员招聘笔试参考题库及答案详解
- 2026年上海交通大学医学院附属瑞金医院医护人员招聘笔试参考试题及答案详解
- 第十三讲先锋队与中华民族独立解放(1919-1949)-中华民族共同体概论专家大讲堂课件
- 《特殊学生综合素质评价规范》
- 《资治通鉴》导读学习通超星期末考试答案章节答案2024年
- (完整版)高考语文常考字音字形1000题
- GB/T 19247.6-2024印制板组装第6部分:球栅阵列(BGA)和盘栅阵列(LGA)焊点空洞的评估要求及测试方法
- 慢性肾脏病5期
- 2024年上海市中考语文备考之150个文言实词刷题表格及答案
- 设备采购与招标流程培训
- 1956-1967国家科学技术发展远景规划纲要
- 山西省万家寨水务控股集团有限公司招聘笔试试题及答案2022
- 清明古诗欣赏课件
评论
0/150
提交评论