最全单片机参考答案姜志海.docx
- 文档编号:30725984
- 上传时间:2023-08-19
- 格式:DOCX
- 页数:28
- 大小:31.64KB
最全单片机参考答案姜志海.docx
《最全单片机参考答案姜志海.docx》由会员分享,可在线阅读,更多相关《最全单片机参考答案姜志海.docx(28页珍藏版)》请在冰豆网上搜索。
最全单片机参考答案姜志海
单片机的C语言概述
1.写出一个单片机的C语言程序的构成。
答:
一个单片机的C语言程序构成如下:
#include<>/*预处理命令*/
longfun1();/*函数说明*/
floatfun2();
intx,y;
floatz;
fun1()/*功能函数1*/
{...
}
main()/*主函数*/
{...
}
fun2()/*功能函数2*/
{...
}
2.标准C语言有那些特点?
答:
(可以参照第3题)
3.标准C语言程序主要的结构特点是什么?
答:
标准C语言的主要结构特点有以下几点:
①语言简洁、紧凑,使用方便、灵活
标准C语言共有32个关键字、9种控制语句。
程序书写形式自由,与其他高级语言相比较,程序简练、简短。
②运算符、表达式丰富
标准C语言包括34种运算符,而且把括号、赋值、强制类型转换等都作为运算符处理。
表达式灵活、多样,可以实现各种各样的运算。
③数据结构丰富,具有现代化语言的各种各样的数据结构
标准C语言的数据类型有整型、实型、字符型、数组类型、指针类型等,并能用来实现各种复杂的数据结构。
④可进行结构化程序设计
标准C语言具有各种结构化的程序语句,如if...else语句、while语句、do...while语句、switch语句、for语句等。
⑤可以直接对计算机硬件进行操作
标准C语言允许直接访问物理地址,能进行位操作,能实现汇编语言的大部分功能,可以对硬件直接进行操作。
⑥生成的目标代码质量高,程序执行效率高
众所周知,汇编语言生成的目标代码的效率是最高的。
但据统计表明,对于同一个问题,用C语言编写的程序生成目标代码的效率仅比汇编语言编写的程序低10%~20%。
而C语言编写程序比汇编语言编写程序方便、容易得多,可读性强,开发时间也短得多。
⑦可移植性好
不同的计算机汇编指令不一样,用汇编语言编写的程序用于另外型号的机型使用时,必须改写成对应机型的指令代码。
而标准C语言编写的程序基本上都不用修改就可以用于各种机型和各类操作系统。
4.简述C51语言和汇编语言的比较
使用C51语言进行嵌入式系统的开发,有着汇编语言所不可比拟的优势:
①编程调试灵活方便;
②生成的代码编译效率高;
③模块化开发;
④可移植性好;
⑤便于项目的维护;
5.简述单片机的C语言和标准C的比较
答:
单片机的C语言和标准C的比较主要有以下几点不同:
①C51中定义的库函数和标准的C语言定义的库函数不同;
②C51中的数据类型和标准C的数据类型也有一定的区别;
③C51变量的存储模式与标准C中变量的存储模式不一样;
④C51与标准C的输入/输出处理不一样;
⑤C51与标准C语言在函数使用方面有一定的区别。
6.简述单片机的C语言的特点
单片机的C语言的特点主要体现在以下几个方面:
①无需了解机器硬件及其指令系统,只需初步了解MCS-51的存储器结构;
②C51能方便的管理内部寄存器的分配、不同存储器的寻址和数据类型等细节问题,但对硬件控制有限;而汇编语言可以完全控制硬件资源;
③C51在小应用程序中,产生的代码量大,执行速度慢;但在较大的程序中代码效率高;
④C51程序由若干函数组成,具有良好的模块化结构,便于改进和扩充;
C51程序具有良好的可读性和可维护性;而汇编语言在大应用程序开发中,开发难度增加,可读性差;
C51有丰富的库函数,可大大减少用户的编程量,显著缩短编程与调试时间,大大提高软件开发效率;
⑦使用汇编语言编制的程序,当机型改变时,无法直接移植使用,而C语言程序是面向用户的程序设计语言,能在不同机型的机器上运行,可移植性好。
7.简述使用KeilC51开发工具开发软件的流程
使用KeilSoftware工具时,用户的项目开发流程和其它软件开发项目的流程极其相似,主要包括以下几个步骤:
① 创建一个项目,从器件库中选择目标器件并配置工具软件的设置;
② 用C语言或汇编语言创建源程序;
③ 用项目管理器生成用户的应用;
④ 修改源程序中的错误;
⑤ 调试链接后的应用。
一个完整的8051工具集的框图可以很好地表述此开发流程,如图1-1所示。
第2章C51语言程序设计基础
1.哪些变量类型是51单片机直接支持的?
答:
C51编译器支持的数据类型有:
位型(bit)、无符号字符型(unsignedchar)、有符号字符型(signedchar)、无符号整型(unsignedint)、有符号整型(signedint)、无符号长整型(unsignedlong)、有符号长整型(signedlong)、浮点型(float)和指针型等。
C51编译器支持的数据类型、长度和值域如表2-1所示。
表2-1C51的数据类型
数据类型
长度/bit
长度/byte
值域
bit
1
0,1
unsignedchar
8
1
0~255
signedchar
8
1
-128~127
unsignedint
16
2
0~65535
signedint
16
2
-32768~32767
unsignedlong
32
4
0~4294967295
signedlong
32
4
-2147483648~2147483647
float
32
4
±1.176E-38~±3.40E+38(6位数字)
double
64
8
±1.176E-38~±3.40E+38(10位数字)
一般指针
24
3
存储空间0~65535
2.简述C51的数据存储类型
答:
我们都知道,8051单片机存储区可分为内部数据存储区、外部数据存储区以及程序存储区。
8051单片机内部的数据存储区是可读写的,8051派生系列最多可有256字节的内部数据存储区,其中低128字节可直接寻址,高128字节(从0x80到0xFF)只能间接寻址,从20H开始的16字节可位寻址。
内部数据区可分为3个不同的存储类型:
data、idata和bdata。
外部数据区也是可读写的,访问外部数据区比访问内部数据区慢,因为外部数据区是通过数据指针加载地址来间接访问的。
C51提供两种不同的存储类型xdata和pdata访问外部数据。
程序存储区是只能读不能写。
程序存储区可能在8051单片机内部或者在外部或者内外都有,这由8051单片机的硬件决定。
C51提供了code存储类型来访问程序存储区。
每个变量可以明确地分配到指定的存储空间,对内部数据存储器的访问比对外部数据存储器的访问快许多,因此应当将频繁使用的变量放在内部存储器中,而把较少使用的变量放在外部存储器中。
各存储区的简单描述如表2-2所示。
表2-2C51存储类型与8051存储空间的对应关系
存储区
描述
DATA
片内RAM的低128字节,可在一个周期内直接寻址
BDATA
片内RAM的位寻址区,16字节
IDATA
片内RAM的256字节,必须采用间接寻址
XDATA
外部数据存储区,使用DPTR间接寻址
PDATA
外部存储区的256个字节,通过P0口的地址对其寻址。
使用MOVX@Ri,需要两个指令周期
CODE
程序存储区,使用DPTR寻址。
以上介绍的是C51的数据存储类型,C51存储类型及其大小和值域如表2-3所示。
表2-3C51存储类型及其大小和值域
存储类型
长度/bit
长度/byte
值域
data
8
1
0~255
idata
8
1
0~255
pdata
8
1
0~255
code
16
2
0~65535
xdata
16
2
0~65535
3.简述C51对51单片机特殊功能寄存器的定义方法
答:
MCS-51通过其特殊功能寄存器(SFR)实现对其内部主要资源的控制。
MCS-51单片机有21个SFR,有的单片机还有更多的SFR,它们分布在片内RAM的高128字节中,其地址能够被8整除的SFR一般可以进行位寻址。
关于MCS-51单片机的特殊功能寄存器参看附录A。
对SFR只能用直接寻址方式访问。
C51允许通过使用关键字sfr、sbit或直接引用编译器提供的头文件来实现对SFR的访问。
(1)使用关键字定义sfr
为了能直接访问特殊功能寄存器SFR,C51提供了一种自主形式的定义方法。
这种定义方法与标准的C语言不兼容,只适用于对8051系列单片机进行C编程。
这种定义的方法是引入关键字“sfr”,语法如下:
sfr特殊功能寄存器名字=特殊功能寄存器地址;
如:
sfrSCON=0x98;/*串口控制寄存器地址98H*/
sfrTMOD=0X89;/*定时器/计数器方式控制寄存器地址89H*/
(2)通过头文件访问SFR
8051系列单片机的寄存器数量与类型是极不相同的,因此对单片机特殊功能寄存器的访问可以通过对头文件的访问来进行。
为了用户处理方便,C51编译器把MCS-51单片机的常用的特殊功能寄存器和特殊位进行了定义,放在一个“reg51.h”或“reg52.h”的头文件中。
当用户要使用时,只需要在使用之前用一条预处理命令“#include
用户可以通过文本编辑器对头文件进行增减。
(3)SFR中位定义
在8051单片机的应用问题中,经常需要单独访问SFR中的位,C51的扩充功能使之成为可能,使用关键字“sbit”可以访问位寻址对象。
特殊位(sbit)的定义,像SFR一样不与标准C兼容。
与SFR定义一样,用关键字“sbit”定义某些特殊位,并接受任何符号名,“=”号后将绝对地址赋给变量名。
这种地址分配有三种方法:
第一种方法:
sbit位名=特殊功能寄存器名^位置;
当特殊功能寄存器的地址为字节(8位)时,可使用这种方法。
特殊功能寄存器名必须是已定义的SFR的名字。
“^”后的“位置”语句定义了基地址上的特殊位的位置。
该位置必须是0~7的数。
如:
第二种方法:
sbit位名=字节地址^位置;
这种方法是以一个整常数为基地址,该值必须在0x80~0xFF之间,并能被8整除,确定位置的方法同上。
第三种方法:
sbit位名=位地址;
这种方法将位的绝对地址赋给变量,地址必须在0x80~0xFF之间。
4.简述C51对51单片机片内I/O口和外部扩展的I/O口的定义方法
答:
C51对51单片机片内I/O口的定义方法是将片内I/O口看成SFR。
C51对51单片机片外I/O的访问有两种比较常用的访问方法:
(1)绝对宏
C51编译器提供了一组宏定义来对51系列单片机的code、data、pdata和xdata空间进行绝对寻址。
在程序中,用“#include
其中:
CBYTE以字节形式对code区寻址;CWORD以字形式对code区寻址;
DBYTE以字节形式对data区寻址;DWORD以字形式对data区寻址;
XBYTE以字节形式对xdata区寻址;XWORD以字形式对xdata区寻址;
PBYTE以字节形式对pdata区寻址;PWORD以字形式对pdata区寻址;
(2)_at_关键字
可以使用关键字_at_对指定的存储器空间的绝对地址进行访问,一般格式如下:
[存储器类型]数据类型说明符变量名_at_地址常数;
其中,存储器类型为C51能识别的数据类型,如省略则按存储器模式规定的默认存储器类型确定变量的存储器区域;数据类型为C51支持的数据类型;地址常数用于指定变量的绝对地址,必须位于有效的存储器空间之内;使用_at_定义的变量必须为全局变量。
5.简述C51对51单片机位变量的定义方法
答:
除了通常的C数据类型外,C51编译器支持bit数据类型。
采用关键字“bit”进行定义。
如:
bitdirection_bit;/*将direction_bit定义为位变量*/
bitlock_pointer;/*将lock_pointer定义为位变量*/
bitdisplay_invers;/*将display_invers定义为位变量*/
6.C51和TurboC的数据类型和存储类型有哪些异同点?
答:
C51增加了位变量,取消了布尔变量。
7.C51的data、bdata、idata有什么区别?
答:
data、bdata、idata是表明数据的存储类型,
data是指片内RAM的低128字节,可在一个周期内直接寻址;
bdata是指片内RAM的位寻址区,16字节;
idata是指片内RAM的256字节,必须采用间接寻址。
8.C51中的中断函数和一般的函数有什么不同?
答:
C51编译器允许用C51创建中断服务函数,中断函数是由中断系统自动调用的。
中断函数的定义格式为:
函数类型函数名interruptnusingn
其中:
interrupt和using为关键字;
interrupt后面的n为中断源的编号,即中断号;
using后面的n所选择的寄存器组,取值范围为0~3。
定义中断函数时,using是一个选项,可以省略不用。
如果不用using选项,则由编译器选择一个寄存器组作为绝对寄存器组。
8051的中断过程通过使用interrupt关键字和中断号(0~31)来实现,中断号告诉编译器中断函数的入口地址。
9.C51采用什么形式对绝对地址进行访问?
答:
绝对地址的访问包括片内RAM、片外RAM及I/O的访问。
C51提供了两种比较常用的访问绝对地址的方法。
(1)绝对宏
C51编译器提供了一组宏定义来对51系列单片机的code、data、pdata和xdata空间进行绝对寻址。
在程序中,用“#include
其中:
CBYTE以字节形式对code区寻址;CWORD以字形式对code区寻址;
DBYTE以字节形式对data区寻址;DWORD以字形式对data区寻址;
XBYTE以字节形式对xdata区寻址;XWORD以字形式对xdata区寻址;
PBYTE以字节形式对pdata区寻址;PWORD以字形式对pdata区寻址;
如:
#include
#definePORTAXBYTE[0xFFC0]/*将PORT定义为外部I/O口,地址为0xFFC0,长度为8位*/
#defineNRAMDBYTE[0x40]/*将NRAM定义为片内RAM,地址为40H,长度为8位*/
(2)_at_关键字
可以使用关键字_at_对指定的存储器空间的绝对地址进行访问,一般格式如下:
[存储器类型]数据类型说明符变量名_at_地址常数;
其中,存储器类型为C51能识别的数据类型,如省略则按存储器模式规定的默认存储器类型确定变量的存储器区域;数据类型为C51支持的数据类型;地址常数用于指定变量的绝对地址,必须位于有效的存储器空间之内;使用_at_定义的变量必须为全局变量。
10.按照给定的数据类型和存储类型,写出下列变量的说明形式
答:
(1)在data区定义字符变量val1
chardatavall;
(2)在idata区定义整型变量val2
intidataval2;
(3)在xdata区定义无符号字符型数组val3[4]。
unsignedxdataval3[4];
(4)在xdata区定义一个指向char类型的指针px。
charxdata*px;
(5)定义可位寻址变量flag。
bitflag;
(6)定义特殊功能寄存器变量P3。
SfrP3=0xB0;
11.break和continue语句的区别是什么?
答:
break语句用于从循环代码中退出,然后执行循环语句之后的语句,不再进入循环。
Continue语句用于退出当前循环,不再执行本轮循环,程序代码从下一轮循环开始执行,直到判断条件不满足为止。
和break的区别是该语句不是退出整个循环。
12.复习C语言的基本运算、数组、指针、函数、流程控制语句
答:
参看课本P35~P68。
第3章单片机内部资源的C51编程
1.在8051系统中,已知振荡频率是12MHz,用定时器/计数器T0实现从P1.1产生周期是2s的方波,试编程。
#include
sbitP1_1=P1^1;//定义位变量
unsignedchari;//定时次数
voidtimer0over(void);//函数声明(定时50ms函数)
voidmain()//主函数
{
i=0;
TMOD=0x01;//定时器T0定时50ms,方式1
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;//开T0
for(;;)
{
if(TF0)
timer0over();
}
}
voidtimer0over(void)
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TF0=0;
i++;
if(i==20)//20次到了吗?
{
i=0;
P1_1=!
P1_1;
}
}
2.在8051系统中,已知振荡频率是12MHz,用定时器/计数器T1实现从P1.1产生高电平宽度是10ms,低电平宽度是20ms的矩形波,试编程。
#include
unsignedchari;
sbitP1_1=P1^1;
voidmain()//主函数
{
i=0;
TMOD=0x10;//T1定时方式1,定时时间10ms
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
EA=1;
ET1=1;
TR1=1;
while
(1);
}
voidtimer1_int(void)interrupt3
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
i++;
if(i==1)P1_1=0;
elseif(i==3)
{
i=0;
P1_1=1;
}
}
3.用8051单片机的串行口扩展并行I/O口,控制16个发光二极管依次发光,试编程。
#include
sbitP1_0=P1^0;//定义位变量
sbitP1_1=P1^1;
voidmain()//主函数
{
unsignedchari,j;
bitflag=1;
SCON=0x00;
j=0x01;
for(;;)
{
P1_0=0;
P1_1=0;
while(flag)
{
P1_0=0;
SBUF=j;
while(!
TI){;}
P1_0=1;TI=0;
for(i=0;i++;i<=254){;}
j=j*2;
if(j==0x00)
{
j=0x01;
flag=0;
}
}
while(!
flag)
{
P1_1=0;
SBUF=j;
while(!
TI){;}
P1_1=1;TI=0;
for(i=0;i++;i<=254){;}
j=j*2;
if(j==0x00)
{
j=0x01;
flag=1;
}
}
}
}
4.用8751单片机制作一个模拟航标灯,灯接在P1.7上,
接光敏器件,使它具有如下功能:
(1)白天航标灯熄灭;夜间间歇发光,亮2s,灭2s,周而复始。
(2)将
信号作为门控信号,启动定时器定时。
按以上要求编写控制主程序和中断服务程序。
#include
unsignedchari;
sbitP1_1=P1^1;
voidmain()
{
i=0;
TMOD=0x09;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
while
(1)
{
if(!
P3^2)//int0=0,白天
P1|=0x80;//P1.7置1,灯灭
}
}
//int0=1时启动定时器0
voidtimer0_int(void)interrupt1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
i++;
if(i==40)
{
i=0;
P1_1=!
P1_1;
}
}
5.外部RAM以DATA1开始的数据区中有100个数据,现在要求每隔150ms向内部RAM以DATA2开始的数据区传送10个数据,通过10次传送把数据全部传送完,以定时器1作为定时,编写有关程序。
单片机的时钟频率是6MHz。
#include
unsignedchari,j,k;
unsignedcharxdatadata1[100];
unsignedchardatadata2[100];
voidmain()
{
i=0;
j=0;
TMOD=0x10;
TH1=(65536-25000)/256;
TL1=(65536-25000)%256;
EA=1;
ET1=1;
TR1=1;
while(j<10);
EA=0;
while
(1);
}
voidtimer1_int(void)interrupt3
{
TH1=(65536-25000)/256;
TL1=(65536-25000)%256;
i++;
if(i==3)//150ms时间到,传送一个数据
{
i=0;
for(k=0;k++;k<10)
data2[j*10+k]=data1[j*10+k];
}
j++;
}
6.用单片机和内部定时器来产生矩形波,要求频率为100Hz,占空比为2:
1,设单片机的时钟频率为12MHz,写出有关程序。
#include
unsig
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 参考答案 姜志海