版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第五章
串口通信
目录CONTENTS01串口通信原理串行通信基础概念、通信协议、数据帧格式与波特率原理04串口初始化编程寄存器配置流程、收发函数编写、
stdio
库函数的串口重定向03串口工作方式与波特率配置4种工作方式的特点、定时器波特率计算与配置方法02
51单片机串口结构串口寄存器、数据收发机制、控制位与状态位解析05基础串口通信实践串并行转换、单片机与PC双向数据收发的仿真实现06进阶应用与头文件制作多字符通信、通用串口通信头文件的封装与复用学习目标01基础认知掌握理解串口通信的概念与原理,熟悉51单片机串口的内部结构、工作方式及相关寄存器配置逻辑。02核心参数精通掌握波特率的计算方法,能够根据需求合理设置定时器/计数器参数,实现稳定的串口通信速率配置。03编程能力落地掌握51单片机串口初始化、收发数据的编程方法,理解
stdio.h
库函数在串口通信中的应用方式。04工程实践应用能够搭建单片机与计算机的双向串口通信电路,实现数据收发功能,并可制作通用串口通信头文件。5.1串行异步通信原理1、计算机通信是指将计算机技术与通信技术相结合,完成计算机与外设或计算机与计算机之间的信息交换。计算机通信可以分为两大类:并行通信与串行通信。2、调制解调器利用调制器把数字信号转换成模拟信号,发送到通信线路上,再由解调器把从通信线路上接收到的模拟信号转换成数字信号。由于通信是双向的,调制器和解调器合并在一个装置中,这就是调制解调器。3、并行通信与串行通信并行通信:多数据线同时传输,速度快但成本高串行通信:单数据线逐位传输,成本低但控制复杂串行通信又可以分同步串行通信和异步串行通信。在多微机系统及现代测控系统中,信息交换多采用串行通信方式。4、同步串行通信
进行同步串行通信时,要建立发送方时钟对接收方时钟的直接控制,使双方达到完全同步。此时,传输数据的位之间的距离均为“位间隔”的整数倍,同时传送的字符间不留间隙,即保持位同步关系,也保持字符同步关系。5、异步串行通信
以字符(帧)为单位传输字符间时间间隔任意每个字符包含起始位、数据位、停止位6、单片机和计算机的串口通信单片机要实现与计算机的串行通信一般采用两种方式:一是串口接串口,但需要在串口间进行电平转换,即RS-232电平与TTL电平转换;二是计算机的USB口接单片机的TTL串口,即进行USB口与TTL串口之间的信号转换。(1)RS-232电平与TTL电平转换计算机的串口是RS-232电平(-15~-5V为1,+5~+15V为0),而单片机的串口是TTL电平(大于+2.4V为1,0V或小于-0.7V为0),两者之间需要有一个电平转换电路实现RS-232电平与TTL电平的相互转换。(2)串行总线标准RS-232目前最常用的串口标准,用来实现计算机与计算机之间、计算机与外设之间的数据通信。RS-232协议以-15~-5V表示逻辑1;以+5~+15V表示逻辑0。RS-232串口总线适用于设备之间的通信距离不大于15m,传输速率最大为20kbit/s的应用场景。(3)USB口转串口CH340是USB总线的转接芯片,内置了USB通信协议的基本固件、处理海量存储设备的专用通信协议的固件、SD卡的通信接口固件,以及FAT16、FAT32和FAT12文件系统的管理固件。这些固件使得单片机系统能够无须了解底层的USB协议、SD卡操作及FAT文件系统,即可通过简单的命令快速读写U盘或SD卡中的文件,实现USB口转串口或者USB口转打印口。
在串口方式下,CH340提供常用的MODEM联络信号,用于为计算机扩展异步串口,或者将普通的串口设备直接升级为USB设备USB口转TTL串口的电路采用的是USB总线转接芯片CH340C,该芯片内置晶振,可以省去晶振电路,节省
成本。主要原理是CH430C芯片与单片机采用UART协议进行通信,计算机与CH340C芯片之间采用USB协议传递UART数据,计算机端安装的CH340驱动则负责解析USB协议以获取单片机的UART数据。5.2.1串口结构
51单片机的UART串口内部结构主要由串口数据缓冲寄存器SBUF、移位寄存器、串口控制寄存器SCON和波特率发生器等组成,其中特殊功能寄存器SBUF和SCON供软件访问和控制串口。5.2单片机的串口通信1、串口数据缓冲寄存器SBUF
串口数据缓冲寄存器实际上是两个寄存器,即接收缓冲寄存器与发送缓冲寄存器同名且占用同一个地址99H,虽然二者地址相同,但由于发送数据采用的是写指令,接收数据采用的是读指令,因此不会产生混淆。2、串口控制寄存器SCON51单片机串行通信方式的选择、接收和发送控制,以及串口的标志都由特殊功能寄存器SCON控制和指示。SCON可位寻址,格式如表所示。(1)SM0、SM1:串口工作方式选择位,可设置以下4种工作方式。①方式0:同步移位寄存器,波特率为fosc/12。②方式1:8位数据UART,波特率可变。③方式2:9位数据UART,波特率为2SMOD×fosc/64。④方式3:9位数据UART,波特率可变。(2)SM2:多机通信控制位,主要用于方式2和方式3。REN:接收允许标志位,由软件置1或清0。若REN=1,则允许串口接收数据;若REN=0,则禁止串口接收数据。(3)REN:接收允许标志位,由软件置1或清0。若REN=1,则允许串口接收数据;若REN=0,则禁止串口接收数据。(4)TB8:在方式2或方式3中,发送数据的第9位,需要由软件写入1或0。在方式0和方式1中,该位不使用。(5)RB8:在方式2或方式3中,接收数据的第9位,由硬件将接收到的第9位数据存入RB8,作为奇偶校验位或地址帧/数据帧的标志位。在方式1中,若SM2=0,则RB8接收到的是停止位,方式0不使用该位。(6)TI(TransmitInterrupt,发送中断):发送中断标志位。发送数据前必须用软件将该位清0,发送过程中TI保持低电平,发送完一帧数据后,由硬件自动将该位置1。如果再次发送数据,必须由软件再次将该位清0。在方式0中,当串行发送第8位数据结束时,或在其他方式中,串行发送停止位开始时,由内部硬件将TI置1,向CPU发送中断请求。在中断服务程序中,必须用软件将其清0,取消此中断请求。(7)RI(ReceiveInterrupt,接收中断):接收中断标志位。接收数据前必须用软件将该位清0,接收过程中RI保持低电平,接收完一帧数据后,由硬件自动将该位置1。如果再次接收数据,必须由软件再次将该位清0。在方式0中,当串行接收第8位数据结束时,或在其他方式中,串行接收停止位中间时,由内部硬件将RI置1,向CPU发送中断请求。在中断服务程序中,必须用软件将其清0,取消此中断请求。PCON是用于电源控制的特殊功能寄存器,可位寻址,其标志位如表所示。PCON中只有最高位SMOD与串口工作有关。SMOD(PCON.7)为波特率倍增选择位。在串口工作于方式1、方式2、方式3时,波特率与SMOD有关,当SMOD=1时,波特率提高一倍。单片机复位时,SMOD=0。3、电源控制寄存器PCON5.2.2串口工作方式1、方式0方式0为同步移位寄存器的I/O方式,主要用于扩展并行输入或输出口。数据由RXD(P3.0)引脚输入或输出,同步移位脉冲由TXD(P3.1)引脚输出。以8位数据为一帧,从低位开始发送和接收。每个机器周期发送或接收1位,波特率固定为fosc/12。在方式0下,发送和接收数据无起始位和停止位。发送过程从写SBUF开始,当8位数据传送完时,TI被置1在接收过程中,当8位数据接收完时,RI被置1,可通过读取SBUF,将串行数据读入2、方式1方式1是以10位数据为一帧的异步通信方式。TXD为数据发送引脚,RXD为数据接收引脚,数据帧的格式(方式1)如图所示,一帧数据包括1位起始位(为0)、8位数据位、1位停止位(为1)。在方式1下发送数据时,数据写入SBUF后,开始发送,此时由硬件加入起始位和停止位,构成一帧数据,由TXD引脚串行输出。输出一帧数据后,TXD引脚保持在高电平状态,并将TI置1,通知CPU可以进行下一个字符或数据的发送在方式1下接收数据时,当串口控制寄存器SCON的接收允许标志位REN=1,且接收到起始位后,在位采样脉冲(移位脉冲)的控制下,把接收到的数据移入接收SBUF中,停止位到来后,把停止位送入串口控制寄存器SCON的RB8位中,并置位RI,通知CPU已接收完一个字符或数据3、方式2和方式3方式2和方式3都是以11位数据为一帧的异步通信方式,两者的区别在于波特率设置方法不同。数据帧的格式(方式2和方式3)如图所示。方式2和方式3的数据帧包括1位起始位(为0)、9位数据位(含1位附加的第9位,发送时为SCON中的TB8,接收时为RB8)、1位停止位(为1),一帧数据为11位。方式2的波特率固定为晶振频率的1/64或1/32,方式3的波特率由定时/计数器T1的溢出率决定。
发送数据前,先设置SCON中的TB8,然后将要发送的数据写入SBUF即可启动发送。TB8被当作数据的第9位,自动叠加到数据帧的D8位上,这一位数据可以作为奇偶校验位使用,在多机通信系统中,该位也可以作为区分地址和数据的特征标志位使用。接收数据时,先设置接收允许标志位REN为1,使串口处于允许接收状态;再根据SM2和所接收到的RB8的状态,决定接收完数据后是否置位RI。当SM2=0时,无论RB8是0还是1,RI都置1,串口接收数据。当SM2=1,RB8=1时,表明是多机通信,所接收的数据是地址帧,RI置1,通过串口接收发送来的地址信息。当SM2=1,RB8=0时,表明接收到的为数据帧,RI不置1,丢弃SBUF中所接收的数据帧。在多机通信系统中,只有与主机发送的地址相匹配的从机才能进行数据的接收。5.2.3串口初始化编程1.串口波特率的设置
51单片机串口在方式0和方式2下的波特率是固定的,在方式0下,串口的波特率=fosc/12;在方式2下,串口的波特率=(2SMOD/64)×fosc。fosc为系统晶振频率,SMOD是电源控制寄存器PCON的第7位,即波特率倍增选择位。方式1和方式3使用定时/计数器T1作为波特率发生器,由于T1工作于方式2时具有自动重载功能,所以T1采用方式2,方式1、方式3的波特率=(2SMOD/32)×(T1溢出率)。其中T1溢出率=1/(T1溢出周期),T1溢出周期=(256–T1计数初值)×12/fosc。由上面的公式可知,波特率和T1的计数初值、晶振频率有关,如果晶振频率选择不当,可能会造成求得的T1计数初值为非整数,这样势必造成波特率误差,影响通信的可靠性和效果。在实际应用中,可以采用频率与计算机通信控制时钟频率(1.8432MHz)成整数倍的晶振作为单片机系统晶振校准这一问题。可以选用11.0592MHz(11.0592=6×1.8432)作为晶振频率,则可计算得到定时/计数器T1的计数初值。常用波特率与计数初值的关系如表。2.比特率和波特率比特率是每秒钟传输二进制代码的位数,单位是bit/s(位/秒,bitspersecond)。波特率是一个衡量通信速度的参数,是指每秒传输的符号数,若每个符号所含信息量为1比特(即一位二进制数码),则波特率等于比特率。在计算机通信中,常将比特率称为波特率。3.串口初始化及应用编程根据波特率确定定时/计数器T1的计数初值后,串口初始化操作步骤:(1)设置定时/计数器T1工作于方式2,并设置TMOD。(2)确定串口工作方式,设置SCON。(3)若需要波特率倍增,则设置PCON。(4)对TH1和TL1送初值。(5)开总中断EA、串口中断ES。(6)启动定时/计数器T1,将TR1置1。①以串口工作于方式1,波特率为9600bit/s为例,串口初始化函数代码。voidcom_initialize(void){TMOD|=0x20;//T1工作于方式2(自动重载模式)SCON=0x50;//串口工作于方式1PCON=0x00;TH1=0xFD;//设置波特率为9600bit/sTL1=0xFD;EA=1;//开总中断ES=1;//开串口中断TR1=1;//启动T1}发送数据时,要发送的数据通过内部累加器A送入发送SBUF,在发送控制器的控制下组成数据帧结构,并自动以串行方式从TXD引脚输出,发送完一帧数据,将TI置1。通过中断或查询TI来了解数据的发送情况。需要注意的是,TI只能用软件清0。②通过串口发送一个字符或1B数据的函数代码voidsend(unsignedcharc)//发送字符c{SBUF=c;//将字符c送入发送SBUFwhile(TI==0);//查询TI是否置1,等待发送结束TI=0;//发送结束,将TI清0,为下次发送做准备}CPU通过RXD引脚接收数据,每接收完一帧数据,自动置位RI,通过中断或查询RI来了解数据的接收情况,然后将接收SBUF中的数据读回。RI与TI一样,只能用软件清0。③串口通过中断方式接收一个字符或1B数据的函数代码voidreceive()interrupt4//串口中断服务程序{if(RI==1)//判断是否接收完一帧数据{RI=0;//接收完,将RI清0c=SBUF;//从接收SBUF中读回数据给c}else;//未接收完则返回}任务1方式0应用:串并行转换任务2单片机与计算机的双向串口通信任务3多字符串口通信任务4串口通信头文件任务1方式0应用:串并行转换
串口工作于方式0时,可通过外接移位寄存器实现串并行转换。在这种方式下,数据为8位,只能从RXD引脚输入或输出,TXD引脚用于输出同步移位脉冲,其波特率固定为晶振频率的1/12。由软件置位SCON中的REN位后才能启动串行接收,在CPU将数据写入发送SBUF后,立即启动发送。待8位数据传输完后,由硬件将SCON中的TI置1,TI必须由软件清0。
基于Proteus平台设计单片机串口外接一个8位串入并出移位寄存器74LS164芯片,构成单片机输出接口电路。5.3工程实践参考例程
的代码如下。#include<reg51.h>#include<intrins.h>#defineuintunsignedint#defineucharunsignedcharvoiddelay(uintx){uchari;while(x--)for(i=0;i<120;i++);}voidmain(){ucharc=0x80;SCON=0x00;//串口工作于方式0while(1){c=_crol_(c,1);//c循环左移
SBUF=c;while(TI==0);//等待发送结束TI=0;//发送结束,将TI清0delay(400);}}任务2单片机与计算机的双向串口通信
单片机与计算机通信时,其硬件接口技术主要是电平转换,示。在DOS操作环境下,要实现单片机与计算机的通信,只要直接对计算机串口的通信芯片8250进行串口地址操作即可。在Windows操作环境下,由于系统硬件的无关性,不再允许用户直接操作串口地址。如果用户要进行串行通信,可以调用Windows操作系统中的API函数,但其使用较为复杂。本任务中,我们使用计算机的串口调试程序SSCOM32或STC-ISP内嵌的串口调试助手。要注意的是,在发送区中输入要发送的数据,如果选中“十六进制发送”单选按钮,那么发送的数据是十六进制的,必须输入两位数据;如果没有选中“十六进制发送”单选按钮,则发送的是ASCII。参考例程的代码如下。#include<reg52.h>#defineucharunsignedchar#defineuintunsignedintucharbuf;voidsenddata(uchardat){SBUF=dat;while(!TI);TI=0;}voidmain(void){SCON=0x50;//设定串口的工作方式PCON=0x00;//波特率不倍增TMOD=0x20;//T1工作于方式2,用于产生波特率EA=1;ES=1;//允许串口中断TL1=0xfd;TH1=0xfd;//设置波特率为9600bit/sTR1=1;while(1);}/*********************************************************
串口中断服务程序*********************************************************/voidserial()interrupt4{ES=0;//关闭串口中断RI=0;//清除串口接收中断标志位buf=SBUF;//从串口缓冲区接收数据senddata(buf);ES=1;//允许串口中断}思考单片机如何将接收到的数据进行一定的处理之后再发送给计算机,如将计算机发送来的数据进行简单的加密处理后再发送给计算机。组队讨论试一试吧!任务3多字符串口通信计算机向串口发送1B数据,将波特率设置为9600bit/s。设置好后,按下S2键,单片机向计算机发送一串字符。参考例程的代码如下。#include<reg52.h>#definejingzhen11059200UL/*使用频率为11.0592MHz的晶振*/#definebotelv9600UL/*将波特率设置为9600bit/s*/unsignedcharzifuchuan[]="你好51MCU!";//待显示字符volatileunsignedcharsending;sbits2=P3^4;voiddelay(unsignedchari){unsignedcharj,k;for(j=i;j>0;j--)for(k=90;k>0;k--);}voidinit(void)//串口初始化{EA=0;//暂时关闭总中断TMOD&=0x0F;//T1的工作方式由TMOD的高4位确定TMOD|=0x20;//T1工作于方式2(自动重装模式)SCON=0x50;//串口工作于方式1TH1=256-jingzhen/(botelv*12*16);//计算T1重装值TL1=256-jingzhen/(botelv*12*16);PCON|=0x80;//串口波特率加倍ES=1;//允许串口中断TR1=1;//启动T1REN=1;//允许接收
EA=1;//开总中断}voidsend(unsignedchard)//发送1B数据,形参d即为待发送的数据{SBUF=d;//将数据写入发送SBUFsending=1;//设置发送标志while(sending);//等待发送完毕}voidsendc(unsignedchar*pd){while((*pd)!='\0')//发送字符串,直到遇到空字符才结束{send(*pd);//发送一个字符pd++;//指针指向下一个字符}}voidmain(){init();while(1){if(s2==0){delay(20);if(!s2){while(!s2);sendc(zifuchuan);}}}}voiduart(void)interrupt4//串口发送中断服务程序{if(RI)//接收到数据{RI=0;//清除接收中断标志位}else//发送完1B数据{TI=0;sending=0;//清除发送标志}}
注意函数sendc()的形参是指针变量,而实参是数组名,即指针。在串口调试助手的接收/键盘发送缓冲区观察单片机发送来的字符串。
思考计算机如何发送多个字符给单片机,组队讨论试一试吧!任务4串口通信头文件参考例程的代码如下。#include<reg52.h>#include<stdio.h>#defineXTAL12000000#definebaudrate9600#defineOLEN8//串口发送SBUF大小unsignedcharostart;//发送SBUF起始索引unsignedcharoend;//发送SBUF结束索引charidataoutbuf[OLEN];//发送SBUF存储数组#defineILEN8//串口接收SBUF大小unsignedcharistart;//接收SBUF起始索引unsignedchariend;//接收SBUF结束索引charidatainbuf[ILEN];//接收SBUF存储数组bitbdatasendfull;//发送SBUF满标志bitbdatasendactive;//发送有效标志/*串口中断服务程序*/staticvoidcom_isr(void)interrupt4using1{charc;if(RI)//接收中断{c=SBUF;//读字符RI=0;//清除接收中断标志位if(istart+ILEN!=iend){inbuf[iend++&(ILEN-1)]=c;//从接收SBUF中接收数据}}if(TI)//发送中断{TI=0;//清除发送中断标志位if(ostart!=oend){SBUF=outbuf[ostart++&(OLEN-1)];//向发送SBUF传送字符sendfull=0;//设置发送SBUF满标志位头文件是扩展名为“.h”的文件,包含C函数声明和宏定义,可被多个源文件引用共享。头文件可分为程序员编写的头文件和编译器自带的头文件。若想在程序中使用头文件中的函数,需要使用预处理命令#include将头文件包含在程序中。编写一个单片机与计算机进行双向串口通信的通用程序,保存为头文件。}else{sendactive=0;//设置发送无效}}}//写字符到发送SBUFvoidputbuf(charc){if(!sendfull)//如果发送SBUF不满就发送{if(!sendactive){sendactive=1;//直接发送一个字符SBUF=c;//写到发送SBUF,启动发送}else{ES=0;//暂时关闭串口中断outbuf[oend++&(OLEN-1)]=c;//向发送SBUF传送字符if(((oend^ostart)&(OLEN-1))==0){sendfull=1;}//设置发送SBUF满标志ES=1;//打开串口中断}}}//putchar:中断服务程序控制本函数的执行//当其他程序中包含此头文件时,使用printf函数会反复调用putchar函数charputchar(charc){if(c=='\n')//增加新的行{while(sendfull);//等待发送SBUF空putbuf(0x0D);//对于新行,在发送换行符(0x0A)前插入回车符(0x0D)}while(sendfull);putbuf(c);return(c);}//_getkey:中断服务程序控制本函数的执行//替换标准库函数_getkeychar_getkey(void){charc;while(iend==istart)//判断接收SBUF起始索引是否等于接收SBUF结束索引{;}ES=0;c=inbuf[istart++&(ILEN-1)];ES=1;return(c);}/*初始化串口和UART波特率函数*/voidcom_initialize(void){istart=0;iend=0;ostart=0;oend=0;sendactive=0;sendfull=0;TMOD|=0x20;//设置定时/计数器T1工作于方式2(自动重载模式)SCON=0x50;//设置串口工作于方式1TH1=0xFD;//设置波特率为9600bit/sTL1=0xFD;PCON=0x00;TR1=1;//启动T1ES=1;//开串口中断}voiduart_Init(){com_initialize();EA=1;//开总中断}
bdata区允许软件以位为单位访问存储器,这是一项非常有用的功能,仅以一条指令就可以实现对位的置位、清除、与、或等操作,简化了设计,如:bitbdatasendfull;//发送SBUF满标志bitbdatasendactive;//发送有效标志#defineXTAL12000000#definebaudrate9600
这两条语句分别用于声明所使用晶振的频率为12MHz,串口的波特率为9600bit/s。根据波特率公式反推计数初值可得计数初值=2n-[(2SMOD/32)·(fosc/12)/波特率]=28-[(20/32)×(12×106/12)/9600]=253=0xFD#defineOLEN8#defineILEN8
这两条语句分别用于定义串口发送SBUF和串口接收SBUF的位数是8位。AT89C52内部有附加的128B数据存储器,称为idata区,其地址与特殊功能寄存器是重叠的。这个空间通常用于存储使用频繁的数据,如:charidataoutbuf[OLEN];//发送SBUF存储数组charidatainbuf[ILEN];//接收SBUF存储数组函数com_initialize()对串口进行了初始化并设置波特率为9600bit/s,串口将工作于方式1;函数uart_Init调用了com_initialize()并打开了总中断。putbuf函数用于写字符到发送SBUF,_getkey函数用于从AT89C52的串口中读入一个字符,然后等待字符输入,putchar函数则通过调用putbuf函数输出字符。注意,putchar函数只能输出一个字符,printf函数通过调用putchar函数来输出字符串。com_isr函数是串口中断服务程序,它的作用就是进行串口中断处理,接收和发送数据。4是串口的中断编号,1表示使用第1组工作寄存器。在C编译系统中,Keil对程序进行编译之前,要先对某些程序进行预处理,然后将预处理的结果和源程序一起进行正常的编译处理,进而得到目标代码,通常的预处理命令都用“#”开头。预处理命令包括以下几种。(1)宏定义。宏定义即#define指令,形式为:#define宏名
字符串(2)头文件包含。是指一个源文件可以将另一个源文件的全部内容包含进来。但要注意的是,对文件包含并不是把两个文件连接起来,而是编译时将其作为一个源程序进行编译,得到一个目标文件,如hex文件。被包含的文件常在文件的头部,所以称为“头文件”,可以以“.h”为后缀,也可以以“.c”为后缀。在源程序中,任何形如#include"file"或#include<file>的行都被替换成由file(文件名)所指定的文件的内容。另外应注意,引用头文件时,如果一个头文件被引用两次,编译器会处理两次头文件的内容,这将产生错误。为了防止这种情况发生,标准的做法是把文件的整个内容放在条件编译语句中,也就是在
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 47491-2026双层床和高床
- 深度解析(2026)《GBT 30088-2013化妆品中甲基丁香酚的测定 气相色谱质谱法》
- 深度解析(2026)《GBT 30025-2013起重机 起重机及其部件质量的测量》
- 深度解析(2026)《GBT 29749-2013工业企业水系统集成优化导则》
- 2026年中考语文总复习训练专题-字音字形
- 《GBT 5757-2008离子交换树脂含水量测定方法》(2026年)合规红线与避坑实操手册
- 《DLT 5203-2022火力发电厂煤和制粉系统防爆设计技术规程》(2026年)合规红线与避坑实操手册
- 2026年食品加工园区清洁协议
- 智慧病房系统建设方案
- 互联网-创新创业项目计划书名师资料合集
- 2026成都环境投资集团有限公司下属子公司招聘技术管理岗等岗位42人备考题库含答案详解(满分必刷)
- 2026年燃气从业资格证试题预测试卷重点附答案详解
- 23G409先张法预应力混凝土管桩
- 探索心理学的奥秘智慧树知到期末考试答案章节答案2024年北京大学
- 2023矿产资源潜力评价规范(1∶250 000)第一部分:总则
- 前荣坯布质量培训课件
- 劳动创造美好生活第四章
- 2011-2022年中国美术学院附属中学招生考试数学历年试题真题
- 实施活动观落实英语学科核心素养
- 外研版小学英语教材培训
- 秘书工作手记 办公室老江湖的职场心法,像玉的石头著
评论
0/150
提交评论