STC51-C51基础知识

1 单片机定义与结构

1.1 什么是单片机

        单板机:将CPU芯片、存储器芯片、I/O接口芯片和简单的I/O设备(小键盘、LED显示器)等装配在一块印刷电路板上,再配上监控程序(固化在ROM中),就构成了一台单板微型计算机(简称单板机)。单板机的I/O设备简单,软件资源少,使用不方便。早期主要用于微型计算机原理的教学及简单的测控系统,现在已很少使用。
        单片机:在一片集成电路芯片上集成微处理器、存储器、I/O接口电路,从而构成了单芯片微型计算机,即单片机。 Intel公司推出了MCS-51系列单片机:集成 8位CPU、4K字节ROM、128字节RAM、4个8位并口、1个全双工串行口、2个16位定时/计数器。寻址范围64K,并有控制功能较强的布尔处理器。

1.2 单片机的内部结构

        单片机内部结构示意图如下图所示,它由微处理器CPU、随机存取存储器RAM、只读存储器ROM、基本输入/输出(I/O)接口电路、定时器/计数器和中断系统等部件组成,并把它们制作在一块大规模集成电路芯片上,就构成一个完整的单片微型计算机。

1.3 51单片机标识信息

        通常我们所说的51单片机是指以51内核扩展出的单片机。生产51单片机的厂商很多,51单片机的型号也很多。下表列出了一些51单片机的厂商和型号。

        以上提到的单片机都是51内核扩展出来的单片机,只要学会了51单片机的应用,这些单片机也就基本都能使用了。单片机都是相通的,不管是51单片机还是其它单片机,都是用户编程控制来实现一定的功能。

2 51单片机外部引脚介绍

2.1 标识解释

        STC-----前缀,表示芯片为STC公司生产的产品。其他前缀还有如AT,i,Winbond,SST等。
        8---------表示该芯片为8051内核芯片。
        9---------表示内部含Flash E^2PROM储存器。还有如80C51中的0表示内部含Mask ROM(掩模ROM)存储器;如87C51中7表示内部含ERPOM存储器(紫外线可擦除ROM)。
        C--------表示该器件为CMOS产品。还有如89LV52和89LE58中的LV和LE都表示该芯片为低电压产品(通常为3.3V供电);而89S52中的S表示该芯片含有可串行下载功能的Flash存储器,即具有ISP可在线编程功能。
        5---------固定不变。
        1---------表示该芯片内部程序存储空间的大小,1为4KB,2为8KB,3为12KB,即该数乘上4KB就是芯片内部程序存储空间大小。
        40--------表示该芯片外部晶振最高可接入40MHz。对AT单片机数值一般为24,表示其外部晶振最高为24MHz。
        C---------产品级别,表示芯片使用温度范围。C表示商业级,温度范围为0℃~+70℃。

 

芯片上标号对应温度范围
C商业级芯片的温度范围是:0℃~70℃
I工业级集成芯片(IC)的温度定额为-40℃~85℃
A汽车级集成芯片(IC)的温度定额为-40℃~125℃
M军品级集成芯片(IC)的温度定额为-55℃~125℃

        PDIP---产品封装型号PDIP表示双列直插式。
        0707---表示本批芯片生产日期为07年第7周。
        CU8138.00D-----不详。

2.2 区分芯片引脚号

        首先找到单片机表面凹进去的小圆坑,或这个使用颜色标识的小标记(圆点或三角或其他小图形),这个小圆坑或者小标记所对应的引脚就是这个芯片的第1引脚,然后逆时针方向数下去。

        按照上图为例介绍单片机各个引脚的功能(40个引脚):

        ① 电源和时钟引脚。如Vcc、GND、XTAL1、XTAL2(需掌握)

        VCC(40脚)、VSS(20脚)—单片机的电源引脚,不同型号的单片机需要接入对应的电源电源电压。开发板上配带的单片机的供电电压为5V,低压单片机的电压为3.3V,用户在使用时要查看芯片手册,确保接入正确的电压。
        
XTAL1(19脚)、XTAL2(18脚)—外部时钟引脚,XTAL1为内部振荡电路的输入端,XTAL2为内部振荡电路的输出端。8051的时钟有两种振荡方式,一种是片内时钟振荡方式,需要在这两个引脚上外接石英晶体和振荡电容,振荡电容的值一般为10pf~30pf;另一种是外部时钟方式,需要将XTAL1接地,外部时钟信号由XTAL2脚输入。

        ② 编程控制引脚。如RST、PSEN、ALE/PROG、EA/VPP,了解即可。

        RST(9脚)—单片机复位引脚。当输入连续两个机器周期以上为高电平时为有效,用来完成单片机的复位初始化操作,复位后程序计数器PC=0000H,即复位后将从程序存储器的0000H单元读取第一条指令码,通俗的讲,就是单片机从头开始执行程序。
      
  PSEN(29脚)—程序存储器允许输出控制端。在读外部程序存储器时PSEN低电平有效,以实现外部程序存储器单元的读操作,由于现在我们使用的单片机内部已经有足够大的ROM,所以几乎没有人再去扩展外部ROM,因此这个引脚大家只需了解即可。
      
  ALE/PROG(30脚)—在单片机扩展外部RAM时,ALE用于控制把P0口的输出低8位地址送锁存器锁存起来,以实现低位地址和数据的隔离。ALE有可能是高电平也可能是低电平,当ALE是高电平时,允许地址锁存信号,当访问外部存储器时,ALE信号会跳变(即由正变负)将P0口上低8位地址信号送入锁存器;当ALE是低电平时,P0口上的内容和锁存器输出一致。关于锁存器的内容,我们后面会有详细介绍。在没有访问外部存储器期间,ALE以1/6振荡周期频率输出(即6分频),当访问外部存储器时,以1/12振荡周期输出(即12分频)。从这里可以看到,当系统没有进行扩展时,ALE会以1/6振荡周期的固定频率输出,因此可以作为外部时钟,或作为外部定时脉冲使用。PROG为编程脉冲的输入端,单片机的内部有程序存储器(ROM),它的作用是用来存放用户需要执行的程序,那么我们怎样才能将写好的程序存入这个ROM中呢?实际上,我们是通过编程脉冲输入才写进去的,这个脉冲的输入端口就是PROG。现在有很多单片机都已经不需要编程脉冲引脚往内部写程序了,比如我们用的STC单片机,它可以直接通过串口往里面写程序,只需要三条线与计算机相连即可。而且现在的单片机内部都已经带有丰富的RAM,所以也不需要再扩展RAM了,因此ALE/PROG这个引脚的用处也已经不大。
    
    EA(31脚)EA接高电平时,单片机读取内部程序存储器。当扩展有外部ROM时,当读取完内部ROM后自动读取外部ROM。EA接低电平时,单片机直接读取外部ROM。8031单片机内部是没有ROM的,所以在使用8031单片机时,这个引脚是一直接低电平的。8751单片机烧写内部EPROM时,利用此引脚输入21V的烧写电压。因为现在我们用的单片机都有内部ROM,所以一般在设计电路时此引脚始终接高电平。

        ③ I/O口引脚。如P0、P1、P2、P3、,4组8位I/O(需掌握)

        P0口(32脚~39脚)—双向8位三态I/O口,每个口可独立控制。51单片机P0口内部没有上拉电阻,为高阻状态,所以不能正常地输出高/低电平,因此该组I/O口在使用时务必要外接上拉电阻,一般我们选择接入10k欧的上拉电阻
        
P1口(1脚~8脚)—准双向8位I/O口,每个口可独立控制,内带上拉电阻,这种接口输出没有高阻状态,输入也不能锁存,故不是真正的双向I/O口。之所以称它为“准双向”是因为该口在作为输入使用前,要先向该口进行写1操作,然后单片机内部才可正确读出外部信号,也就是要使其先有个“准”备过程,所以才称为准双向口。单片机P1.0引脚的第二功能为T2定时器/计数器的外部输入,P1.1引脚的第二功能为T2EX捕捉、重装触发,即T2的外部控制端。
        
P2口(21脚~28脚)—准双向8位I/O口,每个口可独立控制,内带上拉电阻,与P1口相似。
        
P3口(10脚~17脚)—准双向8位I/O口,每个口可独立控制,内带上拉电阻,作为第一功能使用时就当做普通I/O口,与P1口相似,作为第二功能使用时,各引脚的定义如下表所示。值得强调的是,P3口的每一个引脚均可独立定义为第一功能的输入/输出或第二功能。

3 电平特性

        数字电路中只有两种电平:高电平和低电平
        单片机为TTL电平
                高电平:5V或者3.3V,取决单片机电源。
                低电平:0V
        计算机串口的RS232电平
                高电平:-12V
                低电平:+12V

        所以当我们用单片机跟电脑通信的时候,我们要通过各种元器件将单片机的电平转换为计算机可识别的电平才能跟电脑进行通信。

4 二进制逻辑运算

        ① 按位取反 ~ 每一位上的0和1互换;
        ② 左移 << 左移运算运算符左边是移位对象,右边是整型表达式,代表左移的位数。左移时,右端(低位)补0;左端(高位)移出的部分舍弃。
        ③ 右移>> 右移时,右端(低位)移出的二进制舍弃,左端(高位)移入的二进制分两种情况:对于无符号整数和正整数,高位补0;对于负数,高位补1。

short int a =-8,b;
b=a>>2;
//a的二进制码:1111111111111000
//移位后     :1111111111111110

        ④ 按位与& 全1为1,其它为0;
        ⑤ 按位异或^ 不同为1,其它为0;
        ⑥ 按位或 | 有1为1,其它为0;

5 单片机的基础知识介绍

5.1 80C51系列介绍

        80C51是MCS-51系列中的一个典型品种;其它厂商以8051为基核开发出的CMOS工艺单片机产品统称为80C51系列。当前常用的80C51系列单片机主要产品有:
                ①Intel的:80C31、80C51、87C51,80C32、80C52、87C52等;
                ②ATMEL的:89C51、89C52、89C2051等;
                ③Philips、华邦、Dallas 、STC、Siemens(Infineon)等公司的许多产品 。

80C51的引脚封装

P3口第二功能各引脚功能定义
P3.0RXD串行口输入
P3.1TXD串行口输出
P3.2INT0外部中断0输入
P3.3INT1外部中断1输入
P3.4T0定时器0外部输入
P3.5T1定时器1外部输入
P3.6WR外部写控制
P3.7RD外部读控制

        总线(BUS)是计算机各部件之间传送信息的公共通道。微机中有内部总线外部总线两类。内部总线是CPU内部之间的连线。外部总线是指CPU与其它部件之间的连线。 外部总线有三种: 数据总线DB(Data  Bus), 地址总线 AB(Address  Bus)和控制总线 CBControl   Bus)
        CPU:由运算和控制逻辑组成,同时还包括中断系统和部分外部特殊功能寄存器;
        RAM:用以存放可以读写的数据,如运算的中间结果、最终结果以及欲显示的数据;
        ROM:用以存放程序、一些原始数据和表格;
        I/O口:四个8位并行I/O口,既可用作输入,也可用作输出;
        T/C:两个定时/记数器,既可以工作在定时模式,也可以工作在记数模式;
        
五个中断源的中断控制系统
        一个全双工UART(通用异步接收发送器)的串行I/O口,用于实现单片机之间或单片机与微机之间的串行通信;
        片内振荡器和时钟产生电路,石英晶体和微调电容需要外接。最高振荡频率取决于单片机型号及性能。

5.2 单片机工作的基本时序

        机器周期指令周期
                ①振荡周期: 也称时钟周期, 是指为单片机提供时钟脉冲信号的振荡源的周期,我们开发板上为12MHZ。 
                ②状态周期: 每个状态周期为时钟周期的 2 倍, 是振荡周期经二分频后得到的。 
                ③机器周期: 一个机器周期包含 6 个状态周期S1~S6, 也就是 12 个时钟周期。 在一个机器周期内, CPU可以完成一个独立的操作。 
                ④指令周期: 它是指CPU完成一条操作所需的全部时间。 每条指令执行时间都是有一个或几个机器周期组成。MCS - 51 系统中, 有单周期指令、双周期指令和四周期指令。

5.3 利用C语言开发单片机

        C语言是一种编译型程序设计语言,它兼顾了多种高级语言的特点,并具备汇编语言的功能。目前,使用C语言进行程序设计已经成为软件开发的一个主流。用C语言开发系统可以大大缩短开发周期,明显增强程序的可读性,便于改进、扩充和移植。
        一个简单的单片机C程序要有什么?

#include<reg51.h>          //包涵头文件
void main()                //程序主函数
{
	while(1)
	{
	}
}
C-51的基本语句
if选择语句
while 循环语句
for循环语句
switch/case多分支选择语句
do-while循环语句

        if-else语句:

//如果表达式的值为真(非0),则执行语句1,否则执行语句2 
if(表达式) 
    {语句1;}
else  
    {语句2;}

        while语句:

//while语句的语义是:计算表达式的值,当值为真(非0)时, 执行循环体语句。
while(表达式)
  {语句;}

        do-while 语句:

//这个循环与while循环的不同在于:它先执行循环中的语句,然后再判断表达式是否为真, 如果为真则继续循环;如果为假, 则终止循环。因此, do-while循环至少要执行一次循环语句。
do
  {语句;}
while(表达式);

        for语句:

//它的执行过程如下:
//1)先求解表达式1。
//2)求解表达式2,若其值为真(非0),则执行for语句中指定的内嵌语句,然后执行下面第3)步;若其值为假(0),则结束循环,转到第5)步。
//3)求解表达式3。
//4)转回上面第2)步继续执行。
//循环结束,执行for语句下面的一个语句。
for(表达式1;表达式2;表达式3)
 {语句}

        switch语句:

//其语义是:计算表达式的值。 并逐个与其后的常量表达式值相比较,当表达式的值与某个常量表达式的值相等时, 即执行其后的语句,然后不再进行判断,继续执行后面所有case后的语句。如表达式的值与所有case后的常量表达式均不相同时,则执行default后的语句。
switch(表达式)
{ 
  case常量表达式1:语句1;
  case常量表达式2:语句2;
   … 
  case常量表达式n:语句n;
  default        :语句n+1;
}

        函数的定义:

返回变量类型 函数名(输入变量类型)
{
	函数体;
}
unsigned char read(unsigned char addr)
{
	unsigned char dat;        //定义一个变量存放返回值
	(do anything you want); //函数中的程序。
	return dat;               //返回函数的返回值
}

        函数的调用:在函数调用之前要在主函数前面加入上该函数的声明。(或者你可以放在头文件里面,包含该头文件时,就可以声明了。)

5.4 C51中的基本数据类型

        大家在 C 语言的书籍上还能看到有short int, long int, signed short int 等数据类型, 在单片机的C 语言中我们默认的规则如下: short int 即为 int, long int 即为 long, 前面若无 unsigned 符号则一律认为是 signed 型。

5.5 C51 数据类型扩充定义

        单片机内部有很多的特殊功能寄存器,每个寄存器在单片机内部都分配有唯一的地址,一般我们会根据寄存器功能的不同给寄存器赋予各自的名称,当我们需要在程序中操作这些特殊功能寄存器时,必须要在程序的最前面将这些名称加以声明,声明的过程实际就是将这个寄存器在内存中的地址编号赋给这个名称,这样编译器在以后的程序中才可认知这些名称所对应的寄存器。对于大多数初学者来讲, 这些寄存器的声明已经完全被包含在 51 单片机的特殊功能寄存器声明头文件 " reg51.h" 中了, 初学者若不想深入了解,完全可以暂不操作它。
        ①sfr—(sfr 变量名=地址值;)—特殊功能寄存器的数据声明,声明一个8位的寄存器。
        ②sfr16—(sfr16 变量名=地址值;)—16位特殊功能寄存器的数据声明
        ③sbit—(sbit 变量名=地址值;)— 特殊功能位声明, 也就是声明某一个特殊功能寄存器中的某一位。
        ④bit—(bit 变量名=地址值;)—位变量声明,当定义一个位变量时可使用此符号。
        sfr SCON = Ox98;
        SCON 是单片机的串行口控制寄存器, 这个寄存器在单片机内存中的地址为 Ox98 。 这样声明后 , 我们在以后要操作这个控制寄存器时, 就可以直接对 SCON 进行操作, 这时编译器也会明白 , 我们实际要操作的是单片机内部Ox98 地址处的这个寄存器,而 SCON 仅仅是这个地址的一个代号或是名称而已,当然,我们也可以定义成其他的名称。
        sfr16 T2 = OxCC;
        声明一个16位的特殊功能寄存器, 它的起始地址为 OxCC 。
        sbit TI =SCON^1;
        SCON 是一个 8 位寄存器, SCON ^ 1 表示这个 8 位寄存器的次低位, 最低位是 SCON^O;SCON^7 表示这个寄存器的最高位。该语句的功能就是将 SCON 寄存器的次低位声明为 TI,以后若要对 SCON 寄存器的次低位操作, 则可直接操作 Tl。
 

5.6 C51 常用到的一些预处理命令

        #define:

#define A P0(注意后面不用加分号)

        #typedef:

typedef unsigned char uint;(后面要加分号)

        重新定义一些常用的关键词,可以增强程序的可移植 性,因为在不同的编译软件上面,C语言的数据类型 的关键词的位宽是不一样的。

        #ifndef…#endif:

#ifndef
…
#endif

        条件编译,常用于头文件的定义还有一些程序条件编译。

5.7 C51中常用的头文件

        通常有 reg51.h,reg52.h, math.h,ctype.h,stdio.h, stdlib.h,absacc.h,intrins.h。但常用的却只有 reg51.hreg52.h,math.h
        reg51.hreg52.h定义 51 单片机或 52 单片机特殊功能寄存器和位寄存器的, 这两个头文件中大部分内容是一样的, 52 单片机比 51 单片机多一个定时器T2, 因此, reg52.h 中也就比 reg51.h 中多几行定义T2 寄存器的内容。
        math.h定义常用数学运算的, 比如求绝对值、求方根、求正弦和余弦等, 该头文件中包含有各种数学运算函数,当我们需要使用时可以直接调用它的内部函数。
        当我们对特殊功能寄存器有了基本的了解后,大家就可以自己动手来写具有自己风格的头文件了。例如, 在 TX-l C 单片机学习板上, 我们用的是STC 公司的 51 内核单片机, 该单片机内部除了一般 51 单片机所具有的功能外, 还有一些特殊功能, 当我们要使用这些特殊功能时,就要对它进行另外的操作,此时就需要我们自己定义这些特殊功能寄存器的名称,我们可以根据芯片说明文档上所注明的各个寄存器地址来定义它们,关千这方面的扩展,我们会在以后的实际应用中再次提到。

5.8 C51 中的运算符

        C51 算术运算、关系(逻辑)运算、位运算符如下表所示。

        “/” 用在整数除法中时, 10 /3=3, 求模运算也是在整数中, 如 10 对 3 求模即 10 当中含有多少个整数的 3, 即 3 个。当进行小数除法运算时, 我们需要这样写 10/3.0 , 它的结果是3.333333, 若写成 10/3 它只能得到整数而得不到小数, 这一点请大家一定注意。
        "%''求余运算, 也是在整数中, 如 10%3=1, 即 10 当中含有整数倍的 3 取掉后剩下的数即为所求余数
        "==“两个等号写在一起表示测试相等,即判断两个等号两边的数是否相等的意思,在写程序时我们再做详解。” !=, 判断两个等号两边的数是否不相等。
 

5.9 学习单片机应该掌握的主要内容

        1)掌握单片机最小系统能够运行的必要条件。
                ①电源
                ②晶振
                ③复位电路
        2)掌握对单片机任意 VO 口的操作。
                ①IO输出控制电平高低。
                ②IO输入检测电平高低。

                上拉电阻就是将不确定的信号通过一个电阻拉到高电平,同时此电阻起到一个限流的作用,下拉就是下拉到低电平。
                为什么要加上拉电阻?               
                        ①OC门要输出高电平,外部必须加上拉电阻。
                        ②加大普通IO口的驱动能力。
                        ③起到限流的作用。 
                        ④抵抗电磁干扰。
                上拉电阻大小的选择?
                        ①从降低功耗方面考虑应该足够大,因为电阻越大,电流越小。
                        ②从确保足够的引脚驱动能力考虑应该足够小,电阻越小,电流才能越大。
                        ③开漏输出时,过大的上拉电阻会导致信号上升沿变缓。

        3)定时器: 重点掌握最常用的方式2 。
        4)中断: 掌握外部中断、定时器中断、串口中断。
        5)串口通信: 掌握单片机之间通信、单片机与计算机之间的通信。

        掌握了以上这几点知识后,可以说大家对单片机已经基本掌握了,其他的知识也就是在 这些知识点的基础上扩展出的, 只 要大家愿意积极尝试, 善于举一反三, 很 快便能将单片机相关的知识轻松掌握。

  • 4
    点赞
  • 14
    收藏
  • 打赏
    打赏
  • 2
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:深蓝海洋 设计师:CSDN官方博客 返回首页
评论 2

打赏作者

一直在路上的Tom

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值