8051单片机原理及应用郭玲课后参考答案_第1页
8051单片机原理及应用郭玲课后参考答案_第2页
8051单片机原理及应用郭玲课后参考答案_第3页
8051单片机原理及应用郭玲课后参考答案_第4页
8051单片机原理及应用郭玲课后参考答案_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第一章习题答案填空题一位二进制的数字要么是0,要么是1,我们说二进制的一个数字位就是1个比特(bit)。比特位数越多,编出的码字就越多。如果要编4个码字,需要2个比特;如果要编8个码字,则需要3个比特。1个字节由8位二进制数构成,对应数值范围0~255。单片机的1个存储单元容量是1个字节。计算机中有符号数用补码表示。在计算机世界里字节是基本单位。C语言中的标识符由字母、数字和下划线组成,以字母和下划线开头,不可使用保留给系统的关键字。C51相比于标准C语言,扩展了4个数据类型,分别是sfr、sfr16、bit和sbit。选择题:数字电路中的三极管都工作在开关状态,当在关的状态时,三极管处于_____状态。(A)饱和放大截止下列哪些是二进制数的记法?(ABC)(10010)2100010B0b100100x1010十进制56的二进制是(A)。00111000B01011100B11000111B01010000B十进制数-36,用8位二进制表示,它的反码和补码分别是(D)。00100100B、11011100B00100100B、11011011B10100100B、11011011B11011011B、11011100B十进制数+27在8位微机中的反码和补码是(C)。00011011B、11100100B11100100B、11100101B00011011B、00011011B00011011B、11100101B二进制11101110B与01110111B的“与”、“或”和“异或”结果是(D)。01100110B、10011001B、11111111B11111111B、10011001B、01100110B、01100110B、01110111B、10011001B01100110B、11111111B、10011001B二进制11001011B的十进制无符号数是(B)。213203223233二进制有符号数补码11001011的十进制数是(B)。73-53-5275判断题在计算机里一个字节等于8位。(√)在单片机C语言里一个字节的数值范围为0~266。(X)在计算机中,二进制数的单位从小到大依次为位、字、和字节,对应的英文名称为Bit、Word、Byte。(X)在C语言里,十进制加前缀“D”。(X)问答题什么是BCD码,什么是ASCII码?举出两种汉字编码标准。什么是C51?列出C51数据类型的名称、长度、数值范围。计算题请将下面的16进制数转换为二进制和十进制。0x10100x70AF0x7bC10x32F十六进制二进制十进制0x10100b00010000000100004,1120x70AF0b011100001010111128,8470x7bC10b011110111100000131,6810x32F0b001100101111815第二章习题答案填空题单片机是一颗封装好的微型计算机芯片,在工业控制领域应用极为广泛,也称微控制器(Micro-ControllerUnit,MCU),单片机把具有数据处理能力的\t"/item/%E5%8D%95%E7%89%87%E6%9C%BA/_blank"中央处理器(CentralProcessingUnit,CPU)、\t"/item/%E5%8D%95%E7%89%87%E6%9C%BA/_blank"只读存储器(ReadOnlyMemory,ROM)、随机存储器(RandomAccessMemory,\t"/item/%E5%8D%95%E7%89%87%E6%9C%BA/_blank"RAM)、定时计数器(Timer/Counter)、输入输出并行接口(Input/Output,I/O)、串行通信接口(SerialCommunication)、中断系统(InterruptSystem)等功能都集成到一块硅片上,构成了一个小而完善的微型计算机系统。STC8H8K64U单片机,有8K字节的RAM,64K字节ROM,提供USB接口。中央处理器(CentralProcessingUnit,简称CPU)是计算机系统的运算和控制核心,相当于人的大脑,是计算机程序的执行者。CPU并行操作的位数越多,处理速度越快,另外CPU的处理速度还受系统时钟影响,系统时钟也称“主频”,主频越高,处理速度越快。ROM是只读存储器(ReadOnlyMemory)的缩写,主要用于存放用户程序以及一些初始化数据等,所以也称程序存储器,ROM是非易失性存储器。RAM是随机存取存储器(RandomAccessMemory)的缩写,断电之后数据丢失,用于存放临时性数据,选择题STC51单片机系统中,若晶振频率为6MHz,12T的CPU,一个机器周期等于(D)us.A.4B.3C.1D.2单片机应用程序一般存放在(B)中。A.RAMB.ROMC.寄存器D.CPUSTC51单片机内部RAM区有(B)个工作寄存器区。A.8B.4C.2D.1STC51单片机内部RAM的idata区有(C)个位地址。A.256B.255C.128D.32PC的值是(C)。A.当前正在执行指令的前一条指令的地址B.当前正在执行指令的地址C.当前正在执行指令的下一条指令的地址D.控制器中指令寄存器的地址(A)是单片机的控制核心,完成运算和控制功能。A.CPUB.RAMC.ROMD.ALU具有可读可写功能,掉电后数据丢失的存储器是(B)A.CPUB.RAMC.ROMD.ALU具有只读不能写,掉电后数据不会丢失的存储器是(C)A.CPUB.RAMC.ROMD.ALU下面给出的特殊功能寄存器中,(B)是不可寻址的,即用户无法对它进行读写。A.PSWB.PCC.ACCD.P0CPU执行一条指令所需要的时间称为(C)。A.振荡周期B.机器周期C.指令周期D.时钟周期判断题所谓的单片机,就是将CPU、存储器、定时/计数器、中断功能以及I/O设备等主要功能部件都集成在一块超大规模集成电路的微型计算机。(√)STC51单片机的程序存储器数和数据存储器扩展的最大范围都是一样的。(√)STC51单片机的堆栈建立在内部RAM内开辟的区域。(√)CPU对各种外围部件采用程序存储器来控制。(×)单片机128B片内RAM中,工作寄存器区的地址范围为20H-2FH。(×)寄存器(Register)是一个专业术语,寄存器其实就是存储单元,是有“别名”的存储单元。(√)问答题传统8051单片机由哪几部分组成?请绘图说明。略STC增强型单片机相比MCS-51内核都增加了哪些功能?见教材。C51常量数据通常有哪几类?略在C51程序中,如何申明(定义)一个数据变量?略单片机最小系统该如何绘制?略STC51单片机片内RAM低128个单元划分为哪三个主要部分各部分的主要功能是什么?答:8051单片机内部RAM低128单元划分为工作寄存器组、位寻址区、堆栈与数据缓冲区。它们的特点如下:(1)工作寄存器组(O0H———1FH)这是一个用寄存器直接寻址的区域,内部数据RAM区的0—31,共32个单元。它是4个通用工作寄存器组,每个组包含8个8位寄存器,编号为RO——R7。(2)位寻址区((20H——2FH)16个字节单元,共包含128位,这16个字节单元既可以进行字节寻址,又可以实现位寻址。主要用于位寻址。(3)堆栈与数据缓冲区(30H———7FH)用于设置堆栈、存储数据。简述什么是程序计数器PC?答:程序计数器PC是一个16位的寄存器,其内容是保存CPU下一个指令的程序存储器单元地址,寻址范围为64KB。PC用自动加1控制程序的执行顺序。简述单片机有几个中断源,分别指什么,入口地址为多少?答:单片机有5个中断源,分别为外部中断0,其入口地址为0003H;定时器/计数器0,其入口地址为000BH;外部中断1,其入口地址为0013H;定时器/计数器1,其入口地址为001BH。第三章习题答案一、填空题1.单片机管脚(Pin)也称引脚,是单片机芯片内部电路引出的接线。2.单片机引脚对应的数据长度是bit,为了方便管理和使用,8位单片机系统将8个引脚组合在一起,形成了端口(Port),端口的数据长度是byte,传统8051单片机只有四个端口,分别是P0、P1、P2、P3,增强型单片机的端口数量增加。3.在编写单片机程序时,读写特殊功能寄存器和特殊寄存器位,就实现了对端口和引脚的控制。4.增强型单片机的I/O口功能强大,必须配置后才能使用,每个GPIO都有四种工作模式,这四种工作模式分别是准双向口、推挽输出、开漏输出、浮空输入。单片机GPIO除了通用输入输出口功能,几乎所有的管脚都可以被设置为第二甚至第三、第四功能,所谓“功能复用”,是指单片机的引脚既可以用作普通GPIO使用,也可以作为内部外设控制器的引脚来使用。单片机管脚和外围电路连接,这个连接电路称为单片机接口电路。单片机应用系统是指以单片机为核心、配以输入、输出、显示等外围接口电路和控制程序,能实现一种或多种功能的实用系统,单片机应用系统有两个要素,这两个要素分别是单片机接口电路、单片机控制程序。单片机每个GPIO端口都有多个SFR对应,最常用的是端口寄存器和端口模式配置寄存器。假设P1=0xf5,则执行语句P1=~P1后,P1=0x0A。选择题传统Intel8051单片机有(A)个GPIO端口?4个5个6个7个Intel8051单片机GPIO的工作模式是(C)。高阻输入推挽输出准双向输入/输出口开漏输出STC15单片机GPIO上电复位后默认的工作模式是(C)高阻输入推挽输出准双向输入/输出口开漏输出STC8单片机GPIO上电复位后默认的工作模式是(A)高阻输入推挽输出准双向输入/输出口开漏输出在51单片机的并行口中,在外接外部存储器时,可做地址/数据复用的是_A___A.P0口B.PI口C.P2口D.P3口51单片机中,P1口的字节地址是_B____A.80HB.90HC.A8HD.98H下述表达式可以将P1口的低4位全部置为高电平的是_A_____A.P1|=0x0fB.P1&=0x0fC.P1^=0X0fD.P1=~P1在C51的程序中要指定P1口的bit4,该如何编写__A_____sfrP190H;sbitP1.4=P1^4;sfrP190H;sbitp14=P1^4;sfrP190H;sbitP14=Port^4;sfrP190H;sbitP14=p1^4;以下选项中,___D______不是C51提供的合法的数据类型关键字。A.SFRB.charC.sfr16D.integer以下为C51存储模式的是_____B_____A.usingB.xdataC.SmallD.bit关于bit型变量的用法,下列说法正确的是__C_______A.可以定义bit型的数组B.可以声明bit型的指针变量C.bit型变量的值是一个二进制数D.bit型变量不可用做函数返回值C51中,单片机的可寻址位普通变量用___B____定义A.sbitB.bitC.unsignedcharD.unsignedint在51单片机中,具有外部存储器地址/数据复用功能的I/O口是__A__A.P0口B.P1口C.P2口D.P3口一个C程序的执行是从__A______。本程序的main函数开始,到main函数结束。本程序的第一个函数开始,到本程序文件的最后一个函数结束。本程序的main函数开始,到本程序文件的最后一个函数结束。本程序的第一个函数开始,到本程序main函数结束。判断题main函数必须写在一个C程序的最前面。(×)一个.C文件可以包含若干的函数。(√)C程序的注释部分可以出现在程序的任何位置,它对程序的编译和运行不起任何作用。但是可以增加程序的可读性。(√)要清零单片机I/0口的某一位,通常用或“I”运算(×)C程序的注释不能是中文文字信息。(×)要置位单片机I/0口的某一位,通常用与“&”运算。(×)第四章习题答案一、填空题当CPU正在处理某件事的时候外界发生了紧急事件请求(中断源),要求CPU暂停当前的工作,转而去处理这个紧急事件,处理完以后,再回到原来被中断的地方,继续原来的工作,这样的过程称为中断。实现这种功能的部件称为中断系统。向CPU发出中断请求的信号源称为中断源。当CPU正在处理一个中断源请求的时候,也就是在执行相应的中断服务程序,发生了另外一个优先级比它还高的中断源请求。如果CPU能够暂停对原来中断源的服务程序,转而去处理优先级更高的中断请求源,处理完以后,再回到原低级中断服务程序,这样的过程称为中断嵌套。单片机的中断系统包含了很多特殊功能寄存器,常用的有中断使能寄存器、中断请求寄存器、中断优先寄存器等。列举出单片机5个中断源:外部中断0、定时器0、外部中断1、定时器1、串口中断。中断源INT0在IT0=1时,下降沿触发;在IT0=0时,上升沿和下降沿触发。外部中断的中断源响应级别从高到低的顺序分别是INT0、INT1、INT2、INT3。interrupt是中断函数的关键字,表明这个函数是中断函数。中断源INT0请求标志位为IE0,中断源Timer0请求标志位为TF0。二、选择题以下哪个控制位是总中断允许(B)A.ELVDB.EAC.EX0D.ES以下哪些为外部中断源(AD)A.INT0B.EAC.IE2D.INT4外部中断INT0的溢出中断允许位为(C)A.IE0B.EAC.EX0D.ET0定时器T0的溢出中断允许位是(D)A.IE0B.EAC.EX0D.ET0中断服务函数的返回值类型为(C)A.intB.charC.voidD.float以函数名是LED,外部中断0为例,下面正确的中断函数格式为(A)A.voidLED()interrupt0B.voidLEDinterrupt0C.intLED()interrupt0D.intLEDinterrupt0定时器1的中断请求标志位为(C)A.TF0B.IE0C.TF1D.IE1以下中断中,中断等级最高的是(B)A.定时器0B.外部中断0C.定时器1D.定时器1以下哪些中断的中断请求标志位需要硬件清0(A、B)A.INT0B.Timer0C.UART0D.ADC不管是定时器还是外部中断均要开启的中断允许位为(A)A.EAB.EUSBC.ESD.ESPI以下哪些中断的中断请求标志位需要软件清0(C、D)A.INT0B.Timer0C.UART0D.ADC以下哪个不是串行口中断有关控制位(D)A.TI2B.EAC.ESD.EX以下哪个是模数转换允许位(B)A.ELVDB.EADCC.EDACD.ES三、判断题1.当我们使用INT0作为中断源,外部中断服务程序被响应后,中断标志位IE0会自动置1。(×)2.INT4的中断标志位为EX4。(×)3.外部中断2、3无法通过优先级设置位进行设置,因此他们的优先级永远最低的。(√)4.中断编号与中断入口地址对应,编号数字越大,中断等级越高,也越优先被响应。(×)5.当一个中断源发起请求,CPU响应后会将当前的操作数都押入堆栈,再跳转到中断服务函数,如果此时还有更高级别的中断源发出请求,则CPU将进入新的中断服务函数,以此类推。(√)6.ET0为定时器1的中断允许位,对应Timer0。(√)7.单片机不仅可以产生外部中断还有定时器中断,还可以产生串行口中断。(√)第五章课后习题答案一、填空题1.定时器通过记录单位时间发生的次数完成定时、延时等功能,所以定时器的核心是一个计数寄存器组,记录脉冲发生的次数。2.定时器的工作模式,按照计数寄存器的位数,分为8位定时器、16位定时器;按照计数器初值是否能自动重装,分为自动重装载和不可重装两种。3.STC系列单片机的定时器0有4种工作模式;定时器1有3种工作模式;定时器2~4有1种工作模式。4.单片机要使用定时器功能,首先要给它权限,允许定时器工作,即将允许标志位置“1”;其次要设置定时器的工作模式,即设定单片机工作在16位还是8位,是自动重装还是非重装模式。5.定时器模式寄存器TMOD的作用是设置定时器的工作模式。6.在8051单片机中,定时器的计数寄存器是向上(向上、向下)计数器,所以定时器的定时时间和THx、TLx的初值有关系。单片机系统时钟越快,定时器最大定时时间越短,定时器周期的倒数就是定时器的溢出率。二、单项选择题定时器核心的寄存器组是哪些?(B)AUXRTHx、TLxRL_THx、RL_TLxTCONIntel8051单片机有几个定时器?(A)2个3个4个5个定时器0和1的允许标志位在哪个寄存器里设置?(A)TCONTMODIEAUXR定时器0和1的工作模式在哪个寄存器里设置?(B)TCONTMODIEAUXR单片机的定时器T0/T1用做定时方式时,时钟源是(D)。单片机的主时钟MCLK单片机的晶振周期单片机的时钟周期单片机内部的系统时钟SYSclk单片机定时器T1用做计数方式时计数脉冲是(A)。T1Pin的输入脉冲B. 内部时钟产生的方波脉冲T0Pin的输入脉冲D. 外部时钟产生的方波脉冲单片机的定时器T0定时1ms,16位自动重装模式,则TMOD值为(B)。0x01B. 0x00C. 0x10D. 0x04单片机的定时器T1用做计数方式,采用工作模式2,则TMOD值为(A)。0x60B. 0x02C. 0x06D. 0x20启动T0开始计数是使TCON的(B)。TF0置1B. TR0置1C. TR0置0D. TR1置0使51单片机的定时器T0停止计数的语句是(A)。TR0=0;B. TR1=0;C. TR=1;D. TR1=1;单片机的扩展定时器T2工作模式是(A)16位自动重装16位不可重装8位自动重装不可屏蔽中断的16位自动装载当定时器T0发出中断请求后,中断响应的条件是(C)。ET0=1B. TF0=1C. TF1=1D. TR0=1在定时计数器的计数初值计算中,若设最大计数值为M,对于工作模式1下的M值为(D)。A.M=213=8192B.M=28=256C.M=24=16D.M=216=65536三、问答题51单片机定时/计数器的定时功能和计数功能有什么不同?分别应用在什么场合?答:T0或T1用做计数器时,分别对从芯片引脚T0(P3.4)或T1(P3.5)上输入的脉冲进行计数,外部脉冲的下降沿将触发计数,每输入一个脉冲,加法计数器加1。计数器对外部输入信号的占空比没有特别的限制,但必须保证输入信号的高电平与低电平的持续时间都在一个机器周期以上。一般用于需要计数的场合,对时间没有要求。用做定时器时,对内部机器周期脉冲进行计数,由于机器周期是固定值,故计数值确定时,定时时间也随之确定。如果51单片机系统采用12MHz晶振,则计数周期为:T机器周期=1/(12×106/12)=1us,这是最短的定时周期。适当选择定时器的初值可获取各种定时时间。一般用于对时间有要求的场合。软件定时与硬件定时的原理有何异同?答:软件定时是靠CPU运行空操作实现的,CPU在定时时不能进行其它操作,白白占用CPU时间。硬件定时是指采用单片机内部定时器实现定时,当定时器进行计数操作时,CPU可以进行其它操作。51单片机的定时/计数器是增1计数器还是减1计数器?增1和减1计数器在计数和计算计数初值时有什么不同?答:51单片机的定时/计数器是增1计数器。增1计数器是在初值基础上加1计数,直到翻转;减1计数器是在初值基础上减1计数,直到翻转。计算初值时,增1计数的初值需要用最大计数值(模值)减去计数值;减1计数的初值就是计数值。4代码题(1)设计时间间隔为1s的流水灯控制程序。参考程序如下://功能:间隔显示时间为1秒的流水灯程序#include"REG51.H"//包含头文件REG51.H,定义了MCS-51单片机的特殊功能寄存器//函数名:delay1s//函数功能:用T1工作在方式1下的1秒延时函数,采用查询方式实现//形式参数:无//返回值:无voiddelay1s(){unsignedchari;for(i=0;i<0x14;i++){//设置20次循环次数TH1=0x3c;//设置定时器初值为3CB0HTL1=0xb0;TR1=1;//启动T1while(!TF1);//查询计数是否溢出,即定时50ms时间到,TF1=1TF1=0;//50ms定时时间到,将T1溢出标志位TF1清零}}voidmain()//主函数{unsignedchari,w;TMOD=0x10;//设置T1为工作方式1while(1){w=0x01;//显示码初值为01Hfor(i=0;i<8;i++){P1=~w;//w取反后送P1口,点亮相应LED灯w<<=1;//点亮灯的位置移动delay1s();//调用1秒延时函数}}}(2)可控霓虹灯设计。系统包括8个发光二极管,连接在P3.2引脚的一个按键,通过按键改变霓虹灯的显示方式。要求正常情况下8个霓虹灯依次顺序点亮,循环显示,时间间隔为1s。按键按下后8个霓虹灯同时亮灭一次,时间间隔为0.5s。(按键动作采用外部中断0实现)。答:参考程序如下://功能:可控信号灯程序#include<reg51.h>//函数名:delay0_5s//函数功能:用T0的方式1编制0.5秒延时程序,假定系统采用12MHz晶振,定//时器1、工作方式1定时50ms,再循环10次即可定时到0.5秒//形式参数:无//返回值:无voiddelay0_5s(){unsignedchari;for(i=0;i<0x0a;i++)//设置10次循环次数{TH0=0x3c;//设置定时器初值TL0=0xb0;TR0=1;//启动T0while(!TF0);//查询计数是否溢出,即定时50ms时间到,TF0=0TF0=0;//50ms定时时间到,将定时器溢出标志位TF0清零}}//函数名:delay_t//函数功能:实现0.5秒~128秒延时//形式参数:unsignedchart;//延时时间为0.5秒×t//返回值:无voiddelay_t(unsignedchart){unsignedchari;for(i=0;i<t;i++)delay0_5s();}//函数名:int_0//函数功能:外部中断0中断函数,当CPU响应外部中断0的中断请求时,自动执行该//函数,实现八个信号灯闪烁//形式参数:无//返回值:无voidint_0()interrupt0//外部中断0的中断号为0{P1=0x00;//熄灭八个信号灯delay0_5s();//调用0.5秒延时函数P1=0xff;//点亮八个信号灯delay0_5s();//调用0.5秒延时函数}voidmain()//主函数{unsignedchari,w;EA=1;//打开中断总允许位EX0=1;//打开外部中断0允许位IT0=1;//设置外部中断为边沿(下降沿)触发方式TMOD=0x01;//设置T0为工作方式1while(1){w=0x01;//显示码初值为01Hfor(i=0;i<8;i++){P1=~w;//w取反后送P1口,点亮相应LED灯w<<=1;//点亮灯的位置移动delay_t(2);//调用延时函数delay_t(),实际参数为2,延时1秒}}}第六章课后习题答案填空题最简单的通信系统模型由信源、信道和信宿三部分组成。单片机串行口通信遵守RS232协议,信道是RS232通信线缆,信源和信宿是单片机设备或电脑。通信协议是指为了进行数据交换而制定的规则、标准或约定,可以简单地理解为计算机之间进行相互会话所使用的共同协议。通信双方必须使用相同的协议。RS232总线上传送的数字量采用负逻辑,并且关于地对称。单片机串行口通信的DB9接口,2脚RXD、3脚TXD、5脚GND必须连接线缆。当单片机要和电脑的DB9接口连接时,需要增加电平转换芯片。当Intel8051单片机要和电脑USB接口连接时,需要增加串行口转USB芯片。在串口通信中有两种通信方式,一种是通用异步串行通信方式(UART),一种是通用同步/异步串行通信方式(USART)。单片机异步通信10位通信格式,由起始位(StartBit)、8位有效数据字符(D0~D7)、停止位(StopBit)构成;波特率(BaudRate)是指单位时间内传送的码元符号(Symbol)的个数,串口通信的一个码元就是一个二进制符号(字符),所以波特率其实就是比特率,单位是比特每秒(bit/second,bps)。单片机波特率可以是一个固定值,此时只和电路系统时钟频率有关;也可以变化,此时由定时器溢出率产生。5.MCS-51单片机串行通信时,先发送低位,后发送高位。6.SCON中的REN=1表示允许接收。7.PCON中的SMOD=1表示波特率翻倍。8.SCON中的TI=1表示串行口发送中断请求。51单片机串口中断分为发送中断和接收中断两种。选择题(13道)串行口协议RS232规定的逻辑“1”电平是(C)3~15V3~5V-3~-15V-3~-5V现在串行口通信协议RS232的标准接口是(C)RJ45RS232DB9DB25USB在串口通信中有两种通信方式,下面名词中只有(C)表示同步/异步传输。A.UARTB.TXD/RXDC.USARTD.INT4在串口通信中有两种通信方式,下面名词中(A)表示异步传输。A.UARTB.TXD/RXDC.USARTD.INT4数据一位一位地顺序传送是(A)A.串行通信B.并行通信C.同步通信D.异步通信波特率为每秒钟传送的二进制数的位数其单位为()A.bpsB.kbsC.kpsD.bts串行通信中经常在传送过程中进行相应的检测常用的检测方法是()A.奇偶校验B格雷码校验、C.异或校验D.CRC校验单片机串口1,下面那个工作模式是可变波特率10位数据模式?工作模式0B.工作模式1C.工作模式2D.工作模式3串行口的控制寄存器为()A.SCONB.SMODC.UARTD.USART串行口工作在方式0时,串行数据从____输入或输出()A.RXDB.TXDC.UARTD.SCON51单片机输入、输出的逻辑电平为()A.TTLB.CMOSC.SSTLD.HXTL串行口的发送数据和接收数据端为()A.TXD/RXDB.TI/RIC.TB8/RB8D.BEN判断题串行通信数据传送特点是一位一位地顺序传送,传输速度快,成本高,传输线少(X)低并行通信数据传送特点是各位同时传送,传输速度快,成本高,传输线多(✓)按数据传送方向,串行通信可分为单工、双工和全双工三种制式(✓)在半双工制式下,通信一方只具备发送器,另一方则只具备接收器,数据只能按照一个固定的方向传送(X)单工制式串行口的字符帧也称数据帧,由起始位、数据位、奇偶校验位三部分组成(X)和停止位四部分PC机配置的RS-232C标准接口逻辑电平为正逻辑(X)负RS-232C为异步串行通信标准,字符帧格式与UART相同(✓)第七章课后练习题答案填空题I2C是一种串行总线,是在微电子通信控制领域广泛采用的一种总线标准,它是同步通信的一种特殊形式,具有接口线少,控制方式简化,器件封装形式小,通信速率较高等优点。I2C总线只有两根双向信号线:一根是数据线SDA,另一根是时钟线SCL,在主从通信中,可以有多个I2C总线器件同时接到I2C总线上,通过地址来识别通信对象。SDA和SCL都是双向线路,I2C总线需通过上拉电阻接正电源,当总线空闲时,两根线均为高电平,总线上任一器件输出的低电平,都将使总线的信号变低,即各器件的SDA及SCL都是线与关系。“线与”是指连接到总线的器件输出级是漏极开路或集电极开路,此时只要有一个器件输出低电平,总线就被拉低。I2C总线被启动后,多个主机在每发送一个数据位时都要对SDA信号线电平进行检测,只要检测的电平与自己发出的电平____相同____就会继续占用总线。总线控制遵循的原则是谁先发送_____低____电平谁就会掌握对总线的控制权。I2C可用于连接嵌入式处理器及其外围器件,它是广泛采用的一种串行___半___双工传输的总线标准。I2C总线中,发起数据传输操作的I2C器件是___主___控器件。

选择题I2C总线控制电视机是一种具有(C)线配对构成的双向信息总线电视机。A、一根地址线、一根数据线B、一根地址线、一根时钟线C、一根时钟线、一根数据线D、一根时钟线、一根控制线发送数据到总线上的器件是(A)。发送端接收端主器件从器件从总线上接收数据的是(B)。发送端接收端主器件从器件产生启动(START)指令、时钟(SCL)信号并中止数据传送(STOP指令)的器件是(C)。发送端接收端主器件从器件在I2C总线控制的彩色电视机中,各受控器之间是以(A)方式并接在总线上的。A、与B、或C、或非D、异或在I2C总线数据传输过程中,总线(A)产生节拍周期Clock。SCLSDA发送端接收端在I2C总线数据传输过程中,总线()产生数据位。SCLSDA发送端接收端在I2C总线数据传输过程中,在发送器发出一个(B)后,接收器要发出应答信号。位bit字节Byte字word8个字节I2C总线在通信时,数据传输的引脚是(B)A、SCKB、SDAC、DateD、都不是I2C总线共有(A)条信号线A、2B、1C、5D、8下面关于I2C的叙述中,错误的是(B)。A.

I2C是集成电路互连总线B.

I2C具有SDA、SCL和ACK共3条信号线C.

I2C传送数据时,每次传送的字节数目没有限制D.

I2C是多主总线I2C总线上传送的是(C)信号。A、低频模拟B、高频模拟C、串行数字D、并行数字在I2C总线通讯协议中,当SCL和SDA两线空闲时,二者的电平应为(D)。A、SCL为高电平,SDA为低电平B、SCL为低电平,SDA为高电平C、二者均为低电平D、二者均为高电平

判断题(5道)1、(√)所有并接在I2C总线上的器件与总线上其他所有电路的输出有线与功能。2、(√)在I2C总线控制电视机中,所有受控功能模块都必须有自己的从属地址。3、(√)在I2C总线上都接有上拉电阻,若该电阻开路,则会造成总线不能传输数据现象。4、(×)I2C总线控制电视机是通过一根时钟线和一根地址线对各项参数进行设定的。5、(√)在89C51中,当用某两根口线来实现I2C总线的功能时,这两根口线必须接上拉电阻。编程题已知某单片机系统,要将当前日期和按键次数存储在EEPROM(AT24C02)里,当有按键按下后,就将这些值取出来,并显示在数码管,电路参考任务23。具体要求如下:当按键1按下,存储年月日和按键次数,且每按下一次,按键次数就增加一次。EEPROM存储地址和格式如下:地址内容00H无01H年高2位02H年低2位03H月04H日05H按键次数。。。。。。当按键2按下,读取EEPROM数据,数码管显示当前日期和按键次数。为了对比和调试,同时将读取到的数据发送到串口。第八章课后习题答案填空题SPI接口是SerialPeripheralInterface的缩写,顾名思义就是串行外围设备接口。SPI接口是Motorola公司首先提出的全双工同步串行接口通信协议,采用主从模式架构,支持多从设备应用,一般只支持单主设备。SPI总线一般有4根信号线:MOSI、MISO、SCK、SS。在使用的时候,时钟由主设备控制,数据在时钟脉冲下按位传输,高位在前低位在后,SPI接口有2根单向数据线,可以实现全双工通信,数据速率可达几Mbps。DS1302和单片机之间的通信用到了三根线:RES复位、I/O数据和SCL时钟,简化的SPI总线将MOSI和MISO合并成了一根I/O线,收发不能同时进行,是半双工通信。DS1302的读写时序是三线半双工通信,一个时钟周期内有一个方向的数据选择题关于SPI总线,说法错误的是(C)A、MISO端子对于主机来说是数据输入端子B、MOSI端子对于主机来说是数据输出端子C、时钟信号由从机产生D、SS端子表示从机使能信号关于SPI总线,说法错误的是(B)A、时钟信号由主机产生B、SS端子表示主机使能信号C、SS端子由主机控制D、SCK端子用于通信同步的时钟信号如果在一个SPI总线上连接了多个SPI从设备,那么在使用某一从设备时,需要将该从设备的什么端子电位拉低(D)A、MISOB、MOSIC、SCKD、CSSPI通信需要的信号线(D)A、MISO、MOSIB、MOSI、SCK、/SSC、SCK、/SSD、MISO、MOSI、SCK、/SSDS1302寄存器总数(A)A、12B、11C、10D、13DS1302的SCLK引脚功能是(A)A、串行时钟B、串行数据C、并行时钟D、并行数据DS1302有几个寄存器与日期和时间相关(B)A、6B、7C、8D、5SPI总线使用最广泛的传输模式(A)A、SPI0、SPI3B、SPI1、SPI0C、SPI2、SPI1D、SPI3、SPI1DS1302中I/O的作用(C)A、复位B、提供时钟脉冲C、用于发送及接收数据D、数据传输判断题DS1302最基本的操作是读和写。(√)DS1302采用双电源供电模式。(√)SPI使用最广泛的模式是SPI0和SPI2。(×)SPI总线一般有4根信号线:MISO、MOSI、SCK、SS。(√)CPOL=0:时钟空闲状态为高电平。(×)CPHA=1:在时钟的第一个跳变沿进行数据采样。(×)DS1302有12个寄存器。(√)DS1302有6个寄存器与日期和时间相关,其余都是控制寄存器。(×)DS1302芯片的写时序:2个字节都是CPU控制I/O线。(√)DS1302芯片的读时序:第1个2字节是CPU控制I/O线,第2个字节是DS1302控制I/O线。(√)编程题程序初始化设置DS1302时间为2020年4月5日06时59分00秒星期三代码:#include"DS1302.h"/*******************************************************///数组定义/*******************************************************///DS1302读地址,秒分时日月星期年unsignedcharcodeDS1302_ReadAddr[7]={0x81,0x83,0x85,0x87,0x89,0x8B,0x8D};//DS1302写地址,秒分时日月星期年unsignedcharcodeDS1302_WriteAddr[7]={0x80,0x82,0x84,0x86,0x88,0x8A,0x8C};//DS1302初始化时间,202004050131400星期三unsignedcharTIME[7]={0,0x59,0x06,0x15,0x04,0x03,0x20};/*******************************************************//*******************************************************///函数名称:DS1302_Write//函数功能:向DS1302写入数据//入口参数:地址addr数据dat//出口参数:无/*******************************************************/voidDS1302_Write(u8addr,u8dat){ u8i; CE=0;//禁止数据传输 _nop_(); SCLK=0;//确保写数据前保持SCLK为低电平 _nop_(); CE=1;//即上升沿时开启数据传输 _nop_(); for(i=0;i<8;i++) { DATA=addr&0x01;//取数据最低位 addr>>=1;//数据右移 SCLK=1;//SCLK时钟上升沿时,DS1302读取数据 _nop_(); SCLK=0;//为写入dat数据做准备_nop_(); } for(i=0;i<8;i++) { DATA=dat&0x01;//取数据最低位 dat>>=1;//数据右移 SCLK=1;//SCLK时钟上升沿时,DS1302读取数据 _nop_(); SCLK=0;//为写入dat数据做准备 _nop_(); } CE=0;//数据传输结束 _nop_(); }/*******************************************************///函数名称:DS1302_Read//函数功能:读取任意地址的数据//入口参数:地址addr//出口参数:数据dat/*******************************************************/unsignedcharDS1302_Read(u8addr){ u8i,temp,dat; CE=0; _nop_(); SCLK=0; _nop_(); CE=1; _nop_(); for(i=0;i<8;i++) { DATA=addr&0x01;//取数据最低位 addr>>=1; SCLK=1; _nop_(); SCLK=0; _nop_(); } _nop_(); for(i=0;i<8;i++) { temp=DATA; dat=(dat>>1)|(temp<<7); SCLK=1; _nop_(); SCLK=0;//DS1302下降沿时,放置数据 _nop_(); } CE=0; _nop_(); SCLK=1; _nop_(); DATA=0; _nop_(); returndat;}/*******************************************************///函数名称:DS1302_Init//函数功能:初始化DS1302//入口参数:无//出口参数:无/*******************************************************/voidDS1302_Init(void){ u8i; DS1302_Write(0x8E,0x00);//禁止写保护 for(i=0;i<7;i++) { DS1302_Write(DS1302_WriteAddr[i],TIME[i]); } DS1302_Write(0x8E,0x80);//使能写保护}/*******************************************************///函数名称:DS1302_ReadTime//函数功能:读取时钟信息//入口参数:无//出口参数:无/*******************************************************/voidDS1302_ReadTime(void){ u8i; for(i=0;i<7;i++) { TIME[i]=DS1302_Read(DS1302_ReadAddr[i]); }}2、

显示年月日、时分秒

按下按键1选择模式【显示/更改】,按下按键2选择要更改的数,按键3【+】,按键4【-】代码详细内容1.main.c#include<REGX52.H>#include"LCD1602.h"#include"DS1302.h"#include"Key.h"#include"Timer0.h"unsignedcharKeyNumber,MODE,TimeSetSelect,TimeSetFlashFlag;unsignedcharYEAR(unsignedcharyear,month);voidTimeShow();voidTimeSet(); voidmain(){ LCD_Init(); DS1302_Init(); Timer0_Init(); DS1302_SetTime(); LCD_ShowString(1,1,"--"); LCD_ShowString(2,1,"::"); while(1){ KeyNumber=Key(); if(KeyNumber==1){ if(MODE==0)MODE=1; elseif(MODE==1){MODE=0;DS1302_SetTime();} } switch(MODE) { case0:TimeShow();break; case1:TimeSet();break; } }}//显示voidTimeShow(){ DS1302_ReadTime(); LCD_ShowNum(1,1,DS1302_Time[0],2); LCD_ShowNum(1,4,DS1302_Time[1],2); LCD_ShowNum(1,7,DS1302_Time[2],2); LCD_ShowNum(2,1,DS1302_Time[3],2); LCD_ShowNum(2,4,DS1302_Time[4],2); LCD_ShowNum(2,7,DS1302_Time[5],2);}//修改voidTimeSet(){ //选择需要更改的位 if(KeyNumber==2) { TimeSetSelect++; TimeSetSelect%=6; } //增加更改位的数,并判断是否越界 if(KeyNumber==3) { DS1302_Time[TimeSetSelect]++; if(DS1302_Time[0]>99){DS1302_Time[0]=0;} if(DS1302_Time[1]>12){DS1302_Time[1]=1;} if(YEAR(DS1302_Time[0]+2000,DS1302_Time[1])==31) { if(DS1302_Time[2]>31){DS1302_Time[2]=1;} } if(YEAR(DS1302_Time[0]+2000,DS1302_Time[1])==30) { if(DS1302_Time[2]>30){DS1302_Time[2]=1;} } if(YEAR(DS1302_Time[0]+2000,DS1302_Time[1])==29) { if(DS1302_Time[2]>29){DS1302_Time[2]=1;} } if(YEAR(DS1302_Time[0]+2000,DS1302_Time[1])==28) { if(DS1302_Time[2]>28){DS1302_Time[2]=1;} } if(DS1302_Time[3]>24){DS1302_Time[3]=0;} if(DS1302_Time[4]>59){DS1302_Time[4]=0;} if(DS1302_Time[5]>59){DS1302_Time[5]=0;} } //减小更改位的数,并判断是否越界 if(KeyNumber==4) { DS1302_Time[TimeSetSelect]--; if(DS1302_Time[0]>100){DS1302_Time[0]=99;} if(DS1302_Time[1]<1){DS1302_Time[1]=12;} if(YEAR(DS1302_Time[0]+2000,DS1302_Time[1])==31) { if(DS1302_Time[2]<1){DS1302_Time[2]=31;} if(DS1302_Time[2]>31){DS1302_Time[2]=1;} } if(YEAR(DS1302_Time[0]+2000,DS1302_Time[1])==30) { if(DS1302_Time[2]<1){DS1302_Time[2]=30;} if(DS1302_Time[2]>30){DS1302_Time[2]=1;} } if(YEAR(DS1302_Time[0]+2000,DS1302_Time[1])==29) { if(DS1302_Time[2]<1){DS1302_Time[2]=29;} if(DS1302_Time[2]>29){DS1302_Time[2]=1;} } if(YEAR(DS1302_Time[0]+2000,DS1302_Time[1])==28) { if(DS1302_Time[2]<1){DS1302_Time[2]=28;} if(DS1302_Time[2]>28){DS1302_Time[2]=1;} } if(DS1302_Time[3]>100){DS1302_Time[3]=24;} if(DS1302_Time[4]>100){DS1302_Time[4]=59;} if(DS1302_Time[5]>100){DS1302_Time[5]=59;} } //显示更改后的数据 if(TimeSetSelect==0&&TimeSetFlashFlag==1){LCD_ShowString(1,1,"");} else{LCD_ShowNum(1,1,DS1302_Time[0],2);} if(TimeSetSelect==1&&TimeSetFlashFlag==1){LCD_ShowString(1,4,"");} else{LCD_ShowNum(1,4,DS1302_Time[1],2);} if(TimeSetSelect==2&&TimeSetFlashFlag==1){LCD_ShowString(1,7,"");} else{LCD_ShowNum(1,7,DS1302_Time[2],2);} if(TimeSetSelect==3&&TimeSetFlashFlag==1){LCD_ShowString(2,1,"");} else{LCD_ShowNum(2,1,DS1302_Time[3],2);} if(TimeSetSelect==4&&TimeSetFlashFlag==1){LCD_ShowString(2,4,"");} else{LCD_ShowNum(2,4,DS1302_Time[4],2);} if(TimeSetSelect==5&&TimeSetFlashFlag==1){LCD_ShowString(2,7,"");} else{LCD_ShowNum(2,7,DS1302_Time[5],2);} /*LCD_ShowNum(2,10,TimeSetSelect,2); LCD_ShowNum(2,13,TimeSetFlashFlag,2);*/}//闰年判断,月份天数判断unsignedcharYEAR(unsignedcharyear,month){ if(year%400==0||year%4==0&&year%100!=0) { if(month==2) return29; } else { if(month==1||month==3||month==5||month==7||month==8||month==10||month==12) return31; elseif(month==4||month==6||month==9||month==11) return30; else return28; } return0;}//定时器voidTimer0_Routine()interrupt1{ staticunsignedintcount0=0; TL0=0x18; //设置定时初值 TH0=0xFC; //设置定时初值 count0++; if(count0==300){ count0=0; TimeSetFlashFlag=!TimeSetFlashFlag; } }2.DS1302.c#include<REGX52.H>#defineDS1302_SECOND0x80#defineDS1302_MINUTE 0x82#defineDS1302_HOUR 0x84#defineDS1302_DATE 0x86#defineDS1302_MONTH 0x88#defineDS1302_DAY 0x8A#defineDS1302_YEAR 0x8C#defineDS1302_WP 0x8EsbitDS1302_SCLK=P3^6;sbitDS1302_IO=P3^4;sbitDS1302_CE=P3^5;unsignedcharDS1302_Time[]={22,12,31,23,59,58,2};/***@briefBCD转10进制*@param*@retval*/unsignedcharBCD_10(unsignedcharNum){ unsignedcharTemp; Temp=Num/10*16+Num%10; returnTemp;}/***@brief10进制转BCD码*@param*@retval*/unsignedcharTen_BCD(unsignedcharNum){ unsignedcharTemp; Temp=Num/16*10+Num%16; returnTemp;}/***@brief初始化DS1302*@param*@retval*/voidDS1302_Init(){ DS1302_SCLK=0; DS1302_CE=0;}/***@brief写入字节*@param*@retval*/voidDS1302_WriteByte(unsignedcharCommand,Data){ unsignedchari; DS1302_CE=1; for(i=0;i<8;i++){ DS1302_IO=Command&(0x01<<i); DS1302_SCLK=1; DS1302_SCLK=0; } for(i=0;i<8;i++){ DS1302_IO=Data&(0x01<<i); DS1302_SCLK=1; DS1302_SCLK=0; } DS1302_CE=0;}/***@brief读取字节*@param*@retval*/unsignedcharDS1302_ReadByte(unsignedcharCommand){ unsignedchari,Data=0x00; Command|=0x01; DS1302_CE=1; for(i=0;i<8;i++){ DS1302_IO=Command&(0x01<<i); DS1302_SCLK=0; DS1302_SCLK=1; } for(i=0;i<8;i++){ DS1302_SCLK=1; DS1302_SCLK=0; if(DS1302_IO){Data|=(0x01<<i);} } DS1302_CE=0; DS1302_IO=0; returnData;}/***@brief将数组内容写入*@param*@retval*/voidDS1302_SetTime(){ DS1302_WriteByte(DS1302_WP,0x00); DS1302_WriteByte(DS1302_YEAR,BCD_10(DS1302_Time[0])); DS1302_WriteByte(DS1302_MONTH,BCD_10(DS1302_Time[1])); DS1302_WriteByte(DS1302_DATE,BCD_10(DS1302_Time[2])); DS1302_WriteByte(DS1302_HOUR,BCD_10(DS1302_Time[3])); DS1302_WriteByte(DS1302_MINUTE,BCD_10(DS1302_Time[4])); DS1302_WriteByte(DS1302_SECOND,BCD_10(DS1302_Time[5])); DS1302_WriteByte(DS1302_DAY,BCD_10(DS1302_Time[6])); DS1302_WriteByte(DS1302_WP,0x80);}/***@brief读出数组内容*@param*@retval*/voidDS1302_ReadTime(){ DS1302_Time[0]=Ten_BCD(DS1302_ReadByte(DS1302_YEAR)); DS1302_Time[1]=Ten_BCD(DS1302_ReadByte(DS1302_MONTH)); DS1302_Time[2]=Ten_BCD(DS1302_ReadByte(DS1302_DATE)); DS1302_Time[3]=Ten_BCD(DS1302_ReadByte(DS1302_HOUR)); DS1302_Time[4]=Ten_BCD(DS1302_ReadByte(DS1302_MINUTE)); DS1302_Time[5]=Ten_BCD(DS1302_ReadByte(DS1302_SECOND)); DS1302_Time[6]=Ten_BCD(DS1302_ReadByte(DS1302_DAY));}3.DS1302.h#ifndef__SD1302_H__#define__SD1302_H__externunsignedcharDS1302_Time[];voidDS1302_Init();voidDS1302_ReadTime();voidDS1302_SetTime();#endif4.

Delay.cvoidDelay(unsignedintt) //延时函数{ unsignedchari,j; while(t){ i=2; j=239; do { while(--j); }while(--i); t--; } }5.

Delay.h#ifndef__DELAY_H__#define__DELAY_H__voidDelay(unsignedintt);#endif6.Key.c#include<REGX52.H>#include"Delay.h"/***@brief获取独立按键键码*@param无*@retvalKeyNumber键码*/unsignedcharKey(){ unsignedcharKeyNumber=0; if(P3_1==0){Delay(20);while(P3_1==0);Delay(20);KeyNumber=1;} if(P3_0==0){Delay(20);while(P3_0==0);Delay(20);KeyNumber=2;} if(P3_2==0){Delay(20);while(P3_2==0);Delay(20);KeyNumber=3;} if(P3_3==0){Delay(20);while(P3_3==0);Delay(20);KeyNumber=4;} returnKeyNumber;}7.Key.h#ifndef__KEY_H__#define__KEY_H__unsignedcharKey();#endif8.LCD1602.c#include<REGX52.H>//引脚配置:sbitLCD_RS=P2^6;sbitLCD_RW=P2^5;sbitLCD_EN=P2^7;#defineLCD_DataPortP0//函数定义:/***@briefLCD1602延时函数,12MHz调用可延时1ms*@param无*@retval无*/voidLCD_Delay(){ unsignedchari,j; i=2; j=239; do { while(--j); }while(--i);}/***@briefLCD1602写命令*@paramCommand要写入的命令*@retval无*/voidLCD_WriteCommand(unsignedcharCommand){ LCD_RS=0; LCD_RW=0; LCD_DataPort=Command; LCD_EN=1; LCD_Delay(); LCD_EN=0; LCD_Delay();}/***@briefLCD1602写数据*@paramData要写入的数据*@retval无*/voidLCD_WriteData(unsignedcharData){ LCD_RS=1; LCD_RW=0; LCD_DataPort=Data; LCD_EN=1; LCD_Delay(); LCD_EN=0; LCD_Delay();}/***@briefLCD1602设置光标位置*@paramLine行位置,范围:1~2*@paramColumn列位置,范围:1~16*@retval无*/voidLCD_SetCursor(unsignedcharLine,unsignedcharColumn){ if(Line==1) { LCD_WriteCommand(0x80|(Column-1)); } elseif(Line==2) { LCD_WriteCommand(0x80|(Column-1+0x40)); }}/***@briefLCD1602初始化函数*@param无*@retval无*/voidLCD_Init(){ LCD_WriteCommand(0x38);//八位数据接口,两行显示,5*7点阵 LCD_WriteCommand(0x0c);//显示开,光标关,闪烁关 LCD_WriteCommand(0x06);//数据读写操作后,光标自动加一,画面不动 LCD_WriteCommand(0x01);//光标复位,清屏}/***@brief在LCD1602指定位置上显示一个字符*@paramLine行位置,范围:1~2*@paramColumn列位置,范围:1~16*@paramChar要显示的字符*@retval无*/voidLCD_ShowChar(unsignedcharLine,unsignedcharColumn,charChar){ LCD_SetCursor(Line,Column); LCD_WriteData(Char);}/***@brief在LCD1602指定位置开始显示所给字符串*@paramLine起始行位置,范围:1~2*@paramColumn起始列位置,范围:1~16*@paramString要显示的字符串*@retval无*/voidLCD_ShowString(unsignedcharLine,unsignedcharColumn,char*String){ unsignedchari; LCD_SetCursor(Line,Column); for(i=0;String[i]!='\0';i++) { LCD_WriteData(String[i]); }}/***@brief返回值=X的Y次方*/intLCD_Pow(intX,intY){ unsignedchari; intResult=1; for(i=0;i<Y;i++) { Result*=X; } returnResult;}/***@brief在LCD1602指定位置开始显示所给数字*@paramLine起始行位置,范围:1~2*@paramColumn起始列位置,范围:1~16*@paramNumber要显示的数字,范围:

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论