单片机原理及应用——基于Proteus和Keil C

更新时间:2024-06-09 11:57:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

第一章

1. 什么是单片机?

在一块集成电路芯片上集成了微处理器、存储器、输入接口、输出接口、定时器/计数器、中断等基本电路所构成的单片微型计算机,简称单片机(Single-Chip-Microcomputer)。

单片机有较强的控制功能,主要取决于单片机在其结构上的设计,包括单片机硬件、指令系统及I/O处理功能等方面都有独到之处。虽然单片机只是一个芯片,但无论从组成还是从其逻辑功能上来看,都具有微机系统的含义。

2.单片机应用灵活性体现在哪些方面?

单片机以其自身的特点,其应用领域已渗透入各个领域。

单片机的主要特点是体积小、功耗低、价格低廉、使用方便,控制功能强、便于进行位运算且具有逻辑判断、定时计数等多种功能。

单片机应用系统设计灵活,在系统硬件不变的情况下,可通过不同的程序可实现不同的功能,因此这从根本改变了传统控制系统的设计思想和设计方法。过去必须由模拟电路、数字电路及继电器控制电路实现的大部分功能,现在已能用单片机并通过软件方法实现。由于软件技术的飞速发展,各种软件系列产品的大量涌现,可以极大地简化硬件电路。“软件就是仪器”已成为单片机应用技术发展的主要特点。

3.简述单片机的发展历程。

1976年,Inter公司推出了MCS-48系列8位单片机

到目前为止,世界各地厂商已相继研制出大约50个系列300多个品种的单片机产品。代表产品有Intel公司的MCS-51系列(以下简称51系列)机(8位机)

目前,市场上的主流产品是51系列兼容机:由STC公司推出的高性价比的STC89系列单片机和Atmel公司生产的AT89系列单片机。

随着集成电路的发展,随之出现内核为32位的ARM处理器,

在单片机家族的众多成员中,51系列单片机以其优越的性能、成熟的技术及高可靠性和高性能价格比,迅速占领了工业测控和自动化工程应用的主要市场,

在8位单片机的基础上,又推出超8位单片机,其功能进一步加强,同时16位单片机也相继产生,代表产品有Intel公司的MCS-96系列以及ATMEL推出的AVR单片机。

4.计算机能够识别的数值是什么?为什么要引进十六进制数?

在计算机中,由于所采用的电子逻辑器件仅能存储和识别两种状态的特点,计算机内部一切信息存储、处理和传送均采用二进制数的形式。可以说,二进制数是计算机硬件能直接识别并进行处理的惟一形式。十六进制数可以简化表示二进制数。

5. 数值转换。

(1)37=( 100101 )B=( 25 )H (2) 12.875=( 1100.111 )B=( 0CE )H

(3) 10110011B=( 0B3 )H=( 179 )10

(4) 10111.101B=(17.A )H=(23.625 )10 (5) 56H=( 01010110 )B=(86 )10 (6) 3DFH=( 0011 1101 1111 )B=(991 )10 (7)1A.FH =(1 1010.1111 )B=( 26.9375 )10 (8) 3C4DH=(11 1100 0100 1101 )B=( )10

6. 对于二进制数10001001B,若理解为无符号数,则该数对应十进制数为多少?若理解为有符号数,则该数对应十进制数为多少?若理解为BCD数,则该数对应十进制数为多少?

137 -119 89

7. 列出下列数据的反码、原码和补码。

(1) +123 (2) -127 (3) +45 (4) -278 (1)01111011 01111011 01111011 (2)10000000 11111111 10000001 (3)101101 101101 101101

(4)1111111011101001 1000000100010110 1111111011101010 8. 简述单片机的仿真过程和开发过程。

可以使用protues仿真软件首先建立电路原理图,然后调入由keil编译连接的.hex 文件(参考本章项目实例);

开发过程:(参考第8章)

第2章

1. 51单片机包括哪些主要逻辑功能部件?各功能部件的主要作用是什么?简单说明不同型号的差别。

8051单片机内部由CPU、4KB的ROM、128B的RAM、4个8位的I/O并行端口、一个串行口、两个16位定时/计数器及中断系统等组成。

2. 程序状态字寄存器PSW各位的定义是什么?

PSW是一个8位寄存器,用于寄存当前指令执行后的某些状态,即反映指令执行结果的一些特征信息。

Cy(PSW.7):即PSW的D7位,进位/借位标志。 AC(PSW.6):即PSW的D6位,辅助进位标志。 F0(PSW.5)及F1(PSE.1):即PSW的D5位、D1位,用户标志位。 RS1及RS0(PSW.4及PSW.3):即PSW的D4位、D3位,寄存器组选择控制位。 OV(PSW.2):即PSW的D2位,溢出标志。

3. 51存储器结构的主要特点是什么?程序存储器和数据存储器各有何不同?

MCS-51单片机的存储器结构与一般微机存储器的配置方法不同,一般微机把程序和数据共存同一存储空间,各存储单元对应惟一的地址。而MCS-51的存储器把程序和数据的存储空间严格区分开。

数据存储器用于存放程序运算的中间结果、状态标志位等。 程序存储器用于存放已编制好的程序及程序中用到的常数。 4. 51单片机内部RAM可分为几个区?各区的主要作用是什么? 内部数据存储器分为高、低128B两大部分。

低128B为RAM区,地址空间为00H~7FH,可分为:寄存器区、位寻址区、堆栈及数据存储区。存放程序运算的中间结果、状态标志位等。

高128B为特殊功能寄存器(SFR)区,地址空间为80H~FFH,其中仅有21个字节单 元是有定义的。

5. 51单片机的P0~P3四个I/O端口在结构上有何异同?使用时应注意哪些事项?

P0口是一个8位漏极开路型双向I/O端口。

P1口是一个内部带上拉电阻的8位准双向I/O端口。 P2口也是一个内部带上拉电阻的8位准双向I/O端口 P3口是一个内部带上拉电阻的8位多功能双向I/O端口。 在使用时应注意以下方面:

① P0~P3都是准双向I/O口,即CPU在读取数据时,必须先向相应端口的锁存器写入“1”。各端口名称与锁存器名称在编程时相同,均可用P0~P3表示。当系统复位时,P0~P3端口锁存器全为“1”,故可直接对其进行读取数据。

② P0口每一输出位可驱动8个LS型TTL负载,P0口可作通用输入、输出端口使用,此时,若要驱动NMOS或其他拉电流负载时,需外接上拉电阻,才能使该位高电平输出有效。

在单片机进行外部存储器扩展时,P0口必须作为地址/数据复用线使用,此时,不必外接上拉电阻,P0也不能作通用I/O口使用。

③ P1、P2、P3口输出均接有内部上拉电阻,输入端无需外接上拉电阻,每一位输出可以驱动4个LS型TTL电路。

④ P0、P2口除可以作通用I/O端口、以实现与外部进行数据交换外,更主要的是,当CPU访问外部存储器时,CPU将自动地把外部存储器的地址线信号(16位)送P0、P2口,作为地址总线(P0口输出低8位地址,P2口输出高8位地址),向外部存储器输出16位存储单元地址。在控制信号作用下,该地址低8位被锁存后,P0口自动切换为数据总线,这时经P0口可向外部存储器进行读、写数据操作。此时,P2口不再作通用I/O端口,P0口为地址/数据复用口。

6. 指出8051可进行位寻址的存储空间。

00~7FH(即20H.0~2FH.7)及SFR地址能被8整除的寄存器中的各位。

7. 在访问外部ROM或RAM时,P0和P2口各用来传送什么信号?P0口为什么要采用片外地址锁存器?

P0口传送地址低八位后可复用数据线,所以,P0口要采用片外地址锁存器。P2口传送地址高八位。

8. 什么是时钟周期?什么是机器周期?什么是指令周期?当振荡频率为12MHz时,一个机器周期为多少微秒?

时钟周期:也称振荡周期,即振荡器的振荡频率fosc的倒数,是时序中最小的时间单位。机器周期:执行一条指令的过程可分为若干个阶段,每一阶段完成一规定的操作,完成一个规定操作所需要的时间称为一个机器周期,一个机器周期包含12个时钟周期。 当振荡频率为12MHz时,一个机器周期为12/(12×1000000)秒=1微秒 指令周期:定义为执行一条指令所用的时间。

9. 51单片机有几种复位方法?复位后,CPU从程序存储器的哪一个单元开始执行程序?

MCS-51的复位电路包括上电复位电路和按键(外部)复位电路 0000H

10. 8051单片机引脚ALE的作用是什么?当8051不外接RAM和ROM时,ALE上输出的脉冲频率是多少?其作用是什么?

地址锁存使能输出ALE:当单片机访问外部存储器时,外部存储器的16位地址信号由P0口输出低8位,P2口输出高8位,ALE可用作低8位地址锁存控制信号;当不用作外部存储器地址锁存控制信号时,该引脚仍以时钟振荡频率的1/6固定地输出正脉冲,可以驱动8个LS型TTL负载。

第3章

1. MCS-51汇编指令格式是什么,如何通过汇编指令格式来判断指令字节数?

MCS-51指令系统中的每一条指令都有两级指令格式: ? CPU可直接识别并执行的机器语言指令。 ? 汇编语言指令(简称汇编指令)。

MCS-51汇编语言指令格式由以下几个部分组成:

[标号:] 操作码 [目的操作数] [,源操作数] [; 注释]

其中,[ ]中的项表示为可选项。

指令寻址方式是判断指令字节数的依据之一。

2. 有哪几种寻址方式?其特征对象分别是什么?做表说明。

MCS-51指令系统的寻址方式有以下7种: 立即寻址方式:操作数直接出现在指令中。

直接寻址方式中:操作数的单元地址直接出现在指令中。 寄存器寻址方式中:寄存器中的内容就是操作数。

寄存器间接寻址方式中,指定寄存器中的内容是操作数的地址,该地址对应存储单元的内容才是操作数。

变址寻址方式是以程序指针PC或数据指针DPTR为基址寄存器,以累加器A作为变址寄存器,两者内容相加(即基地址+偏移量)形成16位的操作数地址,

相对寻址是以程序计数器PC的当前值作为基地址,与指令中的第二字节给出的相对偏移量rel进行相加,所得和为程序的转移地址。

位地址:内部RAM地址空间的可进行位寻址的128位和SFR地址空间的可位寻址的11个8位寄存器的88位。位寻址给出的是直接地址。

3. 位寻址和字节寻址如何区分?在使用时有何不同? 由寻址方式可以看出,不同的寻址方式所寻址的存储空间是不同的。正确地使用寻址方式不仅取决于寻址方式的形式,而且取决于寻址方式所对应的存储空间。字节寻址必须是对8位存储单元,位寻址的存储空间只能是片内RAM的20H~2FH字节地址中的所有位(位地址为00H~7FH)和部分SFR的位,决不能是该范围之外的任何单元的任何位。

4. 要访问专用寄存器和片外数据寄存器,应采用什么寻址方式?举例说明。 访问专用寄存器:可采用直接寻址或寄存器寻址。 访问片外数据寄存器:寄存器间接寻址

5. 什么是堆栈?其主要作用是什么?如何使用? 堆栈是后进先出的数据存储区

一般用于中断处理过程中,若需要保护现场数据(如内部RAM单元的内容),可使用入栈指令,将数据压入堆栈,中断处理过程执行完后,再使用出栈指令恢复现场数据。

6. 编程将片外数据存储器2000H~20FFH单元内容清零。

MOV DPTR,#2000H MOV A,#0

MOV R3,#100H LOP :MOV @DPTR,A

INC DPTR DJNZ R3,LOP

7. 已知A=83H,R0=17H,(17H)=34H,写出下列程序段执行完后的A中的内容。

ORL A, #17H ANL 17H, A XRL A, @R0 CPL A

(A)=11001011B=0CBH

8. 已知单片机的fosc=6MHz,分别设计延时0.1s、1s、1min的子程序。

这里取单片机常用的晶振频率为12MHz,一个机器周期为1μs。 (若fosc=6MHz,读者可参考下列程序修改)

延时1ms的子程序:

DELAY: MOV R7, #0FFH LOOP: NOP NOP DJNZ R7, LOOP RET

执行时间(机器周期) 1 1 1 2 2

该程序段的总的执行时间为:

(1+4×255+2)?s=1023μs≈1ms

延时时间为100ms的子程序:

DELAY: LOP1: LOOP:

MOV R5,#64H 对延时1ms的子程序循环100次。

MOV R7, #0FFH NOP NOP DJNZ R7, LOOP DJNZ R5,LOP1 RET

延时时间为1s的子程序:

DELAY1: MOV R3, #0AH 对延时100ms的子程序循环10次 DELAY:

LOP1: LOOP:

MOV R5,#64H 。

MOV R7, #0FFH NOP NOP DJNZ R7, LOOP DJNZ R5,LOP1

DJNZ R3, DELAY RET

延时时间为60s的子程序: 对延时1s的子程序循环60次 9. MCS-51汇编语言中有哪些常用的伪指令?各起什么作用? BIT(地址符号命令)

END(结束汇编) EQU(等值) DB(定义字节)

DW(定义字)

EX0=1; /* 打开外部中断0, setb ex0*/ while(1); /*等待中断*/ }

void external0(void) interrupt 0 /*定义外部中断0中断函数处理程序*/ { int a;

EX0=0; /*关闭外部中断0, clr ex0*/ P1=0xff; a=P1;

if(a) out=1; else out=0; EX0=1; }

第5章

(注:题后附有本章补充习题)

1. MCS-51系列单片机能提供几个中断源、几个中断优先级?各个中断源的优先级怎样确定?在同一优先级中,各个中断源的优先顺序怎样确定?

答:MCS-51系列单片机能提供5个中断源,2个中断优先级。各个中断源的优先级是由特殊功能寄存器IP来确定,IP中和各个中断源对应位为1时,此中断源为高优先级,否则为低优先级。在同一优先级中,各个中断源的优先顺序是由自然优先级来确定的。

2. 简述MCS-51系列单片机的中断响应过程。

答:MCS-51系列单片机的中断响应过程是按照以下顺序执行的:开中断-----中断请求------中断判断-------中断响应-------中断返回。

3. MCS-51系列单片机的外部中断有哪两种触发方式?如何设置?对外部中断源的中断请求信号有何要求?

答:MCS-51系列单片机的外部中断有电平触发和边沿触发两种方式。是由特殊功能寄存器TCON中IT0,IT1的状态确定的,如:IT0为1时外部中断0为边沿触发方式,当INT0外部引脚出现下降沿时向CPU提出中断请求, 否则为电平触发方式,当INT0外部引脚出现低电平时向CPU提出中断请求。

4. MCS-51单片机中断响应时间是否固定?为什么?

答:MCS-51单片机中断响应时间不固定,因为当中断源向CPU提出中断请求时,CPU正在执行的指令的指令周期是不一样的。

5. MCS-51单片机如果扩展6个中断源,可采用哪些方法?如何确定它们的优先级? 答:一般可采取中断加查询方式,软件先查询到的为高优先级,最后查询到的为低优先级。

6. 试用中断技术设计一发光二极管LED闪烁电路,闪烁周期为2s,要求亮1s再暗1s。 提示:在外部中断0的控制下,使用定时器实现延时。

7. 当正在执行某一中断源的中断服务程序时,如果有新的中断请求出现,问在什么情况下可响应新的中断请求?在什么情况下不能响应新的中断请求?

答:当正在执行某一中断源的中断服务程序时,如果有新的中断请求出现,当新中断源中断级别比正在执行中断源的中断级别高时可响应新的中断请求,否则不能响应新的中断请求。

8. 异步通信和同步通信的主要区别是什么?MCS-51串行口有没有同步通信功能? 答案:

异步通信因为每帧数据都有起始位和停止位,所以传送数据的速率受到限制。但异步通信不需要传送同步脉冲,字符帧的长度不受限制,对硬件要求较低,因而在数据传送量不很大。同步通信一次可以连续传送几个数据,每个数据不需起始位和停止位,数据之间不留间隙,因而数据传输速率高于异步通信。但同步通信要求用准确的时钟来实现发送端与接收端之间的严格同步。

MCS-51串行口有同步通信功能。

9. 解释下列概念:

1) 并行通信、串行通信。 2) 波特率。

3) 单工、半双工、全双工。 4) 奇偶校验。

答案:

(1)并行通信:数据的各位同时进行传送。其特点是传送速度快、效率高,数据有多少位,就需要有多少根传输线。当数据位数较多和传送距离较远时,就会导致通信线路成本提高, 因此它适合于短距离传输。

串行通信:数据一位一位地按顺序进行传送。其特点是只需一对传输线就可实现通信,当传输的数据较多、距离较远时,它可以显著减少传输线,降低通信成本,但是串行传送的速度慢。

(2)波特率:每秒钟传送的二进制数码的位数称为波特率(也称比特数),单位是bps(bit per second),即位/秒。

(3)单工:只允许数据向一个方向传送,即一方只能发送,另一方只能接收。

半双工:允许数据双向传送,但由于只有一根传输线,在同一时刻只能一方发送,另一方接收。

全双工:允许数据同时双向传送,由于有两根传输线,在A站将数据发送到B站的同时,也允许B站将数据发送到A站。

(4)奇偶校验:为保证通信质量,需要对传送的数据进行校验。对于异步通信,常用的校验方法是奇偶校验法。

采用奇偶校验法,发送时在每个字符(或字节)之后附加一位校验位,这个校验位可以是“0”或“1”,以便使校验位和所发送的字符(或字节)中“1”的个数为奇数——称为奇校验,或为偶数——称为偶校验。接收时,检查所接收的字符(或字节)连同奇偶校验位中“1”的个数是否符合规定。若不符合,就证明传送数据受到干扰发生了变化,CPU可进行相应处理。

10. MCS-51串行口控制寄存器SCON中SM2、TB8、RB8有何作用?主要在哪几种方式下使用? 答案:

SM2:多机通信控制位,主要在方式1、2、3下使用; TB8:存放发送数据的第9位,主要在方式2、3下使用;

RB8:存放接收数据的第9位或停止位,主要在方式1、2、3下使用。

11. 试分析比较MCS-51串行口在四种工作方式下发送和接收数据的基本条件和波特率的产生方法。

答案:发送数据的基本条件:

方式0、1、2、3:CPU执行一条将数据写入发送缓冲器SBUF的指令; 接收数据的基本条件:

方式0:用软件使REN=1(同时RI=0);方式1:用软件使REN=1,一帧数据接收完毕后,必须同时满足以下两个条件:①RI=0;②SM2=0或接收到的停止位为1,这次接收才真正

有效,将8位数据送入SBUF,停止位送RB8,置位RI。否则,这次接收到的数据将因不能装入SBUF而丢失。方式2、3:软件使REN=1,同时满足以下两个条件:① RI=0;② SM2=0或接收到的第9位数据为1(SM2=1),则这次接收有效,8位数据装入SBUF,第9位数据装入RB8,并由硬件置位RI。否则,接收的这一帧数据将丢失。 波特率的产生方法:

在方式0下,串行口的波特率是固定的,即波特率=fosc /12;在方式1、3下,串行口波特率由定时器T1的溢出率和SMOD值同时决定。相应公式为:波特率=2SMOD×T1溢出率/32;在方式2下,串行口的波特率可由PCON中的SMOD位控制:若使SMOD=0,则所选波特率为fosc/64;若使SMOD=1,则波特率为fosc/32。即 2SMOD

×fosc 波特率= 64

12. 为何T1用作串行口波特率发生器时常用模式2?若fosc=6MHz,试求出T1在模式2下可能产生的波特率的变化范围。

答案:定时器T1作为波特率发生器可工作于模式0、模式1和模式2。其中模式2在T1溢出后可自动装入时间常数,避免了重装参数,因而在实际应用中除非波特率很低,一般都采用模式2。

若fosc=6MHz,T1在模式2下可能产生的波特率的变化范围为:61.04 bps ~ 15625 bps。

13. 简述多机通信原理。

答案:当主机选中与其通信的从机后,只有该从机能够与主机通信,其他从机不能与主机进行数据交换, 而只能准备接收主机发来的地址帧。上述要求是通过SCON寄存器中的SM2和TB8来实现的。当主机发送地址帧时使TB8=1,发送数据帧时使TB8=0,TB8是发送的一帧数据的第9位,从机接收后将第9位数据作为RB8,这样就知道主机发来的这一帧数据是地址还是数据。另外,当一台从机的SM2=0时,可以接收地址帧或数据帧,而当SM2=1时只能接收地址帧,这就能实现主机与所选从机之间的单独通信。

14. 试用8051串行口扩展I/O口,控制16个发光二极管自右向左以一定速度轮流发光,画出电路并编写程序。

程序如下:

#include

#define uchar unsigned char #define uint unsigned int sbit high8 = P1^1; sbit low8 = P1^0; uchar a = 0x80; uchar count = 0x08;

void init() { SCON = 0x00; //串口工作方式0 ES = 1; //开串口中断 EA = 1; //开总中断 low8 = 1; //打开低8位并行输出 high8 = 0; //关闭高8位并行输出

}

void delay(void) //M ms 延时程序 误差 0us (6M) {

unsigned char a,b,c; for(c=23;c>0;c--)

for(b=152;b>0;b--) for(a=70;a>0;a--); }

int main() {

init(); SBUF = 0x00; //串行口发送数据 while(1); //等待中断

}

void recv() interrupt 4 { TI = 0; //清除发送标志位

SBUF = a; delay(); a = a >> 1; //数据向右移位一次 if(a == 0) //判断a是否为0

a= 0x80; count --; if(count == 0) //判断是否显示够8次

{ count = 0x08; //置数软件计数器

high8 = ~high8;

low8 = ~low8; //切换高低8位并行输出

} }

15. 试设计一个8051单片机的双机通信系统,串行口工作在方式1,波特率为2400bps,编程将甲机片内RAM中40H~4FH的数据块通过串行口传送到乙机片内RAM的40H~4FH单元中。 答案:

双方约定的通信协议如下:

甲机先发送请求乙机接收信号“0AAH”,乙机收到该信号后,若为准备好状态,一个则发送数据“0BBH”作为应答信号,表示同意接收。当甲机发送完16个字节后,再向乙

机发送一个累加校验和。校验和是针对数据块进行的,即在数据发送时,发送方对块中的数据简单求和,产生一个单字节校验字符(校验和),附加到数据块结尾。在数据接收时,接收方每接收一个数据也计算一次校验和;接收完数据块后,再接收甲机发送的校验和,并将接收到的校验和与乙机求出的校验和进行比较,向甲机发送一个状态字,表示正确(00H)或出错(0FFH),出错则要求甲机重发。甲机收到收到乙机发送的接收正确应答信号(00H)后,即结束发送,否则,就重发一次数据。

甲机采用查询方式进行数据发送,乙机采用中断方式进行数据接收。双方约定传输波特率为2400bps,两机主频均为11.059MHz,双机串行口都工作于方式1,查表6-2可知SMOD=0,定时器T1采用工作模式2,初值为F4H。

甲机发送子程序:

#include #include

#define uchar unsigned char #define uint unsigned int uint i;

char data *p; //定义一个指向片内RAM地址的指针 void init() {

TMOD = 0x20; //定时器T1工作在方式2

TH1 = 0xF4; // 波特率为2400bit/s

ES = 1; //开串口中断 EA = 1; //开总中断 SCON = 0x50; //串口工作在方式1

PCON = 0x00; //SMOD = 0;

TR1=1; //打开定时器T1 }

void send(uchar data1)

//发送子程序

TL1 = 0xF4;

{

SBUF = data1; while(TI == 0); TI = 0; }

void main() {

uchar i,ack,checksum = 0; init();

p=0x40;//片内RAM地址为0x40 for(i = 0;i < 16; i++) //初始化要发送的数据

p[i] = i+1; while(1) { send(0xaa); while(!RI);

RI = 0;

ack = SBUF;

if(ack == 0xbb) { for(i = 0 ;i < 16 ;i ++) {

send(p[i]); //发送数据 checksum = checksum + p[i]; //求校验和

}

send(checksum); checksum = 0; while(!RI); RI = 0;

ack = SBUF; if(ack == 0x00) while(1);

//清校验和

//判断数据是否为0 //停止发送

} }

}

乙机接收子程序:

#include #include

#define uchar unsigned char #define uint unsigned int

uchar checksum = 0,i = 0,checksum_r;

char data *p; //定义一个指向片内RAM地址的指针

bit rec_flag = 0; void init() { TMOD = 0x20; //定时器T1工作在方式2

TH1 = 0xF4; // 波特率为2400bit/s

TL1 = 0xF4; ES = 1; //开串口中断 EA = 1; //开总中断 SCON = 0x50; //串口工作在方式1 PCON = 0x00; //SMOD = 0; TR1=1; //打开定时器T1

}

void send(uchar data1) //串口发送子程序

{

SBUF = data1; while(TI == 0); TI = 0;

}

void main() {

init(); p=0x40; //片内RAM地址为0x20 while(1) //等待中断 { } }

void recv() interrupt 4 {

uchar ack = 0; if(RI) {

RI = 0; ack = SBUF;

//清除接收标志位

}

if(ack == 0xaa) //判断是否为请求发送数据帧 { //发送应答信号 send(0xbb);

rec_flag = 1; //数据接收标志位置1 } else { if(!rec_flag) //接收的不是数据 { checksum_r = SBUF;

if(checksum == checksum_r)//发送数据的校验和与接收数据校验和比较 send(0x00); //相等发送00 else send(0xff); //不等发送0xff checksum = 0; } if(rec_flag) { p[i] = SBUF; checksum = checksum + p[i]; //求校验和 i ++; if(i == 16) { i = 0; rec_flag = 0; } } } }

16. 8051以方式2进行串行通信,假定波特率为1200bps,第9位作奇偶校验位,以中断方式发送。请编写程序。 答案:

主程序:

#include

#define uchar unsigned char uchar i = 0; uchar a[10]; void main() {

SCON = 0x80; PCON = 0; ES = 1; EA = 1; while(1); }

void uart() interrupt 4 {

TI = 0;

if( i < 10 ) { ACC = a[i]; TB8 = P; SBUF = a[i]; i++; } }

17. 8051以方式3进行串行通信,假定波特率为1200bps,第9位作奇偶验位,以查询方式接收。请编写程序。

答案:

#include

#define uchar unsigned char uchar i,flag; uchar a[10]; void main() {

TMOD = 0x20; TL1 = 0xe8; TH1 = 0xe8; TR1 = 1;

SCON = 0xd0; PCON = 0; while(1) {

} }

if(RI) { RI = 0; ACC = SBUF; if( P == 0 ) { if( RB8 == 1 ) flag = 1; } else { if( RB8 == 1 ) { flag = 0; if( i < 10 ) { a[i]= SBUF; i++; } } else flag = 1; } }

18. RS-232C总线标准是如何定义其逻辑电平的?实际应用中可以将MCS-51单片机串

行口和PC机的串行口直接相连吗?为什么? 答案:

RS-232C采用负逻辑,即逻辑1用-5V~-15V表示,逻辑0用+5V~+15V表示。 PC机配置的是RS-232C标准接口,与MCS-51单片机输入、输出电平不兼容。因此实际应用中不能将MCS-51单片机串行口和PC机的串行口直接相连。

19. 为什么RS-485总线比RS-232C总线具有更高的通信距离和更远的通信距离? 答案:

RS-232C由于发送器和接收器之间具有公共信号地,不可能使用双端信号,因此共模噪声会耦合到信号系统中,从而限制了RS-232C的信号传输速率和通信距离。而RS-485总线无论发送还是接收数据,均用两条线传送双端(差分)信号,因而大大提高了通信速率和通信距离。

定时器补充练习题:

1.8051定时器/计数器有哪几种工作模式?各有什么特点?

答:8051定时器/计数器有0,1,2,3四种工作模式。模式0为13位1定时器/计数器,模式1为16位1定时器/计数器,模式2为自动赋初值的8位定时器/计数器,模式3可以增加一个8位定时器(T1没有模式3)。

2.8051定时器作定时和计数时,其计数脉冲分别由谁提供?

答:8051定时器作定时器时,输入的记数脉冲是由晶体振荡器的输出经12分频后得到的,所以定时器可看作是对单片机机器周期的计数器。8051定时器作计数器时,则对外部事件进行计数。

3.8051定时器的门控信号GATE为1时,定时器如何启动?

答:8051定时器的门控信号GATE为1时,只有INT0(或INT1)引脚为高电平且TR0(或TR1)置1时,相应的T0或T1才能选通工作。

4.定时器/计数器0已预置为156,且选定用于模式2的计数方式,现在T0引脚上输入周期为1ms的脉冲,问:

(1) 此时定时器/计数器0的实际用途是什么? (2) 在什么情况下,定时器/计数器0溢出? 答:(1)此时定时器/计数器0的实际用途是0。1S脉冲信号发生器。 (2)当T0每记数100次后定时器/计数器0溢出。

5.设fosc=12MHz,定时器0的初始化程序和中断服务程序如下:

MAIN:

MOV MOV MOV SETB ?

TH0, #9DH

TL0, #0D0H TMOD, #01H TR0

中断服务程序:

MOV MOV

? RETI

TH0, #9DH TL0, #0D0H

问:(1) 该定时器工作于什么方式?

(2) 相应的定时时间或计数值是多少? 答:(1)该定时器以模式1工作于定时方式。 (2)相应的定时时间为25。136ms.

6.8051单片机的fosc=6MHz,如果要求定时时间分别为0.1ms和5ms,当T0工作在模式0、模式1和模式2时,分别求出定时器的初值。

答:(1)定时时间为0.1ms时:模式0初值为8142、模式1初值为65486,模式2初值206。

(2)定时时间为5ms时:模式0初值为5692、模式1初值为63036,模式2此时定时时间不够。

7.以定时器1进行外部事件计数,每计数1000个脉冲后,定时器1转为定时工作方式。定时10ms后,又转为计数方式,如此循环不止。设fosc=6MHz,试用模式1编程。

解:先确定T1作为计数器时初值为:64536(0FC68H) T1作为定时器时初值为:60536(0EC78H) 程序如下:

#include void main() {

TR1 = 1; while(1)

{ } }

TMOD = 0x50; TL1 = 0x68; TH1 = 0xfc;

while(TF1 == 0); TMOD = 0x10; TL1 = 0x78; TH1 = 0xe0; while(TF1 == 0);

8.已知8051单片机的fosc=6MHz,试利用T0和P1.0输出矩形波。矩形波高电平宽100μs,低电平宽300μs。

解:先确定 T0作为定时器工作于模式2时初值为:高电平为50,低电平为150。

采用中断方式编程。 程序如下:

#include

#define uchar unsigned char sbit SQU = P1^0; void main() {

TMOD = 0x02; TL0 = 50; IE = 0x82; SQU = 1; TR0 = 1; while(1) { } }

void t0_SQU() interrupt 1 {

if(SQU == 1) { SQU = 0; TL0 = 150; } else { SQU = 1; TL0 = 50; } }

9.设fosc=12MHz,试编写一段程序,功能为:对定时器T0初始化,使之工作在模式2,产生200μs定时,并用查询T0溢出标志的方法,控制P1.1输出周期为2ms的方波。

解:先确定 T0作为定时器时初值为:56 程序如下:

#include

#define uchar unsigned char sbit SQU = P1^1; void main() {

TMOD = 0x02; TL0 = 56; TL0 = 56; SQU = 1; TR0 = 1; while(1) { if(TF0 == 1) { i++; if(i>4) { i = 0; SQU = ~SQU; } } } }

10.已知8051单片机系统时钟频率为6MHz,利用其定时器测量某正脉冲宽度时,采用哪种工作模式可以获得最大的量程?能够测量的最大脉宽是多少?

答:首先设置TMOD中GATE为1,以定时方式工作在模式1,外部正脉冲从外部中断引脚引入,可获得最大的量程。

能够测量的最大脉宽为:131ms.

第6章

1.通常8031给用户提供的I/O口有哪几个?为什么? 答案:

MCS-51系列单片机虽然有4个8位I/O口P0、P1、P2、P3,但4个I/O口实际应用时,并不能全部留给用户作系统的I/O口。因为当单片机在外部扩展了程序存储器、数据存储器时,就要用P0和P2口作为地址/数据总线,而留给用户使用的I/O口只有P1口和一部分P3口。

2. 简述MCS-51系列单片机CPU访问外部扩展程序存储器的过程。 答案:

P0口作为地址/数据复用的双向三态总线,用于输出程序存储器的低8位地址或输入指令,P2口具有输出锁存功能,用于输出程序存储器的高8位地址。当ALE有效(高电平)时,高8位地址从P2口输出,低8位地址从P0口输出,在ALE的下降沿把P0口输出的低8位地址锁存起来,然后在PSEN有效(低电平)期间,选通外部程序存储器,将相应单

元的数据送到P0口,CPU在PSEN上升沿完成对P0口数据的采样。

3. 简述MCS-51系列单片机CPU访问外部扩展数据存储器的过程。 答案:

第一个机器周期是从外部程序存储器读取MOVX指令操作码,第二个机器周期才是执行MOVX指令访问外部数据存储器。在该周期中,若是读操作,则RD信号有效(低电平),P0口变为输入方式,被地址信号选通的外部RAM某个单元中的数据通过P0口输入CPU;若是写操作,则WR信号有效(低电平),P0口变为输出方式,CPU内部数据通过P0口写入地址信号选通的外部RAM的某个单元中。

4. 现要求为8051扩展2片2732作为外部程序存储器,试画出电路图,并指出各芯片的地址范围。

答案:

电路图如下:

各芯片的地址范围: 2732(1):0B800H ~0BFFFH; 2732(2):7800H ~7FFFH。

5. 现要求为8051外扩1片2864A,兼作程序存储器和数据存储器,请画出硬件连接图。 答案:

电路图如下:

6. 假设某一8051单片机系统,拟扩展2片2764 EPROM芯片和2片6264SRAM芯片,试画出电路图,并说明存储器地址分配情况。

答案:

电路图如下:

P2.0~P2.458ALE8031EAGQ0~Q7A0~A7A8~A12A0~A7A8~A12A0~A7A8~A12A0~A7A8~A1274LS373OED0~D782764?1?OED0~D7CE2764?2?6264?1?OED0~D7CEWE6264?2?OED0~D7CEOED0~D7CEWEP0.0~P0.7PSENRDWRP2.5P2.5

存储器地址分配:

2764(1):C000H~DFFFH; 2764(2):A000H~BFFFH; 6264(1):C000H~DFFFH; 6264(2):A000H~BFFFH。

7. 一个8051应用系统扩展了1片8155,晶振为12MHz,具有上电复位功能,P2.1~P2.7作为I/O口线使用,8155的PA口、PB口为输入口,PC口为输出口。试画出该系统的逻辑图,并编写初始化程序。

答案:

系统逻辑图如下:

初始化程序:

MOV DPTR, #0FFF8H MOV A, #0CH

MOVX DPTR, A

8. 8155TIN端输入脉冲频率为1MHz,请编写能在TOUT引脚输出周期为8ms方波的程序。

答案: 程序如下:

MOV DPTR,#7F04H ; 指向定时器低8位 MOV A,#40H MOVX @DPTR,A ; 计数常数低8位装入定时器 INC DPTR ; 指向定时器高8位 MOV A,#5FH ; 设定时器输出方式为连续方波输出 MOVX @DPTR,A ; 装入定时器高8位 MOV DPTR,#7F00H ; 指向命令/状态口

MOV A,#0C2H ; 命令字设定PA口为基本输入方式,PB口为基

本输出方式,并启动定时器

MOVX @DPTR,A

9. 现要求8155的A口基本输入,B口、C口基本输出,启动定时器工作,输出连续方波,请编写8155的初始化程序。

答案: 程序如下:

MOV DPTR,#data 1 ; 指向定时器低8位 MOV A,#data2 MOVX @DPTR,A ; 计数常数低8位装入定时器 INC DPTR ; 指向定时器高8位 MOV A,#40 H ; 设定时器输出方式为连续方波输出 MOVX @DPTR,A ; 装入定时器高8位 MOV DPTR,#data3 ; 指向命令/状态口

MOV A,#0CEH ; 命令字设定PA口为基本输入方式,PB、PC

口为基本输出方式,并启动定时器

MOVX @DPTR,A

第7章

1.简述键盘扫描的主要思路。 答案:

键盘扫描的主要思路:首先确定是否有键按下,消除抖动,若有键按下,输出逐行或列的扫描字,读取列或行的状态,确定按键键值,然后再判断按键是否释放,若释放,即可返回。

2.简述软件消除键盘抖动的原理。 答案:

软件消除键盘抖动的原理:当CPU发现有键按下的情况下,为了防止是机械抖动的误动作,可以采用软件延时10ms,然后再次检测按键是否仍然为闭合状态,若仍然闭合,则确定有键按下,否则就是键盘抖动,不予理睬。

3.什么叫LED的动态显示和静态显示。 答案:

静态显示形式,即七段LED数码管在显示某一个字符时,相应的段(发光二极管)恒定的导通或截至,直至换显其他字符为止。

动态显示是将所有数码管的段码线对应并联在一起,由一个8位的输出口控制,每位数码管的公共端(称位选线)分别由一位I/O口线控制,以实现各位的分时选通。

4.要求利用8051的P1口扩展一个2?2行列式键盘电路,画出电路图,并根据所绘电路编写键扫描子程序。

答案:

设行线H1~H2连接到51单片机P1口的P1.0~P1.1,列线L1~L2连接到P1口的P1.4~

P1.5。电路图如下:

键扫描子程序: C程序如下:

uchar keysearch() //按键函数扫描有键按下否(返回值不等于0,说明有键按下)

{

uchar k; P1=0x0f; k=P1; k=~k;

k=k&0x0f; return k; }

uchar key() //按键函数(返回值:等于0xff,说明没有键按下)

{

uchar a,c,kr,keynumb; a=keysearch(); if(a==0) return 0xff; else delay(10); //延时去抖动

a=keysearch(); if(a==0) return 0xff; else { a=0xef; for(kr=0;kr<2;kr++) { P1 = a; c = P1; if((c & 0x01)==0)keynumb=kr+0x00; if((c & 0x02)==0)keynumb=kr+0x02; a=_crol_(a,1); //循环左移函数,需要intrins.h头文件支持 }

} do{

//按键释放检测

a=keysearch(); }while(a!=0); return keynumb; //返回按键的编码键值 }

void keybranch(uchar k) //按键的键值处理函数

{

switch(k) { case 0x00 : //添加需要执行的功能;break; case 0x01 : //添加需要执行的功能;break; case 0x02 : //添加需要执行的功能;break; case 0x03 : //添加需要执行的功能;break; default: break; } }

5.请在图7-1的基础上,设计一个以中断方式工作的开关式键盘,并编写其中断键处理程序。

答案:

电路图如下:

中断键处理程序:

void int_key() interrupt 0 {

delay(10); //delay 10 ms temp = P1;

if( (temp & 0x0f) == 0x0f ) break; temp = P1;

if((temp & 0x0f) == 0x0e) //key1处理函数

if((temp & 0x0f) == 0x0d) if((temp & 0x0f) == 0x0b) if((temp & 0x0f) == 0x07) }

//key2处理函数 //key3处理函数 //key4处理函数

6.状态或数码显示时,对LED的驱动可采用低电平驱动,也可以采用高电平驱动,二者各有什么特点?

答案:

高电平驱动要采用共阴极数码管,必须外接上拉电阻;低电平驱动要采用共阳极数码管,电源效率相对较高。

7.用DAC0832进行D/A转换时,当输出电压的范围在0~5V时,每变化一个二进制数其输出电压跳变约20mV,即输出是锯齿状的,采取何种措施可使输出信号比较平滑?

答案:

两种方法: (1)可以计算移动平均值;

(2)可以设计滤波器的办法。

8.当系统的主频为6MHz时,请计算图7-17中DAC0832产生锯齿波信号的周期。 答案:

T=2μs×8×256=4096μs

9.编写图7-17中用DAC0832产生三角波的应用程序。 答案:

程序功能:连续访问外部DAC寄存器,产生锯齿波

#include #include

#define uchar unsigned char #define uint unsigned int

延时函数

//头文件包含 //宏定义

void delay() {

uint i,j;

for(i=0;i<1;i++) for(j=0;j<120;j++); }

void main() 主函数

{

unsigned char a=0;

while(1) { XBYTE[0x7FFF]=a; a++;

delay( ); } }

//控制波形累加深度

//加入延时函数,控制其周期

10.对图7-24的A/D转换电路,若采用中断方式,编写相应程序。 答案:

在硬件电路上,应当将EOC引脚接到单片机的外部中断引脚上面,如INT1;

C程序如下:

//程序功能:对8路模拟信号轮流采样,并把结果依次存到数组中; #include //头文件定义

#include

unsigned char a[8]; unsigned char i; void main() 主程序 {

EA = 1; IT1= 1; EX1= 1;

XBYTE[0x7FF8] = a[0]; while(1) { } }

void int_adc() interrupt 0 {

a[i] = XBYTE[0x7FF8+i]; i++; if(i>7) i = 0; }

11.当图7-24的ADC0809对8路模拟信号进行A/D转换时,编写用查询方式工作的采样程序,8路采样值存放在30H~37H单元。

答案:

//程序功能:对8路模拟信号轮流采样一次,并把结果依次存放在30H~37H单元;

#include //头文件定义

#include unsigned char a[8]; unsigned char p;

void delay(unsigned char m) 延时函数

{

unsigned char i,j; for(i=0;i

void main() 主程序

{

unsigned char i; p = 0x30;

XBYTE[0x7FF8] = a[0]; for(i=0;i<8;i++) {

delay(10); a[i] = XBYTE[0x7FF8+i]; *[p++] = a[i]; }

while(1); }

第8章

1.哪些场合适合使用单片机系统?

单片机以其自身的特点,其应用领域已渗透入各个领域。

主要应用在: 智能仪器仪表、智能家用电器、实时工业控制、机电一体化。 还广泛应用于办公自动化领域(如复印机)、汽车电路、通信系统(如手机)、计算机外围设备等,成为计算机发展和应用的一个重要方向。

单片机应用系统设计灵活,在系统硬件不变的情况下,可通过不同的程序可实现不同的功能,因此这从根本改变了传统控制系统的设计思想和设计方法。过去必须由模拟电路、数字电路及继电器控制电路实现的大部分功能,现在已能用单片机并通过软件方法实现

2.从事单片机应用系统开发需要具备哪些基本知识和设备配置?

单片机基础知识、计算机通信基础知识、单片机开发板、下载软件及上位计算机。 3.简述单片机应用开发过程。

4.什么是ISP技术?在单片机开发过程中如何使用? ISP:在系统编程.

5.设计完成一个电子时钟,可以根据需要选择实现下列功能: 1)具有显示年、月、日、时、分、秒的功能。 2)具有校正功能。

3)可以选用LED数码管或者LCD显示。 4)能够显示星期、温度等信息;(发挥部分)。 5)具有整点报时、设定闹钟等附加功能。(发挥部分)。 参考下载包第8章项目6.

4.什么是ISP技术?在单片机开发过程中如何使用? ISP:在系统编程.

5.设计完成一个电子时钟,可以根据需要选择实现下列功能: 1)具有显示年、月、日、时、分、秒的功能。 2)具有校正功能。

3)可以选用LED数码管或者LCD显示。 4)能够显示星期、温度等信息;(发挥部分)。 5)具有整点报时、设定闹钟等附加功能。(发挥部分)。 参考下载包第8章项目6.

本文来源:https://www.bwwdw.com/article/gvo6.html

Top