版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
单片机原理与应用
第1章单片机的基础知识学习目标(1)掌握单片机的概念、发展过程和应用领域。(2)掌握单片机的数制和字符表示。(3)掌握单片机系统开发与仿真的步骤与过程。(4)了解单片机应用系统开发常用工具软件。学习重点和难点(1)单片机系统开发及仿真过程。(2)常用数制和字符表示。1.1单片机技术的发展及应用什么是单片机把组成微型计算机的微处理器、存储器、输入输出接口电路集成在一块芯片上,构成单片微型计算机,即单片机1.1.1单片机的发展历史一、初级单片机阶段1971年Intel公司最早推出的是4位单片机4004。1976年,Intel公司推出MCS-48单片机,具有8位CPU,RAM,并行I/O口,8位定时器/计数器,无串行口,寻址范围不超过4KB。此阶段以8048、8039为代表。二、结构成熟阶段1978~1983年,单片机普及阶段。此阶段的单片机仍为8位CPU,片内RAM和ROM的容量加大,片外寻址范围可达64KB,增加了串行口、多机中断处理系统,以及16位的定时器/计数器。此阶段的单片机以Intel公司的MCS-51系列、MOTOROLA公司的6801系列和Zilog公司的Z8系列单片机为代表。在此期间,单片机以其优良的性能价格比得到了广泛的应用。三、性能提高阶段1983年以后,16位单片机阶段。此阶段的单片机的CPU为16位,片内RAM和ROM的容量进一步增大,增加了D/A、A/D转换器,主频增加,运算速度加快。此阶段的单片机以Intel公司的MCS-96单片机为代表。32位的单片机也已进入实用阶段。1.1.2单片机的应用领域1)智能家电:家用电器采用单片机智能化控制代替传统的电子线路控制,有利于提高控制功能,减小家电体积和重量。如洗衣机、空调、电视机、录像机、微波炉、电冰箱、电饭煲以及各种视听设备等。2)智能办公设备:现代办公室使用的办公设备多数嵌入单片机,实现智能化控制。如打印机、复印机、传真机、绘图机等。3)工业控制:工业生产中往往需要根据控制对象的物理特征采用不同的智能算法进行过程控制。单片机可以采集温度、湿度、电流、电压、液位、流量、压力等物理参数,因此,单片机正好适合工业生产的智能控制,提高生产效率和产品质量。典型的工业控制如各种测控系统、过程控制、电机转速控制、温度控制、自动生产线等,在化工、建筑、冶金等各种工业领域都要用到单片机控制。1.1.2单片机的应用领域4)智能仪器仪表:采用单片机的智能化仪表能够提高仪器仪表的使用功能和精度,简化仪器仪表的硬件结构,使仪器仪表智能化、微型化、数字化。采用单片机的智能仪表可以进行数据处理和存储、故障诊断,典型的应用如各种智能电气测量仪表(电压表、示波器等)、智能传感器、各种分析仪等。5)分布式系统的前端采集模块:在采用分布式测控系统的工业系统中,经常要采用分布式测控系统完成大量的分布参数的采集。在这种系统中,采用单片机作为分布式的前端采集模块,系统具有运行可靠、数据采集方便灵活、成本低廉等优点。分布式系统通常分为多个子系统,是单片机的多机应用形态。其他领域:汽车电子、智能通信产品、航空航天系统、国防军事等领域。1.2单片机的数制和表示1.2.1二进制数和十六进制数二进制数可以表示单片机中的数据信号、地址信号和控制命令,后缀用字母B表示。例如:01101001B是8位二进制数。为了缩短数字的位数,可以用十六进制表示,十六进制的后缀用字母H表示。例如:69H是十六进制数,且有01101001B=69H。二进制与十六进制转换二进制数转化为十六进制数的转化方法是将二进制数从末位以四位为单位进行划分,每个四位二进制数转化为一位十六进制数,如果二进制数的位数不是4的整数倍,则在数位的高位补0,使其成为4的整数倍;十六进制数转化为二进制数的转化方法是将每位十六进制数转化为四位二进制数。原码、反码计补码机器数“0”表示正号,“1”表示负号。正数的原码、反码和补码都相同,负数的原码为其符号位和数值位,负数的反码为其所对应的正数按位求反,负数的补码为该负数的反码加1。【例1-1】机器字长为8位,求[+105]补和[-105]补。[+105]补=01101001=69H按位求反,得10010110,再加1,得10010111[-105]补=97H1.2.2BCD码二进制编码的十进制数1.2.3单片机的数据类型1.位(bit)位是指一个比特的二进制数据,是数据的最小长度单位。2.字节(Byte) 字节是相邻的8个二进制位,通常从数据的末位开始划分,每8个二进制位称为一个字节。一个字节也可以用2个十六进制位表示。3.字(Word)字是2个相邻的字节,通常从末位开始划分,每2个字节称为一个字,字分为高低字节,高字节表示高位数据,低字节表示低位数据。1.3单片机中的字符字符信息包括数字、字母、符号和汉字等美国信息交换标准代码(ASCII码)包括英文字母大小写、数字、专用字符(如+、-、*、/、空格等)以及非打印的控制符号。共128种编码。用一个字节表示,低7位为ASCII码,最高位为0。简体中文字符集GB2312是简体中文字符集的中国国家标准,称为信息交换用汉字编码字符集-基本集,又称GB0。GB2312共收录6763个汉字,其中一级汉字3755个,二级汉字3008个,同时,GB2312收录了包括拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母在内的682个全角字符。汉字的点阵编码汉字的编码是点阵式的,通过软件取模可以得到汉字的点阵编码例如:PCtoLCD字模举例光(0)逐列式{0x40,0x80,0x40,0x80,0x42,0x40,0x44,0x20,0x58,0x18,0xC0,0x07,0x40,0x00,0x7F,0x00},{0x40,0x00,0xC0,0x3F,0x50,0x40,0x48,0x40,0x46,0x40,0x40,0x40,0x40,0x78,0x00,0x00},/*"光",0*/取模选项1.4单片机系统开发与仿真硬件与软件单片机系统由硬件与软件两个部分组成,硬件实现单片机与外部的连接及单片机与外界信号的匹配,软件实现运算、信号采集和信息输出。单片机的系统开发就是要实现正确的硬件设计和良好的软件设计,并使软件设计和硬件设计相匹配,形成一个能够完成某种具体功能的应用系统。1.4单片机系统开发与仿真一、系统开发过程
1总体设计:2硬件设计:3软件设计:4系统调试和运行单片机开发的在系统编程(ISP)和在应用编程(IAP)技术1在系统编程技术在已经焊接好的单片机开发系统中对单片机芯片直接装入目标程序称为在系统编程技术。2在应用编程技术单片机系统处于运行状态中对单片机的程序进行更新而不影响系统运行,并能实现程序切换,使系统运行新加载的程序,这种技术称为在应用编程技术。本章小结单片机是把微处理器、存储器、输入/输出接口电路集成在一片集成电路芯片上,构成的单片微型计算机,它具有体积小、重量轻、价格低、可靠性高和易于嵌入式应用等优点,广泛应用在工业控制、仪器仪表、航空航天、智能家电、智能办公设备、汽车电子、智能传感器等领域。单片机系统由硬件与软件两个部分组成,硬件实现单片机与外部的连接及单片机与外界信号的匹配,软件实现运算、信号采集和信息输出。单片机的系统开发就是要实现正确的硬件设计和良好的软件设计,并使软件设计和硬件设计相匹配,形成一个能够完成某种具体功能的应用系统。单片机的数制和编码常采用二进制、十进制、十六进制、BCD码、ASCII码和GB2312汉字编码,单片机系统开发过程主要有系统设计、硬件设计、软件设计和系统调试运行,单片机系统开发需要借助于计算机软件完成,软件设计调试工具有Keil、Wave,电路图和电路板设计和仿真软件有Multisim、Protel等,单片机的学习和掌握要在实践中不断深入。第2章单片机内部结构和汇编指令学习目标(1)熟悉单片机的内部结构和应用模式。(2)掌握单片机引脚信号功能,内部资源。(3)掌握单片机的存储器空间分配及各I/O口的特点。(4)掌握单片机汇编指令的格式、寻址方式、字节数及执行时间。(5)掌握单片机汇编指令的寻址方式。(6)掌握具体的五大类汇编指令。学习重点和难点(1)单片机存储器配置与空间的分布。(2)程序状态寄存器(PSW)。(3)单片机的I/O口的特点。(4)汇编指令的格式及寻址方式。(5)熟练掌握总共111条汇编指令。MCS-51是美国Intel公司的8位单片机系列这一系列的单片机有多种型号:8051/8751/8031、8052/8752/8032、80C51/87C51/80C31、80C52/87C52/80C32生产工艺1.生产工艺有两种:HMOS工艺高密度短沟道MOS工艺CHMOS工艺互补金属氧化物的HMOS工艺产品型号中带有字母“C”的即为CHMOS芯片,CHMOS芯片的电平既与TTL电平兼容,又与CMOS电平兼容,具有低功耗的特点,如87C51。8051的功耗为630mW,80C51的功耗只有120mW。功能基本型:51子系列,8051/8751/8031、80C51/87C51/80C31增强型:52子系列是,8052/8752/8032、80C52/87C52/80C32。通常选用增强型芯片。片内程序存储器配置即掩膜ROMEPROMROMLessFlashROM如:80C51有4K字节的掩膜ROM、87C51有4K字节的EPROM、80C31在芯片内无程序存储器、89S51具有FlashROM4K字节。现在人们普遍采用具有Flash存储器的芯片。2.1单片机内部结构组成2.1.180C51单片机的片内结构微处理器(运算器和控制器)存储器I/O接口组成80C51单片机基本型包含有一、CPU系统1个8位微处理器(CPU)。时钟电路。总线控制。二、存储器系统128B数据存储器(RAM,可再扩展64K)。4KB程序存储器(ROM/EPROM/Flash,可外扩至64K)。特殊功能寄存器(SFR)。三、I/O口和其他功能单元4个8位的并行I/O接口P0~P3。2个16位定时/计数器。5个中断源,其中包括2个优先级嵌套中断。1个可编程的全双工串行I/O接口。80C51单片机基本型/增强型的组成2.1.280C51单片机的CPU80C51单片机的核心是一个8位高性能的CPU。主要由运算器和控制器构成。一、运算器算术/逻辑运算单元ALU累加器ACC寄存器B暂存寄存器程序状态字寄存器PSW程序状态字寄存器PSW
程序状态字寄存器PSW是状态标志寄存器,它用来保存ALU运算结果的特征(如:结果是否为0,是否有进位等)和处理器的状态。这些特征和状态可以作为控制程序转移的条件,以供程序判别和查询。PSW的各位定义如下,其字节地址为D0H。①Cy—
进位、借位标志。也可写为C。在执行算术运算和逻辑运算指令时,用于记录最高位的进位或借位。有进位、借位时Cy=1,否则Cy=0。Cy可以被硬件或软件置位或清零,在位处理器中,它是位累加器。②AC—
辅助进位、借位标志。用于表示Acc.3有否向Acc.4进位、借位。当进行加法或减法操作而产生由低4位数(十进制的一个数字)向高4位数进位或借位时,Ac将被硬件置位,否则就被清0。Ac用于十进制调整。③RS1、RS0—
当前工作寄存器组选择控制位。RS1、RS0=00——0组(00H~07H)RS1、RS0=01——1组(08H~0FH)RS1、RS0=10——2组(10H~17H)RS1、RS0=11——3组(18H~1FH)④OV—
溢出标志。表示Acc在有符号数算术运算中的溢出。即超出了带符号数的有效范围(-128~+127)。有溢出时OV=1,否则OV=0。⑤P—
奇偶标志。表示Acc中“1”的个数的奇偶性。若1的个数为奇数,则P置位,否则清0。⑥F0、F1—
用户标志位,由用户自己定义。二、控制器程序计数器指令寄存器IR指令译码器ID控制逻辑电路
2.280C51单片机的引脚功能和最小系统、
2.2.180C51引脚封装及功能采用双列直插式(DIP)QFP44(QuadFlatPack)LCC(LeadedChipCarrier)总线型DIP40引脚封装(1)电源及时钟引脚(4个)VCC:电源接入引脚;VSS:接地引脚;XTAL1:晶体振荡器接入的一个引脚(采用外部振荡器时,对CHMOS型而言,如80C51,此引脚作为外部振荡信号的输入端);XTAL2:晶体振荡器接入的另一个引脚。(采用外部振荡器时,对CHMOS型而言,此引脚悬空)。总线型DIP40引脚封装(2)控制线引脚(4个)RST/VPD:复位信号输入引脚/备用电源输入引脚;ALE/:地址锁存允许信号输出引脚/编程脉冲输入引脚;/VPP:内外程序存储器选择引脚/片内EPROM(或FlashROM)编程电压输入引脚;:外部程序存储器选通信号输出引脚。总线型DIP40引脚封装(3)并行I/O口引脚(32个,分成4个8位口)P0.0~P0.7:一般I/O口引脚或数据/低位地址总线复用引脚;P1.0~P1.7:一般I/O口引脚;P2.0~P2.7:一般I/O口引脚或高位地址总线引脚;P3.0~P3.7:一般I/O口引脚或第二功能引脚。与并行口P3(P3.0~P3.7)复用的第二功能引脚信号分别是:串行口输入和输出引脚RXD和TXD;外部中断输入引脚和;外部计数输入引脚T0和T1;外部数据存储器写和读控制信号和。2.2.280C51单片机的复位一、复位电路(a)上电复位电路(b)按键与上电复位二、单片机复位后的状态1.程序计数器PC的值为0000H2.单片机启动后,片内RAM为随机值,运行中的复位操作不改变片内RAM的内容。3.P0~P3为FFH,SP为07H,SBUF不定,IP、IE和PCON的有效位为0,其余的特殊功能寄存器的状态均为00H。相应的意义为:P0~P3=FFH,相当于各接口锁存器已经写入1,此时不但可用于输出,也可以用于输入;SP=07H,堆栈指针指向片内RAM的07H单元(第一个入栈内容将写入08H单元);IP、IE和PCON的有效位为0,各中断源处于低优先级且均被关断,串行通信的波特率不加倍;PSW=00H,当前工作寄存器为第0组。2.2.380C51单片机CPU的时钟与时序时序:指令微操作的时间次序称作时序单片机的时钟信号用来为单片机芯片内部的各种微操作提供时间基准一、时钟产生方式内部时钟方式外部时钟方式内部时钟方式外部时钟方式电容器C1和C2的作用是稳定频率和快速起振,电容值在5~30pF,典型值为30pF。晶振CYS的振荡频率范围为1.2~12MHz,典型值为12MHz、6MHz或11.0592MHz当系统要与PC机通信时,应选择晶振频率为11.0592MHz,这样便于将波特率设定为标称值。二、80C51的时钟信号晶振周期(时钟周期)S状态机器周期指令周期三、80C51的典型时序单周期指令时序三、80C51的典型时序单字节双周期指令时序三、80C51的典型时序访问外部RAM的双周期指令时序80C51单片机最小系统单片机最小系统就是使单片机工作的最低配置2.380C51单片机的存储器组织随机存取存储器(RAM)只读存储器(ROM)2.3.180C51单片机的程序存储器配置
寻址范围:64KB一.芯片内、外程序存储器的选择1.引脚接高电平2.3.180C51单片机的程序存储器配置2.引脚接低电平2.3.180C51单片机的程序存储器配置二.程序存储器的几个特殊单元0000H:单片机复位后的入口地址;0003H:外部中断0的中断服务子程序入口地址;000BH:定时/计数器0溢出中断服务子程序入口地址;0013H:外部中断1的中断服务子程序入口地址;001BH:定时/计数器1溢出中断服务子程序入口地址;0023H:串行接口的中断服务子程序入口地址。对于增强型单片机,002BH为定时/计数器2溢出或T2EX负跳变中断服务子程序入口地址。ROM低端的入口地址基本程序结构2.3.280C51单片机的数据存储器配置一、工作寄存器区80C51单片机片内RAM的低端地址为00H~1FH的共32个字节单元,分成4个工作寄存器组,每组占8个单元。寄存器0组:地址00H~07H;寄存器1组:地址08H~0FH;寄存器2组:地址10H~17H;寄存器3组:地址18H~1FH。当前工作寄存器组从某一组工作寄存器换至另一组工作寄存器时,原来工作寄存器组的各寄存器的内容将被屏蔽保护起来。利用这一特性可以方便地完成快速现场数据保护任务二、位寻址区内部RAM中地址为20H~2FH的共16个字节单元128个位的地址范围是00H~7FH三、通用RAM区地址为30H~7FH的共80个字节单元为通用RAM区数据缓冲器80C51的堆栈一般设在30H~7FH的范围内。栈顶的位置由SP寄存器指示。复位时SP的初值为07H,2.3.380C51单片机的特殊功能寄存器一、与运算器相关的寄存器(3个)累加器ACC,8位。ACC是80C51单片机中最频繁使用的寄存器,用于向ALU提供操作数,许多运算的结果也存放在累加器中;寄存器B,8位。主要用于乘、除法运算。也可以作为RAM的一个单元使用;程序状态字寄存器PSW,8位。它用来保存ALU运算结果的特征和处理器状态。其中RS1和RS0位用来设定当前工作寄存器组。二、指针类寄存器(3个)堆栈指针SP,8位。它总是指向栈顶。复位初始值为07H;数据指针DPTR,16位。用来存放16位的地址。它由两个8位寄存器DPH和DPL组成,可对片外64KB范围的RAM或ROM数据进行间接寻址或变址寻址操作。三、与口相关的寄存器(7个)并行I/O口P0、P1、P2、P3,均为8位。通过对这4个寄存器的读/写操作,可以实现数据从相应并口的输入/输出;串行口数据缓冲器SBUF;串行口控制寄存器SCON;串行通信波特率倍增寄存器PCON(一些位还与电源控制相关,所以又称为电源控制寄存器)。四、与中断相关的寄存器(2个)中断允许控制寄存器IE;中断优先级控制寄存器IP。五、与定时/计数器相关的寄存器(6个)定时/计数器T0的两个8位计数初值寄存器TH0、TL0,可以构成16位的计数器,TH0存放高8位,TL0存放低8位;定时/计数器T1的两个8位计数初值寄存器TH1、TL1,它们可以构成16位的计数器,TH1存放高8位,TL1存放低8位;定时/计数器的工作方式寄存器TMOD;定时/计数器的控制寄存器TCON。80C51的特殊功能寄存器(SFR)与片内RAM统一编址的21个特殊功能寄存器(SFR),离散地分布在80H~FFH的地址空间中。字节地址能被8整除的(即十六进制的地址码尾数为0或8的)单元是具有位地址的寄存器。在SFR地址空间中,有效位地址共有83个2.4单片机指令系统和寻址方式简介1.指令系统概述机器语言程序汇编语言汇编语言是用助记符、符号和数字来表示指令的程序语言,容易理解和记忆,它与机器语言指令是一一对应的2.指令格式[标号:]操作码[目的操作数][,源操作数][;注释]例如:MOVA,#00H3.寻址方式概述:七种寻址方式立即寻址、寄存器寻址、寄存器间接寻址、直接寻址、基址加变址寻址、相对寻址、位寻址1.立即寻址立即寻址方式(也称立即数寻址)是直接在指令中给出操作数MOVA,#05H需要在操作数前面加前缀标志“#”2.寄存器寻址寄存器寻址方式就是指令中的操作数为某一寄存器的内容。MOVA,R03.寄存器间接寻址寄存器中存放操作数的地址MOVA,@R04.直接寻址指令中直接给出操作数的单元地址MOVA,50HMOV50H,60H5.基址加变址寻址以DPTR或者PC的内容作为基地址,然后在这个基地址的基础上加上地址偏移量A的内容形成真正的操作数地址MOVCA,@A+DPTR6.相对寻址相对寻址只出现在相对转移指令中。目的地址=源地址+相对转移指令字节数+relrel是单字节的带符号的8位二进制补码数相对偏移在-128~+127单元之间7.位寻址操作数是8位二进制数中的某一位。指令中给出的是位地址,即片内RAM某一单元中的一位SETBbit2.4.4汇编指令描述符号Rn当前工作寄存器R0~R7(n=0~7)。Ri当前工作寄存器区中RO、R1(i=0,1)。direct直接地址#data包含在指令中的8位立即数。#data16包含在指令中的16位立即数。rel相对转移指令中的偏移量,补码(-128~+127)。DPTR数据指针bit直接寻址位。C或Cy进位标志位或位处理机中的累加器。addr1111位目的地址。addr1616位目的地址。@间接寻址寄存器前缀,如@Ri,@A+DPTR。(X)表示X地址单元或寄存器中的内容。((X))表示以X的内容为地址间接寻址单元的内容。2.5数据传送类指令通用格式如下:
MOV[目的操作数],[源操作数]1.以累加器为目的操作数的指令MOVA,Rn;(Rn)→A,n=0~7MOVA,@Ri;((Ri))→A,i=0,1MOVA,direct;(direct)→AMOVA,#data;#data→A源操作数可以是寄存器、直接地址、间接地址、和立即数MOVA,R4;(R4)→A,寄存器寻址
MOVA,@R0;((R0))→A,寄存器间接寻址
MOVA,60H;(60H)→A,直接寻址
MOVA,#20H;20H→A,立即数寻址2.以Rn为目的操作数的指令MOVRn,A;(A)→Rn,n=0~7MOVRn,direct;(direct)→Rn,n=0~7MOVRn,#data;#data→Rn,n=0~7把源操作数的内容送入当前工作寄存器区的R0~R7中的某一个工作寄存器例如:(A)=42H,执行指令MOVR0,A后,R0的内容为42H.3.以直接地址direct为目的操作数的指令MOVdirect,A;(A)→directMOVdirect,Rn;(Rn)→directMOVdirect,@Ri;((Ri))→direct,i=0,1MOVdirect1,direct2;(direct2)→(direct1)MOVdirect,#data;#data→direct把源操作数的内容送入直接地址单元direct指的是内部RAM或SFR地址例如:(43H)=12H,执行指令MOV20H,43H后20H单元的内容为12H.
MOV@Ri,A;(A)→((Ri)),i=0,1MOV@Ri,direct;(direct)→((Ri)),i=0,1MOV@Ri,#data;#data→((Ri)),i=0,1把源操作数内容送入R0或R1指定的存储单元中4.以寄存器间接地址为目的操作数的指令例如:(A)=12H,(R0)=30H,执行指令MOV@R0,A后结果为RAM中(30H)=12HMOV@R0,AMOV30H,A。5.十六位数据传送指令MOVDPTR,#data16
将高8位立即数dataH送入DPH,低8位立即数dataL送入DPL。如“MOVDPTR,#1234H”,执行结果为(DPH)=12H,(DPL)=34H。6.堆栈操作指令PUSHdirect功能:首先将堆栈指针SP加1,然后把direct中的内容送到堆栈指针SP所指的内部RAM单元中。例如:当(SP)=60H,(A)=12H,(B)=34H,执行下列指令
PUSHACC;(SP)+1=61H→SP,(A)→61HPUSHB;(SP)+1=62H→SP,(B)→62H结果为(61H)=12H,(62H)=34H,(SP)=62H(2)出栈指令POPdirect功能:将堆栈指针SP指示的栈顶内容送到direct字节单元中,堆栈指针SP减1。例如:当(SP)=62H,(62H)=12H,(61H)=34H,执行下列指令POPACC;((SP))→A,(SP)-1→SPPOPPSW;((SP))→PSW,(SP)-1→SP结果为(A)=12H,(PSW)=34H,(SP)=60H。7.查表指令(1)MOVCA,@A+PC(2)MOVCA,@A+DPTR读程序存储器中表格数据执行这两条指令时,单片机的引脚信号有效例如:当(A)=06H,执行地址2000H处的指令2000H:MOVCA,@A+PC该指令占用一个字节,下一条指令的地址为2001H,(PC)=2001H,再加上A中的06H,得到2007H,结果是将程序存储器中的2007H的内容送入累加器A。例如:(DPTR)=2000H,(A)=06H,执行指令MOVCA,@A+DPTR结果是将程序存储器中2006H单元内容送入累加器A中。8.累加器A与片外RAM传送指令MOVXA,@Ri;((Ri))→AMOVXA,@DPTR;((DPTR))→AMOVX@Ri,A;A→((Ri))MOVX@DPTR,A;A→((DPTR))可以实现I/O接口输入/输出数据@Ri间址作低8位地址指针,高8位地址由P2口送出寻址范围64KB读写信号9.字节交换指令XCHA,RnXCHA,@RiXCHA,direct功能:将累加器A中的内容与源操作数的内容进行互换例:若(R0)=80H,(A)=20H。执行指令XCHA,R0
后,(A)=80H,(R0)=20H。
2/5/202310510.半字节交换指令XCHDA,@Ri功能:将Ri间接寻址的单元内容与累加器A中内容的低4位互换,高4位内容不变。该操作只影响标志位P。例如:(R0)=30H,(30H)=67H,(A)=20H,执行指令XCHDA,@R0后,(A)=27H,(30H)=60H。11.累加器半字节交换指令SWAPA功能:将累加器A的高4位和低4位互换。例如:(A)=56H,执行指令SWAPA,结果(A)=65H.2.6算术运算和逻辑运算类指令2.6.1算术运算类指令MCS-51算术运算指令包括加、减、乘、除、基本四则运算针对8位二进制无符号数其中:√表示有影响,×表示无影响,0表示清零
指令
标志ADD、ADDC、SUBBDAMULDIVCY√√00AC√√××OV√×√√P√√√√1.加法指令ADDA,Rn;(A)+(Rn)→AADDA,@Ri;(A)+((Ri))→AADDA,direct;(A)+(direct)→AADDA,#data;(A)+data→A影响标志位AC、CY、OV、P算数运算影响标志位示例例:有2个参与相加的机器数,一个是84H,另一个是8DH。试分析运算过程及其对状态标志的影响。结果:CY为1;AC为1;OV为1;P为0
2/5/2023111例3-1:设(A)=0C3H,(R0)=0AAH,执行指令ADDA,R0(A):11000011+(R0):10101010101101101所得和为6DH,标志位CY=1,AC=0,P=1,OV=1,溢出标志OV在CPU内部根据异或门输出置位,OV=C72.带进位加法指令ADDCA,Rn;(A)+(Rn)+CY→AADDCA,@Ri;(A)+((Ri))+CY→AADDCA,direct;(A)+(direct)+CY→AADDCA,#data;(A)+data+CY→A功能:同时把源操作数所指出的内容和进位标志位CY都加到累加器A中,结果存放在A中将影响标志位AC,CY,OV,P常用于多字节加法例3-2:设(A)=85H,(20H)=0FFH,CY=1,执行指令ADDA,20H(A):10000101+(R0):11111111110000101所得和为85H,标志位CY=1,AC=1,OV=0,P=13.增1指令INCAINCRn;n=0~7INCdirectINC@Ri;i=0,1INCDPTR不影响PSW4.十进制调整指令DAA;调整A的内容为正确的BCD码两个压缩的BCD码按二进制相加后,必须经过调整方能得到正确的和。
当A中低4位出现了非BCD码(1010~1111)或低4位的进位AC=1,则应在低4位加6调整。当A中高4位出现了非BCD码(1010~1111)或高4位的进位CY=1,则应在高4位加6调整。
执行十进制调整指令后,PSW中的CY表示结果的百位值2/5/2023116例:若(A)=01101001B,表示的BCD码为(R2)=01011000B,表示的BCD码为,执行指令:ADDA,R2DAA(A)=00100111B,即且(CY)=1,即正确的结果为:127
2/5/20231175.带借位减法用此组指令完成不带借位的减法,只需先清CY为0即可
CY为1,表示D7位需借位
AC为1,表示D3位需借位OV为1,表示“D6有借位D7无借位”或“D7有借位D6无借位”2/5/2023118例:若(A)=C9H,(R2)=54H,(CY)=1,试分析指令SUBBA,R2执行后,累加器的内容及状态标志。(A):11001001(201)-(CY):
1(1)11001000-(R2):01010100(84)结果:01110100(116)即:(A)=74H,(CY)=0,(AC)=0,(OV)=1,(P)=0。分析:数据为无符号类型。该指令执行前CY=1,说明此指令不是运算的最低字节,即在此指令执行之前,一定执行过低字节的减法并产生了借位。因此,本次相减(201-1-84=116=74H)结果为74H。2/5/20231196.减1指令这组指令仅DECA
影响P标志。其余指令都不影响标志位的状态。2/5/20231207.乘法指令仅有一条乘法指令MULAB;A与B相乘无符号结果:B中为积的高8位,A中为积的低8位。
CY总是被清0;OV=1表示积大于FFH
8.除法指令仅有一条除法指令DIVAB;A除以B
无符号结果:A中为商的整数部分,B中为余数
CY总是被清0;OV=1表示除数为02/5/20231212.6.2逻辑操作类指令逻辑操作包括与、或、异或、清零、求反、移位等操作1.累加器A清零指令CLRA该指令的功能是将累加器A的内容清零,不影响CY、AC、OV等标志位。2.累加器A求反指令CPLA该指令的功能是将累加器A的内容进行求反操作,不影响CY、AC、OV等标志位。3.累加器A循环左移指令RLA该指令功能是将累加器A的内容向左循环移动一位,最高位移入最低位。4.累加器A循环右移指令RRA该指令功能是将累加器A的内容向右循环移动一位,最低位移入最高位。5.带进位循环左移指令RLCA该指令功能是将累加器A的内容连同进位标志位CY一起向左循环移一位,ACC.7移入CY,CY移入ACC.0。6.带进位循环右移指令RRCA该指令功能是将累加器A的内容连同进位标志位CY一起向右循环移一位,ACC.0移入CY,CY移入ACC.7。例3-4:无符号二进制数(A)=10101100B,CY=0。执行指令RLCA的结果为A=01011000,CY=17.逻辑“与”指令ANLA,#data;ANLA,direct;ANLA,Rn;ANLA,@Ri;ANLdirect,#dataANLdirect,A功能:位进行逻辑与,结果存入目的操作数例2-6:(A)=85H,(40H)=7FH,执行指令 ANLA,40H
10000101∧)0111111100000101结果为(A)=05H8.逻辑“或”指令ORLA,#data;ORLA,direct;ORLA,Rn;ORLA,@Ri;ORLdirect,#dataORLdirect,A按位进行逻辑或,结果存入目的操作数。例2-7:(A)=76H,R5=8AH,执行指令 ORLA,R5
01110110∨)1000101011111110结果为(A)=FEH9.逻辑“异或”指令XRLA,#data;XRLA,direct;XRLA,Rn;XRLA,@Ri;XRLdirect,#data;XRLdirect,A;按位进行逻辑“异或”,结果存入目的操作数例2-8:(A)=56H,R2=77H,执行指令 XRLA,R2
01010110⊕)0111011100100001结果为(A)=21H2.7控制转移类和位操作指令2.7.1控制转移类指令无条件转移:条件转移:绝对转移:相对转移:长转移或长调用:目的地址距当前PC64KB地址范围内。短转移或短调用:目的地址距当前PC2KB地址范围。这一类指令的功能是改变指令的执行顺序绝对转移AJMPaddr11;PC←(PC)+2,PC10~0←addr111.无条件转移指令长转移(长跳转)LJMPaddr16;PC←addr16相对转移SJMPrel;PC←(PC)+2,PC←(PC)+rel目标地址rel
对应范围为+127~-128。
2/5/2023137【例】若“NEWADD”为地址1022H,PC的当前值为1000H。执行指令SJMPNEWADD后,程序将转向1022H处执行(rel=20H=1022H-1000H-2)。解析如下:2/5/2023138间接转移(散转移)JMP@A+DPTR;PC←(PC)+1,PC←(A)+(DPTR)
可完成多条判跳指令的功能【例】功能:当(A)=00H时,程序将转到ROUT0处执行;当(A)=02H时,程序将转到ROUT1处执行;……。
MOVDPTR,#TABLEJMP@A+DPTRTABLE:AJMPROUT0AJMPROUT1AJMPROUT2AJMPROUT32/5/20231392.条件转移指令(1)累加器判零转移指令JZrel;A=0则转移,否则顺次执行JNZrel;A≠0则转移,否则顺次执行(2)减1不为零转移指令DJNZRn,relDJNZdirect,rel(3)比较不相等转移指令CJNEA,direct,relCJNEA,#data,relCJNERn,#data,relCJNE@Ri,#data,rel3.调用及返回指令长调用指令
短调用指令
指令执行时将返回地址入栈
SP应设为合适值(默认值07H)
例:若(SP)=07H,标号“XADD”表示的实际地址为0345H,PC的当前值为0123H。执行指令ACALLXADD
后:返回地址为:(PC)+2=0125H。其低8位的25H压入堆栈的08H单元,其高8位的01H压入堆栈的09H单元(低地址对应于低字节)。(PC)=0345H,程序转向目标地址0345H处执行。2/5/2023144(3)子程序返回指令中断子程序返回指令RETI专用于中断服务程序返回,它具有清除内部相应的中断状态触发器(以保证正确的中断逻辑)的功能。
4.空操作指令
NOPCPU不进行任何实际操作,除PC加1外,不影响其他寄存器和标志位。该指令常用来产生一个机器周期的延时2.7.2位操作指令在程序中位地址的表达有多种方式:1)用直接位地址表示,如D4H。2)用“·”操作符号表示,如PSW.4,或D0H.43)用位名称表示,如RS1。4)用用户自定义名表示。如ABCBITD4H,其中ABC定义为D4H位的位名,BIT为位定义伪指令。以上各例均表示PSW.4的RS1位。1.位清零指令CLRC;0→CYCLRbit;0→bit2.位置1指令SETBC;1→CYSETBbit;1→bit3.位取反指令CPLC;CY→CYCPLbit;bit→bit4.位传送指令MOVC,bit;(bit)→CYMOVbit,C;CY→(bit)5.位逻辑“与”指令ANLC,bit;CY∧(bit)→CYANLC,/bit;CY∧(/bit)→CY6.位逻辑“或”指令ORLC,bit;CY∨(bit)→CYORLC,/bit;CY∨(/bit)→CY7.位转移指令JCrel;CY=1,则转移,否则程序顺序执行JNCrel;CY=0,则转移,否则程序顺序执行JBbit,rel;(bit)=1,则转移,否则程序顺序执行JNBbit,rel;(bit)=0,则转移,否则程序顺序执行JBCbit,rel;(bit)=1,则转移,且该位清零;否则程序顺序执行2.880C51并行口结构与驱动4个8位的并行I/O接口,分别是P0、P1、P2和P3由口锁存器、输出驱动器和输入缓冲器组成P0口、P2口可用作通用的输入/输出口。当需要外部程序存储器和数据存储器扩展时(如80C31的应用),P0口作为分时复用的低8位地址/数据总线,P2口作为高8位地址总线。P1口是80C51唯一的单功能口,仅能用作通用的数据输入/输出口。P3口是双功能口,除具有数据输入/输出功能外,每一口线还具有特殊的第二功能。2.880C51并行口结构与驱动2.8.1P0口的结构2.880C51并行口结构与驱动2.8.2P1口的结构2.880C51并行口结构与驱动2.8.3P2口的结构2.880C51并行口结构与驱动2.8.4P3口的结构2.8.5并口驱动简单外设一、并口的负载能力对于典型的单片机器件AT89S52,每根口线最大可吸收10mA的(灌)电流;但P0口所有引脚吸收电流的总和不能超过26mA,P1、P2和P3口每个口吸收电流的总和限制在15mA,全部4个并口所有口线的吸收电流总和限制在71mA。2.8.5并口驱动简单外设二、驱动输出设备1.驱动发光二极管LED2.驱动数码管2.驱动数码管若数据总线D7~D0与dp、g、f、e、d、c、b、a顺序对应相接,要想显示数字“8”时,共阴极数码管送01111111B至数据总线,即字形码为7FH;而共阳极数码管送数据10000000B至数据总线,即字形码为80H。3.驱动蜂鸣器三、驱动输入设备按键开关的抖动现象和去抖电路通常采用软件延时10ms的方法本章小结180C51单片机由微处理器、存储器、I/O接口以及特殊功能寄存器SFR构成内部的各种微操作都以晶振周期为时序基准。晶振信号二分频后形成两相错开的节拍信号P1和P2,十二分频后形成机器周期。一个机器周期包含12个晶振周期(或6个S状态)。指令的执行时间称作指令周期。80C51单片机有4个8位的并行I/O口:存储器在物理上设计成程序存储器和数据存储器两个独立的空间单片机的复位操作使单片机进入初始化状态。本章小结2单片机的复位操作使单片机进入初始化状态。复位后,PC内容为0000H,P0口~P3口内容均为FFH,SP内容为07H,SBUF内容不定,IP、IE和PCON的有效位为0,其余的特殊功能寄存器的内容均为00H。对于典型的单片机器件AT89S52,每根口线最大可吸收10mA的(灌)电流;但P0口所有引脚吸收电流的总和不能超过26mA,P1、P2和P3每个口吸收电流的总和限制在15mA,全部4个并口所有口线的吸收电流总和限制在71mA。简单输出设备有LED二极管、LED数码管及蜂鸣器等。用单片机驱动时除了考虑口线的负载能力,还要注意P0口上拉电阻的配置。简单的输入设备有按键和拨动开关。对于按键开关,按键在闭合和断开时,触点会存在抖动现象。按键较少时可以采用硬件去抖电路,按键较多时采用软件延时消抖。本章小结3MCS-51单片机的汇编指令系统由111条指令组成。寻址方式是指寻找操作数的方法,或者说通过什么方式找到操作数。汇编指令系统可分为五大类:数据传送类指令、算术运算类指令、逻辑运算类指令、控制转移类指令、位操作类指令。数据传送类指令完成的功能是在单片机内部或者和单片机外部进行数据的传输,包括内部传送指令和外部传送指令。算术运算类指令是将数据进行算术运算,有些指令会对标志位产生影响。逻辑运算类指令是将数据进行逻辑运算,例如与、或、逻辑移位等操作。控制转移类指令是控制程序执行的顺序,其中的跳转及调用指令能够灵活的控制指令运行的方式。位操作类指令是对可寻址位的内容进行操作,包括位传送、及位逻辑操作等。第3章C51语言编程基础学习目标(1)了解C51编程的一般设计流程。(2)掌握C51程序设计的基本方法。学习重点和难点(1)C51的数据类型、存储器类型和存储模式。(2)C51的函数定义及使用方法。(3)C51指针的使用。3.1单片机的C51基础知识(1)对单片机的指令系统不要求了解,仅要求对8051的存储器结构有初步了解;(2)寄存器分配、不同存储器的寻址及数据类型等细节可由编译器管理;(3)程序有规范的结构,可分成不同的函数,这种方式可使程序结构化;(4)提供的库包含许多标准子程序,具有较强的数据处理能力;(5)由于具有方便的模块化编程技术,使已编好程序容易移植;3.1.2C51的基本数据类型1.char字符类型无符号字符类型unsignedchar有符号字符类型signedchar,默认值为signedchar类型。2.int整型有符号int整型数signedint无符号整型数unsignedint,默认值为signedint类型3.long长整型有符号long长整型signedlong无符号长整型unsignedlong,默认值为signedlong类型4.float浮点型5.bit位变量6.sfr特殊功能寄存器,例如:sfrP1=0x907.sfr1616位特殊功能寄存器8.sbit可寻址位sfrP1=0x90;//因P1端口的寄存器是可位寻址的,所以能定义sbitP1_1=P1^1;//P1_1为P1中的P1.1引脚3.1.3存储器类型存储器类型描述data直接寻址内部数据存储器,访问变量速度最快(128bytes)bdata可位寻址内部数据存储器,允许位与字节混合访问(16bytes)idata间接寻址内部数据存储器,可访问全部地址空间(256bytes)pdata分页(256bytes)外部数据存储器,由操作码MOVX@Ri访问xdata外部数据存储器(64KB),由MOVX@DPTR访问code代码数据存储器(64KB),由MOVC@A+DPTR访问3.1.4存储器模式存储器模式描述SMALL参数及局部变量放入可直接寻址的内部寄存器(最大128bytes128bytes,默认存储器类型是DATA)COMAPCT参数及局部变量放入分页外内部存储区(最大256bytes256bytes,默认存储器类型是PDATA)LARGE参数及局部变量直接放入外部数据存储器(最大64K64K,默认存储器类型是XDATA)3.1.5C51常量1.整型常量能表示为十进制如123、0、-89等。十六进制则以0x开头如0x34、-0x3B等。长整型就在数字后面加字母L,如104L、034L等。2.浮点型常量可分为十进制和指数表示形式。如0.888,3345.345,0.0等如125e3,7e9,-3.0e-33.字符型常量是单引号内的字符,如‘a’,‘d’等,4.字符串型常量由双引号内的字符组成,如“test”,“OK”等。5.位常量,它的值是一个二进制数。3.2C51的基本运算1.算术运算符+加A=x+y-减B=x-y*乘C=x*y/除D=x/y%取余数E=x%y2.关系运算符符号功能范例说明==相等x==y比较x与y变量的值,相等则结果为1,不相等则为0!=不相等x!=y比较x与y变量的值,不相等则结果为1,相等则为0>大于x>y若x变量的值大于y变量的值,其结果为1,否则为0<小于x<y若x变量的值小于y变量的值,其结果为1,否则为0>=大等于x>=y若x变量的值大于或等于y变量的值,其结果为1,否则为0<=小等于x<=y若x变量的值小于或等于y变量的值,其结果为1,否则为03.逻辑运算符符号功能范例说明&&及运算(x>y)&&(y>z)若x变量的值大于y变量的值,且y变量的值也大于z变量的值,其结果为1,否则为0||或运算(x>y)||(y>z)若x变量的值大于y变量的值,或y变量的值大于z变量的值,其结果为1,否则为0!反相运算!(x>y)若x变量的值大于y变量的值,其结果为0,否则为14.位运算符符号 功能 范例& 及运算 A=x&y| 或运算 B=x|y^ 异或 C=x^y~ 取反 D=~x<< 左移 E=x<<n>> 右移 F=x>>n5.递增/减运算符符号功能范例说明++加1x++将x变量的值加1--减1x--将x变量的值减13.3C51的程序设计基础1.while循环语句的格式如下:While(表达式){语句;}2.for循环语句for语句是一个很实用的计数循环,其格式如下:格式:for(表达示1;表达示2;表达示3) { 语句;}3.if选择语句if-else语句提供条件判断的语句,称为条件选择语句,其格式如下:if(表达式){ 语句1;}else{ 语句2;}4.多分支条件语句和开关语句
(1)多分支语句格式如下:if(条件表达式1)语句1elseif(条件表达式2)语句2…elseif(条件表达式m)语句m…elseif(条件表达式n)语句nelse语句p4.多分支条件语句和开关语句
(2)开关语句switch(表达式){case常量1:语句1break;case常量2:语句2break;…case常量m:语句mbreak;…case常量n:语句nbreak;default:语句p}5.其它语句(1)绝对跳转语句:gotogoto标号;(2)返回语句:returnreturn(表达式或变量);(3)退出语句:break和continue
3.3.2数组unsignedintxcount[10];//定义无符号整形数组,有10个数据单元charinputstring[5];//定义字符形数组,有5个数据单元floatoutnum[10],[10];//定义浮点型数组,有100个数据单元表3-10数组定义数据类型数组名[常量表达式];数据类型数组名[常量表达式1]......[常量表达式N];
3.3.2指针用一个变量来存放另一个变量的地址,那么用来存放变量地址的变量称为“指针变量”变量的指针就是变量的地址,用取地址运算符‘&’取得赋给指针变量。&STR就是把变量STR的地址取得。要访问变量STR除了能用‘STR’这个变量名来访问之外,还能用变量地址来访问。方法是先用&STR取变量地址并赋于STRIP指针变量,然后就能用*STRIP来对STR进行访问了。‘*’是指针运算符,用它能取得指针变量所指向的地址的值。
3.4C51的函数1.函数的定义函数定义格式如下:返回值的数据类型函数名(形参变量1说明,。。。,形参变量n说明){局部变量定义函数体语句返回语句}void函数名(void){函数体语句}2.主函数voidmain(void){语句}3.中断函数voidT0_interrupt(void)interrupt1中断源名称中断号外部中断INT00定时器/计数器T0中断1外部中断INT12定时器/计数器T1中断3串行口中断UART4定时器/计数器T2中断T5在main函数里调用TwoDataAdd函数:voidmain(void){chara,b;intc;a=38;b=99;c=TwoDataAdd(a,b);}4.库函数函数库对应的头文件功能字符函数CTYPE.H与ASKII码表相关一般I/O函数STDIO.H与UART相关字符串函数STRING.H字符串的截取、查找、比较等标准函数STDLIB.H字符串与数字之间的转换数学函数MATH.H求绝对值、平方开方、三角函数绝对地址访问ABSACC.H绝对地址访问内部函数INTRINS.H只有_NOP_()函数有用,相当于汇编里的NOP变量参数表STDARG.H不用全程跳转SETJMP.H不用SFR访问REG51/52.H特殊功能寄存器声明5.函数的调用voidmain(void){chara,b;intc;a=38;b=99;c=TwoDataAdd(a,b);}变量a、b叫实参,调用TwoDataAdd()函数时,实参a、b的值分别传递给形参FirstData和SecondData,用变量c接收函数的返回值。值传递的点是,在函数调用结束后,实参仍旧保持原来的值,即a=38、b=99,而形参被释放。【例3-1】写出一个完整的调用子函数的例子,用单片机控制一个LED灯闪烁发光。用P1口的第一个引脚控制一个LED灯,1秒钟闪烁一次。#include<reg52.h>//头文件#defineuintunsignedint//宏定义sbitD1=P1^0;//声明单片机P1口的第一位uintx,y;voidmain(){ while(1)//大循环 { D1=0;//点亮第一个发光二极管 for(x=500;x>0;x--) for(y=110;y>0;y--); D1=1;//关闭第一个发光二极管 for(x=500;x>0;x--) for(y=110;y>0;y--); }}#include<reg52.h>//头文件#defineuintunsignedint//宏定义sbitD1=P1^0;//声明单片机P1口的第一位voiddelay();//声明子函数voidmain(){ while(1)//大循环 { D1=0;//点亮第一个发光二极管 delay();//延时500毫秒 D1=1;//关闭第一个发光二极管 delay();//延时500毫秒 }}
voiddelay()//延时子程序延时约500毫秒{ uintx,y; for(x=500;x>0;x--) for(y=110;y>0;y--);}【例3-3】调用子函数的例子,用单片机控制一个LED灯闪烁发光。用P1口的第一个引脚控制一个LED灯,让它亮500ms,灭800ms。#include<reg52.h>//头文件#defineuintunsignedint//宏定义sbitD1=P1^0;//声明单片机P1口的第一位voiddelay(uintz);//声明子函数voidmain(){ while(1)//大循环 { D1=0;//点亮第一个发光二极管 delay(500);//延时500毫秒 D1=1;//关闭第一个发光二极管 delay(800);//延时800毫秒 }}voiddelay(unsignedintz)//延时子程序延时约500毫秒{ uintx,y; for(x=z;x>0;x--) for(y=110;y>0;y--);}本章小结C51是面向51系列单片机所使用的程序设计语言,使MCS-51单片机的软件具有良好的可读性和可移植性。具有操作直接、简洁和程序紧凑的优点,为大多数51单片机实际应用最为广泛的语言。C51编译器常用的数据类型有字符型、整型、长整型、浮点型、位型和指针型。任何数据都要以一定的存储器类型定位到单片机的存储区中,如用户未做定义,则依据系统默认存储器类型进行存储。第4章MCS-51单片机程序设计方法学习目标(1)掌握单片机程序设计的步骤和方法。(2)掌握汇编语言源程序的指令格式和常用伪指令的基本功能。(3)掌握C51语言源程序的基本结构和常用预处理指令的基本功能。学习重点和难点(1)汇编语言源程序和C51语言源程序编写方法(2)伪指令与执行指令的区别和使用方法(3)预处理指令的功能及使用方法4.1程序编制的步骤、方法和技巧4.1.1程序编制的步骤1、任务分析2、算法设计3、程序流程设计4、源程序编辑和编译5、程序调试常用的流程图符号“超级循环”结构4.1.2编制程序的方法和技巧一、模块化程序设计方法采用模块化程
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 电子科技合作协议样本
- 国内代理记账服务协议
- 临时安全服务协议
- 合同退款的协议范本
- 电脑买合同范例
- 2024年度母婴用品社交电商营销合同
- 教育设施零星工程协议
- 智能家居系统维护合同
- 劳务派遣终止合同范例
- 退股协议书范例
- 生活饮用水、公共场所卫生管理系列国家强制性标准解读答案-2024年全国疾控系统“大学习”活动
- 《算法设计与分析基础》(Python语言描述) 课件 第5章回溯法1
- 人音版八年级上册第二单元 多彩音乐剧 《雪绒花》教案
- 2024年中国交流低噪声风机市场调查研究报告
- 2024-2030年中国海洋工程行业市场发展分析及前景趋势与投资前景研究报告
- 2024-2030年中国安全校车市场发展分析及市场趋势与投资方向研究报告
- 数字孪生水利项目建设可行性研究报告
- 管理的本质:企业管理的6个关键方法论
- 车辆采购服务投标方案(技术方案)
- 人教版六年级上册数学课本课后习题答案
- 2024至2030年中国沥青搅拌站行业市场现状调研及市场需求潜力报告
评论
0/150
提交评论