1.什么是单片机?单片机和通用微机相比有何特点? 答:单片机又称为单片微计算机,它的结构特点是将微型计算机的基本功能部件(如处理器(CPU)、存储器、输入接口、输出接口、定时/计数器及终端系统等)全部集成在一个半导体芯片上。 虽然单片机只是一个芯片,但无论从组成还是从逻辑功能上来看,都具有微机系统的定义。与通用的微型计算机相比,单片机体积小巧,可以嵌入到应用系统中作为指挥决策中心,是应用系统实现智能化。
2.单片机的发展有哪几个阶段?8位单片机会不会过时,为什么?
答:单片机诞生于1971年,经历了SCM、MCU、SOC三大阶段,早期的SCM单片机都是8位或4位的。其中最成功的是INTEL的8031,此后在8031上发展出了MCS51系列MCU系统。基于这一系统的单片机系统直到现在还在广泛使用。随着工业控制领域要求的提高,开始出现了16位单片机,但因为性价比不理想并未得到很广泛的应用。90年代后随着消费电子产品大发展,单片机技术得到了巨大提高。随着INTEL i960系列特别是后来的ARM系列的广泛应用,32位单片机迅速取代16位单片机的高端地位,并且进入主流市场。然而,由于各应用领域大量需要的仍是8位单片机,因此各大公司纷纷推出高性能、大容量、多功能的新型8位单片机。
目前,单片机正朝着高性能和多品种发展,但由于MCS-51系列8位单片机仍能满足绝大多数应用领域的需要,可以肯定,以MCS-51系列为主的8位单片机,在当前及以后的相当一段时间内仍将占据单片机应用的主导地位。
3.举例说明单片机的主要应用领域。
答:单片机广泛应用于仪器仪表、家用电器、医用设备、航空航天、专用设备的智能化管理及过程控制等领域,大致可分如下几个范畴: 智能仪器
单片机具有体积小、功耗低、控制功能强、扩展灵活、微型化和使用方便等优点,广泛应用于仪器仪表中,结合不同类型的传感器,可实现诸如电压、电流、功率、频率、湿度、温度、流量、速度、厚度、角度、长度、硬度、元素、压力等物理量的测量。采用单片机控制使得仪器仪表数字化、智能化、微型化,且功能比起采用电子或数字电路更加强大。例如精密的测量设备(电压表、功率计,示波器,各种分析仪)。 工业控制
单片机具有体积小、控制功能强、功耗低、环境适应能力强、扩展灵活和使用方便等优点,用单片机可以构成形式多样的控制系统、数据采集系统、通信系统、信号检测系统、无线感知系统、测控系统、机器人等应用控制系统。例如工厂流水线的智能化管理,电梯智能化控制、各种报警系统,与计算机联网构成二级控制系统等。 家用电器现在的家用电器广泛采用了单片机控制,从电饭煲、洗衣机、电冰箱、空调机、彩电、其他音响视频器材、再到电子秤量设备和白色家电等。
网络和通信
现代的单片机普遍具备通信接口,可以很方便地与计算机进行数据通信,为在计算机网络和通信设备间的应用提供了极好的物质条件,现在的通信设备基本上都实现了单片机智能控制,从手机,电话机、小型程控交换机、楼宇自动通信呼叫系统、列车无线通信、再到日常工作中随处可见的移动电话,集群移动通信,无线电对讲机等。 医用设备领域
单片机在医用设备中的用途亦相当广泛,例如医用呼吸机,各种分析仪,监护仪,超声诊断设备及病床呼叫系统等等。 模块化系统
某些专用单片机设计用于实现特定功能,从而在各种电路中进行模块化应用,而不要求使用人员了解其内部结构。如音乐集成单片机,看似简单的功能,微缩在纯电子芯片中(有别于磁带机的原理),就需要复杂的类似于计算机的原理。如:音乐信号以数字的形式存于存储器中(类似于ROM),由微控制器读出,转化为模拟音乐电信号(类似于声卡)。在大型电路中,这种模块化应用极大地缩小了体积,简化了电路,降低了损坏、错误率,也方便于更换。 汽车电子 单片机在汽车电子中的应用非常广泛,例如汽车中的发动机控制器,基于CAN总线的汽车发动机智能电子控制器、GPS导航系统、abs防抱死系统、制动系统、胎压检测等。
此外,单片机在工商、金融、科研、教育、电力、通信、物流和国防航空航天等领域都有着十分广泛的用途。
4.将十进制数37转换为二进制,BCD码和十六进制数,并对转换结果进行对比分析。
答:37=(100101)B=(25)H;BCD 码为 0011 0111; 可见,同一个数用不同进制表示,其结果也不同。
5.写出下列十进制数在8位微机中的原码,反码和补码形式。 (1)+36
原码 0010 0100B 反码 0010 0100B 补码 0010 0100B (2)-36
原码 1010 0100B 反码 1101 1011B 补码 1101 1100B (3)+127
原码 0111 1111B 反码 0111 1111B 补码 0111 1111B (4)-128
原码 1000 0000B 反码 0111 1111B
补码 1000 0000B (5)-121
原码 1111 1001B
反码 1000 0110B
补码 1000 0111B
6.对于二进制数1000 1001B,若理解为无符号数,则该数对应十进制数为多少?若理解为有符号数,则该数对应十进制为多少?若理解为BCD数,则该数对应十进制数为多少?
答:1000 1001B 无符号数:137
有符号数:-9; BCD数:;
7.对下列各组数进行“与”,“或”和“异或”运算。 (1)1010 1010 和 0000 0000
与 0000 0000 或 1010 1010 异或 1010 1010
(2) 0111 0111 和 1000 1000
与 0000 0000 或 1111 1111 异或 1111 1111
(3) 1110 1110 和 0111 0111
与 0110 0110 或 1111 1111 异或 1001 1001
(4) 0011 1100 和 1111 0000
与 0011 0000 或 1111 1100 异或 1100 1100
8.Proteus ISIS的工作界面中包含哪几个窗口?菜单栏中包含哪几个选项?
答:Proteus ISIS的工作界面主要包括标题栏、菜单栏、工具栏、状态栏、方位控制按钮、仿真进程控制按钮、对象选择窗口,原理图编辑窗口和预览窗口等。
主菜单栏包含文件、查看、编辑、工具、设计、图形、源文件、调试、库、模板、系统、帮助选项。
9.利用ISIS模块开发单片机系统需要经过哪几个主要步骤? 答:
(1)启动ISIS;
(2)绘制电路原理图; (3)输入单片机程序; (4)进行源代码调试; (5)仿真运行。
10.何谓PCB?利用ARES模块进行PCB设计需要经过哪几个主要步骤? 答:PCB(Printed Circuit Board),中文名称为印制电路板,又称印刷电路板、印刷线路板,是重要的电子部件,是电子元器件的支撑体,是电子元器件电气连接的提供者。由于它是采用电子印刷术制作的,故被称为“印刷”电路板。 利用ARES模块进行PCB设计的主要步骤:
(1)启动ARES; (2)元器件布局; (3)元器件布线; (4)铺铜; (5)三维效果图; (6)CADCAM输出。
第2章 MCS-51单片机结构及原理 习题
1. MSC-51单片机内部由哪些功能部件组成,各有什么功能? 答:以51单片机为例,其内部功能部件有: 控制器:是对取自程序存储器中的指令进行译码,在规定的时刻发出各种操作所需的控制信号,完成指令所规定的功能;
运算器:根据控制器发来的信号,执行算术逻辑运算操作; 存储器:包括程序存储和数据存储器;
定时器计数器:2个16位定时器/计数器,可对机器周期计数,也可对外部输入脉冲计数;
中断系统:可响应三个内部中断源和两个外部中断源的中断请求; 输入输出接口:4个8位并行口和一个全双工串行口;
2.MSC-51单片机外部引脚的名称是什么?各有什么功能? 答:(1) 电源及晶振引脚 VCC(40脚):+5V电源引脚 VSS(20脚): 接地引脚
XTAL1(19脚);外接晶振引脚(内置放大器输入端) XTAL2(18脚):外接晶振引脚(内置放大器输出端) (2) 控制引脚
RST/VPD(9)为复位/ 备用电源引脚
ALE/PROG(30)为地址锁存使能输出/ 编程脉冲输入 PSEN(29):输出访问片外程序存储器读选通信号 EA/ VPP (31):外部ROM允许访问/ 编程电源输入 (3) 并行I/O口引脚
P0.0~P0.7(39~32脚)——P0口; P1.0~P1.7(1~8脚)——P1口; P2.0~P2.7(21~28脚)——P2口; P3.0~P3.7(10~17脚)——P3口。
3.51系列单片机的封装有哪些类型?请说明每一种封装引脚之间的距离。
答:51系列单片机的封装有:
40引脚双列直插封装(DIP——dual in-line package),引脚之间的距离是100mil();
44引脚方形扁平封装(QFP ——quad flat package)方式,引脚之间的距离是;
44引脚带引线的塑料芯片载体PLCC(Plastic Leaded Chip Carrier)。
4.什么是复位?单片机复位电路有哪几种,工作原理分别是什么? 答:复位——使单片机恢复原始默认状态的操作。
单片机复位电路有:上电复位电路,由电阻和电容构成,通过上电时,电容相当于短路而使复位引脚在晶振有效的情况下保持2个机器周期的高电平;按钮开关复位电路,由两个电阻的分压构成,通过手工按下按钮,使复位引脚在晶振有效的情况下保持2个机器周期的高电平。
5.通常的微机系统存储器结构有哪几种?MCS-51单片机存储器属于哪一类? CS-51可寻址多大空间?
答:通常的微机系统存储器结构有两种结构,即哈佛结构和冯诺依曼结构(也叫普林斯顿结构),MCS-51单片机存储器属于,MCS-51可寻址空间是两个KB,即KB的程序存储空间和KB的数据存储空间。 6.片内RAM中低128个单元划分为哪三个主要部分?各部分的主要功能是什么? 答:片内RAM中低128个单元划分为三个部分: ①工作寄存器区(00H-1FH),四组,每组8个,可作用工作寄存器切换使用; ②可位寻址区(20H-2FH),16B,位地址为00H-7FH,用作为按位寻址的空间; ③用户RAM区(30H-7FH),80B,用作普通RAM单元或堆栈。
7.程序状态字寄存器PSW各位的定义是什么? 答:程序状态字寄存器PSW各位的定义如下:
PSW.7 CY C PSW.6 AC A PSW.5 F0 F PSW.4 RS1 RS PSW.3 RS0 RS PSW.2 OV O PSW.1 F1 F PSW.0 P P PSW.7:进/借位标志CY,加法有进位时置1,减法有借位时置1; PSW.6:辅助进位标志AC,加法运算低四位向高上四位有进位时置1; PSW.5、PSW.1:用户标志位F0和用户标志位F1, 保存用户的位数据;
PSW.4、PSW.3:工作寄存器选择控制位RS1和RS0,00至11分别选择四组工作之一作为当前工作寄存器
PSW.2 :溢出标志位OV,有符号数加、减运算结果有溢出或乘除上结果异常(乘法运算结果大于255即乘积在BA中,或除法运算除数为0)时置1 PSW.0:奇偶标志位P,累加器A中1的个数为奇数时置1。
8.什么是时钟周期?什么是机器周期?什么是指令周期?当振荡频率为12MHz时,一个机器周期为多少微秒?
答:时钟周期又叫振荡周期或拍,用P表示,是MCS-51单片机中最小的时间单位,在一个时钟周期内,CPU完成一个最基本的动作。 机器周期:由12个时钟周期构成,完成一个基本操作
指令周期:是执行一条指令所需的时间,根据指令的复杂性,可由1~4个机器周期构成。
当振荡频率为12MHz时,一个机器周期为1微秒。
9.P0、P1、P2和P3口的结构和功能分别是什么?
答:P0口的每一位由1个锁存器 、2个三态缓冲器 、1个输出控制电路(非门 X、与门、电子开关MUX、输出驱动电路构成,其功能既可以作为通用I/O口实现输入/输出功能,也可作为单片机地址线的低8位和数据线实现外部扩展功能。在用作输入输出口时,需外接上拉电阻。
P1口的每一位由1个锁存器 、1个场效应管驱动器V和2个三态门缓冲器构成,其作用是用作输入输出口
P2口的每一位由1个锁存器、2个三态缓冲器、1个输出控制单元、1个输出驱动单元构成,其功能是用作输入输出口,或地址总线的高8位。
P3口的每一位由1个锁存器、2个三态缓冲器、1个第二功能控制单元 、1个输出驱动单元构成,其作用是用作输入输出口或第二功能。
10.51单片机引脚ALE的作用是什么?当51不外接存储器时,ALE上的输出的脉冲频率是多少? 答:51单片机引脚ALE的作用是对外部存储寻址时锁存P0口输出的低8位地址,当51不外接存储器时,ALE上的输出的脉冲频率是fosc/6。
第3章 单片机的汇编语言与程序设计 习题
1.MCS-51单片机有哪几种寻址方式?适用于什么地址空间?
答:MCS-51单片机有7种寻址方式:直接寻址、寄存器寻址、寄存器间接寻址、立即寻址、变址寻址、位寻址、相对寻址。
直接寻址方式:操作数的地址由指令直接给出,适用于片内RAM的所有地址空间;如 MOV A,68H
MOV A,PSW 寄存器寻址方式:指令给出的是寄存器的编码,操作数在编码指定的寄存器中,适用于片内00H至1FH的32个字节,用R0,…,R7表示,通过PSW的RS1和RS0选择组号确定对应32个字节中的其中8个,还有累加器A,以及乘除法指令中的A和B寄存器,位寻址方式中的布尔累加器C;
MOV A,R1 MUL AB INC DPTR 寄存器间接寻址方式:指令给出的是寄存器的编码,操作数地址在编码指定的寄存器中,适用于片内RAM的全部空间,其中52系列中的80H至FFH只能用寄存器间接寻址;如 MOV A,@R0
MOV A,@R1
MOVX A,@DPTR 立即寻址方式:操作数本身在指令中直接,给出适用于用8位立即数对片内RAM所有地址单元赋值,也可用16位立即数对DPTR赋值; 如
MOV A,#0E2H MOV DPTR,#2000H 变址寻址方式:以DPTR或PC作为基地址寄存器,以累加器A作为变址寄存器,将基址寄存器与变址寄存器的内容相加形成操作数的实际地址的一种寻址方式,变址寻址方式适用于程序存储器ROM,仅有三条指令如下:
MOVC A,@A+DPTR
MOVC A,@A+PC JMP @A+DPTR
位寻址方式:指令中直接给出操作数所在单元的位地址,适用于片内RAM中地址20H至2FH中的16个字节中的128个位地址空间和80H至FFH中地址中可以被8整除的所有SFR中的每个位地址空间;如
MOV C,7FH MOV F0,C MOV C,ACC.7
相对寻址方式:为相对转移指令而设,指令中直接给出转移的相对偏移量,其转移目标在当前指令-128至+127字节范围内的地址空间。如 SJMP START
HERE: SJMP HERE ;等效于: SJMP $ 2.MCS-51单片机的PSW程序状态字中无ZERO(零)标志位,怎样判断某内部数据单元的内容是否为零?
答:MCS-51单片机的PSW程序状态字中无ZERO(零)标志位,判断某内部数据单元的内容是否为零是能通过取数到A累加器,再判断A中的每一位是否为零来确定其值是否为零。
3.编程将内部RAM的20H--30H单元内容清零。
解:设一个片内RAM指针R0,先指向首地址20H,通过累加器A清零,然后采用间接寻址方式依次将A中的零值传送到指针所指的片内RAM单元,每传送一个字节,地址指针加1,直到达到地址为30H或达到计数器规定的17个字节为止。 程序1: MOV R0,#20H ;设地址指针初值 CLR A ;累加器清0 CONT: MOV @R0,A ;置0指针所指单元 INC R0 ;地址指针加1
CJNE R0,#31H,CONT ;指针未超过终点则继续 SJMP $ ;暂停 程序2: MOV R0,#20H ;设地址指针初值 CLR A ;累加器清0 MOV R7,#17 ;计数器赋初值,从20H到30H共17个字节 CONT: MOV @R0,A ;置0指针所指单元
INC R0 ;地址指针加1
DJNZ R7, CONT ;计数器减1,非0,则继续 SJMP $ ;暂停 4.编程查找内部RAM的32H~41H单元中是否有0AAH这个数据,若有这一数据,则将50H单元置为0FFH,否则将50H单元清零。
解:设一个片内RAM指针R0,先指向首地址32H,比较@R0与#0AAH,若相等,则退出循环,给50H单元赋0FFH,若不相等,则R0加1为继续比较下一个字节做准备,直到达到地址为41H或达到计数器规定的16个字节为止还没找到,则给50H单元赋00H 程序1: MOV R0,#32H ;设地址指针初值
CONT: CJNE @R0,#0AAH,NEXT;比较查找值与指针所指单元的值,不相等转移 MOV A,#0FFH ;相等,则准备好要赋的标志值0FFH SJMP DOWN ;转存到保存结果处 NEXT: INC R0 ;修改地址指针
CJNE R0,#42H,CONT ;若指针未越过终点,则继续 MOV A,#00H ;查找失败,则将00H存入结果标志单元 DOWN: MOV 50H,A ;将比较结果标志存入50H单元 SJMP $ ;暂停 END 程序2: MOV R7,#16 ;计数器赋初值,从20H到30H共16个字节 MOV R0,#32H ;设地址指针初值
CONT: CJNE @R0,#0AAH,NEXT ;比较查找值与指针所指单元的值,不相等转移
MOV A,#0FFH ;相等,则准备好要赋的标志值0FFH SJMP DOWN ;转存到保存结果处 NEXT: INC R0 ;修改地址指针
DJNZ R7,CONT ;计数器减1,非0,则继续 MOV A,#00H ;查找失败,则将00H存入结果标志单元 DOWN: MOV 50H,A ;将比较结果标志存入50H单元 SJMP $ ;暂停 END
5.查找20H~4FH单元中出现00H的次数,并将查找结果存入50H单元。 解:从20H到4FH共48个字节 MOV R7,#48 ;字节计数器赋初值
MOV R0,#20H ;设地址指针初值
CONT: CJNE @R0,#00H,NEXT ;比较查找值与指针所指单元的值,不相等转移 INC R6 ;相等,0的个数计数器加1 NEXT: INC R0 ;修改地址指针
DJNZ R7,CONT ;计数器减1,非0,则继续 MOV 50H,R6 ;保存O的个数计数值到50H单元 SJMP $ ;暂停
END END
6.已知A=83H,R0=17H,(17H)=34H,写出下列程序段执行之后的A中的内容。 ANL A,#17H ORL 17H,A XRL A,@R0 CPL A END 答:
ANL A,#17H ;A=03H ORL 17H,A ;(17H)=0011 0100 ∨ 0000 0011=0011 0111 XRL A,@R0 ;A= 0000 0011 ∨ 0011 0111 =0011 0100 CPL A ;A=1100 1011
7.已知单片机的晶振频率为12MHz,分别设计延时为0.1s、1s的子程序。 答:已知单片机的晶振频率为12MHz,则机器周期为1us,延时子程序是通过执行指令序列中机器周期数来达到,如果要0.1s,即100ms,也就是100000us,所以需要机器周期数达到100000。要延时达到1S,可通过对延时为0.1秒的子程序调用10次来实现。 DELAY100MS: MOV R6,#200 ;1个机器周期 D1: MOV R7,#250 ;1个机器周期 D2: NOP ;1个机器周期 DJNZ R7,D2 ;2个机器周期,3*251=753 DJNZ R6,D1 ;2个机器周期,(1+753+2)*132=99792 RET ;2个机器周期,1+99792+2=99795,约100ms
DELAY1S: MOV R7,#10 ;计数10次 1 LOOP: ACALL DELAY100MS ;延时100ms子程序 99795+2
DJNZ R7,LOOP ;未达到10次则继续 10*(2+99795+2) RET ;返回2+10*(2+99795+2)=997992
8.内部RAM从20H单元开始处有一数据块,以ODH为结束标志,试统计该数据块的长度,将该数据块送到外部数据存储器7E01H开始的单元,并将长度存入7E00H单元。
解:从20H的指针用R0,从外部RAM7E01开始的指针用DPTR,计数器用R7 MOV R7,#0 ;字节计数器赋初值 MOV R0,#20H ;设片内RAM地址指针初值 MOV DPTR,#7E01H ;设片外RAM地址指针初值 CONT: MOV A,@R0 ;取片内RAM中的一个字节 MOVX @DPTR,A ;存入片外RAM指针所指单元 INC R7 ;长度计数器加1 INC R0 ;片内RAM地址指针加1 INC DPTR ;片外RAM地址指针加1 CJNE A,#0DH,CONT ;未达到结束标志 MOV A,R7 ;取块计数长度值 MOVX @DPTR,A ;保存
SJMP $ ;暂停 END
9.内部RAM从DATA开始的区域中存放着10个单字节十进制数,求其累加和,并将结果存入SUM和SUM+1单元。
解:R7计数,R6保存累加和高8位,R0用作地址指针 ORG 0000H LJMP MAIN ORG 100H SUM EQU 30H DATAA EQU 40H MAIN: MOV R7,#10 ;字节计数器赋初值 MOV R0,#DATAA ;设片内RAM地址指针初值 CLR A ;累加器清0 MOV R6,A ;累加结果的高8位 CONT: ADD A,@R0 ;加RAM中的一个字节到ACC DA A JNC NEXT ;若无进位则不用管高8位 INC R6 ;有进位,高8位加1 NEXT: INC R0 ;片内RAM地址指针加1 DJNZ R7,CONT ;未完继续 MOV SUM,A ;保存低8位 MOV SUM+1,R6 ;保存高8位 SJMP $ ;暂停 END 10.内部RAM从DATA1和DATA2单元开始处存放着两个等长的数据块,数据块的长度在LEN单元中。请编程检查这两个数据块是否相等,若相等,将0FFH写入RESULT单元,否则将0写入RESULT单元。
解:从DATA1开始的指针用R0,从DATA2开始的指针用R1,计数器用R7 LEN EQU 10 DATA1 EQU 30H DATA2 EQU 40H RESULT EQU 50H MOV R7,#LEN ;字节计数器赋初值 MOV R0,#DATA1 ;设片内RAM地址指针初值 MOV R1,#DATA2 ;设片外RAM地址指针初值 CONT: MOV A,@R0 ;取片内RAM R0所指的的一个字节 MOV 7FH,@R1 ;将R1所指单元内容取到片内RAM地址7FH中 CJNE A,7FH,NOEQ ;比较,不相等则结束 INC R0 ;DATA1 RAM地址指针加1 INC R1 ;DATA2 RAM地址指针加1 DJNZ R7,CONT ;未完,继续 MOV A,#0FFH ;相等,准备写入FFH SJMP DOWN ;转写入结果处 NOEQ: MOV A,#0 ;不相等,准备写入00H
DOWN: MOV RESULT,A ;保存比较结果标志 SJMP $ ;暂停 END
11.编制程序,将内部RAM中M1、M2、M3和M4单元中的无符号数xl、x2、x3和x4相加,并把和存入RO和R1(R0中为高8位)中。 解:
M1 EQU 30H M2 EQU 40H M3 EQU 45H M4 EQU 4FH MOV A,M1 ;取第一个数 ADD A,M2 ;与第二个数相加 JNC NEXT1 ;如果无进位,则转移至第三个相加 MOV R0,#1 ;有进位,高8位置1 NEXT1: ADD A,M3 ;与第三个数相加 JNC NEXT2 ;没有进位,则转至第四个数相加 INC R0 ;有进位,高8位加1 NEXT2: ADD A,M4 ;与第四个数相加 JNC NEXT3 ;没有进位,则转至结束 INC R0 ;有进位,高8位再加1 NEXT3: MOV R1,A ;低8位保存到R1 SJMP $ ;暂停 END
第4章 单片机的C51语言 习题
1.C语言的优点是什么?C程序的主要结构特点是什么?
答:C语言是一种高级语言,学习比低级容易,不需要具体组织、分配存储器资源和处理端口数据,可以直接驱动单片机的所有资源。
C程序以函数为单位,由一个主函数和若干个其他函数构成,主函数是程序的入口,其他函数由主函数直接或间接调用。程序可以由一个文件或多个文件组成。文件类型包括头文件和C语言源文件,也可以是汇编语言文件,C程序可与汇编语言混合编程。
2.C51语言的变量定义包含哪些关键因素?为何这样考虑? 答:C语言的变量定义格式如下:
[存储种类] 数据类型 [存储类型] 变量名 其中:
存储种类与标准C语言相同,包括:自动型(auto)、外部型(extern)、静态型(static)、寄存器型(register)。
数据类型除了包含标准C语言类型的字符型(char),整型(int),长整型(long),浮点型(float),双精度型(double)外,还有二进制位型(bit),特殊功能寄存器型(sfr),SFR可位寻址的位类型(sbit)。
存储类型包括:片内RAM区(data)、片内可位寻址区(bdata),片内RAM间接寻址区(idata),片外RAM页寻址区(pdata),片外RAM区(xdata)、ROM区(code)。
只所以比标准C语言多了存储类型,就是因为MCS-51单片机的存储结构中有四个物理存储空间(片内RAM、片内ROM,片外RAM,片外ROM),三个逻辑地址空间(片内RAM,片外RAM,ROM),而且有多种寻址方式(直接寻址、间接寻址、页面寻址、位寻址)所致,所以在定义变量时,要根据其所在位置和寻址方式明确指定存储类型。
3.C51与汇编语言的特点各有哪些?怎样实现两者的优势互补?
答:C51是结构化语言,代码紧凑;接近自然语言,程序可读性强,易于调试、维护;库函数丰富,编程工作量小,可使产品开发周期短;具有机器级控制能力,功能很强,适合于嵌入式系统开发;汇编指令无关,易于掌握,上手快。
汇编语言优点是编写的程序代码精炼、执行速度快,在相同功能下,汇编语言程序可能比C语言程序效率高。缺点是对程序员要求高,必须对单片机的硬件结构非常熟悉才能编程,不便于编写比较复杂的程序。 可根据需要对要求时间性很强的代码用汇编语言编写,其它部分用C语言编写,两者混合编程就可以实现优势互补。
4.指出下面程序的语法错误: #include void delay();{ cgar i; for(i=O; i<=255; ”++”); } 答: #include a=C; //a和C必须先定义才可使用 int a=7,C //缺分号,应该提在使用前说明 delay(10) //延时子程序必须先定义,或先有函数原型说明 void delay();{ //作为函数定义,有函数定义不能嵌套的问题, //即不能在一个函数内定义另一个函数,而且“{”前不应有分号 //作为函数原型说明,应该放在函数调用之前,且其后不应该接函数体 cgar i; //字符型应该是unsigned char for(i=O; i<=255; ”++”);// ”++”应改成i++ } //主函数没有结束,缺”}” 5.定义变量a,b,c,其中a为内部RAM的可位寻址区的字符变量,b为外部数据存储区浮点型变量,c为指向 int 型 xdata 区的指针。 答: char bdata a; float xdata b; int xdata *c; 6.编程将8051的内部数据存储器20H单元和35H单元的数据相乘,结果存到外部数据存储器中(任意位置)。 解:方法一:用嵌入式汇编语言实现 #include { #pragma asm MOV A,20H MOV B,35H MUL AB MOV DPTR,#1234H MOVX @DPTR,A INC DPTR MOV A,B MOVX @DPTR,A #pragma endasm } 方法二:单用C语言编程实现 #include unsigned int xdata x; unsigned char *ptr,a,b; ptr=0x25; a=*ptr; ptr=0x30; b=*ptr; x=a*b; } 7.8051的片内数据存储器25H单元中存放有一个0~10的整数,编程求其平方根(精确到5位有效数字),将平方根放到30H单元为首址的内存中。 解:方法一:用C语言与汇编语言混合编程实现 //用C语言编写的主函数MAIN.C #include void main() { char a=0x25,c; float f; c=getdata(a); f=sqrt(c); } ;用汇编语言编写的取数据子函数,只有一个地址参数在R7中,返回值为指定地址单元中的内容,用R7返回主函数。 PUBLIC _GETDATA DE SEGMENT CODE RSEG DE _GETDATA: MOV A,R7 ;取地址参数 MOV R0,A MOV A,@R0 MOV R7,A ;返回地址单元中的内容 EXIT: RET END 方法二:单用C语言编程实现 //MAIN.C #include char n; char *ptr; float *ptr2; float f; ptr=0x25; n=*ptr; f=sqrt(n); ptr2=0x30; *ptr2=f; } 8.将外部RAM 10H~15H单元的内容传送到内部RAM 10H~15H单元。 解:方法一:采用C语言与汇编语言混合编程 //用C语言编写的主函数MAIN.C #include char movdata(char,char); void main() { char a=0x10,b=0x06; movdata(a,b); } ;用汇编语言编写的移动数据子函数MOVDATA,其中第一个参数在R7中为首地址,第二个参数在R5中为字节数 PUBLIC _MOVDATA DE SEGMENT CODE RSEG DE _MOVDATA: MOV A,R7 ;取参数 MOV R0,A LOOP: MOVX A,@R0 MOV @R0,A DJNZ R5,LOOP EXIT: RET END 方法二:单用C语言编程实现 //MAIN.C #include char n=6; char *ptr1=0x10; char xdata *ptr2; ptr2=0x20; while(n--){ *ptr2++=*ptr1++; } } 9.内部RAM 20H、21H和22H、23H单元分别存放着两个无符号的16位数,将其中的大数置于24H和25H单元。 解:方法一: #include unsigned int *ptr; //设置一个内部RAM指针 unsigned int x,y,z; ptr=0x20; //指向0x20单元 x=*ptr; //取第一个数 ptr=0x22; //指向0x22单元 y=*ptr; //取第二个数 z=(x>y)?x:y; //将两数中的较大者赋给z ptr=0x24; //指向地址为0x24的目标单元 *ptr=z; //将大数存入目标单元 } 方法二: #include unsigned int x,y,z; x=DBYTE[0X20]*256+DBYTE[0X21]; y=DBYTE[0X22]*256+DBYTE[0X23]; z=(x>y)?x:y; //将两数中的较大者赋给z DBYTE[0X24]=z/256; DBYTE[0X25]=z%256; } 方法三: #include unsigned int x _at_ 0x20; unsigned int y _at_ 0x22; unsigned int z _at_ 0x24; void main() { z=(x>y)?x:y; } 第4章 单片机的C51语言 习题 1.C语言的优点是什么?C程序的主要结构特点是什么? 答:C语言是一种高级语言,学习比低级容易,不需要具体组织、分配存储器资源和处理端口数据,可以直接驱动单片机的所有资源。 C程序以函数为单位,由一个主函数和若干个其他函数构成,主函数是程序的入口,其他函数由主函数直接或间接调用。程序可以由一个文件或多个文件组成。文件类型包括头文件和C语言源文件,也可以是汇编语言文件,C程序可与汇编语言混合编程。 2.C51语言的变量定义包含哪些关键因素?为何这样考虑? 答:C语言的变量定义格式如下: [存储种类] 数据类型 [存储类型] 变量名 其中: 存储种类与标准C语言相同,包括:自动型(auto)、外部型(extern)、静态型(static)、寄存器型(register)。 数据类型除了包含标准C语言类型的字符型(char),整型(int),长整型(long),浮点型(float),双精度型(double)外,还有二进制位型(bit),特殊功能寄存器型(sfr),SFR可位寻址的位类型(sbit)。 存储类型包括:片内RAM区(data)、片内可位寻址区(bdata),片内RAM间接寻址区(idata),片外RAM页寻址区(pdata),片外RAM区(xdata)、ROM区(code)。 只所以比标准C语言多了存储类型,就是因为MCS-51单片机的存储结构中有四个物理存储空间(片内RAM、片内ROM,片外RAM,片外ROM),三个逻辑地址 空间(片内RAM,片外RAM,ROM),而且有多种寻址方式(直接寻址、间接寻址、页面寻址、位寻址)所致,所以在定义变量时,要根据其所在位置和寻址方式明确指定存储类型。 3.C51与汇编语言的特点各有哪些?怎样实现两者的优势互补? 答:C51是结构化语言,代码紧凑;接近自然语言,程序可读性强,易于调试、维护;库函数丰富,编程工作量小,可使产品开发周期短;具有机器级控制能力,功能很强,适合于嵌入式系统开发;汇编指令无关,易于掌握,上手快。 汇编语言优点是编写的程序代码精炼、执行速度快,在相同功能下,汇编语言程序可能比C语言程序效率高。缺点是对程序员要求高,必须对单片机的硬件结构非常熟悉才能编程,不便于编写比较复杂的程序。 可根据需要对要求时间性很强的代码用汇编语言编写,其它部分用C语言编写,两者混合编程就可以实现优势互补。 4.指出下面程序的语法错误: #include void delay();{ cgar i; for(i=O; i<=255; ”++”); } 答: #include a=C; //a和C必须先定义才可使用 int a=7,C //缺分号,应该提在使用前说明 delay(10) //延时子程序必须先定义,或先有函数原型说明 void delay();{ //作为函数定义,有函数定义不能嵌套的问题, //即不能在一个函数内定义另一个函数,而且“{”前不应有分号 //作为函数原型说明,应该放在函数调用之前,且其后不应该接函数体 cgar i; //字符型应该是unsigned char for(i=O; i<=255; ”++”);// ”++”应改成i++ } //主函数没有结束,缺”}” 5.定义变量a,b,c,其中a为内部RAM的可位寻址区的字符变量,b为外部数据存储区浮点型变量,c为指向 int 型 xdata 区的指针。 答: char bdata a; float xdata b; int xdata *c; 6.编程将8051的内部数据存储器20H单元和35H单元的数据相乘,结果存到外部数据存储器中(任意位置)。 解:方法一:用嵌入式汇编语言实现 #include { #pragma asm MOV A,20H MOV B,35H MUL AB MOV DPTR,#1234H MOVX @DPTR,A INC DPTR MOV A,B MOVX @DPTR,A #pragma endasm } 方法二:单用C语言编程实现 #include unsigned int xdata x; unsigned char *ptr,a,b; ptr=0x25; a=*ptr; ptr=0x30; b=*ptr; x=a*b; } 7.8051的片内数据存储器25H单元中存放有一个0~10的整数,编程求其平方根(精确到5位有效数字),将平方根放到30H单元为首址的内存中。 解:方法一:用C语言与汇编语言混合编程实现 //用C语言编写的主函数MAIN.C #include char a=0x25,c; float f; c=getdata(a); f=sqrt(c); } ;用汇编语言编写的取数据子函数,只有一个地址参数在R7中,返回值为指定地址单元中的内容,用R7返回主函数。 PUBLIC _GETDATA DE SEGMENT CODE RSEG DE _GETDATA: MOV A,R7 ;取地址参数 MOV R0,A MOV A,@R0 MOV R7,A ;返回地址单元中的内容 EXIT: RET END 方法二:单用C语言编程实现 //MAIN.C #include char n; char *ptr; float *ptr2; float f; ptr=0x25; n=*ptr; f=sqrt(n); ptr2=0x30; *ptr2=f; } 8.将外部RAM 10H~15H单元的内容传送到内部RAM 10H~15H单元。 解:方法一:采用C语言与汇编语言混合编程 //用C语言编写的主函数MAIN.C #include char movdata(char,char); void main() { char a=0x10,b=0x06; movdata(a,b); } ;用汇编语言编写的移动数据子函数MOVDATA,其中第一个参数在R7中为首地址,第二个参数在R5中为字节数 PUBLIC _MOVDATA DE SEGMENT CODE RSEG DE _MOVDATA: MOV A,R7 ;取参数 MOV R0,A LOOP: MOVX A,@R0 MOV @R0,A DJNZ R5,LOOP EXIT: RET END 方法二:单用C语言编程实现 //MAIN.C #include char n=6; char *ptr1=0x10; char xdata *ptr2; ptr2=0x20; while(n--){ *ptr2++=*ptr1++; } } 9.内部RAM 20H、21H和22H、23H单元分别存放着两个无符号的16位数,将其中的大数置于24H和25H单元。 解:方法一: #include unsigned int *ptr; //设置一个内部RAM指针 unsigned int x,y,z; ptr=0x20; //指向0x20单元 x=*ptr; //取第一个数 ptr=0x22; //指向0x22单元 y=*ptr; //取第二个数 z=(x>y)?x:y; //将两数中的较大者赋给z ptr=0x24; //指向地址为0x24的目标单元 *ptr=z; //将大数存入目标单元 } 方法二: #include unsigned int x,y,z; x=DBYTE[0X20]*256+DBYTE[0X21]; y=DBYTE[0X22]*256+DBYTE[0X23]; z=(x>y)?x:y; //将两数中的较大者赋给z DBYTE[0X24]=z/256; DBYTE[0X25]=z%256; } 方法三: #include unsigned int x _at_ 0x20; unsigned int y _at_ 0x22; unsigned int z _at_ 0x24; void main() { z=(x>y)?x:y; } 第5章 单片机的中断系统 习题 1.什么是中断、中断源、中断优先级和中断嵌套? 答:中断是指单片机内部有一个中断管理系统,它对内部的定时器事件、串行通信的发送和接收及外部事件(如键盘按键动作)等进行自动的检测判断。当CPU正在处理某件事情(例如正在执行主程序)的时候,外部或内部发生的某一事件(如某个引脚上电平的变化,一个脉冲沿的发生或计数器的计数溢出等)请求CPU迅速处理,于是,中断管理系统会置位相应标志通知CPU暂时中止当前的工作,迅速转去处理所发生的事件。处理完该事件后,再回到原来被中止的地方,继续原来的工作,这样的过程称为中断。 引发中断的事件称为中断源。 将中断事件按轻重缓急分若干级别叫中断优先级。 允许中断优先级高的中断源中断正在执行的低优先级的中断服务程序叫中断嵌套。 2.什么叫中断源?MCS-51有哪些中断源?各有什么特点?它们的中断向量地址分别是多少? 答:中断源即引发中断的事件。 MCS-51单片机有5个中断源,它们是外部中断0,定时器T0,外部中断1,定时器T1,串行口。 外部中断源是由引脚的触发信号引起的中断,定时器中断源是由于定时器计数器的溢出引发的中断,串行口是由于串行通信的发送或接收引发的中断。 外部中断0,定时器T0,外部中断1,定时器T1,串行口五个中断源的中断向量地址依次为:0003H,000BH,0013H,001BH,0023H。 3.MCS-51中断的中断响应条件是什么? 答:(1) 中断源有中断请求; (2) 此中断源允许位为1,即中断源可以向CPU发中断请求; (3) CPU开总中断,即EA=1; (4) 无同级或者更高级中断正在服务 4.MCS-51的中断响应过程是怎样的? 答:(1) 将相应的中断优先级状态触发器置1,以阻断后来的同级和低级中断请求; (2) 由硬件清除相应的中断请求标志,串行口的发送和接收中断除外; (3) 执行一条硬件LCALL指令,即把程序计数器PC的内容压入堆栈保存,再将相应的中断服务程序的入口地址送入PC; 5.编写出外部中断1为下跳沿触发的中断初始化程序。 解: void Int1_init(){ IT1=1; EA=1;EX1=1; //IE=0x84;// IE|=0x84; } 6.有一外部中断源,接入INT0端,当其中有中断请求时,要求CPU把一个从内部RAM 30H单元开始的50个字节的数据块传送到外部RAM从1000H开始的连续存储区。请编写对应的程序。 解: #include EA=1; EX0=1; while(1) ; } void intx0() interrupt 0 using 1{ char * ptr1=0x30; char xdata * ptr2=0x1000; for(i=0;i<50;i++) *ptr2++=*ptr1++; } 7.设fosc = 12MHz,利用定时器,TO(工作在方式2)在P1.1引脚上获取输出周期为O.4ms的方波信号,定时器溢出时采用中断方式处理,请编写,T0的初始化程序及中断服务程序。 解:fosc = 12MHz,则机器周期=1us;当T0工作在方式2时,其最大定时时间为256us,要输出周期为0.4mS即400us的方波信号,则其高、低电平应各为200us,显然当定时器T0按方式2工作时,只需计数达到200次即可,因此其时间常数初值为256-200=56。在T0的中断服务程序中,只需将P1.1引脚求反即可。 #include void timer0()interrupt 1 using 1{ P1_1=!P1_1; } void main(){ P1_1=0; TMOD=0x02; TH0=56; TL0=56; IE=0x82; TR0=1; for(;;){} } 8.设fosc = 6MHz,要求每隔50ms,从内部RAM以30H开始的数据存储区传送一个字节数据到外部RAM以2000H开始的连续存储区,共传送50个数据。要求:采用定时器T1以方式2实现定时,数据传送在中断服务程序中完成。 解:fosc = 6MHz,机器周期=12/6*10-6S=2us,T1工作在方式2时,最大定时时间为512us,要定时50ms,可以计数100次,每次定时500us来实现,方式2定时500us需计数250次,故其时间常数为256-250=6。 #include char xdata *ptr2=0x2000; void timer1()interrupt 3 using 1{ intcnt++; if(intcnt==100){ if(mocnt<50){ *ptr2++=*ptr1++; movcnt++; } else EX1=0; intcnt=0; } } void main(){ TMOD=0x20; TH1=6; TL1=6; IE=0x84; TR1=1; for(;;){} } 9.805l单片机只有两个外部中断源,若要扩展成8个外部中断源,请画出实现这种扩展的硬件线路图,并说明如何确定各中断源的优先级。 解:用按钮开关模拟中断源的中断请求,INT0单独作为一个中断源,INT1扩展成7个中断源,有中断请求时,借助于P2口识别是这七个中断源是哪个请求中断,为了验证正确性,如果是INT0中断,则在P0口的数码管上显示0,是INT1中断,则根据从上到下是哪个中断源在P0口的数码管上显示1—7。具体电路和程序如下: #include char led_mod[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07}; void INT0_srv (void) interrupt 0 using 1 //外部中断0处理程序 { P0=led_mod[0]; } void INT1_srv (void) interrupt 2 using 2 //外部中断1处理程序 { char intnum; intnum=P2; switch(intnum){ case 0xfe:P0=led_mod[1];break; case 0xfd:P0=led_mod[2];break; case 0xfb:P0=led_mod[3];break; case 0xf7:P0=led_mod[4];break; case 0xef:P0=led_mod[5];break; case 0xdf:P0=led_mod[6];break; case 0xbf:P0=led_mod[7]; } } void main(){ EA=1; EX0=1; EX1=1; P0=0; while(1); } 第6章 单片机的定时器/计数器 习题 1.MCS-51系列的8051单片机内有几个定时/计数器?每个定时/计数器有几种工作方式?如何选择? 答:MCS-51系列的8051单片机内有2个定时/计数器,即T0和T1,每个都可以编程为定时器或计数器,T0有四种工作方式(方式0—13位、方式1—16位、方式2-可自动装入初值的8位、方式3-两个8位),T1有三种工作方式(与T0相同的前三种),通过对TMOD的设置选择,其高四位选择T1,低四位选择T0。 2.如果采用的晶振频率为3MHz,定时/计数器TO分别工作在方式0、1和2下,其最大的定时时间各为多少? 答:如果采用的晶振频率为3MHz,机器周期为12×1/(3*106)=4us,由于定时/计数器TO工作在方式0、1和2时,其最大的计数次数为8192、65536和256所以,其最大定时时间分别是:方式0为8192×4us=32.768ms、方式1为65536×4us=262.144ms、方式2为256×4us=1024us。 3.定时/计数器TO作为计数器使用时,其计数频率不能超过晶振频率的多少? 答:由于定时/计数器TO作为计数器使用时,是对外部引脚输入的脉冲进行计数, CPU在每个机器周期采样一次引脚,当前一次采样为高电平,后一次采样为低电平,则为一次有效计数脉冲,所以如果晶振频率为fosc,则其采样频率fosc/12,两次采样才能决定一次计数有效,所以计数频率不能超过fosc/24。 4.简单说明定时/计数器在不同工作模式下的特点。 答:方式0为13位的定时/计数器,由THx的8位和TLx的低5位构成、方式1为16位的定时/计数器,由THx的8位和TLx的8位构成,方式2为8位的定时/计数器,TLx为加1计数器,THx为计数初值寄存器。方式3只能用于T0,是将T0的低8位用作一个的定时/计数器,而高8位的TH0用作一个的定时器,并借用T1的TR1和TF1作为高8位定时器的启停控制位和溢出标志位。 5.定时器工作在方式2时有何特点?适用于什么应用场合? 答:定时器工作在方式2时是一个可自动装入时间常数初值的8位定时/计数器,TLx为加1计数器,THx为计数初值寄存器。由于其恢复初值由硬件自动完成,所以当需要反复计数时,用方式2可以方便地实现精确的定时。 6.一个定时器的定时时间有限,如何采用两个定时器的串行定时来实现较长时间的定时? 答:一个定时器的定时时间有限,可采用两个定时器的串行定时来实现较长时间的定时,比如,当fosc=12MHz时,单个定时/计数器采用方式1的最大定时时间为65.536ms,此时若用另一个定时/计数器按方式1进行溢出次数计数,在定时器溢出中断时,给计数器发一个计数脉冲,且两者均为方式一,则两者串行可达到的定时时间为65536×65.536ms=4294967.296ms。 7.设MCS-51单片机的晶振频率为12MHz,请编程使P1.O端输出频率为20kHz的方波。 解:fosc = 12MHz,所以机器周期为1us。20kHz的方波周期为1/(20×1000)=50us,方波即高电平和低电平和时间相等,所以只需设一个定时器定时25us将P1.O求反一次即可。由于题目没有规定,所以可以用查询方式,也可以用中断方式进行编程实现。 方法一:采用查询方式实现 #include sbit P1_0=P1^0;//定义输出引脚变量 void main(){ P1_0=0; //输出初值为0 TMOD=0x02; //T0方式2定时 TH0=256-25; //计25次,计数初值为模256减25 TL0=TH0; TR0=1; //启动T0 while(1) //无限循环 if(TF0){ //查询T0溢出标志 TF0=0; //溢出标志复位 P1_0=!P1_0; //输出求反 } } 方法二:采用中断方式实现 #include sbit P1_0=P1^0; //定义输出引脚变量 void main(){ P1_0=0; //输出初值为0 TMOD=0x02; //T0方式2定时 TH0=256-25; //计25次,计数初值为模256减25 TL0=TH0; IE=0x82; //允许CPU响应中断,允许T0发中断请求 TR0=1; //启动T0 for(;;){} //无限循环等待中断 } timer0()interrupt 1 using 1{ P1_0=!P1_0; //输出求反 } 8.采用定时/计数器TO对外部脉冲进行计数,每计数10O个脉冲,TO切换为定时工作方式。定时1ms后,又转为计数方式,如此循环不止。假定MCS-5l单片机的晶体振荡器的频率为6MHz,要求T0工作在方式1状态,请编写出相应程序。 6 解:晶体振荡器的频率为6MHz,则机器周期为12×1/(6*10)= 2us, 要定时1ms,需计数次数为1000/2=500次 #include TMOD=0x05;//T0计数,方式一 TH0=(65536-100)/256;//计数100次 TL0=(65536-100)%256; TR0=1; while(!TF0);//等待计数100次的溢出 TF0=0; //溢出标志复位 TMOD=0x01;//T0定时,方式一 TH0=(65536-500)/256;//计数100次 TL0=(65536-500)%256; TR0=1; //启动T0 while(!TF0); //等待定时时间到1ms的溢出 TF0=0; //溢出标志复位 } } 9.设单片机的fosc = 12MHz,使P1.O和P1.1分别输出周期为1ms和lOms的方波,请用定时器TO方式2编程实现。 解:fosc = 12MHz,所以机器周期为1us。 要使P1.0输出周期为1000us的方波,可以通过定时中断方式实现,定时时间为250us,定时计数2次来实现,对P1.0求反即可。 要使P1.1输出周期为10ms的方波,也可以通过定时中断方式实现,定时时间为5ms,当时间到时,对P1.1求反即可。由于5ms/250us=20,所以也可以通过对250us的定时计数20次来实现。程序如下: #include sbit P1_0=P1^0;//输出周期为400us的方波的引脚 sbit P1_1=P1^1; //输出周期为10ms的方波的引脚 unsigned char num1=0,num2=0;//中断次数计数器,初值为0 void main(){ P1_0=0; //输出初值为0 P1_1=0; //输出初值为0 TMOD=0x02; //T0方式2定时 TH0=256-250;//计200次,计数初值为模256减200 TL0=TH0; IE=0x82; //允许CPU响应中断,允许T0发中断请求 TR0=1; //启动T0 for(;;){} //无限循环等待中断 } void timer0()interrupt 1 using 1{ num1++;num2++; //中断次数加1 if(num1==2) // 中断次数达到2次 { P1_0=!P1_0; //输出P1_0求反 num1=0; //中断次数复位为0 } if(num2==20){ // 中断次数达到20次 num2=0; //中断次数复位为0 P1_1=!P1_1; //输出P1_1求反 } } 10.编写程序,要求使用TO,采用方式2定时,在P1.0输出周期为400us占空比为10:1的矩形脉冲。 解:设fosc = 12MHz,则机器周期为1us。设P1.0初值为0。 周期为400us,可定义方式2定时,计数初值为256-40,一个周期中断10次为400us,在中断计数为1和2(或任意两次计数之间)时,对P1.0求反即可。 #include sbit P1_0=P1^0; //输出周期引脚 unsigned char cnt=0; //中断次数计数器,初值为0 void main(){ P1_0=0; //输出初值为0 TMOD=0x02; //T0方式2定时 TH0=256-40; //计40次,计数初值为模256减40 TL0=TH0; IE=0x82; //允许CPU响应中断,允许T0发中断请求 TR0=1; //启动T0 for(;;){} //无限循环等待中断 } void timer0()interrupt 1 using 1{ cnt++;//中断次数加1 if(cnt==1||cnt==2) P1_0=!P1_0; //中断次数为1或2时对输出引脚求反 if(cnt==10)cnt=0; //中断次数达到10时复位为0 } 第七章 7.1. 什么事串行异步通信?在串行异步通信中,数据帧的传输格式是什么?含义如何? 答:串行异步通信是指在串行通信中发送端和接收端可以由各自的时钟来控制数据的发送和接收,这两个时钟源彼此,互不同步。 数据帧的传输格式:起始位,数据位,奇偶校验位和停止位 含义:起始位用于实现发送和接收双方设备之间的同步;数据位包含所要传输的信息;奇偶校验位用于判断接收数据的正确性;停止位表示一帧数据发送结束,开始下一帧数据的传输。 7.3. C51单片机串行通信接口控制寄存器有几个?每个寄存器的含义是什么? 答: 有电源控制寄存器PCON和串行口控制寄存器SCON PCON中SMOD与串口通信有关。 SMOD=0; 串口方式1,2,3时,波特率正常。 SMOD=1; 串口方式1,2,3时,波特率加倍 其余与串行通信无关 SCON中 SM0、SM1:串行口工作方式控制位 SM2:多机通信控制位 REN:串行口接收使能控制端;REN=1时,允许接收,REN=0时,禁止接收 TB8:发送接收数据位8 RB8:接收数据位8 TI:发送中断标志位;TI=1表示帧发送结束,TI可由软件置0 RI:接收中断标志位;RI=1表示帧接收完成,RI可由软件置0 7.4. 在方式1和方式3的通信模式下,波特率通过那个定时器驱动产生?采用何种定时方式?如果要求采用晶振为11.0592MHz,产生的传送波特率为2400b/s,应该怎样对定时器初始化操作? 答:由定时器1驱动产生,采用定时器1的工作方式2,自动从装初值 当晶振为11.0592MHz,波特率为2400b/s,由波特率公式: 波特率= (2SMOD/32)fOSC/(12(256a)) a25611.0592106/(3842400) 可求得初值a为F4H 初始化操作: TMOD=0x20; TL1=0xF4; TH1=0xF4; PCON=0x00; SCON=0x00; TR1=1; 8.3 在由单片机80C51和一片ADC0809组成的数据采集系统中,假设ADC0809的地址为0x7ff8~0x7fff,画出接口电路图,并编写每隔1ms轮流采集一次8个通道数据的程序。采样100次取平均值。 答:电路图书上实例有,做了如下改动 1.控制端ADDA,ADDB,ADDC分别接P2^0,P2^!,P2^2. 2.删去了译码器与逻辑器件器件,74LS373,74HC14,74HC02, 3.中断检测端EOC接P3^2。 参考程序如下,自己写的没经过仿真, #include #define uchar unsigned char//宏定义 #define uint unsigned int #define AD_0 XBYTE[0xff8]//定义通道访问地址 #define AD_1 XBYTE[0xff9] #define AD_2 XBYTE[0xffa] #define AD_3 XBYTE[0xffb] #define AD_4 XBYTE[0xffc] #define AD_5 XBYTE[0xffd] #define AD_6 XBYTE[0xffe] #define AD_7 XBYTE[0xfff] sbit busy=P3^2;//定义中断请求端 uchar count=0;//定义采样次数 uchar datcode[100]={0};//定义数据存放数组 int dat=0,dat1=0;//定义临时数据与最终平均数据 uchar i,j,num;//定义变量 void main() { TMOD=0x01;//定时器0 工作方式1 TL0=(65536-1000)/256;//1ms中断一次 TH0=(65536-1000)%256; EA=1;//开总中断,定时器中断,打开定时器0 ET0=1; TR0=1; while(count<100)//100次数据求和函数 { dat1=dat1+datcode[i]; count++; } dat=dat1/100; if(count>=100) count=0; } void timer0() interrupt 1//中断函数 { TMOD=0x01; TL0=(65536-1000)/256; TH0=(65536-1000)%256; AD_0=0;//启动0通道AD转换 while(busy==1) { num=AD_0+1;//把0通道数据附给num,并指向AD_1通道查询 datcode[i+1]=num; j++; if(j==7)//八次查询完毕退出循环 { busy=0; j=0; } } } 第一章习题参 1-1:何谓单片机?与通用微机相比,两者在结构上有何异同? 答:将构成计算机的基本单元电路如微处理器(CPU)、存储器、I/O接口电路和相应实时控制器件等电路集成在一块芯片上,称其为单片微型计算机,简称单片机。 单片机与通用微机相比在结构上的异同: (1)两者都有CPU,但通用微机的CPU主要面向数据处理,其发展主要围绕数据处理功能、计算速度和精度的进一步提高。例如,现今微机的CPU都支持浮点运算,采用流水线作业,并行处理、多级高速缓冲(Cache)技术等。CPU的主频达到数百兆赫兹(MHz),字长普遍达到32位。单片机主要面向控制,控制中的数据类型及数据处理相对简单,所以单片机的数据处理功能比通用微机相对要弱一些,计算速度和精度也相对要低一些。例如,现在的单片机产品的CPU大多不支持浮点运算,CPU还采用串行工作方式,其振荡频率大多在百兆赫兹范围内;在一些简单应用系统中采用4位字长的CPU,在中、小规模应用场合广泛采用8位字长单片机,在一些复杂的中、大规模的应用系统中才采用16位字长单片机,32位单片机产品目前应用得还不多。 (2) 两者都有存储器,但通用微机中存储器组织结构主要针对增大存储容量和CPU对数据的存取速度。现今微机的内存容量达到了数百兆字节(MB),存储体系采用多体、并读技术和段、页等多种管理模式。单片机中存储器的组织结构比较简单,存储器芯片直接挂接在单片机的总线上,CPU对存储器的读写按直接物理地址来寻址存储器单元,存储器的寻址空间一般都为 KB。 (3) 两者都有I/O接口,但通用微机中I/O接口主要考虑标准外设(如CRT、标准键盘、鼠标、打印机、硬盘、光盘等)。用户通过标准总线连接外设,能达到即插即用。单片机应用系统的外设都是非标准的,且千差万别,种类很多。单片机的I/O接口实际上是向用户提供的与外设连接的物理界面。用户对外设的连接要设计具体的接口电路,需有熟练的接口电路设计技术。 另外,单片机的微处理器(CPU)、存储器、I/O接口电路集成在一块芯片上,而通用微机的微处理器(CPU)、存储器、I/O接口电路一般都是的芯片 1-4 IAP、ISP的含义是什么? ISP:In System Programable,即在系统编程。用户可以通过下载线以特定的硬件时序在线编程(到单片机内部集成的FLASH上),但用户程序自身不可以对内部存储器做修改。 IAP:In Application Programable,即在应用编程。用户可以通过下载线对单片机进行在线编程,用户程序也可以自己对内部存储器重新修改。 1-6 51单片机与通用微机相比,结构上有哪些主要特点? (1)单片机的程序存储器和数据存储器是严格区分的,前者为ROM,后者为RAM; (2)采用面向控制的指令系统,位处理能力强; (3)I/O引脚通常是多功能的; (4) 产品系列齐全,功能扩展性强; (5) 功能是通用的,像一般微处理机那样可广泛地应用在各个方面。 1-7 51单片机有哪些主要系列产品? (1) Intel公司的MCS-51系列单片机:功能比较强、价格比较低、较早应用的单片 机。此系列三种基本产品是:8031/8051/8751; (2) ATMEL公司的系列单片机:内含Flash存储器,开发过程中可以容易地进 行程序修改。有8位Flash子系列、ISP_Flash子系列、I2C_Flash子系列; (3) SST公司的SST系列单片机:具有独特的超级Flash技术和小扇区结构设计, 采用IAP和ISP技术; (4) PHILIPS公司的增强型80C51系列单片机:其产品类型较完整,包括通用型、 Flash型、OTP型和低成本型,主要产品系列包括P80、P87、P、LPC76、LPC900等。 第二章习题参 2-1 51单片机内部包含哪些主要逻辑功能部件? (1)一个8位微处理器CPU。 (2)256B数据存储器RAM和特殊功能寄存器SFR。 (3)4K程序存储器ROM。 (4)两个定时/计数器,用以对外部事件进行计数,也可用作定时器。 (5)四个8位可编程的I/O(输入/输出)并行端口,每个端口既可做输入,也可做输出。 (6)一个串行端口,用于数据的串行通信 (7)1个可管理5个中断源、2级优先嵌套的中断管理系统;。 (8)片内振荡器及时钟发生器。 2-2 MCS-51引脚中有多少I/O总线?它们和单片机对外的地址总线和数据总线有什么关系?地址总线和数据总线各是几位? 32条I/O口线,分为4组,每组,称为P0~P3口,P0口有8位数据总线和地址总线的低8位,P2口有地址总线的高8位,因此单片机的地址总线位是16位,寻址空间为KB,数据总线位宽为8位。同时在P3口还R/W控制信号线。I/O口线的总数与地址总线和数据总线没有多大联系,只是说地址总线和数据总线需要占用一定的端口。像ATC2051单片机,只有15条I/O口线(P3.6没有引出,作为内部使用),分为P1电压比较器占用了。 2-3 51单片机的 EA, ALE,PSEN信号各自功能是什么? EA:为片外程序存储器选用端,该引脚有效(低电平)时,只选用片外程序存储器,否则单片机 上电或复位后选用片内程序存储器。 ALE:地址锁存有效信号输出在访问片外程序存储器期间,ALE以每机器周期两次进行信号 输出,其下降沿用于控制锁存P0输出的低8位地址;在不访问片外程序存储器期间,ALE端仍以上述频率(振荡频率fosc的1/6)出现,可作为对外输出的时钟脉冲或用于定时目的. PSEN:片外程序存储器读选通信号输出端,低电平有效。 2-4 51系列单片机有哪些信号需要芯片引脚的第二功能方式提供? P3.0 :RxD 串行口输入端 P3.1 :TxD串行口输出端 P3.2 :INT0 外部中断0请求输入端,低电平有效 P3.3 :INT1 外部中断1请求输入端,低电平有效 P3.4 :T0 定时/计数器 0技术脉冲输入端 P3.5 :T1 定时/计数器 1技术脉冲输入端 P3.6 :WR 外部数据存数器写选通信信号输出端,低电平有效 P3.7 :RD 外部数据存数器读选通信信号输出端,低电平有效 2-5 51系列单片机的程序状态字PSW中存放什么信息?其中的OV标志位在什么情况下被置位?置位是表示什么意思? ●PSW是一个8位标志寄存器,它保存指令执行结果的特征信息,以供程序查询和判别。 ●1)做加法时,最高位,次高位之一有进位则OV被置位 2)做减法时,最高位,次高位之一借位则OV被置位 3)执行乘法指令MUL AB,积大于255,OV=1 4)执行除法指令DIV AB,如果B中所放除数为0 ,OV=1 ●0V=1,置位反映运算结果超出了累加器的数值范围 2-9 片内RAM低128单元划分为哪几个区域?应用中怎么样合理有效的使用? ●工作寄存器区,位寻址区,数据缓冲区 ①工作寄存器区用于临时寄存8位信息,分成4组,每组有8个寄存器,每次只用1组, 其他各组不工作 ②位寻址区(20H~2FH),这16个单元的每一位都赋予了一个位地址,位地址范围为00H~7FH,位寻址区的每一位都可能当作软件触发器,由程序直接进行位处理。 ③由于工作寄存器区,位寻址区,数据缓冲区统一编址,使用同样的指令访问,因此这三个 区既有自己独特的功能,又可统一调度使用,前两个已未使用的单元也可作为一般的用户RAM单元。 2-10 51系列单片机的堆栈与通用微机中的堆栈有何异同?在程序设计时,为什么要对堆栈指针SP重新赋值? ●堆栈是按先进后出或后进先出的远侧进行读/写的特殊RAM区域 51单片机的堆栈区时不固定的,可设置在内部RAM的任意区域内 ●当数据压入堆栈时,SP的内容自动加1,作为本次进栈的指针,然后再存取数据SP的值随着数据的存入而增加,当数据从堆栈弹出之后,SP的值随之减少,复位时,SP的初值为07H,堆栈实际上从08H开始堆放信息,即堆栈初始位置位于工作寄存器区域内,所以要重新赋值 2-13 什么是时钟周期,机器周期和指令周期?当振荡频率为6MHZ时,一条双周期指令的执行时间是多少? ●时钟周期:2个CPU振荡脉冲信号的周期 机器周期:一个机器周期包含6个状态周期 指令周期:执行一条指令所占用的全部时间 12MHZ时,一条双周期指令周期时间为2us 6MHZ时,一条双周期指令周期时间为4us 2-14 定时器/计数器定时与计数的内部工作有何异同? ●定时工作模式和技术工作模式的工作原理相同,只是计数脉冲来源有所不同: 处于计数器工作模式时,加法计数器对芯片端子T0(P3.4)或T1(P3.5)上的输入脉冲计数; 处于定时器工作模式时,加法计数器对内部机器周期脉冲计数。 2-15 定时器/计数器有四种工作方式,它们的定时与计数范围各是多少?使用中怎样选择工作方式? ●工作方式0:定时范围:1~8192us;计数值范围:1~8192 工作方式1:定时范围:1~65536us;计数值范围:1~65536 工作方式2:定时范围:1~256us;计数值范围:1~256 工作方式3:定时范围:1~256us;计数值范围:1~256 ●通过TMOD来选择,低4位用于定时器/计数器0,高4位用于定时器/计数器1 M1,M0:定时器计数器工作方式选择位 2-16 定时器/计数器的门控方式与非门控方式有何不同?使用中怎么样选择哪种工作方式?初值应设置为多少(十六进制)? ●GATE:门控位,用于控制定时器/计数器的启动是否受外部中断请求信号的影响。 GATE=1,则定时器/计数器0的启动受芯片引脚INT0(P3.2)控制,定时器/计数器1的启动受芯片引脚INT1(P3.3)控制 GATE=0,则定时器/计数器的启动与引脚INT0、INT1无关,一般情况下GATE=0 2-18 51单片机的五个中断源中哪几个中断源在CPU响应中断后可自动撤除中断请求,哪几个不能撤除中断请求?CPU不能撤除中断请求的中断源时,用户应采取什么措施? ●可自动撤除:计数器T0`T1的溢出中断 不可自动撤除:电平触发的外部中断;发送接收中断 ●1)电平触发的外部中断:由于CPU对INTx引脚没有控制作用,也没有相应的中断请求标志位,因此需要外接电路来撤除中断请求信号。 2)串行口的发送/接收中断:当串行口发送完或接收完一帧信息时,SCON的TI,RI向CPU申请中断,响应中断后,接口电路不能自动将TI或RT清0,用户需采用软件方法将TI或RT清0,来撤除中断请求信号 2-21 使单片机复位有几种方式?复位后单片机的初始状态如何? ●上电复位,按钮复位 ●(PC)=0000H:程序的初始入口地址为0000H (PSW) =00H:由于RS1(PSW.4)=0,RS0(PSW.3)=0,复位后单片机选择工作寄存器0组 (SP)=07H:复位后堆栈早起片内RAM的08H单元处建立 TH1、TL0、TH0、TL0:他们的内容为00H,定时器/计数器的初值为0 (TMOD)=00H:复位后定时器/计数器T0、T1定时器方式0,非门控方式 (TCON)=00H:复位后定时器/计数器T0、T1停止工作,外部中断0、1为电平触发方式 (T2CON) =00H:复位后定时器/计数器T2停止工作 (SCON)=00H:复位后串行口工作在移位寄存器方式,且禁止串行口接收 (IE)=00H:复位后屏蔽所有中断 (IP)=00H:复位后所有中断源都直指为低优先级 P0~P3:锁存器都是全1状态,说明复位后4个并行接口设置为输入口 2-23 51单片机串行口有几种工作方式?这几种工作方式有何不同?各用于什么场合? ●有4种工作方式:方式0、方式1、方式2、方式3 工作方式:方式0移位寄存器方式;方式1、方式2、方式3都是异步通信方式 场合:方式0不用于通信,而是通过外接移位寄存器芯片实现扩展I/O口的功能;方式1用于双机通信;方式2、3主要用于多机通信,也可用于双机通信 第三章参 3-1 何谓寻址方式?51单片机有哪几种寻址方式?这几种方式是如何寻址的? ●所谓寻址方式,就是CPU执行那个一条指令时怎样找到该指令所要求的操作数的方式。 ●1)立即寻址:操作数直接出现在指令中,紧跟在操作码的后面,作为指令的一部分与操作码一起存放在程序存储器中,可以立即得到并执行,例如:MOV A,#30H指令中30H就是立即数。这一条指令的功能是执行将立即数30H传送到累加器A中的操作。 2)寄存器寻址:操作数放在寄存器中,在指令中直接以寄存器的名字来表示操作数的地址。例如MOV A,R0,即将R0寄存器的内容送到累加器A中。 3)寄存器间接寻址方式:由指令指出某一寄存器的内容作为操作数地址的寻址方法,例如:MOV A,@R1,将以工作寄存器R1中的内容为地址的片内RAM单元的数据传送到A中去。 4)直接寻址: 指令中直接给出操作数所在的存储器地址,以供取数或存数的寻址方式称为 直接寻址。例如:MOV A,40H指令中的源操作数就是直接寻址,40H为操作数的地址。该指令的功能是把片内RAM地址为40H单元的内容送到A中 5)变址寻址:基地址寄存器加变址寄存器间接寻址 6)相对寻址:相对寻址是以当前程序计数器PC值加上指令中给出的偏移量rel,而构成实际操作数地址的寻址方法。它用于访问程序存储器,常出现在相对转移指令中。 7)位寻址:位寻址是在位操作指令中直接给出位操作数的地址,可以对片内RAM中的128 位和特殊功能寄存器SFR中的93位进行寻址。 3-2 访问片内、片外程序存储器有哪几种寻址方式? ●采用基址寄存器加变址寄存器间接寻址方式 MOVC A,@A+DPTR MOVC A,@A+PC 3-3 访问片内RAM单元和特殊功能寄存器各有哪几种寻址方式? ●访问片内RAM有:立即寻址,寄存器寻址,寄存器间接寻址,直接寻址 ● 特殊功能有:直接寻址 3-4若要完成以下的数据传送,应如何用51的指令来完成。 (1)R0的内容送到R1中。 MOV A, R1 MOV R0,A (2)外部RAM的20H单元内容送R0,送内部RAM的20H单元。 MOV DPTR,#0020H MOVX A,@DPTR MOV R0,A 3-5 试比较下列每组两条指令的区别 1)MOV A,#24与MOV A,24H 2)MOV A,R0与MOV A,@R0 3)MOV A,@R0与MOVX A,@R0 4)MOV A,@R1与MOVX A,@DPTR ●1)前者为立即寻址,将立即数24H单元的内容送到A中;后者为直接寻址,将24H单元的片内RAM内容送到A中。 2)前者为直接寻址,将R0单元的内容送到A中,后者为寄存器间接寻址,将R0中的内容为地址的片内RAM单元的数据送到A中。 3)前者为寄存器间接寻址,将R0中的内容为地址的片内RAM单元的数据送到A;后者为寄存器间接寻址,将R0中的内容为地址的片外RAM单元的数据送到A中。 4)用R1做地址指针可寻址片内RAM的256个单元,但能访问SFR块,也可8位地址访问片外RAM的低256个地址单元(00~ffH);用DPTR做地址指针,用于访问片外RAM的KB范围(0000~ffffH)(16位)。 3-6已知(A)= 7AH,( B)= 02H,( R0)= 30H,( 30H)= A5H,( PSW)=80H,写出以下各条指令执行后A和PSW的内容。 (1)XCH A, R0 (A)=30H,(PSW)=00H, (R0)= 7AH, (2)XCH A, 30H (A)=A5H,(PSW)=00H (3)XCH A, @R0 (A)=A5H,(PSW)=00H (4)XCHD A, @R0 (A)=75H,(PSW)=01H (5)SWAP A (A)=A7H,(PSW)=01H (6)ADD A, R0 (A)=AAH,(PSW)=00H (7)ADD A, 30H (A)=1FH,(PSW)=81H (8)ADD A, #30H (A)=AAH,(PSW)=00H (9)ADDC A, 30H (A)=20H,(PSW)=01H (10)SUBB A, 30H (A)=D5H,(PSW)=85H (11)SUBB A, #30H (A)=4AH,(PSW)=01H (12)INC @R0 (A)=7AH,(PSW)=80H; (13)MUL AB (14)DIV AB 3-7 已知(A)=02H,(R1)=7FH,(DPTR)=2FFCH,(SP)=30H, 片内RAM(7FH)=70H,片外RAM(2FFEH)=11H,ROM(2FFEH)=H,试分别写出以下指令执行后目标单元的结果。 1)MOVX @DPTR,A 2)MOVX A,@R1 3)MOVC A,@A+DPTR 4)PUSH ACC ●1)(2FFEH)=02H 2)(A)=70H 3)(A)=(02H+2FFCH)=(2FFEH)=H 4)(31H)=02H 3-9 DA A指令有什么作用?怎样使用? 这条指令是进行BCD码运算时,跟在ADD或ADDC指令之后,将相加后存放在 累加器中的结果进行修正。 修正的条件和方法为: 若(A0~3)>9或(AC)=1,则(A0~3)+06H→(A0~3); 若(A4~7)>9或(CY)=1,则(A4~7)+06H→(A4~7)。 若以上二条同时发生,或高4位虽等于9 ,但低4位修正后有进位,则应加66H修正。 3-9 设(A)=83H,(R0)=17H,(17H)=34H,分析当执行下面的每条指令后目标单元的内容,及4条指令组成的程序段执行后A的内容是什么? ANL A,#17H ;与 ORL 17H,A ;或 XRL A,@R0 ;异或 CPL A ;取反 ANL A,#17H 10000011与00010111 = 0000 0011 ORL 17H,A 00110100或00000011 = 0011 0111 XRL A,@R0 00110111异或 0000 0011 = 0011 0100 CPL A ~A 1100 1000 CBH 3-10 请写出达到下列要求的逻辑操作的指令,要求不得改变未涉及位的内容 1)使累加器A的低位置‘1’ 2)清累加器A的高4位 3)‘1’ 4)清除A.3、A.4、A.5、A.6 SETB ACC.1; ANL A,#0FH; ORL A,#00001100B ANL A,#10000111B 3-11 指令LJIMP addr16与AJMP addr11的区别是什么? LJIMP addr16是长转移, LCALL的作用就是将addr16直接赋给PC AJMP addr11,在当前PC的2KB范围跳转(因为addr11就是2KB), 即PC高 五位不变,低十一位等于addr11。 3-12试说明指令CJNE @R1, #7AH, 10H的作用。若本条指令地址为2500H,其转移地址是多少? 当前地址 2500H。执行该指令后PC为2503H,加上10H后,目标地址是2513H。 3-13下面执行后(SP)=42H, (A) = 40H, (B) =40H ,并解释每条指令的作用。 ORG 2000H ;起始地址为2000H MOV SP,#40H ;(SP)=40H MOV A,#30H ;(A)=30H LCALL 2500H ;调用2500H子程序 ADD A,#10H ;(A)<—(A)+10,(A)=40H MOV B,A ;(B)=40H HERE:SJMP HERE ORG 2500H ;起始地址为2500H MOV DPTR,#2009H ;(DPTR)=2009H PUSH DPL ;(SP)=40H+1=41H PUSH DPH ; (SP)=41H+1=42H RET ;返回 3-14已知P1.7= 1, A.0= 0, C= 1, FIRST=1000H, SECOND=1020H,试写出下列指令的执行结果。 (1)MOV 26H, C 1 (2)CPL A.0 1 (3)CLR P1.7 0 (4)ORL C, /P1.7 1 (5)FIRST: JC SECOND (6)FIRST: JNB A.0, SECOND (7)SECOND: JBC P1.7, FIRST 3-15经汇编后,下列各条语句标号将是什么值? ORG 2000H TABLE: DS 5 WORD: DB 15, 20, 25, 30 (2005H)=15, FANG: EQU 1000H FANG=1000H BEGIN: MOV A, R0 3-16 设fosc=12MHZ,定时器/计数器0的初始化程序和中断服务程序如下: MOV TH0,#0DH MOV TL0,#0D0H MOV TMOD,#01H SETB TR0 : ;中断服务程序 ORG 000BH MOV TH0,#0DH MOV TL0,#0D0H : RETI 问:1)该定时器/计数器工作于什么方式? 2)相应的定时时间或计数值是多少? 3)为什么在中断服务程序中药重置定时器/计数器的初值? ●1)方式1 2)定时时间为:fosc=12MHZ Tcy=1us T=N*Tcy =(65536-x)*Tcy 定时范围:1~65536 计数值为:N=216 -x=65536-x 计数范围为:1~65536 3)定时器T0的溢出对外无脉冲信号,重置定时器/计数器的初值可以再形成计数脉冲 3-18设有100个有符号数,连续存放在以2000H为首地址的存储区中,试编程统计其中正数、负数、零的个数。 ZERO EQU 20H ;零的统计 NEGETIVE EQU 21H ;负数的统计 POSITIVE EQU 22H ;正数的统计 COUNT EQU 100 ;比较个数 ORG 0000H LJMP MAIN ORG 0040H MOV ZERO,#0 MOV NEGETIVE,#0 MOV POSITIVE,#0 MOV R2,#0 MOV DPTR,# 2000H LOOP: MOVX A,@DPTR CJNE A,#0,NONZERO INC ZERO AJMP NEXT NONZERO: JC NEG INC POSITIVE AJMP NEXT NEG: INC NEGETIVE NEXT: INC DPTR INC R2 CJNE R2,#COUNT,LOOP SJMP $ 3-20 51单片机从串行口发送缓冲区首址为30H的10个ASCII码字符,最高位用于奇偶校验,采用偶校验方式,要求发送的波特率为2400波特,时钟频率ƒosc=12MHz,试编写串行口发送子程序。 单片机采用12 MHz晶振;设串行口工作于方式1;定时器/计数器T1用作波特率发生器,工作于方式2;PCON中的SMOD位为1;发送的波特率要求为2400。 定时器/计数器T1初值计算: 根据公式 波特率=2SMOD×溢出率/32有 溢出率=2400×16=38 400 溢出周期=1/溢出率=26 μs (此为定时器/计数器的定时值) 定时器初值=256-26=230=E6H 根据要求确定定时器/计数器的TMOD中的方式控制字为20H,串行口SCON中的控制字为40H,PCON控制字为80H。则相应的发送程序如下: TSTART:MOV TMOD,#20H ;置定时器/计数器T1工作于方 式2定时 MOV PCON, #80H MOV TL1,#0E6H ;定时器/计数器T1置初值 MOV TH1,#E6H ;定时器/计数器T1置重装数 MOV SCON,#40H ;置串行口工作于方式1 MOV R0,#30H ;R0作地址指针,指向数据块首址 MOV R7,#10 ;R7作循环计数器,置以发送=字节数 SETB TR1 ;启动定时器/计数器T1 LOOP: MOV A,@R0 ;取待发送的一个字节 MOV C,P ;取奇偶标志,奇为1,偶为0 MOV A.7,C ;给发送的ASCII码最高位加偶校验位 MOV SBUF,A ;启动串行口发送 WAIT:JNB TI,WAIT ;等待发送完毕 CLR TI ;清TI标志,为下一个字节发送作准备 INC R0 ;指向数据块下一个待发送字节的地址 DJINZ R7,LOOP ;循环发送,直到数据块发送完毕 第四章 参 4-1何谓单片机的最小系统? ★所谓最小系统,是指一个真正可用的单片机最小配置系统。 对于片内带有程序存储器的单片机,只要在芯片上对外接时钟电路和复位电路就能达到真正可用,就是最小系统。 对于片外不带有程序存储器的单片机,除了在芯片上外接时钟电路和复位电路外,还需外接程序存储器,才能构成一个最小系统。 4-5什么是完全译码?什么是部分译码?各有什么特点? ★所谓部分译码,就是存储器芯片的地址线与单片机系统的地址线顺序相接后,剩余的高位地址线仅用一部分参加译码。 特点:部分译码使存储器芯片的地址空间有重叠,造成系统存储器空间的浪费。 ★所谓全译码,就是存储器芯片的地址线与单片机系统的地址线顺序相接后,剩余的高位地址线全部参加译码。 ★特点:存储器芯片的地址空间是唯一确定的,但译码电路相对复杂。 4-7存储器芯片地址引脚数与容量有什么关系? ★ 地址线的数目由芯片的容量决定,容量(Q)与地址线数目(N)满足关系式:Q=2N 4-10 采用27(8K*8)芯片扩展程序存储器,分配的地址范围为4000H~7FFFH。采用完全译码方式,试确定所用芯片数目,分配地址范围,画出地址译码关系图,设计译码电路,画出与单片机的连接图。 ★7FFFH-4000H+1=4000H=16KB 因为27为8K*8 所以需要2片芯片 第一片地址为范围为:4000H~5FFFH 第二片地址为范围为:6000H~7FFFH 译码关系图: p2.7 P2.6 P2.5 P2.4 p2.3 P2.2 P2.1 P2.0 P0.7 P0.6 P0.5 P0.4 P0.3 P0.2 P0.1 P0.0 A15 A14 A13 A12 A11 A10 A9 0 0 1 1 0 1 * * * * * * * * A8 * * A7 * * A6 * * A5 * * A4 * * A3 * * A2 * * A1 * * A0 * * 第六章 参 6-9何谓静态显示?何谓动态显示?两种显示方式各有什么优缺点? ★静态显示:LED工作在静态显示方式下,共阴极接地或共阳极接+5V;每一位的段选线(a~g,dp)与一个8位并行I/O口相连。 优点:显示器每一位可以显示,每一位由一个8位输出口控制段选码,故在同一个时刻各位可以显示不同的字符。 缺点:N位静态显示器要求有N×8根I/o口线,占用I/o口线较多,故在位数较多时往往采用动态显示。 ★ 动态显示:LED动态显示是将所有位的段选线并接在一个I/o口上,共阴极端或共 阳极端分别由相应的I/o口线控制。 优点:节约用线 缺点:每一位段选线都接在一个I/o口上,因此每送一个段选码,8位就显示同一个字符,这种显示器是不能用的。解决这个问题利用人眼的视觉停留,从段选线I/o口上按位分别送显示字符的段选码,在位控制口也按相应的次序分别选通相应的显示位(共阴极送低电平,共阳极送高电平),选通位就显示相应字符,并保持几毫秒的延时,未选通位不显示字符(保持熄灭)。 6-14设计一个内置HD44780驱动控制器的字符型LCM与51单片机的接口电路,并编写在字符型液晶显示模块显示“HELLO”字符的程序。 6-15 ADC0809的8路输入通道是如何选择的?试举例说明。 ★ ADDC 0 0 0 0 1 1 1 1 ADDB 0 0 1 1 0 0 1 1 ADDA 0 0 0 1 0 1 0 1 选通的通道 IN0 IN1 IN2 IN3 IN4 IN5 IN6 IN7 6-22单片机控制大功率对象时,为什么要采用隔离器进行接口? ★由于继电器由吸合到断开的瞬间会产生一定的干扰,当吸合电流较大时,在单片机与继电器之间需要增加隔离电路。 常用的光耦器件的型号:4N25 ,4N26~4N28,TLP528,TLP124,TLP126,4N33,H11G1,H11GZ,H11G3 6-23 单片机与继电器线圈接口时,应注意什么问题?采取什么措施解决这些问题? ★继电器由吸合到断开的瞬间会产生一定的干扰,因而使用于吸合电流很小的微型继电器 ★当吸合电流比较大时,在单片机与继电器之间需要增加隔离电路。 第七章习题参 7-1 一般单片机应用系统由哪几部分组成? 由硬件系统和软件系统两部分组成的。硬件系统是指单片机及扩展的存储器、外围设备及其接口电路等;软件系统包括监控程序和各种程序。 7-2 模拟量采集的前向通道包括哪些组成部分?有什么特点? 一般包括变换器、隔离放大器、滤波器、采样保持器、多路电子开关、A/D转换器及其接口电路。 特点: (1) 与现场采集对象相连,是现场干扰进入的主要通道,是整个系统抗干扰设 计的重点部位; (2) 采集对象多样,存在大量的、形式多样的信号变换调节电路; (3) 是一个模拟、数字混合电路系统,电路功耗小,一般没有功率驱动要求。 7-3 后向通道有什么特点? (1) 是输出通道,大多数需要功率驱动; (2) 靠近伺服驱动现场,故后向通道的隔离对系统的可靠性影响很大; (3) 输出控制要求不同,后向通道电路多种多样。 7-5 单片机应用系统设计包括哪些主要内容? (1) 单片机系统设计,包括最小系统设计和系统扩展设计; (2) 通道与接口设计; (3) 系统抗干扰设计; (4) 应用软件设计。 7-14 硬件调试的基本步骤是什么? 先静态调试,第一步为目测,第二步为万用表测试,第三步为加电检查,第四步是联机检查;然后动态调试,一般是由近及远、由分到合。 7-15 软件调试中可用哪些程序运行方式?它们分别在何种场合下运用? 单步运行:需要了解每条指令的执行情况时,或用于精确定位某一段程序范围内的错误所在; 断点运行:用于将故障定位在程序的一个小范围内 连续运行:需要调试实时性操作(如中断等)。为准确地对错误进行定位,可使用连续加断点方式调试。 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- huatuo0.com 版权所有 湘ICP备2023021991号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务