单片机原理与C51语言程序设计与基础教程 课后习题答案

更新时间:2024-01-14 23:24:01 阅读量: 教育文库 文档下载

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

单片机原理与C51语言程序设计与基础教

程 课后习题答案

习题

填空题

1.一般而言,微型计算机包括 、 、 、 四个基本组成部分。

2.单片机是一块芯片上的微型计算机。以 为核心的硬件电路称为单片机系统,它属于 地应用范畴。

3.Atmel 公司生产的CMOS型51系列单片机,具有 内核,用 代替ROM作为程序存储器,

4.单片机根据工作温度可分为 、 和 三种。民用级的温度范围是0℃一70℃,工业级是-40℃~85℃,军用级是-55℃-125℃(不同厂家的划分标推可能不同。

5.在单片机领域内,ICE的含义是 。

选择题

1.单片机的工作电压一般为 V? A 5V B 3V C 1V D 4V

2.单片机作为微机的一种,它具有如下 特点:

A 具有优异的性能价格比 B 集成度高、体积小、可靠性高 C 控制功能强,开发应用方便 D 低电压、低功耗。 3.民用级单片机的温度范围是: A -40℃~85℃ B 0℃一70℃ C -55℃-125℃ D 0℃一50℃ 4.MCS-51系列单片机最多有 个中端源。 A 3 B 4 C 5 D 6 5.下列简写名称中不是单片机或单片机系统的是

A MCU B SCM C ICE D CPU

问答题

1.单片机常用的应用领域有哪些? 2.我们如何学习单片机这么技术?

3.单片机从用途上可分成哪几类?分别由什么用处? 答案

填空题

1. 运算器、控制器、存储器、输入输出接口 2. 单片机 嵌入式系统 3. MCS-51 Flash ROM

4. 民用级(商业级) 工业级 军用级 5.在线仿真器 选择题

1. A 2. ABCD 3. B 4. C

5. D 问答题

1.单片机广泛应用于仪器仪表、家用电器、医用设备、航空航天、专用设备的智能化管理及过程控制等领域,大致可分如下几个范畴: (1)在智能仪器仪表上的应用

单片机具有体积小、功耗低、控制功能强、扩展灵活、微型化和使用方便等优点,广泛应用于仪器仪表中,结合不同类型的传感器,可实现诸如电压、功率、频率、湿度、温度、流量、速度、厚度、角度、长度、硬度、元素、压力等物理量的测量。采用单片机控制使得仪器仪表数字化、智能化、微型化,且功能比起采用电子或数字电路更加强大。例如精密的测量设备(功率计,示波器,各种分析仪)。 (2)在工业控制中的应用

用单片机可以构成形式多样的控制系统、数据采集系统。例如工厂流水线的智能化管理,电梯智能化控制、各种报警系统,与计算机联网构成二级控制系统等。 (3)在家用电器中的应用

可以这样说,现在的家用电器基本上都采用了单片机控制,从电饭褒、洗衣机、电冰箱、空调机、彩电、其他音响视频器材、再到电子秤量设备,五花八门,无所不在。 (4)在计算机网络和通信领域中的应用 现代的单片机普遍具备通信接口,可以很方便地与计算机进行数据通信,为在计算机网络和通信设备间的应用提供了极好的物质条件,现在的通信设备基本上都实现了单片机智能控制,从手机,电话机、小型程控交换机、楼宇自动通信呼叫系统、列车无线通信、再到日常工作中随处可见的移动电话,集群移动通信,无线电对讲机等。 (5)单片机在医用设备领域中的应用

单片机在医用设备中的用途亦相当广泛,例如医用呼吸机,各种分析仪,监护仪,超声诊断设备及病床呼叫系统等等。

此外,单片机在工商,金融,科研、教育,国防航空航天等领域都有着十分广泛的用途。

2.首先,大概了解单片机的机构,例如本书的第2章则是主要讲了单片机的内部结构以及资源。对单片机的内部结构有了初步了解之后,读者就可以进行简单的实例练习,从而加深对单片机的认识。

其次,要有大量的实例练习。其实,对于单片机,主要是软件设计,也就是编程。 目前最流行的用于51系列单片机地编程软件是Keil。Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部份组合在一起。掌握这一软件的使用对于使用51系列单片机的爱好

者来说是十分必要的,如果你使用C语言编程,那么Keil几乎就是你的不二之选,即使不使用C语言而仅用汇编语言编程,其方便易用的集成环境、强大的软件仿真调试工具也会令你事半功倍。

第三,要多结合外围电路,如流水灯、数码管、独立键盘、矩阵键盘、AD或DA(原理一样)、液晶、蜂鸣器进行练习,因为,这样可以直观的看到程序运行的结果,当然,我们也可以用proteus这个软件对硬件进行仿真,这样也可以直观的看到结果。在实际学习过程中,可以根据自己的项目需求去选择,从而减少了学习周期。

最后,就是结合自己的实际情况,开发一个完全具有个人风格,功能完善的电子产品,尽情享受单片机带来的欢乐和成就感。

同时,不必为软件、硬件基础知识不扎实而烦恼,单片机中用到的编程语言很简单,可以说主要是配置一些寄存器,不涉及太复杂的算法和语法,电子元器件也以简单应用居多,本书接下来的几章将主要介绍硬件和软件基础知识,这些对于单片机开发来说基本已经够用了。另一方面,在做单片机实验的过程中会慢慢地积累、一步步地巩固相关的基础知识,在实践中有针对性的学习肯定比纯粹地看书效果更好。所以,完全不必担心你的基础不够扎实。 3.单片机从用途上可分成专用型单片机和通用型单片机两大类。专用型单片机是为某种专门用途而设计的,如DVD控制器和数码摄像机控制器芯片等。在用量不大的情况下,设计和制造这样的专用芯片成本很高,而且设计和制造的周期也很长。我们通常所用的都是通用型单片机,通用型单片机把所有资源(如ROM、I/O等)全部提供给用户使用。当今通用型单片机的生产厂家已不下几十家,种类有几百种之多。

第2章 答案

填空题

1.32 4 8 R0~R7 2.时钟电路 复位电路

3.指令寄存器IR 程序计数器PC 数据指针DPTR 堆栈指针SP 4.SBUF SCON 5.低电平 下跳变

选择题

1.ABC

2.C 按CPU查询顺序确定。即1、 外部中断0 2、定时中断0 3、外部中断1 4、定时中断1 5、串行中断 3.A 4.C 5.D 6.C

问答题

1.所谓中断,是指CPU在正常运行程序时,由于内部/外部事件或由程序预先安排的事件,引起CPU中断正在运行的程序,而转到为内部/外部事件或为预先安排的事件服务的程序中去,服务完毕,再返回去执行波暂时中断的程序。 中断响应的过程如下:

(1) 保护断点,即保存下一将要执行的指令的地址,就是把这个地址送入堆栈。

(2) 寻找中断入口,根据6个不一样的中断源所产生的中断,查找6个不一样的入口地址。这6个中断源的编号和入口地址如表2.13所示各中断服务程序入口地址仅间隔8字节,编译器在这些地址放入无条件转移指令,跳转到服务程序的实际地址。。以上工作是由计算机自动完成的,与编程者无关。 (3) 执行中断处理程序。

(4) 中断返回:执行完中断指令后,就从中断处返回到主程序,继续执行。

2.P0口既可作一般I/O端口使用,又可作地址/数据总线使用;P1口是一个准双向并行口,作通用并行I/O口使用;P2口除了可作为通用I/O使用外,还可在CPU访问外部存储器时作高八位地址线使用;P3口是一个多功能口除具有准双向I/O功能外,还具有第二功能。 3.堆栈是一种后进先出(LIFO)的线性表,使用单片机内部RAM单元存储一些需要回避的数值数据或地址数据。堆栈好像堆放货物的仓库一样,存取数据时采用“后进先出”(即“先进后出”)的原则。堆栈指针SP是用来存放当前堆栈栈顶指向的存储单元地址的一个8位特殊功能寄存器,地址是81H。

堆栈只有两种操作:入栈和出栈。不论数据是入栈还是出栈,都是对栈顶单元(SP指向的单元)进行操作的。堆栈是向上生成的。入栈时SP内容是增加的,出栈时SP的内容是减少的。堆栈区域的大小可用软件对SP重新定义初值来改变,但堆栈深度以不超过片内RAM空间为限。系统复位后,SP的值为07H,若不重新定义,则以07H单元为栈底,入栈的内容从地址为08H单元开始存放。

堆栈主要是为子程序调用和中断操作而设立的,常用的功能有两个:保护断点和保护现场。在单片机系统中,既有与子程序调用和中断调用相伴随的自动入栈和出栈,又有堆栈的入栈和出栈指令(PUSH和POP)。此外,堆栈还具有传递参数等功能。

第3章

答案

1 立即寻址 寄存器寻址 间接寻址 直接寻址 变址寻址 相对寻址 位寻址 2 累加器A PC DPTR 3 00H,0,0,0,0 4 指令

5 一 二 三

6 转移指令的PC值加上它的字节数 7 DPH=3CH , DPL=5FH , SP=4FH

选择题

1 C 2 C 3 A

4 D 5 C 问答题

1(1) 分析问题:首先必须明确求解问题的意义和任务。对项目背景和要完成的任务进行详

细地了解和分析,将一个实际的问题转化为单片机可以处理的问题。 (2) 确定算法:根据实际问题的要求和指令系统的特点,决定所采用的计算公式和计算方法。这是正确编程的基础,比程序设计语言本身更为重要。

(3) 绘制框图:根据所选定的算法,制定出运算步骤和顺序,把运算过程画成程序框图。这样使程序清晰,结构合理,便于调试。

(4) 分配资源:要根据程序区、数据区、暂存区、堆栈区等预计所占空间大小,对片内外存储区进行合理分配并确定每个区域的首地址,便于编程使用。

(5) 编写程序:编写程序就是采用汇编语言来实现上面已确定的算法,也即是将由人类自然语言组织的程序框图转化为计算机语言组织的源代码。

(6) 仿真调试:利用单片机各种开发工具对所编写的程序进行测试,检验程序是否完成了指定的功能。测试过程要尽可能仔细,保证程序中的各条支路都得到了检验。

(7) 软件优化:在完成指定功能的基础上,进行程序优化,以进一步缩短程序量、减少运算时间和节省工作单元。

(8) 状态固化:完成前期工作之后,将程序烧录到EEPROM等程序存储器上,保证单片机系统每次上电后都能正确运行程序。

(9) 文档说明:将程序的功能和使用方法,程序的基本结构和所采用的主要算法以及程序必要说明和注意事项等问题整理成一个文档,不仅便于用户使用,而且便于对程序的维护和扩充。 2.(1)bit位标量:利用它可定义一个位标量,但不能定义位指针,也不能定义位数组。它的值是一个二进制位,不是 0 就是 1,类似一些高级语言中的 Boolean 类型中的 True 和 False。

(2) sbit可寻址位:利用它能定义内部 RAM 中的可寻址位或特殊功能寄存器中的可寻址位。 (3) sfr特殊功能寄存器:利用它能定义 8051系列单片机内部的所有特殊功能寄存器, (4) sfr16特殊功能寄存器:sfr16和 sfr 一样用于操作特殊功能寄存器,所不一样的是它用于操作占两个字节的寄存器,如定时器T0和T1。 3.

变址寻址

变址寻址是以某个寄存器的内容为基础,然后在这个基础上再加上地址偏移量,形成真正的操作数地址,需要特别指出的是用来作为基础的寄存器可以是PC或是DPTR,地址偏移量存储在累加器A中。 相对录址

相对寻址主要是针对跳转指令而言的。对于跳转指令,跳转去的目标指令的地址是通过正在执行的指令地址来确定的,一般是采用正在执行的指令地址加上偏移量的方式。即:转移目的地址=当前PC值+相对偏移量rel。偏移量可以是正也可以是负,偏移量是采用有符号数的存储形式即补码的形式来存储的。 位寻址

位寻址方式是指将要访问的数据是一个单独的位,指定位数据的方式有:通过位地址、通过字节地址加点及位数、通过寄存器名加点及位数、通过位的名称。

4.1)SP=SP+1=61H (61H)=PC的低字节=03H SP=SP+1=62H (62H)=PC的高字节=20H

2)PC=3456H 3)可以

4)2KB=2048 Byte 5.62H , 30H , 70H

P1=SBUF; //接收数据并送P1口 while(TI==0); //TI=0等待 TI=0; //TI清零 for(j=0;j<1000;j++) //延时 for(k=0;k<100;k++); } if(i==8)i=0; //只有8个灯 } } 2.

//发送

#include \

#define uchar unsigned char void int4(void) ; char xdata *p; main() {

P=0x3400; TMOD=0x20;

TL1=0Xfd;TH1=0xfd; SCON=0x40;

TR1=1;EA=1;ES=1; SBUF = *P; while(1); }

void int4() interrupt 4 {

TI=0; P++;

SBUF=*P;

if(P==0X34A0)EA=0; }

//接收

#include \

#define uchar unsigned char void int4(void) ; char xdata *p; main() {

P=0x4400;

TMOD=0x20;

TL1=0Xfd;TH1=0xfd; SCON=0x50;

TR1=1;EA=1;ES=1; SBUF = *P; while(1); }

void int4() interrupt 4 {

RI=0;

*P=SBUF; P++; if(P==0X44A1)EA=0; }

3. #include \

#define uchar unsigned char sbit P3_3=P3^3; uchar a=3;

unsigned char tab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; void timer(uchar t); void int4(void) ; main() {

uchar i,j;

SCON=0;EA=0;ES=1; for(;;) {

P3_3=1; for(i=0;i<4;i++) { SBUF=tab[a]; j=a; while(j==a); }

P3_3=0; timer(100); if(a=255)a=7; }

void int4() interrupt4 {

//共阳 TI=0; a--; }

void timer(uchar t) {

uchar i;

for(i=0;i

TMOD=0x01; TH0=-10000/256; TL0=-10000%6; TR0=1; while(!TF0); TF0=0; } }

第10章

填空题

1.模拟 数字 数字 模拟 2.转换时间 3.5/256 4. 同步

5. 单缓冲,双缓冲,直通

选择题 1.A 2.D 3.A 4.B 5.ABD

上机题

1. (1)

#include #include

#define da0832 XBYTE[0XF7FF] main() {

unsigned char i,j; while{

for(i=0;i<=153;i++) {

da0832=i; for(j=0;j<=100;j++); }} }

(2) #include #include

#define da0832 XBYTE[0XF7FF] main() {

unsigned char i,j; while{ da0832=j;

for(i=0;i<=255;i++) j=j^0xcc;} }

(3) #include #include

#define da0832 XBYTE[0XF7FF] main() {

unsigned char i,j; while{

for(i=0;i<=255;i++) {

da0832=i; for(j=0;j<=100;j++); }} }

2. #include #include

#define uchar unsigned char #define IN2 XBYTE[0x7ffa] sbit adbusy =P1^0;

main() {

uchar idata ad[10] ; uchar i;

for(i=0;i<=10;i++) {

IN2=0; while(adbusy==1); ad[i]=IN2; } }

3. #include #include

#define uchar unsigned char #define da0832 XBYTE[0x7fff]

main() {

uchar *p,i,j; p=0x20 ;

for(i=0;i<=16;i++) {

dac0832=*p; p++; for(j=0;j<=255;j++) } }

第11章

填空题

1. 触点式开关按键 无触点式开关按键 2.中断扫描

3.硬件消抖 软件消抖 4.10ms 延时

5. 既要保证CPU能及时响应按键操作,又不要过多占用CPU的工作时间。

选择题 1.A 2.D 3.B 4.C 5.B

上机题

1. #include \#define SEG p0

unsigned char code TAB[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff}; void debouncer();

sbit PB1=P2^0; sbit PB2=P2^1; main() { unsigned char i=0; PB1=PB2=1; while(1) { SEG=TAB[i]; if(PB1==0) { debouncer(); if(PB1==0) { debouncer(); i=(i<9)?i+1:0; }

if(PB@==0) { debouncer(); i=(i>0)?i-1:9; } } } }

void debouncer(void) { int i; for(i=0;i<2400;i++); }

2. #include \sbit speaker=P0^0 ; unsigned char keys;

unsigned char tone[]={108,102,91,86,77,68,61,57}; void delay8us(unsigned char x) {

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

void sound (unsigned char x) {

char i;

for(i=0;i<60;i++) {

speaker=1; delay8us(tone[x]); speaker=0; delay8us(tone[x]); } }

main() {

P2=0xff; while(1)

{ keys=~P2; switch (keys) { case 0x01: sound(0);break; case 0x02: sound(1);break; case 0x04: sound(2);break; case 0x08: sound(3);break; case 0x10: sound(4);break; case 0x20: sound(5);break; case 0x40: sound(6);break; case 0x80: sound(7);break; } } }

3. #include \sbit output=P0^0 ;

sbit s1=P2^0; sbit s2=P2^1; sbit s3=P2^2; sbit s4=P2^3; sbit s5=P2^4; sbit s6=P2^5; sbit s7=P2^6; sbit s8=P2^7;

unsigned int count=0;

#define TH_M1(65536-count)/256 #define TL_M1(65536-count)%6

main() { IE=0x82;

TMOD=0X01; output=1; P2=0xff; while(1) { if(s1==0) count=5; else if(s2==0) count=10; else if(s3==0) count=50; else if(s4==0) count=100; else if(s5==0) count=500; else if(s6==0) count=1000; else if(s7==0) count=5000; else if(s8==0) count=10000; TH0=TH_M1; TL0=TL_M1; TR0=1; while(TF0==0); TF0=0; output=~output; } }

第12章

填空题

1. 双键互锁方式和N键巡回方式 2.动态 静态 3.直插式 贴片式 4. 中断方式

5. 段控信号 位控信号

选择题 1.b 2.c 3.AB 4.B 5 B

上机题

1. #include %unsigned char

TAB[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff}; char disp[2][4]={{2 0 0 8},{0 3 1 5}}; void delay1ms(int);

code

void scanner(char); main() {

char i; while(1) {

for(i=0;i<2;i++) {

scanner(i); P1=0xff;

delay1ms(480); } } }

void delay1ms(int x) {

int i,j;

for(i=0;i

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

void scanner(char x) {

char i,j,BCD,scan; for(i=0;i<30;i++) {

scan=0xf7;

for(j=0;j<4;j++) {

p2=0xff; P1=scan;

BCD=disp[x][j]; P2=TAB[BCD]; delay1ms(4); scan>>=1; }

} }

2. #include \#define SEG P2 #define SCANP P1 sbit LED=P0^&;

#define count_M1 50000

#define TH_M1 (65536-COUNT_M1)/256 #define TH_M1 (65536-COUNT_M1)%6 int count_T0=0;

#define count_M2 250

#define TH_M2 (256-count_M2)

unsigned char code TAB[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff}; char disp[2]={0xc0,0xc0}; char seconds=0; char scan=0; main() { IE=0X8A; TMOD=0X21; TH0=TH_M1;TL0=TL_M1; TR0=1; TH1=TH_M2;TL0=TL_M2; TR1=1; LED=1; while(1); }

void T0 1s(void) interrupt 1 { TH0=TH_M1;TL0=TL_M1; if(++count_T0==20) { count_T0=0; seconds++; if(++count_T0==20) { count_T0=0; seconds++; if(seconds==60) { seconds=0; LED=~LED; } } disp[1]=TAB[second/10]; disp[0]=TAB[second]; } }

void T1_8ms(void) interrupt3 { if(++count_T1==32) { count_T1=0; if(++scan==3)scan=1; SEG=0XFF; SCANP=~scan; SEG=disp[scan-1]; } }

3. #include \

unsigned char code TAB[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff}; #define counts 6

char disp[counts+7]={10,10,10,10,1,2,3,4,5,6,10,10,10}; void delay1m(int); void scanner(char); main() { char i; while(1) for(i=0;i

void delay1m(int x) { int i,j; for(i=0;i

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

void scanner(char x) { char i,j,BCD,scan; for(i=0;i<30;i++) { scan=0xf7; for(j=0;j<4;j++) { P2=0xff; p1=scan; BCD=disp[x+j]; P2=TAB[BCD]; DELAY1M(4);

scan>>=1; } } }

第13章 答案: 填空题

1 硬件 软件

2 8

3 指令冗余 拦截技术 软件“看门狗”技术 4 硬件调试 软件调试 软、硬件联调 选择题 1 A 2 C 3 C

4 B 问答题

1 应用系统研制主要可以分为如下几个主要阶段:

(1) 总体方案的确定:主要包括可行性调研、技术指标的确定、器件的选择和软硬件功能的划分等。

(2) 系统设计:主要包括硬件设计和软件设计。其中硬件设计主要包括键盘、显示、A/D电路等外围扩展电路的设计和地址译码、总线驱动等电路的设计。软件设计则主要包括定义系统功能、画出程序流程图和编写代码等。另外特别重要的是,作为实际的产品,除了满足基本的功能外,还必须考虑可靠性设计的问题。

(3) 系统调试:主要包括硬件调试、软件调试以及软硬件的联合调试。硬件的调试主要包括静态调试和动态调试。软件调试则主要是在线的仿真调试。调试中一般软件和硬件不可能完全分开,软件调试和硬件调试通常要协同完成。

(4) 固化和运行:完成系统调试之后,反复运行正常则可将用户系统程序固化到EPROM之类的存储器上,单片机脱离开发系统独立工作,并在试运行阶段观测所设计的系统是否满足设计要求。

2 提高系统的可靠性也就是减少系统的故障率.一般引起系统故障有以下两个方面: (1)外部因素:例如环境温度、湿度、电源电压、电磁干扰、冲击、化学腐蚀等。 (2)内部因素:包括软件和硬件两个部分。 3 自诊断又称“自检”,是通过软硬件配合来实现对系统故障的自动捡测,一般有上电自检、定时自检、键控自检三种形式。通过自检可以及时发现系统问题,防止程序出错,从而增强系统运行的可靠性。系统的自检一般包括以下几个部分:

1.CPU的自检 2.ROM的诊断

3.外部RAM的诊断

4.A/D、D/A转换通道的诊断 5.I/O通遭的诊断

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

Top