单片机的C语言考试要点.docx
《单片机的C语言考试要点.docx》由会员分享,可在线阅读,更多相关《单片机的C语言考试要点.docx(26页珍藏版)》请在冰豆网上搜索。
![单片机的C语言考试要点.docx](https://file1.bdocx.com/fileroot1/2023-1/4/13c37b6f-7873-4d48-9ae6-dc71339c9ad8/13c37b6f-7873-4d48-9ae6-dc71339c9ad81.gif)
单片机的C语言考试要点
第1章单片机的C语言概述
1、单片机就是在一块硅片上集成了中央处理器,存储器和输入、输出接口、振荡电路、计数器等电路的一块集成电路。
2、单片机最小系统就是能让单片机工作起来的一个最基本的组成电路。
以单片机为核心,单片机的18、19引脚端外接石英晶体振荡电路,9引脚外接复位电路,20脚接地,31脚接电源,就构成了单片机的最小系统。
3、单片机简介:
8位中央处理器,支持ISP功能,128字节的RAM。
4、AT89S51共有40个引脚,4个端口。
5、C51使用sfr命令来对单片机这些端口进行定义。
6、使用sbit命令定义特殊功能寄存器中的可寻址位。
7、中断源有外部中断、内部定时/计数器和串行通信口中断三种。
8、定时/计数器实质上就是一个加1计数器,定时器实际上也就是以计数方式工作。
9、每个机器周期等于12个振荡周期,故计数频率为振荡器频率的1/12,当采用12MHz的晶振时,计数速率为1MHz。
10、执行一条指令的执行时间称为指令周期;执行一条指令的时间为一个机器周期,一个机器周期为单片机振荡器的12个振荡周期
11、由THx的高8位和TLx的低8位构成全16位定时/计数器,其最大计数器值为:
M=212=65536.
12、初始化编程格式:
TMOD=方式字;THx=高8位初始值;TLx=低8位初始值;ETx=1;EA=1;TRx=1。
13、已知晶振频率为6MHz,T0=1,T=1ms,求TH0\TH1;计数器计数2000次,求TH0\TH1
解:
(1)TH0=(65536-1000*6/12)/256=254=FEH
TL0=(65536-1000*6/12)%256=12=0CH
(2)TH0=(65536-2000)/256=248=F8HTL0=(65536-2000)%256=48=30H
14、一个汉字要用32个字节来表示。
运算符与表达式
1、/(除法运算)
2、%(模,求余运算)
数据分离:
123/100=1
123%100/10=2
123%100%10=3
3、强制转换
(int)(a+b)a+b的值强制转换成int型
4、关系表达式
表达式1关系运算符表达式2
(a>b)==c;若a>b,则为真,值为1,所以c为1
5、逻辑运算
(1)逻辑与&&
(2)逻辑或|
(3)逻辑非!
6、位运算
(1)按位与&
(2)按位或|
(3)按位异或^
(4)按位取反~
(5)位左移<<后面补零
(6)位右移>>
7、自增运算
(1)++i先加1再使用--I先减1再使用
(2)i++先使用再加1i--先使用再减1
8、复合运算
变量复合赋值运算符表达式
a+=3等价于a=a+3<<=左移赋值
C语言结构语句
1.顺序结构0条语句
2.选择语句2条语句
(1)if单选if—else两选
(2)Switch—case—break,三者合起来才算选着语句
3.循环语句3条语句
(1)for(初值;条件;增值)
(2)do语句;while(表达式)先执行后判断
(3)while(表达式)语句;
4.Break:
跳出循环语句,专用于switch语句和循环语句
Continue:
结束本次循环,专用于循环体中。
例:
ucharx=1,y=1;
for(i=0;i<2;i++)
{x=x+1;break;y=y+1;}循环结束后x=2,y=1,只执行一次程序
如果把break换成continue则x=3,y=1跳出本次循环执行下一次循环
5.Return子程序返回
函数
1.函数组成
(1)函数声明
(2)子函数
(3)函数的调用
2.如果函数有类型,那么一定有返回值
如果函数有形式参数,那么一定有实参向形参判定
数组、指针
1.数组类型数组名数组长度数组个数数组值
Inta[10]={0,1,2,3,4,5,6,7,8,9}后面5个数全赋值0
2.字符数组
Charc[]=“Cprogram”用字符串赋值比用字符逐个赋值要多占一个字节,用于存放”\0”标志
3.指针
uchar*spsp表示指向地址的数
*sp++表示指针是指向sp加1后的地址,但是数值时sp地址内的数值
4.P[i]与*(p+i)等价
中断、定时器
1.定时查询4+1
(1)设置TMOD,定时器工作方式
(2)装预置数(THX,TLX)
(3)开定时器(TRX)
(4)TFX=0
查询溢出标志位TFX,若TFX由0到1,说明定时时间已到,硬件自动置1,软件清零
(5)记满重装预置数
2.中断
(1)设置TMOD,定时器工作方式
(2)装预置数(THX,TLX)
(3)设置IE,ITX,开总中断,开定时器中断
(4)设置TRX,开定时器
(5)中断时间到,处理中断服务函数
(6)记满重装预置数
3.中断函数语法
返回值函数名([参数])[模式][重入]interruptn[usingm]
外部中断0、定时器0、外部中断1、定时器1、串口、定时器2中断源编号为0、1、2、3、4、5
1.写出一个单片机的C语言程序的构成。
#include<>/*预处理命令*/
longfun1();/*函数说明*/
floatfun2();
intx,y;
floatz;
fun1()/*功能函数1*/
{...
}
main()/*主函数*/
{...
}
fun2()/*功能函数2*/
{...
}
标准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、XBYTE、PWORD、DBYTE、CWORD、XWORD、PBYTE、DWORD,具体使用方法参考absacc.h头文件。
其中:
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、XBYTE、PWORD、DBYTE、CWORD、XWORD、PBYTE、DWORD,具体使用方法参考absacc.h头文件。
其中:
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的区别是该语句不是退出整个循环。
第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()//主函数
{
unsigned