单片机原理及应用基于Proteus和KeilC.docx
《单片机原理及应用基于Proteus和KeilC.docx》由会员分享,可在线阅读,更多相关《单片机原理及应用基于Proteus和KeilC.docx(53页珍藏版)》请在冰豆网上搜索。
单片机原理及应用基于Proteus和KeilC
第一章
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=(001111011111)B=(991)10
(7)1A.FH=(11010.1111)B=(26.9375)10
(8)3C4DH=(11110001001101)B=()10
6.对于二进制数10001001B,若理解为无符号数,则该数对应十进制数为多少?
若理解为有符号数,则该数对应十进制数为多少?
若理解为BCD数,则该数对应十进制数为多少?
137-11989
7.列出下列数据的反码、原码和补码。
(1)+123
(2)-127(3)+45(4)-278
(1)011110110111101101111011
(2)100000001111111110000001
(3)101101101101101101
(4)111111*********11000000100010110111111*********0
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单元内容清零。
MOVDPTR,#2000H
MOVA,#0
MOVR3,#100H
LOP:
MOV@DPTR,A
INCDPTR
DJNZR3,LOP
7.已知A=83H,R0=17H,(17H)=34H,写出下列程序段执行完后的A中的内容。
ORLA,#17H
ANL17H,A
XRLA,@R0
CPLA
(A)=11001011B=0CBH
8.已知单片机的fosc=6MHz,分别设计延时0.1s、1s、1min的子程序。
这里取单片机常用的晶振频率为12MHz,一个机器周期为1µs。
(若fosc=6MHz,读者可参考下列程序修改)
延时1ms的子程序:
执行时间(机器周期)
DELAY:
MOVR7,#0FFH1
LOOP:
NOP1
NOP1
DJNZR7,LOOP2
RET2
该程序段的总的执行时间为:
(1+4×255+2)μs=1023µs≈1ms
延时时间为100ms的子程序:
DELAY:
MOVR5,#64H对延时1ms的子程序循环100次。
LOP1:
MOVR7,#0FFH
LOOP:
NOP
NOP
DJNZR7,LOOP
DJNZR5,LOP1
RET
延时时间为1s的子程序:
DELAY1:
MOVR3,#0AH对延时100ms的子程序循环10次
DELAY:
MOVR5,#64H。
LOP1:
MOVR7,#0FFH
LOOP:
NOP
NOP
DJNZR7,LOOP
DJNZR5,LOP1
DJNZR3,DELAY
RET
延时时间为60s的子程序:
对延时1s的子程序循环60次
9.MCS-51汇编语言中有哪些常用的伪指令?
各起什么作用?
BIT(地址符号命令)
END(结束汇编)
EQU(等值)
DB(定义字节)
DW(定义字)
DS(定义存储单元)
ORG(汇编起始地址)
10.比较下列各题中的两条指令是否相同,若不同,请指出其区别?
①MOVA,R1;MOVACC,R1指令功能相同,寻址方式表示不同
②MOVA,P0;MOVA,80H指令功能相同,寻址方式表示不同
③LOOP:
SJMPLOOP;SJMP$指令功能相同
11.下列程序段汇编后,从3000H开始各有关存储单元的内容是什么?
ORG3000H
TAB1EQU1234H
TAB2EQU5678H
DB65,13,"A"
DWTAB1,TAB2,9ABCH
ORG3000H
TAB1:
EQU1234H
TAB2:
EQU5678H
DB65,13,"abcABC"
DWTAB1,TAB2,9ABCH
3000H:
65
3001H:
13
3002H:
‘A’
3003H:
34H
3004H:
12H
3005H:
78H
3006H:
56H
3007H:
BCH
3008H:
9AH
12.为了提高汇编语言程序的可读性和编译效率,在编写时应注意哪些问题?
(1)把要解决的问题化成一个个具有一定独立性的功能模块,各模块尽量采用子程序完成其功能。
(2)力求少用无条件转移指令,尽量采用循环结构。
(3)对主要的程序段要下功夫精心设计,这样会收到事半功倍的效果。
(4)能用8位数据解决问题的就不要使用16位数据。
(5)累加器是信息传递的枢纽,在调用子程序时应通过累加器传送子程序的参数,通过累加器向主程序传送返回参数。
所以,在子程序中一般不把累加器推入堆栈。
若需保护累加器的内容时,应先把累加器的内容存入其他寄存器单元,然后再调用子程序。
(6)为了保证程序运行的安全可靠,应考虑使用软件抗干扰技术,如数字滤波技术、指令冗余技术、软件陷井技术,用汇编语言程序实现这些技术,不需要增加硬件成本,可靠性高,稳定性好,方便灵活。
13.有一输入设备,其端口地址为20H,要求在1秒钟时间内连续采样10次读取该端口数据,求其算术平均值,结果存放在内部RAM区20H单元。
MOVR0,#20H
MOVR2,#0
MOVA,#0
MOVR4,#0
LOP:
MOVR3,#0AH
IN:
ACALLDELAY
MOVXA,@R0
MOVR2,A
MOVA,R4
ADDA,R2
MOVR4,A
DJNZR3,IN
MOVB,#0AH
DIVAB
MOV20H,A
AJMPLOP
DELAY:
MOVR5,#64H延时时间为0.1s的子程序:
LOP1:
MOVR7,#0FFH
LOOP:
NOP
NOP
DJNZR7,LOOP
DJNZR5,LOP1
RET
END
14.现需对外部某2个信号进行异或操作,请使用单片机完成其要求。
MOVDPTR,#2000H
MOVXA,@DPTR
MOV20H,A
INCDPTR
MOVXA,@DPTR
XRLA,20H
15.简单说明两条查表指令使用上的区别。
查表是程序设计中使用的基本方法。
只要适当地组织表格,就可以十分方便地利用表格进行多种代码转换和算术运算等。
MOVCA,@A+PC与MOVCA,@A+DPTR两条指令的区别:
前者查表的范围与存放该指令的地址有关,由于PC的值已经确定及8位累加器A的限制,数据表格只能存放在该指令后面的256个字节单元之内。
而后者查表范围通过改变DPTR的值可达整个程序存储器64KB的任何地址空间(即DPTR的值为表格的首地址),其数据表格可以为各个程序模块共享。
将要查表的数据字作为偏移量送累加器A中,通过改变变址寄存器A的内容即可改变表格中的位置,执行该指令即可获得所需的内容(即将该位置单元的内容传送给A)。
因此,可以根据需要设计表格的内容,将A的内容实现换码。
第4章
1.C51扩展了哪些数据类型?
sbitsfrsfr16bit
2.简述C51存储器类型关键字与8051存储空间的对应关系。
程序存储器(code)
内部数据存储器:
data内部RAM直接寻址128B(0x00~0x7F)
idata内部RAM间接寻址256B(0x00~0xFF)
bdata内部RAM16B(0x20~0x2F)的128位进行位寻址
外部数据存储器:
xdata外部存储器64KB的任何单元
pdata访问外部存储器(一页)低256B
3.在定义inta=1,b=1后,分别指出表达式b=a、b=a++和b=++a执行后变量a和b的值。
b=a;
b=a++;a=2b=1
b=++a;a=2b=2
4.用C51编程实现当P1.0输入为高电平时,P1.2输出控制信号灯点亮。
#include
sbitkey1=P1^0;
sbitled=P1^2;
voidmain()
{bita;
for(;;)
{key1=1;
a=key1;
if(a)led=1;
elseled=0;
}
while
(1);
}
5.使用选择结构编写程序,当输入的数字为“1”、“2”、“3”、“4”时,输出显示“A”、“B”、“C”、“D”,当输入数字“0”时,程序结束。
#include
voidmain()
{charch;
SCON=0x52;/*对串口实现初始化,以便调试时调用scanf()和printf()*/
TMOD=0x20;/*在keilc串行窗口#0中输入或显示数据*/
TH1=0Xf3;/*若不使用scanf()和printf()函数,则程序中不需要蓝色语句*/
TR1=1;
printf("请输入:
");
while
(1)
{scanf("%c",&ch);
switch(ch)
{
case‘1’:
printf("A");break;
case‘2’:
printf("B");break;
case‘3’:
printf("C");break;
case‘4’:
printf("D");break;
case‘0’:
break;
default:
printf("输入错误\n");
}
if(ch==’0’)break;
}
while();
}
6.编一个函数sum,求数组a中各元素的数据和。
要求在main函数中输入数组元素的数据,通过调用sum函数并输出返回的数据和。
#include
intsum(intb[],intn)
{inti,s=0;
for(i=0;is+=b[i];
returns;
}
voidmain()
{inta[10]={10,20,30,40,50,90,80,70,60,0}i,total;
SCON=0x52;/*对串口实现初始化,以便调试时调用scanf()和printf()*/
TMOD=0x20;/*在keilc串行窗口#0中可以输入或显示数据*/
TH1=0Xf3;/*若不使用scanf()和printf()函数,则程序中不需要蓝色语句*/
TR1=1;
total=sum(a,10);
printf("%d",total);
while
(1);
}
7.编一个函数len,求一个字符串s的长度。
要求在main函数中输入字符串,通过调用len函数并输出返回的字符串长度。
#include“string.h”
#include
intlen(char*s)
{intn;
n=strlen(s);
returnn;
}
voidmain()
{char*ch=”china”;
inta;
a=len(ch);
while
(1);
}
8.C51中断函数如何定义,在使用时应注意哪些问题?
C51中,中断服务程序是以中断函数的形式出现的。
单片机中断源以对应中断号的形式出现在C51中断函数定义中
中断函数定义语法格式如下:
void函数名(void)interruptn[usingn]
{
函数体
}
关键字interrupt定义该函数为中断服务函数,n为中断号。
使用时应注意:
1)在中断函数中不能使用参数。
2)在中断函数中不能存在返回值。
3)中断函数的执行是由中断源的中断请求后系统调用的。
4)中断函数的中断号在不同的单片机中其数量也不相同,具体情况察看具体的处理器手册。
9.用C51编写流水灯控制程序,要求由8051的P1口控制8个发光二极管(采用共阳极连接)依次轮流点亮,循环不止。
#include
#include
#defineucharunsignedchar
#defineledP1
voiddelay(ucharm);//声明延时函数
voidmain()
{
uchars_data=0xFE;
while
(1)
{
led=~s_data;