技术文档

51单片机初始化 51单片机知识重点汇总一,想学习单片机的朋友不要错过

小编 2024-11-25 技术文档 23 0

51单片机知识重点汇总一,想学习单片机的朋友不要错过

51单片机知识重点汇总一

主要性能:

  与MCS-51单片机产品兼容 、8K字节在系统可编程Flash存储器、 1000次擦写周期、全静态操作:0Hz~33Hz 、三级加密程序存储器 、 32个可编程I/O口线、三个16位定时器/计数器八个中断源、全双工UART串行通道、 低功耗空闲和掉电模式 、掉电后中断可唤醒 、看门狗定时器 、双数据指针、掉电标识符 。

一、STC89C51单片机外部引脚简介

电源及时钟引脚:Vcc(40脚)、GND(20脚)、XTAL1(19脚)、XTAL2(18脚)。

Vcc、GND——单片机电源引脚,不同的型号单片机接入对应电压电源,常压为+5V,低压为

+3.3V。

XTAL1、XTAL2——外接时钟引脚。XTAL1为片内震荡电路的输入端,XTAL2为片内震荡电路的输出端。8051的时钟有两种方式,一种是片内时钟震荡方式,需要在这两个脚外接石英晶体和震荡电容,震荡电容的值一般取10p~30p;另一种是外部时钟方式,将XTAL1接地,外部时钟信号从XTAL2脚输入。

编程控制引脚。如RST(复位)、PSEN(29脚)、ALE/PROG(30脚)、EA/Vpp(31脚)。

RST(9脚)——单片机复位引脚。当输入连续两个机器周期以上高点平时有效,用来完成单片机的复位初始化操作,复位后程序计数器PC=0000H,单片机从程序储存器的0000H单元读取第一条指令码。即单片机从头开始执行程序。

PSEN(29脚)—— 程序存储器允许输出控制端。读取外部程序存储器时PSEN低电平有效,以实现外部程序存储器单元的读操作(了解即可)。

ALE/PROG(30脚)—— 在单片机扩展外部RAM时,ALE用于控制把P0口的输出低8位地址送锁存器锁存器来,以实现地位地址和数据的隔离。(了解即可)。

EA/Vpp(31脚)—— EA接高电平时,单片机读取内部程序存储器。当扩展有外部ROM时,当读取完内部ROM后自动读取外部ROM。EA接低电平时,单片机直接读取外部ROM。

I/O口引脚 —— P0口、P1口、P2口、P3口。

P0口(39-32脚)——双向8位I/O口,每个口可独立控制,没有上拉电阻,为高阻态,所以不能正常的输出高低电平,因此该组IO口在使用时务必要接上拉电阻,一般选10千欧。

P1口(1-8脚)——准双向8位IO口,每个口可独立控制,内带上拉电阻,这种接口输出没有高阻状态,输入也不能锁存,故不是真正的双向IO口。之所以称它为准双向,是因为该口在作为输入使用前,要先向该口进行写1操作,然后单片机内部才可正确地读出外部信号,也就是要使其先有个“准”备的过程,所以说才是准双向接口。

P2口(21-28脚)—— 准双向8位I/O口,每个口可独立控制,内带上拉电阻,与P1口相似。

P3口(10-17脚)——准双向8位IO口,每个口可独立控制,内带上拉电阻。作为第一功能可以当做普通I/O口,与P1口相似。P3口可做第二功能使用。参照下表:

二、电平特性

单片机的输入输出电平为TTL电平,其中高电平为+5V,低电平为0V。计算机串口为RS-232电平,其中高电平为-12V,低电平为+12V。注意,RS-232为负逻辑电平。

三、单片机的几个周期介绍

(1)时钟周期。也称为震荡周期,定义为时钟频率的倒数(可以这样来理解,时钟周期就是单片机外接晶振的倒数,

如12MHz的晶振,它的时钟周期就是1/12us)它是单片机中最基本的、最小的时间单位;在一个时钟周期内,CPU

仅仅完成一个最基本的动作。对于某个单片机来讲,若采用了1MHz的时钟频率,则时钟周期就是1us;若采用4MHz

的时钟频率,则时钟周期就是250us。由于时钟脉冲是CPU的基本脉冲,它控制着CPU的工作节奏(使CPU的每一步

都统一到它的步调上来)。显然,对同一种单片机,时钟频率越高,单片机的工作速度就越快。但是,由于不同的

单片机内部硬件电路和电气结构不完全相同,所以其所需的时钟频率范围也不一定相同。我们使用的STC89C系列的

时钟范围约在1MHz~40MHz。

(2)状态周期。它是时钟周期的两倍。

(3)机器周期。单片机的基本操作周期,在一个操作周期内,单片机完成一项基本操作,如取指令、存储器读/写等。它由12个时钟周期(6个状态周期)组成。

(4)指令周期。它是指CPU执行一条指令所需要的时间。一般一个指令周期含有1~4个机器周期。

四、移位操作

左移。C51操作符为“<<”,最低位补零

右移。同上

循环左移,最高位移入最低位,其他依次向左移一位。

五、数码管显示原理

电路方面有共阴极和共阳极之分,让数码管显示不同的数字就是先定义一个保存16进制数的数组,然后在程序中把这个16进制数赋值给相应的引脚。

在这里我们华维单片机编程为大家准备了一些基础课程,免费送给大家,有需要可以加关注领取。

关注领取

六、中断概念

51单片机一共有6个中断源

INT0——外部中断0

INT1——外部中断1

T0/1/2——计时器/定时器中断,由计数器满回零引起。

T1/R1——串行口中断,串行端完成一帧字符发送/接收后引起。

七、单片机的定时器中断

51单片机内部共有两个16位可编程的定时器/计数器,即定时器T0和定时器T1。它们既有定时功能又有计数功能。定时器/计数器的实质是加1计数器(16位),由高8位和低8位两个寄存器组成,TMOD寄存器是定时器/计数器的工作方式寄存器,确定工作方式和功能;TCON是控制寄存器,控制T0,T1的启动和停止以及设置溢出标志。

加一计数器的输入计数脉冲有两个来源,一个是由系统的时钟振荡器输出脉冲经12分频后送来;另一个是T0或T1引脚输入的外部脉冲源。如果定时器/计数器工作在定时模式,则表示时间已到;如果工作在计数模式,则表示计数值已经满了。

定时器初始化过程如下:

①对TMOD赋值,以确定T0和T1的工作方式

②计算初值,并将初值写入TH0、TL0或TH1、TL1中。

③中断方式时,则对IE赋值,开放中断。

④使TR0或TR1置位,启动定时器/计数器定时或计数

八、并行与串行基本通信方式

1、并行通信方式:将数据字节的各位用多条数据线同时进行传输,每位数据都需要一条传输线。

2、串行通信方式:串行通信是将数据字节分成一位一位的形式在一条传输线上逐个的传输,此时只需要一条数据线

3、异步串行通信方式:指通信的接收与发送设备使用各自的时钟控制数据的发送和接收过程。其特点是:不要求发送双方时钟严格一致,容易实现,设备开销小,但每个字符要附加2~3位,用于起始位、校验位、停止位,各帧之间还有间隔,因此传输效率不高。在单片机与单片机之间,单片机与计算机之间通信时,通常采用异步串行通信方式。

4、同步串行通信方式:同步通信时要建立发送方时钟对接收方时钟的直接控制,使双方完全达到同步。

51单片机-配置定时器

配置寄存器

首先,让我们来先配置下定时器,如何配置定时器。定时器是要先把相关的符号先进行声明的,但由于#include <REGX52.H>当中已经帮我们声明好了,那么我们直接使用即可。

先把图放在这里方便观看!

⒈TMOD配置

〖内容⇢定时器/计数器工作模式寄存器TMOD〗

那么我们先创建一个子函数 void Timer0_Init() ⇥ 对定时器进行初始化。

那么首先是TMOD的一个配置,定时器1我们先不管(高四位定时器全部给上0),只管低四位的一个定时器0的一个配置。

STC89C52 的 T0 和 T1 一共有四种工作模式:在这里我们选择最常用的工作模式1。

Ⅰ:工作模式①的话,我们只需要把 M1 = 0,M0 = 1 就是定时器模式①的配置了。

Ⅱ:C/T(取反):这个我们只需要给C/T(取反) = 0即可,SYSclk⇢系统时钟。

Ⅲ:GATE(门控端),GATE = 0,这里当中都是数字电路当中的一些基础逻辑门,TR0 = 1。

经过上述的TMOD配置,此时,TMOD = 0x01;// 0000 0001 (十六进制→二进制)

注→TMOD是不可位寻址:寄存器只能进行整体的进行赋值『十六进制0x』

⒉TCON配置

〖内容⇢定时器/计数器控制寄存器TCON〗

​TCON可位寻址,注→可位寻址可以为每一位寄存器单独赋值。

在这个我们主要针对 TF0 和 TR0,注:这里我们是单独赋值,用二进制(0/1)来。

Ⅰ: TF0中断溢出标志位,TF0 = 0 被允许计数以后,从处置开始计数+1,当最高位产生溢出的时候,由n硬件置"1"TF0 = 1的时候就会向CPU请求中断。

在程序当中我们先可以直接给TF0 = 0,因为一旦TF0 = 1的就会产生中断。

Ⅱ:TR0 就是计数系统会不会开启,TR0 = 1的时候就代表着开始计数。

那么我们就可以给 TR0 = 1 开始计数工作。

拓展→IE0和IT0就是用来控制外部中断引脚的,但是因为GATE门控端 = 0,那么我们就可以不用去配置这些东西。

​Ⅲ:我们还需要配置 TL0 和 TH0 这里我们也需要给它写好一个值。这个计数脉冲就是在12MHZ情况下,每隔1us进行+1,等加到最大值的时候 65535us,它才进行产生一个中断。TL0是低字节,TH0是高字节。它们都是计数系统,这两个字节总共可以存储0~65535。每隔1us加1,总共时间是65535us,这就相当于是65ms计满之后就计数不下去了(好比一个沙漏⏳的沙子已经放满了)

64535us离计数器溢出差值1000us=1ms,每隔1ms的时候产生中断。每一次中断之后再次的计一次数,每计数1000us的时候再做其它的事情。

注:定时器的工作单位方式是以微妙(us)为单位的。

那么在这里我们可以先定义一个1ms的时间,所以我们刚开始的时候就可以给64535离计数器计满(溢出)差值的时候就为1000个数(1ms),注:我们寄存器是⑧个比特位为一位的,⑧位的只能存的下256。而这个65535它是指的是两个⑧位的拼接在了一起,一句话:要分开来。

TH0 = 64535/256;把高8位拿出来了,TL0=64535%256;低8位拿出来了。这个可能理解起来会比较难点,但是其实这样就很好理解了,用画图的方法来演示下吧

​中断的配置

​为了方便观看把图放在这里

那么定时器的配置已经配置好了,接下来就是中断的配置了。

在这里我们只需要配置T0的那一条路线即可。这个配置就比上述容易许多了。

Ⅰ:ET0 = 1

Ⅱ:EA = 1

Ⅲ:PT0 = 0 『默认:即为zero』

void Timer0_Init(void)

那么上述的定时器初始化配置如下↓

那么以上void Timer0_Init() ⇥ 对定时器初始化的函数就已经好了。我们只需要在源文件.c的 main() 函数当中进行初始化,上电的时候它实际上已经是开始工作的了。那么这样才能让它进行中断呢。

注:上述实际上是65536才到溢出,当然65535仅仅也知识多出了1微秒。

STC89C52中断资源

​interrupt0 表示的是外部中断。注:P3.2引脚可以使用。

interrupt1 表示(定时器中断0) 在这里我们使用的是定时器0的中断。

interrupt2 表示(外部中断1) 注:P3.3引脚可以使用。

interrupt3 表示(定时器中断1)

interrupt4 表示(串口中断)

我们此时还需要在main()函数后面再写一个子函数,这个子函数的作用就是代表"闹钟"响了之后跳转到这个子函数当中去执行最终的中断任务,指的就是void Timer0_Init(void)

注:interrupt是关键字。

上述代码总的意思实际上就是→执行main()函数当中的定时器初始化Timer0_Init(); 定时器初始化好之后。原本这个程序是在while(1);执行的时候就会跳转到 void Timer0_Routine(void) interrupt 1 这个中断子函数当中去执行完这个子函数完的时候就会回到while(1);依次往复这个过程。

注⇢在中断任务当中需要重新赋值定时器初始值,如果你赋值它为2ms的话,那么也只是第一次为1ms,等到第二次的时候到中断任务就会编程2ms。所以我们通常会把中断任务的赋初始值和定时器任务赋初始值都是一样的。

但是如果我们在while(1);死循环+个让一脚点灯,它既可以执行while(1)循环里面的点灯的程序又可以执行中断任务,这个就是为什么使用定时器是可以在一定情况下同时完成⒉项任务

实验很简单我们可以点个灯试一下或者调试看下是不是如上述所说。

流程图

​主程序(main)函数 --> 其它子函数 --> 中断来了定时

器溢出,中断请求 --> 跳转到中断的一个函数里面执行中断里面的任务 --> 中断执行完之后再返回原来断点的地方就是原来从哪里停的现在从哪里回来 --> 然后再继续执行主函数。

从上面的理解当中我们可以看出,这个程序当中在一定的程度上,可以同时完成两项任务。比如说:执行主程序其它子程序也在执行。就像是LED的流水灯上,既可以执行流水灯的扫描,其次按键也可以进行控制流水灯。好处是:大大的提高了运行效率,有兴趣可以了解一下中断的概念实际上是非常多的。

定时器点灯⇢间隔1s

程序代码如下所示↓

拓展:注如果g_Count不是用全局变量的话,而是局部变量的话,那么那个局部变量需要被static 进行修饰,其作用:延长生命周期,出了局部变量原来修饰变量的值不会被销毁,再次回到函数当中被修饰的变量依旧会保持原来的值的大小。

注:我们这里的 g_Count++ 是每次+1ms。所以当它不满足if()语句的判断条件的时候是还需要返回到while(1);语句当中去的。再次进入到中断执行中断任务。

TMOD问题

当然上述代码当中还是存在着缺陷的,那就是TMOD,在上述当中我们TMOD是不可谓寻址就是不能单个赋值初始值必须⑧位才行。在这里我们使用一个定时器是当然没有任何问题的,因为我们的定时器1更本就没有开始工作不会出现问题。

出问题是在于:同时使用⒉个定时器的时候,定时器1和定时器0的话。高位会被刷新!

当然,实际上TOMD = 0x11;也是可以使用两个定时器的。但是它的操作上有很大的区别↓

TMOD = TMOD&0xF0;

TMOD = TMOD|0x01;

这个是可以进行统一的处理,而也建议大家这样养成一个好的习惯。

TMOD = 0x11;

这种是单独进行处理。

所以,在使用TMOD的时候推荐用这种代码方式↓

注:TMOD默认为低电平。

TMOD低四位清0,高四位保持不变。 0000 0000 & 1111 0000 = 0000 0000

任何数1&1还是等于1,任何数&0还是等于0的。

TMOD最低为置1,高四位保持不变。 0000 0000 | 0000 0001 = 0000 0001

任何数或上一个0,就是等于自身的那个数。

那么这个与或赋值法就可以操作其中的几个位而不会影响其它的位。

STC-ISP-自动配置

在STC-ISP软件上可以直接配置定时器计算器的,如下图所示

​AUTR:可以删除因为已经是12T模式了。当然这里还是少了中断的配置我们需要加上的。

Ⅰ:ET0 = 1

Ⅱ:EA = 1

Ⅲ:PT0 = 0 『默认:即为zero』

TL1和TH1的配置都是可以的​

相关问答

51单片机初始化 是什么?

[最佳回答]1把某些变量变成初始值,比如0或者1.2如果用到定时器需要设置定时器的工作方式及初值。3如果用到中断需要开放相应的中断源的中断并设置优先级。4如果用到串...

c51单片机 中断系统的 初始化 应该包括哪几个步骤?

[最佳回答]初始化程序应完成如下工作:对TMOD赋值,以确定T0和T1的工作方式。计算初值,并将其写入TH0、TL0或TH1、TL1。中断方式时,则对IE赋值,开放中断。使TR0或TR1...

51单片机 程序 初始化 的意义?

[最佳回答]初始化顾名思义就是初始配置,不同的使用有不同的配置.如果只是为了做一个类似点亮一个LED的话,就不用初始化了.它并不是程序所必要的.你若用了定时器,设置...

51单片机 编写 初始化 程序。要求实现:外部中断0?

[最佳回答]汇编SETBIT0;setINT0inttype(1:Falling0:Lowlevel)SETBEX0;enableINT0interruptSETB...

51单片机初始化 函数?

[最佳回答]51单片机(如AT89C51)的初始化函数主要用于配置单片机的各种外设和内部寄存器,以确保它们在程序开始执行前具有预期的状态。初始化函数通常在程序的主函数(如m...

使用 51单片机 定时50ms, 初始化 程序怎么写?

[最佳回答]TMOD=0x01;//方式1TH0=(65536-50000)/256;//12MHZ晶振,一个机器周期1us,50000个就是50msTL0=(65536-500...

设MCS- 51单片机 的晶振频率为12MHZ,使用定时器1工作方式1中断...

[最佳回答]STARTORG0001BHMOVTH1,#(65536-50000)/256MOVTL1,#LOW(65536-50000)CPLP1.0RETISTART:MO...

51单片机 max7219数码管使用方法?

[最佳回答]使用方法如下:1.接线:将Max7219引脚与MCU引脚相连,VCC和GND分别连接到正负电源上。2.初始化:编写初始化函数,包括设置控制口输出、设置扫描限制、设置亮度...

MCS 51单片机初始 上电时,CPU执行的第1条指令所处的ROM空间地址是?

[最佳回答]MCS-51单片机上电后(或复位后),首先开始初始化各个寄存器。PC寄存器设置为0000H,于是,程序从0000H开始执行第一条指令。

51单片机 怎么写程序在一段时间内按钮按一下是1,按两下是2,...

使用51单片机实现这种逻辑需要设置多个步骤:初始化定时器、配置按键中断、写入相应的代码处理按钮输入(比如P0口)。当接收到第一个按键信号后启动定时器,在适当...

猜你喜欢