【51单片机学习笔记】基础知识

一、什么是单片机

        单片机所谓单片机,它属于一种特殊的计算机的,本身把一台计算机的许多功能集成到了一块芯片里。同时它又只是为控制目的而应用的,我们可以通过学习掌握单片机的编程语言,实现和它的对话,通过编写不同的程序,让它能够按照我们的想法从各个引脚上发出不同的高、低电平信号,完成不同的输入、输出控制要求,代替人完成各种智能控制任务。

二、单片机中的数制和数制转换

        所谓数制是指数的制式。单片机常用的数制有十进制、二进制、八进制和十六进制。

        十进制:大家最熟悉的计数制,有0-9十个数码。十进制数的末尾加英文字母D表示它是一个十进制,字母D也可以省略不写。数制中数码的个数定义为基数,故十进制数的基数为10。任何一个十进制数都可以展开成幂级数形式。例如:

        其中以十为底的指数称为,10是它的基数

        二进制:数字电路中只有两种电平特性,即高电平和低电平,这两个状态只需要用“0”、“1”两个数字区分就可以了,所以数字电路中使用二进制计数。二进制是计算机采用的计数制,它有01两个数码二进制数用末尾加一个英文字母B表示它是一个二进制数。二进制数的基数为2,它奉行逢2进1的进位计数原则。二进制数也可以展开成幂级数,例如:

        其中以二为底的指数称为,2基数

        十六进制:它有01……9ABCDEF共十六个数码。十六进制数的末尾加英文字母H表示它是一个十六进制数。十六进制数的基数为16,进位计数为逢16进1。十六进制数可以展开成幂级数形式,例如:

        在C语言编程时要把十六进制数写成前面带前缀“0x”,如0xa,表示十进制数10。采用十六进制数可以大大减轻阅读和书写二进制数时的负担。例如:
1100011B=63H;1100001101011010B=C35AH

        三种常用数制之间的转换方法如下:

1.二进制和十进制之间的转换

        ①二进制转换成十进制:采用按权相加法,把要转换的数按权展开后相加即可。例如:

        ②十进制转换成二进制:转换分成整数和小数的转换,整数的转换采用除2取余法,小数的转换采用乘2取整法。除2取余法用2连续去除要转换的十进制数,直到商小于2为止,然后把各次余数按最后得到的为最高位、最先得到的为最低位,依次排列起来所得到的数便是所求的二进制数。

        转换结果:215=11010111B

        乘2取整法是用2连续去乘要转换的十进制小数,直到所得积的小数部分为0或满足所需精度为止,然后把各次整数按先得到的为最高位、最后得到的为最低位,依次排列起来所对应的数便是所求的二进制小数。

        转换结果:

2.十六进制和十进制之间的转换

        ①十六进制转换成十进制:采用按权相加法,即把十六进制数按权展开后相加。例如:

        ②十进制转换成十六进制:对于整数和小数分别采用除16取余法乘16取整法

        转换结果:3901D=F3DH

        转换结果:0.76171875=0.C3H

3.十六进制和二进制之间的转换

二进制转换成十六进制:采用四位合一位法

转换结果:1101001000011110.001001011110B=D21E.25EH

十六进制转换成二进制:采用一位分四位法,即把十六进制数的每位分别用四位二进制数码表示。

        转换结果:3D0.8AFH=11 1101 0000.1000 1010 1111B

三、二进制的逻辑运算

1.与
        单片机C
语言中与运算符为“&”,运算规则为:0&0=00&1=1&0=01&1=1。运算符“&”表示按位与运算。

例如:(1010 1111)&(1010 0000)=1010 0000

2.或

        单片机C语言中的或运算符为“|”,运算规则为:0|0=00|1=1|0=11|1=1。运算符“|”表示按位或运算。

例如:(1010 1111)|(1010 0000)=1010 1111

3.非

        非运算实现“求反”功能的运算。单片机C语言中的非运算符为“!”,运算规则为:!0=1,!1=0。运算符“~”表示按位取反运算。而“!”运算只是对一位取反的运算。

例如:~0101 0000=1010 1111

4.同或

        同或逻辑运算符为“⊙”,运算规则为:0⊙0=1,1⊙0=00⊙1=01⊙1=1。在C语言中没有规定符号。

5.异或

        异或逻辑运算符为“⊕”,运算规则为:0⊕0=010=101=111=0。在单片机C语言中按位异或运算符为“^”。

        若在一个逻辑表达式中出现多种逻辑运算,可用括号指定运算的次序。

四、单片机中的常用编码

1BCD
        它是一种具有十进制权的二进制编码。BCD码种类较多,现在8421码为例进行介绍。8421码是BCD码的一种,因组成它的四位二进制数码的权为8421而得名。BCD码与十进制代码的对应关系如表所示。

十进制数

8421

十进制数

8421

0

0000

8

1000

1

0001

9

1001

2

0010

10

0001 0000

3

0011

11

0001 0001

4

0100

12

0001 0010

5

0101

13

0001 0011

6

0110

14

0001 0100

7

0111

15

0001 0101

        当两个BCD码的数相加时,按逢十进一的原则相加。计算机在两个相邻BCD码之间按逢16进位运算,所以计算机进行BCD加法时,必须对结果进行修正,实现逢十进一。

2ASCII码(字符编码)

        单片机有时要处理大量数字、字母和符号,这就需要对这些数字、字母、符号进行二进制编码。这些被编码的信息统称为字符,故这些数字、字母、符号的二进制编码又称为字符编码。

        通常ASCII码由七位二进制数码构成,共128个字符编码。这些字符分为两类:一类是图形字符,共96个;另一类是控制字符,共32个。图形字符又包括十进制数符10个,大小写英文字母52个,其他字符34个。数字09ASCII码为30H39H,大写字母的ASCII 码为41H5AH。这些字符是可显示的,在单片机的系统中,通常数字、字母、符号需要送LCD显示时,就要先转化成字符编码,否则显示的字符会出现乱码。

五、单片机的引脚功能

        51系列单片机AT89S51双列直插封装形式的引脚如图所示。

        由图可见,AT89S51单片机引脚中数量最多的是I/O口,包括P0P1P2P348位,每个口都可独立控制,比如P2.0引脚为高或低电平,不影响P2口其它7个引脚的状态。以下依次了解一下这些引脚的用法。

        P0口(P0.0-P0.7——双向8位三态I/O口,直接输出为高阻状态,因此使用时必须外接上拉电阻。在单片机对外驱动其它芯片时,它提供的地址线共16根,数据线共8根,16根地址线占两个8I/O,其中低8位地址线由P0口提供,同时它也作为8位数据口,P0口既作为地址口又作为数据口的这种用法叫做地址/数据复用。

        P1口(P1.0-P1.7——内带上拉电阻。该口在作为输入使用前,要先向该口写1,然后单片机才能正确读出输入信号,也就是不能直接输入,所以它又叫做准双向口。对52单片机P1.0引脚的第二功能为T2定时/计数器的外部输入,P1.1引脚的第二功能为T2EX,即T2的外部控制端。

        P2口(P2.0-P2.7——准双向8I/O口,内带上拉电阻,与P1口相似。在单片机外驱其它芯片时,P2口作为高8位地址线。

        P3口(P3.0-P3.7——准双向8位I/O口,内带上拉电阻。当作普通I/O使用时与P1口相似。但它的每个引脚又可独立定义为第二功能。P3口的第二功能定义如表所示。

标号

引脚

第二功能

说明

P3.0

10

RXD

串行输入口

P3.1

11

TXD

串行输出口

P3.2

12

INT0

外部中断0

P3.3

13

INT1

外部中断1

P3.4

14

T0

定时/计数器0外部输入端

P3.5

15

T1

定时/计数器1外部输入端

P3.6

16

WR

外部数据存贮器写脉冲

P3.7

17

RD

外部数据存贮器读脉冲

        其它的引脚还有电源、时钟、编程控制引脚,功能和用法如下:

        VCC(40脚)、GND20脚)——单片机电源引脚

        XTAL1(19脚)、XTAL218脚)——外接时钟引脚。单片机的时钟电路是用来配合外部晶体实现振荡的电路,这样可以为单片机提供运行时钟。51单片机时钟电路工作方式有两种:一种是片内时钟振荡方式,需要在这两个引脚外接石英晶体和振荡电容;另一种是外部时钟方式,即将XTAL1接地,外部时钟信号从XTAL2脚输入。

        RST(9脚)——单片机的复位引脚。复位可以使单片机从头开始执行程序,程序将从程序存储器的0H单元读取指令码。只要给复位引脚输入持续两个机器周期以上的高电平时,就可以使51单片机成功复位。复位可以是按钮复位、上电复位或复位电路复位。

        PSEN29脚)——外部程序存储器允许输出控制端。当单片机外挂程序存储器时,该引脚为低电平时,单片机就可以从外部ROM读数据了。单片机外接程序存储器的目的是增加程序存储器的数量。

        ALE/PROG(30脚)——在单片机外驱其它芯片时,用ALE引脚信号的由正到负的跳变沿,可以把P0口输出的低8位地址送锁存器锁存起来,实现P0口地址、数据的分离。当系统没有进行扩展时,ALE会以1/6振荡周期的固定频率输出,因此可以作为外部时钟,或作为外部定时脉冲使用。PROG为编程脉冲的输入端,通过编程脉冲的输入,可以控制编好的程序写入程序存储器。

        EA/VPP31脚)—— EA用于控制读取单片机片内或片外的程序存储器,当它接高电平时,单片机读程序先读片内程序存储器,片内读完会自动跳转到片外。当它接低电平时,读取程序时直接到片外的程序存储器读。

六、单片机的C51基础

1.C语言的突出优点

        C语言是现有程序设计语言中规模最小的语言之一。而小的语言体系往往能设计出较好的程序。C语言的关键字很少,一共只有32个关键字,9种控制语句,压缩了一切不必要的成分。

        C语言具有丰富的数据结构类型,可以根据需要采用多种数据类型来实现复杂的数据结构运算。它还具有多种运算符,灵活使用各种运算符可以实现其它高级语言难以实现的运算,极大地增强了程序处理能力和灵活性。

        C语言以函数作为程序设计的基本单位。C语言对于输入和输出的处理也是通过函数调用来实现的。各种C语言编译器都会提供一个函数库,其中包含有许多标准函数,此外C语言具有自定义函数的功能,用户可以根据自己的需要编制满足某种特殊需要的自定义函数。

        汇编语言程序目标代码的效率是最高的,但是统计表明,用C语言编写的程序生成代码的效率仅比用汇编语言编写的程序低10%-20%。目前流行的51单片机C编译器——Keil C51,它产生的程序代码,质量上与汇编语言不相上下。

2.C语言程序的基本结构

        一个C语言源程序至少包括一个函数(主函数),且只有一个名为main()的函数,也可能包含其他函数,因此,函数是C语言程序的基本单位。函数后面一定有一对大括号{……},在大括号里面写程序。C语言程序总是从mail主函数开始执行的,而不管书写程序时把它放在了什么地方。

        使用C语言开发产品,可以大量使用库函数而减少用户自己编写程序的工作量,这样产品开发的速度和质量是汇编语言绝对不能相比的。KeilC51内部有上百个库函数可供我们使用,调用KeilC51的库函数时只需要包含具有该函数说明的相应的头文件即可.

3. 数据类型

        数据的格式通常称作数据类型。而按照数据类型对数据进行的排列、组合、架构则称为数据结构。

        在C51语言中,数据有常量和变量之分,常量是指在程序运行过程中其值不能改变的量,变量是指在运行过程中值可以改变的量。变量的数据大小是有限制的,变量在单片机的内存中要占据空间,变量大小不同所占据的空间也不同。所以在设定一个变量之前,要提前从单片机内存中分配给这个变量合适大小的空间,这就是通过设定数据类型来实现的,这也就解释了为什么单片机C语言中要定义那么多的数据类型。

数据类型

关键字

所占位数

所占字节数

取值范围

无符号字符型

unsigned char

8

1

0255

有符号字符型

Char

8

1

-128+127

无符号整型

unsigned int

16

2

065535

有符号整型

Int

16

2

-32768+32767

无符号长整型

unsigned long

32

4

04294967295

有符号长整型

long

32

4

-2147483648+2147483647

单精度实型

float

32

4

3.4e-38+3.4e38

双精度实型

Double

64

8

1.7e-308+1.7e308

位类型

Bit

1

01

特殊功能寄存器

Sfr

8

1

特殊功能寄存器

sfr16

16

2

特殊功能位

Sbit

1

01

一般指针

24

3

存储空间065535

        在51单片机中,除了程序计数器PC4组通用寄存器组之外,其他所有的寄存器均称为特殊功能寄存器(SFR)。为了能访问这些特殊功能寄存器,Keil C51编译器扩充了关键字sfrsfr16。在程序中要用到这些特殊功能寄存器时,必须要在程序的最前面对这些名称进行声明,声明的过程就是将这个寄存器在内存中的地址编号赋给这个名称,这些编译器就可以知道这些名称所对应的寄存器了。实际上这些寄存器的声明已经包含在51单片机的特殊功能寄存器声明头文件“reg51.h”中了。

对特殊功能寄存器的声明方法如下:

sfr 特殊功能寄存器名=地址常数,如sfr P0=0x80

sfr16 特殊功能寄存器名=地址常数,如sfr16 T2=0xcc

对特殊功能寄存器中的某一位声明方法如下:

sbit 位变量名=位地址,如sbit OV=0XD2

sbit 位变量名=特殊功能寄存器名^位位置,如sbit OV=PSW^2。

sbit位变量名=字节地址^位位置,如sbit OV=0xD0^2。

4.C51中的运算符

1.算术运算符

        C51中的算术运算符有:

        +:加法运算符,或者正值符号。

        -:减法运算符,或者负值符号。

        *:乘法运算符。

        /:除法运算符。

        %:模(求余)运算符。

        用算术运算符和括号将运算连接起来的式子称为算术表达式,其中的运算对象包括常量、变量、函数、数组、结构等。

        当运算对象的数据类型不相同时,先将较低的数据类型转换成较高的数据类型,运算的结果为较高的数据类型。另一种数据类型的转换方式为强制类型转换,需要使用强制类型转换运算符。基形式为:(类型名)(表达式);

2.赋值运算符

        在C51语言中,赋值运算符有两类,一类是基本赋值运算符“=”,一类是基本赋值运算符派生出来的复合赋值运算符,包括:+=、-=、*=、/=、%=、>>=、<<=、&=、^=、︱=。

        赋值运算符将运算符右侧操作数的值赋给左侧操作数或变量。复合赋值运算符则首先对变量进行某种运算之后,再将运算结果赋给该变量。

3. 关系运算符

        C51的关系运算符有6种:<(小于)、>(大于)、<=(小于等于)、>=(大于等于)、==(等于)、!=(不等于)。前4种关系运算符的优先级相同,后 2种也相同;前4种优先级高于后2种。

4.逻辑运算符

        C51的逻辑运算符有3种:

        &&:逻辑与(AND)。

        ‖:逻辑或(OR)。

        !:逻辑非(NOT)。

5.位运算符

        C51有如下位操作运算符:

        &:按位与。|:按位或。

        ^:按位异或。~:按位取反。

        <<:位左移。>>:位右移。

6.逗号运算符

        逗号运算符用于将表达式串在一起。格式如下:

        表达式1,表达式2,……,表达式n

        运算顺序为从左到右,整个逗号表达式的值是最右边表达式的值。如x=(y=3,z=5,y+2),结果为z=5,y=3,x=y+2=5

7.条件运算符

        C语言中的条件运算符为“?:”,可以将三个表达式连成一个条件表达式。其一般形式如下:

逻辑表达式?表达式1:表达式2

例如,当a=8b=5时,求ab中的最大值。

计算程序如下:max=(ab?a:b

因为ab为真,所以应取表达式1a的值,结果max=8

8.强制转换运算符

        作用是将一个表达式转化为所需类型。格式:(类型名)(表达式)        

例如:

        (int)a;  //将a强制转化为整型

        (int)(3.58);  //将实型变量3.58强制转化为整型,结果为3,即只取整

5.C51中的函数

        一个C51程序大体上是一个函数定义的集合,在这个集合中有且仅有一个main主函数。主函数是程序的入口,主函数中的所有语句执行完毕,则程序执行结束。

        在C51中,函数定义由类型、函数名、参数表和函数体4部分组合而成。函数名是一个标志符,标志符是区分大小的,最长为255个字符。参数表是用圆括号括起来的若干参数,项与项之间用逗号隔开。函数体是用大括号括起来的若干C51语句,语句与语句之间用分号隔开。每一个函数都返回一个值,该值由return语句中的表达式指定(省略时为零)。函数的类型就是返回值的类型,函数类型(除整型外)均需在函数名前加以指定。

        C51的一般格式如下:

        类型  函数名(参数表)

        参数说明:

        {

        数据说明部分;

        执行语句部分;

        }

        一个函数在程序中以3种形式出现:函数定义、函数调用和函数说明。

(1)如何进行二进制、十进制、十六进制数的转换?

答:1.二进制和十进制之间的转换
1)二进制转换成十进制:采用按权相加法,把要转换的数按权展开后相加即可。
2)十进制转换成二进制:转换分成整数和小数的转换,整数的转换采用除 2 取余 法,小数的转换采用乘 2 取整法。除 2 取余法用 2 连续去除要转换的十进制数,直到商小于 2 为止,然后把各次余数按最后得到的为最高位、最先得到的为最低位,依次 排列起来所得到的数便是所求的二进制数。 乘 2 取整法是用 2 连续去乘要转换的十进制小数,直到所得积的小数部分为 0 或满足 所需精度为止,然后把各次整数按先得到的为最高位、最后得到的为最低位,依次排 列起来所对应的数便是所求的二进制小数。
2.十六进制和十进制之间的转换
1)十六进制转换成十进制:采用按权相加法,即把十六进制数按权展开后相加。
2)十进制转换成十六进制:对于整数和小数分别采用除 16 取余法、乘 16 取整法。 除 16 取余法是用 16 连续去除要转换的十进制整数,直到商小于 16 为止,然后把各 次余数按逆序排列起来所得的数,便是所求的十六进制数。 乘 16 取整法把要转换的十进制小数连续乘以 16,直到所得乘积的小数部分为 0 或达 到所需精度为止,然后把各次乘积的整数按得到顺序排列起来,便是所求的小数。
3.十六进制和二进制之间的转换
1)二进制转换成十六进制 采用四位合一位法,即从二进制数的小数点开始,或左或右每四位一组,不足四位以 0 补足,然后分别把每组用 16 进制数码表示,并按顺序相连。
2)十六进制转换成二进制 采用一位分四位法,即把十六进制数的每位分别用四位二进制数码表示。

(2)单片机的并口 P0、P1、P2、P3在结构上有什么区别?

答:P0 口(P0.0-P0.7)——双向 8 位三态 I/O 口,直接输出为高阻状态,因此使用时必须外接上拉电阻,才能正常输出高、低电平。 P1 口(P1.0-P1.7)——内带上拉电阻,所以它的输出没有高阻状态。该口在作为输入使用前,要先向该口写 1,然后单片机才能正确读出输入信号,也就是不能直 接输入,所以它又叫做准双向口。 P2 口(P2.0-P2.7)——准双向 8 位 I/O 口,内带上拉电阻,与 P1 口相似。在单片机外驱其它芯片时,P2 口作为高 8 位地址线。 P3 口(P3.0-P3.7)——准双向 8 位 I/O,内带上拉电阻。当作普通 I/O 使用时与 P1 口相似。但它的每个引脚又可独立定义为第二功能。

(3)C51的不同数据类型有什么区别? 如何应用?

答:Keil C51 编译器支持的基本数据类型有:位型(只占一个二进制的数据位)、 无符号字符型(占一个字节,即 8 个位)、有符号字符型(占一个字节,但最高位是符号位,实际的数据位数是 7 位)、无符号整型(占两个字节)、有符号整型 (占两个字节,最高位是符号位)、无符号长整型(占四个字节)、有符号长整型 (占四个字节,最高位是符号位)、浮点型(占四个字节,用于存放带小数点的 2 数)、双精度浮点型(占八个字节,用于存放带小数点的数)。 在 C51 语言中,数据有常量和变量之分,常量是指在程序运行过程中其值不能改 变的量,变量是指在运行过程中值可以改变的量。变量的数据大小是有限制的, 变量在单片机的内存中要占据空间,变量大小不同所占据的空间也不同。所以在 设定一个变量之前,要提前从单片机内存中分配给这个变量合适大小的空间,这 就是通过设定数据类型来实现的,这也就解释了为什么单片机 C 语言中要定义那么多的数据类型

(4)C51中有几类运算符? 如何应用这些运算符?

答:常用的运算符有如下几类:包括算术运算符、关系运算符、逻辑运算符、赋 值运算符等。 用算术运算符和括号将运算连接起来的式子称为算术表达式,其中的运算对象包 括常量、变量、函数、数组、结构等。算术运算符的优先级规定为先乘除模,后 加减,括号最优先。 赋值运算符将运算符右侧操作数的值赋给左侧操作数或变量。复合赋值运算符则 首先对变量进行某种运算之后再将运算结果赋给该变量。利用赋值运算符将一个 变量与一个表达式连接起来的式子称为赋值表达式。 关系运算符的结合性为左结合。用关系运算符将两个表达式(算术表达式、关系 表达式、逻辑表达式、字符表达式等)连接起来的式子称为关系表达式。由于关 系运算符总是双目运算符,其作用在运算对象上产生的结果为一个逻辑值(即真 或假)。C 语言以 1 代表真,以 0 代表假。 C51 逻辑运算符与算术运算符、关系运算符、赋值运算符之间优先级的次序为:逻辑非(!)运算符优先级最高,关系运算符低于算术运算符但高于逻辑与(&&) 和逻辑或(‖)运算符,最低的是赋值运算符。 逻辑表达式的结合性为自左向右。用逻辑运算符将关系表达式或逻辑量连接起来 的式子称为逻辑表达式。逻辑表达式的值应该是一个逻辑量“真”或“假”。逻辑表达式的值与关系表达式的值相同,以 0代表假,以 1 代表真。

(5)构成 C51的各个函数之间是什么关系? 程序运行时,如何执行各个函数?

答:在 C51 语言中,函数是一种基本模块,C51 语言的程序就是由一个主函数和 若干个子函数构成的。主函数是程序的起点,根据不同需要调用不同的子模块函 数,子函数则是完成一定任务的功能模块。 一个 C51 程序大体上是一个函数定义的集合,在这个集合中有且仅有一个 main 主函数。主函数是程序的入口,主函数中的所有语句执行完毕,则程序执行结束。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值