跳转到主要内容

51单片机

51单片机的定时计数器

judy /

<font size="3"><strong>一、作用</strong></font>

定时器/计数器以定时器的作用最为突出。一般来说涉及到定时器,都可以算作定时器算法。简单的如秒表等。复杂的如果系统内核的定时算法等。在学习单片机的路上,必学会定时器。

<font size="3"><strong>二、工作原理</strong></font>

定时器/计数器的原理其实没那么难。

定时器也就是一个计数器。而每计一个数的时间是一定的,于是就等价了定时器。51的定时器是从你设置的初值开始计数,直到他所能达到的最高数值为止。即:

定时时间 =(最大值 – 初值)X 每计一个数的时间

最大值因不同模式而定,初值需要你设计。

当达到定时器最大值的时候,就会触发定时器标志置位。当开启全局中断和定时器中断的时候,定时器标记置位会触发定时器中断函数,执行玩中断后,标记会自动复位。备注:如果没有触发中断函数,标记不会自动复位。

51的特殊功能寄存器sfr笔记

judy /

51系列单片机内部主要有四大功能模块,分别是I/O口模块、中断模块、定时器模块和串口通信模块(串行I/O口)。51开发的重点其实就是对这四个部分进行具体的开发,而其对这四个模块的开发实质则又是能否对每个模块所对应寄存器的正确操纵。

单片机的内部结构可以大概归纳如下图:四大功能模块相关的寄存器又可分为四大部分:

I/O口相关:P1 P2 P3 P4
中断相关:IP IE
定时器相关:TMOD TCON TL0、TH0、TL1、TH1
串口通信相关:PCON SBUF

<center><img width="600" src="http://mcu.eetrend.com/files/2018-06/wen_zhang_/100012079-42867-p.jpg&q…; alt="51的特殊功能寄存器sfr笔记"></center>

51单片机数据传送指令

judy /

数据传送指令共有29条,数据传送指令一般的操作是把源操作数传送到目的操作数,指令执行完成后,源操作数不变,目的操作数等于源操作数。

如果要求在进行数据传送时,目的操作数不丢失,则不能用直接传送指令,而采用交换型的数据传送指令,数据传送指令不影响标志C,AC和OV,但可能会对奇偶标志P有影响。

<strong>以累加器A为目的操作数类指令(4条)</strong>

这4条指令的作用是把源操作数指向的内容送到累加器A。有直接、立即数、寄存器和寄存器间接寻址方式:
MOV A,data;   (data)→(A) 直接单元地址中的内容送到累加器A
MOV A,#data;   #data →(A) 立即数送到累加器A中
MOV A,Rn;    (Rn)→(A) Rn中的内容送到累加器A中
MOV A,@Ri;   ((Ri))→(A) Ri内容指向的地址单元中的内容送到累加器A

<strong>以寄存器Rn为目的操作数的指令(3条)</strong>

51单片机应用系统软件设计经验

judy /

在进行应用系统的总体设计时,软件设计和硬件设计应统一考虑,相结合进行。当系统的电路设计定型后,软件的任务也就明确了 ,系统中的软件是根据系统功能要求设计的。

一般地讲,软件的功能可分为两大类。

- 一类是执行软件,它能完成各种实质性的功能,如测量,计算,显示,打印,输出控制等;

- 另一类是监控软件,它是专门用来协调各执行模块和操作者的关系,在系统软件中充当组织调度角色。

由于应用系统种类繁多,程序编制者风格不一,因此应用软件因系统而异。尽管如此,作为优秀的系统软件还是有其共同特点和其规律的。

设计人员在进行程序设计时应从以下几个方面加以考虑:

根据软件功能要求,将系统软件分成若干个相对独立的部分,根据它们之间的联系和时间上的关系,设计出合理的软件总体结构,使其清晰,简洁,流程合理。培养结构化程序设计风格,各功能程序实行模块化,子程序化。既便于调试,连接,又便于移植,修改。

建立正确的数学模型。即根据功能要求,描述出各个输入和输出变量之间的数学关系,它是关系到系统性功能好坏的重要因素。

51单片机堆栈深入剖析

judy /

用C语言进行MCS51系列单片机程序设计是单片机开发和应用的必然趋势。Keil公司的C51编译器支持经典8051和8051派生产品的版本,通称为Cx51。应该说,Cx51是C语言在MCS51单片机上的扩展,既有C语言的共性,又有它自己的特点。本文介绍的是Cx51程序设计时堆栈的计算方法。   

1.堆栈的溢出问题。MCS51系列单片机将堆栈设置在片内RAM中,由于片内RAM资源有限,堆栈区的范围也是有限的。堆栈区留得太大,会减少其他数据的存放空间,留得太少则很容易溢出。所谓堆栈溢出,是指在堆栈区已经满了的时候还要进行新的压栈操作,这时只好将压栈的内容存放到非堆栈区的特殊功能寄存器(SFR)中或者堆栈外的数据区中。特殊功能寄存器的内容影响系统的状态,数据区的内容又很容易被程序修改,这样一来,之后进行出栈操作(如子程序返回)时内容已变样,程序也就乱套了。因此,堆栈区必须留够,宁可大一些。要在Cx51程序设计中防止堆栈的溢出,要解决两个问题:第一,精确计算系统分配给用户的堆栈大小,假设是M;第二,精确计算用户需要堆栈的大小,假设是N。要求M≥N,下面分别分析这两个问题。

51单片机不能正常起振的原因

judy /

<strong>如何确定晶振正常起振?</strong>

1、判断方法很多,用示波器看波形是最直接的,用数字万用表的电压档测电压也行,因晶振波形的占空比为50%,所以测得的平均电压为1/2Vcc左右,对于51单片机,在使用外置程序存储器的时候还可以测PSEN引脚或P0口引脚的电压或波形,只有晶振电路正常工作,那些引脚才会有信号输出,但现在很少采用片外扩展存储器,所以测晶体两端的电压或波形即可,只是晶振电路设计不良时,测试设备的引入有可能导致停振。

2、晶体两端的电压差不是平均电压差,虽然事实上因外电路的影响,晶体两端的电压可能会有差别,但这不是判断晶振是否起振的依据,也不是晶振电路正常工作的条件。至于一高一低没有工作是指一端为Vcc或接近Vcc,另一端为0或接近0,这时晶振电路当然没有起振,否则50%的占空比势将平均电压拉到1/2Vcc左右,但这么表达是不确切的,搞技术应该尽量定量精确描述。

3、听声音判断晶振是否起振不可靠,晶体的振荡频率远超人耳能够听见的频率上限,有时能够听到反而是有问题的,说明晶体质量不佳,更多的时候,正常工作的晶体是不会发出任何人耳能听到的声音的,有时声音来自外电路元件

51单片机的边沿触发及电平触发

judy /

51单片机的外部中断有两种触发方式可选:电平触发和边沿触发。选择电平触发时,单片机在每个机器周期检查中断源口线,检测到低电平,即置位中断请求标志,向CPU请求中断。选择边沿触发方式时,单片机在上一个机器周期检测到中断源口线为高电平,下一个机器周期检测到低电平,即置位中断标志,请求中断。

这个原理很好理解。但应用时需要特别注意的几点:

1)电平触发方式时,中断标志寄存器不锁存中断请求信号。也就是说,单片机把每个机器周期的S5P2采样到的外部中断源口线的电平逻辑直接赋值到中断标志寄存器。标志寄存器对于请求信号来说是透明的。这样当中断请求被阻塞而没有得到及时响应时,将被丢失。换句话说,要使电平触发的中断被CPU响应并执行,必须保证外部中断源口线的低电平维持到中断被执行为止。因此当CPU正在执行同级中断或更高级中断期间,产生的外部中断源(产生低电平)如果在该中断执行完毕之前撤销(变为高电平)了,那么将得不到响应,就如同没发生一样。同样,当CPU在执行不可被中断的指令(如RETI)时,产生的电平触发中断如果时间太短,也得不到执行。

51单片机 | 定时/计数器原理及结构

judy /

定时/计数器结构(T0和T1)
<img src="http://mcu.eetrend.com/files/2018-02/wen_zhang_/100010259-35431-1.png&q…; alt="51单片机 | 定时/计数器原理及结构">
16位寄存器T0、T1分别由TH0、TL0和TH1、TL1四个8位计数器组成

<ul>
<li>
<p>定时器的区别:</p>

<ul>
<li>T0可分成2个独立的8位定时器,而定时器1则不能;</li>
<li>T1可作为串口的波特率发生器,而定时器0则不能。</li>
</ul>
</li>
<li>
<p>工作原理</p>

基于51单片机控制门禁系统的设计

judy /

近年来,电子门禁系统发展非常迅速,按照其开门方式可以分为3类:密码识别、卡片识别和生物识别。
  
无线射频识别技术(RFID)在门禁系统中得到广泛的应用,本例中以使用工作频率为125KHz的射频ID卡和密码识别相结合的门禁系统为例,说明单片机控制门禁系统的原理及应用。
  
本门禁系统主要应用于居民小区的居民楼,其工作原理如下:当有人要进入时,可以通过以下两种方式实现:

一是通过在门禁处主机上刷卡,当该卡为门禁系统中存在的ID卡时,门可以打开,否则,语音提示该卡不存在;

二是输入房间号码+密码的方式开门,若有访客要进入时,访客可以提前和住户联系,获得住户的房间号和密码,当访客输入正确的房间号和密码后,楼宇门可以打开,否则提示密码错误。

为什么51单片机的地址总线是16位的,但是它却是8位机?

judy /

位数指CPU处理的数据的宽度,参与运算的寄存器的数据长度。

如果总线宽度与CPU一次处理的数据宽度相同,则这个宽度就是所说的单片机位数。

如果总线宽度与CPU一次处理的数据宽度不同:

(1)总线宽度小于CPU一次处理的数据宽度,则以CPU的数据宽度定义单片机的位数,但称为准多少位。比如著名的Intel 8088,CPU是16位但总线是8位,所以它是准16位。

(2)总线宽度小于CPU一次处理的数据宽度,则以CPU的数据宽度定义单片机的位数。

少位宽不是指总线宽度,也不是存储器的宽度,像51单片机的地址总线是16位的,但是它是8位机。像ARM的存储器也有八位的,但是它是32位机。而是指CPU处理的数据的宽度,也就是CPU一次数据的吞吐量。比如同一条指令:MOV R0 R2

在51单片机里面,R0和R2都是8位的,所以51的CPU一次只能处理8位数据。

在ARM里面,R0和R2是32位的,所以ARM的CPU一次能处理32位数据。这就是区别。

有啥复杂的, 一句话:参与运算的寄存器的数据长度。

8位单片机的数据总线宽度为8位,通常直接只能处理8位数据;

16位单片机的数据总线宽度为16位,通常可直接处理8位或16位数据。