单片机原理与实践学习记录
第二课(更新时间:2021.9.3)
51单片机I/O口简单应用
C51中常用的头文件
? 通常有reg51.h,reg52.h,math.h, ctype.h, stdio.h, stdlib.h, absacc.h, intrins.h。但常用的却只有reg51.h或reg52.h,math.h。reg51.h和reg52.h是定义51单片机或52单片机特殊功能寄存器和位寄存器的,这两个头文件中大部分内容是一-样的, 52单片机比51单片机多一个定时器T2,因此,reg52.h 中也就比reg51.h中多几行定义T2寄存器的内容。math.h是定义常用数学运算的,比如求绝对值、求方根、求正弦和余弦等,该头文件中包含有各种数学运算函数,当需要使用时可以直接调用它的内部函数。
C51数据类型扩充定义
单片机内部有很多的特殊功能寄存器,每个寄存器在单片机内部都分配有唯一的地址,一般会根据寄存器功能的不同给寄存器赋予各自的名称,当需要在程序中操作这些特殊功能寄存器时,必须要在程序的最前面将这些名称加以声明,声明的过程实际就是将这个寄存器在内存中的地址编号赋给这个名称,这样编译器在以后的程序中才可认知这些名称所对应的寄存器。
sfr-特殊功能寄存器的数据声明,声明一个8位的寄存器。 sfr16-16位特殊功能寄存器的数据声明。 sbit-特殊功能位声明,也就是声明某一个特殊功能寄存器中的某一位。 bit-位变量声明,当定义一个位变量时可使用此符号。 例如: sfr SCON = 0x98; SCON是单片机的串行口控制寄存器,这个寄存器在单片机内存中的地址为0x98。这样声明后,在以后要操作这个控制寄存器时,就可以直接对SCON进行操作,这时编译器也会明白,实际要操作的是单片机内部0x98地址处的这个寄存器,而SCON仅仅是这个地址的一个代号或是名称而已,当然,也可以定义成其他的名称。 例如: sfr16 T2 = 0xCC;声明一个16位的特殊功能寄存器,它的起始地址为0xCC。 例如: sbit TI =SCON^1; SCON是一一个8位寄存器,SCON^1 表示这个8位寄存器的次低位,最低位是SCON0;SCON7表示这个寄存器的最高位。该语句的功能就是将SCON寄存器的次低位声明为TI,以后若要对SCON寄存器的次低位操作,则可直接操作TI。
单片机最小系统
? 单片机最小系统,或者称为最小应用系统,是指用最少的元件组成的以单片机为核心元件的可以正常工作的具有特定功能的单片机系统,是单片机产品开发的核心电路。而且单片机最小系统是在以51单片机为基础上扩展,使其能更方便地运用于测试系统中。下面将介绍其的组成:
单片机最小系统主要由电源、复位、振荡电路以及扩展部分等部分组成。最小系统原理图如图1所示。
图1 最小系统电路图
?
1.电源供电模块
对于一个完整的电子设计来讲,首要问题就是为整个系统提供电源供电模块,电源模块的稳定可靠是系统平稳运行的前提和基础。51单片机虽然使用时间最早、应用范围最广,但是在实际使用过程中,一个和典型的问题就是相比其他系列的单片机,51单片机更容易受到干扰而出现程序跑飞的现象,克服这种现象出现的一个重要手段就是为单片机系统配置一个稳定可靠的电源供电模块。电源模块电路如图2所示。 图2 电源模块电路图
此最小系统中的电源供电模块的电源可以通过计算机的USB口供给,也可使用外部稳定的5V电源供电模块供给。电源电路中接入了电源指示LED,图中R11为LED的限流电阻。S1 为电源开关。
2.复位电路
单片机的置位和复位,都是为了把电路初始化到一个确定的状态,一般来说,单片机复位电路作用是把一个例如状态机初始化到空状态,而在单片机内部,复位的时候单片机是把一些寄存器以及存储设备装入厂商预设的一个值。复位电路图如图3所示。
图3 复位电路图
单片机复位电路原理是在单片机的复位引脚RST上外接电阻和电容,实现上电复位。当复位电平持续两个机器周期以上时复位有效。复位电平的持续时间必须大于单片机的两个机器周期。具体数值可以由RC电路计算出时间常数。
复位电路由按键复位和上电复位两部分组成。
(1)上电复位:STC89系列单片及为高电平复位,通常在复位引脚RST上连接一个电容到VCC,再连接一个电阻到GND,由此形成一个RC充放电回路保证单片机在上电时RST脚上有足够时间的高电平进行复位,随后回归到低电平进入正常工作状态,这个电阻和电容的典型值为10K和10uF。
(2)按键复位:按键复位就是在复位电容上并联一个开关,当开关按下时电容被放电、RST也被拉到高电平,而且由于电容的充电,会保持一段时间的高电平来使单片机复位。
3.振荡电路
单片机系统里都有晶振,在单片机系统里晶振作用非常大,全程叫晶体振荡器,他结合单片机内部电路产生单片机所需的时钟频率,单片机晶振提供的时钟频率越高,那么单片机运行速度就越快,单片接的一切指令的执行都是建立在单片机晶振提供的时钟频率。振荡电路如图4所示。
图4 振荡电路图
在通常工作条件下,普通的晶振频率绝对精度可达百万分之五十。高级的精度更高。有些晶振还可以由外加电压在一定范围内调整频率,称为压控振荡器(VCO)。晶振用一种能把电能和机械能相互转化的晶体在共振的状态下工作,以提供稳定,精确的单频振荡。
单片机晶振的作用是为系统提供基本的时钟信号。通常一个系统共用一个晶振,便于各部分保持同步。有些通讯系统的基频和射频使用不同的晶振,而通过电子调整频率的方法保持同步。
晶振通常与锁相环电路配合使用,以提供系统所需的时钟频率。如果不同子系统需要不同频率的时钟信号,可以用与同一个晶振相连的不同锁相环来提供。
STC89C51使用11.0592MHz的晶体振荡器作为振荡源,由于单片机内部带有振荡电路,所以外部只要连接一个晶振和两个电容即可,电容容量一般在15pF至50pF之间。
4.扩展部分
4.1LED电路
图5 LED电路图
图5中主要元件有1K的排阻、LED、。1K的排阻为每个LED的限流电阻。此最小系统提供了8个独立LED,由P1口控制,采用共阳级接法所以只有当P1口输出低电平时LED才会点亮。
4.2蜂鸣器电路
图6 蜂鸣器电路图
图6中蜂鸣器使用的是PNP三极管进行驱动控制的,此蜂鸣器为电磁式有源蜂鸣器。三极管的集电极通过蜂鸣器接5V电源,基极是控制端,发射极接地,当单片机的P2.3输出低电平时,三极管导通,蜂鸣器发声。蜂鸣器为感性原件,也可以在两端并接一个二极管来起到泄放作用。
4.3系统的数码管电路
图7 数码管电路图
如图7所示,多位数码管的“位选”是可以独立控制的,而“段选”是连接在一起的,可以用作数码管的动态显示和静态显示。图7中所示的数码管全部为共阴极的数码管。74HC573为所存器,利用单片机可以控制所存器的所存端,进而控制锁存器的数据输出,利用分时控制的方法可以方便地控制任意数码管显示任意数字。
4.4系统的键盘电路
图8 独立和矩阵键盘电路图
图8中S2-S3为4个独立按键,与单片机的P3.4-P3.7分别相连。
独立键盘与单片机相连时,每个按键都需要单片机的一个I/O口,若按键较多时,占用的I/O口资源就会过多,为此就引入了矩阵键盘。图8中是将16个按键排成4行4列,这样一共有8根线,节省了8个I/O口。S6-S21即为16个矩阵键盘,8条线分别与单片机飞P3口相连。
4.5A/D电路
图9 A/D电路图
集成A/D转换器品种繁多,一般选用逐次比较型A/D转换器,图9中的ADC0804就是这类单片集成A/D转换器。它采用CMOS工艺20引脚的集成芯片,分辨率为8位,转换时间为100us,输入电压范围为0-5V。芯片内具有三态输出数据锁存器,可以直接连接数据总线上。
4.6D/A电路
图10 D/A电路图
DAC0832是使用非常普遍的8位D/A转换器,转换时间为1us,工作电压为+5V~+15V,基准电压为正负10V。它主要由两个8位寄存器和一个8位D/A转换器组成。其片内有输入数据缓冲器,可以直接与单片机接口。DAC0832一电流形式输出,需要转换为电压输出时,可外接运算放大器。
4.7 系统串行通信电路
图11 串行通信电路图
RS232串口电路使用MAX232作为电平转换芯片,可以通过串口电缆连接到计算机背后的COM口,用于单片机与上位机通信以及和其他串口设备的数据交互。
以上就是单片机最小系统的组成介绍了。由于单片机往往是作为一个核心部件来使用,仅单片机方面知识是不够的,因此还应根据具体硬件结构,以及针对具体应用对象特点的软件结合,来更好的完善使用。
闪烁灯的制作
入门:
? 在日常生活中,有各种各样的闪烁灯,有的应用于娱乐场所,有的应用于店面等的装饰,有的起警示作用。如舞台灯、汽车转向灯、十字路口的黄闪灯等。在单片机控制系统中,通过I/O口进行开关量的控制占用较大的比重,如LED发光二极管的亮灭、电动机的启停等控制都属于单片机的开关量输出控制。LED发光二极管是几乎所有的单片机系统都要用到的显示器件,常见的发光二极管主要有红色、绿色、黄色等单色发光二极管,另外还有双色的二极管。
? 这里,我们使用Ubuntu下的MCU 8051 IDE进行学习。 首先,在创建一个新的空白项目之后,将芯片类型设置为AT89S52。
接着,在创建完空白c文件之后,将以下代码粘贴到文件里面去。
`#include "8052.h"`
`#define LSA P1_5`
`#define LSB P1_6`
`#define LSC P1_7`
`int main(void)`
`{`
`LSA = 0;`
`LSB = 0;`
`LSC = 0;`
`P0=0XAA;`
`}`
然后点击compile进行编译。
在源代码进行编译的过程中,我们对代码的原理进行分析。
? 这里我们先附上LED流水灯模块的原理图。LED,也就是发光二极管,是一种半导体固体发光器件。因此, LED的工作是有方向性的,只有当正极接到LED阳极(+),负极接到LED的**阴极(-)**的时候才能工作,如果反接LED是不能正常工作的。发光二极管与普通二极管一样也具有单向导电性。当给发光二极管加上大于其导通电压的正向电压后,就会有电流产生,同时发出相应颜色的光,不同颜色的二极管的工作也是不一样的,一般发光二极管的工作电压是2V,其工作电流大多为5—20mA,因此如果用5V的电源进行供电则需要加入限流电阻。 ? 单片机的I/O口有两种状态“1”和“0”,当为“1”时其管脚输出为高电平,即为5V,当为“0”时为低电平,即为0V。由上图可知,当P1.0为高时发光二级管两端电压相同,即不会产生电流,发光二极管就不会发光,当P1.0为低时,5V和P1.0就会有5V的电压,就会有电流流过LED0,使发光二极管发光。这样我们通过控制单片机的I/O口的高低电平就能实现对LED 的亮灭控制。 原理了解以后,我们对代码进行分析。
`#include "8052.h"`
`#define LSA P1_5`
`#define LSB P1_6`
`#define LSC P1_7`
`int main(void)`
`{`
`while(1)
`{LSA =0;`
`LSB = 0;`
`LSC = 0;`
`P0=0XAA;
`}`
`}`
? 通过硬件连接可知:当I/O口为“1”时LED是灭的;当I/O口为“0”时LED是亮的;物理层面观察到的现象也就是灭亮灭亮灭亮灭亮。而我们在程序中,还为P1.5、P1.6、P1.7也赋了值。使LED1的灯也可以亮。这样能帮助我们更好地理解基于51单片机I/O口的简单应用。 ? 这时,程序在编译成功之后就会出现这样的界面,如果出错,系统就会提示出错的具体位置。 然后我们对程序进行仿真模拟(点击START,或者那个小火箭,注意,一定要先模拟哦)。 出现以下界面模拟完成。 紧接着在运行完之后,我们需要打开LED模拟界面。并调试成如下界面。 在这里,我们先测试对P0的任务安排是否成功。 效果不错,接下来再测试,P1的功能。 完成。
进阶:
让一只LED灯不停地闪烁。这里我们先补充一点小知识。
由于我们使用的是仿真软件,而仿真存在一个时间轴的概念,我们的一秒等同于仿真软件里面的一毫秒,这就使得仿真的现象非常慢,即使是在硬件中肉眼难以捕捉的现象也可以在软件中观察到。
#include "8052.h"
#define LSA P1_5
#define LSB P1_6
#define LSC P1_7
int main(void)
{
while(1)
{LSA =0;
LSB = 0;
LSC = 0;
P0 = 0xff;
P0 = 0x00;
}
}
由于我们并没有在代码之中添加时间延迟函数,那么,在硬件上,就很难观察到LED灯的明灭。然而,在软件仿真上呢,嘿嘿嘿。。。
#include "8052.h"
#define LSA P1_5
#define LSB P1_6
#define LSC P1_7
int main(void)
{
unsigned int a;
LSA =0;
LSB = 0;
LSC = 0;
while(1)
{
a=60;
while(a--);
P0 = 0xff;
a=60;
while(a--);
P0 = 0x00;
}
}
不正经的时间延迟如上。。。
本文以zhangrelay老师的单片机课程为骨干,借鉴郭天祥老师的新概念51书本内容为辅助,个人进行编辑整理用于知识回顾以及概念学习使用。学识浅薄,献丑献丑,麻烦各位多多批评与指正,提出宝贵的意见。(随时间更新哦!)
|