1 AT89S51单片机功能及特点-德赢Vwin官网 网

AT89S51单片机功能及特点

描述

编程

第1章 单片机系统硬件电路

1.1 实习目的

了解单片机最小系统;

了解keil软件操作,程序下载及调试方法;

掌握单片机外部电路使用;

掌握键盘和数码管显示编程方法;

应用单片机开发板进行实验开发;

1.2 单片机型号及特性

1、AT89S51单片机功能及特点

AT89S51采用40引脚双列直插封装(DIP)形式,内部由CPU,4kB的ROM,256 B的RAM,2个16b的定时/计数器TO和T1,4个8 b的工/O端I:IP0,P1,P2,P3,一个全双功串行通信口等组成。特别是该系列单片机片内的Flash可编程、可擦除只读存储器(E~PROM),使其在实际中有着十分广泛的用途,在便携式、省电及特殊信息保存的仪器和系统中更为有用。AT89S51提供了高度灵活和低成本的解决办法。充分利用他的片内资源,即可在较少外围电路的情况下构成功能完善的超声波测距系统。
2、STC89C52单片机功能及特点

STC89C52是由8K可反复擦写Flash ROM,32个双向I/O口,256x8bit内部RAM,3个16位可编程定时/计数器中断,时钟频率0-24MHz,2个串行中断,可编程UART串行通道,2个外部中断源,共6个中断源,2个读写中断口线,3级加密位,低功耗空闲和掉电模式,软件设置睡眠和唤醒功能。该器件采用ATMEL搞密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。

1.3 单片机开发板

1、复位电路

在电路中,使用电阻给电容充电,使电容的电压缓慢上升一直到VCC,在还没有到VCC时,芯片复位脚近似低电平,但是芯片复位,接近VCC时,芯片复位脚近高电平,导致芯片停止复位,此时复位完成,整个电路循环运行.这个电路就叫做复位电路。开关复位电路如上图所示。

在电路上电时候或电压波动不稳定的时候,当给单片机上电那一瞬间,电压有在几微秒内(有的是几毫秒内)不是直接跳变到5V的而是一个直线上升的阶段,这时候,单片机不能正常工作,需要复位电路给它延时以等到电压稳定。这叫上电复位。

编程

图1

2、晶振电路

晶振使用12MHZ。时钟周期是机器周期的12倍,机器周期是晶振频率的倒数,1/12MHz = 1/12us那么时钟周期就是12*(1/12us)=1us。单片机晶振提供的时钟频率越高,那么单片机运行速度就越快,单片机的一切指令的执行都是建立在单片机晶振提供的时钟频率。晶振的两端并联上合适的电容它就会组成并联谐振电路。这个并联谐振电路加到一个负反馈电路中就可以构成正弦波振荡电路,也就是晶振电路。

编程

图2

3、键盘和中断

键盘扫描原理:

检测时,先送一列为低电平,其余几列全为高电平,然后立即轮流检测一次各行是否有低电平,若检测到某一行为低电平,则我们便可确认当前被按下的键是哪一行哪一列的,用同样的方法轮流送各列一次低电平,轮流检测一次各行是否变成低电平,这样即可检测完所有的按键,当有键被按下时便可判断出按下的键是哪一个键。

编程

图3

中断原理:

⑴ 当单片微机内部或外部有中断申请时,CPU能及时响应中断,停下正在执行的任务,转去处理中断服务子程序,中断服务处理后能回到原断点处继续处理原先的任务;

⑵ 当有多个中断源同时申请中断时,应能先响应优先级高的中断源,实现中断优先级的控制;

⑶ 当低优先级中断源正在享用中断服务时,若这时优先级比它高的中断源也申请中断,要求能停下低优先级中断源的服务程序转去执行更高优先级中断源的服务程序,实现中断嵌套,并能逐级正确返回原断点处。

4、数码管

静态显示驱动原理:

静态驱动也称直流驱动。静态驱动是指每个数码管的每一个段码都由一个单片机的I/O口进行驱动。静态驱动的优点就是编程简单,显示亮度高,缺点是占用I/O口多。实际应用时必须增加译码驱动器进行驱动,增加了硬件电路的复杂性。

动态显示驱动原理:

数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示,这就是动态驱动。在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。

编程

图4

第2章 单片机应用系统软件

2.1 STC下载软件

本软件不需要安装,只要直接点击编程这个图标即可。

MCU Type 选择STC89C52RC 将生成的文件Open File 然后我的电脑点击右键找到管理设备管理器端口然后看显示的是哪个COM口。最后点击Download 单片机的开关在显示连接时再打开。

编程

2.2Keil软件

点开图标UV3;

编程

编程

编程

编程

编程

编程

编程

点击add close即可在界面上编译即可。

编程

编程

编程

编程

2.3 外部电路驱动

1、串口

串行接口是一种可以将接受来自CPU的并行数据字符转换为连续的串行数据流发送出去,同时可将接受的串行数据流转换为并行的数据字符供给CPU的器件。一般完成这种功能的电路,我们成为串行接口电路。计算机通信是将计算机技术和通信技术的相结合,完成计算机与外部设备或计算机与计算机之间的信息交换 。可以分为两大类:并行通信与串行通信。

并行通信通常是将数据字节的各位用多条数据线同时进行传送 。

编程

并行通信控制简单、传输速度快;由于传输线较多,长距离传送时成本高且接收方的各位同时接收存在困难。

串行通信是将数据字节分成一位一位的形式在一条传输线上逐个地传送。

编程

串行通信的特点:传输线少,长距离传送时成本低,且可以利用电话网等现成的设备,但数据的传送控制比并行通信复杂。

异步通信是指通信的发送与接收设备使用各自的时钟控制数据的发送和接收过程。为使双方的收发协调,要求发送和接收设备的时钟尽可能一致。

异步通信的数据格式 :

编程

异步通信的特点:不要求收发双方时钟的严格一致,实现容易,设备开销较小,但每个字符要附加2~3位用于起止位,各帧之间还有间隔,因此传输效率不高。

同步通信时要建立发送方时钟对接收方时钟的直接控制,使双方达到完全同步。此时,传输数据的位之间的距离均为“位间隔”的整数倍,同时传送的字符间不留间隙,即保持位同步关系,也保持字符同步关系。
2、定时器
定时/计数器的工作原理:

加1计数器输入的计数脉冲有两个来源,一个是由系统的时钟振荡器输出脉冲经12分频后送来;一个是T0或T1引脚输入的外部脉冲源。每来一个脉冲计数器加1,当加到计数器为全1时,再输入一个脉冲就使计数器回零,且计数器的溢出使TCON中TF0或TF1置1,向CPU发出中断请求(定时/计数器中断允许时)。如果定时/计数器工作于定时模式,则表示定时时间已到;

如果工作于计数模式,则表示计数值已满。可见,由溢出时计数器的值减去计数初值才是加1计数器的计数值。

工作方式寄存器TMOD用于设置定时/计数器的工作方式,低四位用于T0,高四位用于T1。其格式如下:

编程

GATE:门控位。

C/T:定时/计数模式选择位。

M1M0:工作方式设置位。

编程

编程

TF1(TCON.7):T1溢出中断请求标志位。

TR1(TCON.6):T1运行控制位。

TF0(TCON.5):T0溢出中断请求标志位,其功能与TF1类同。

TR0(TCON.4):T0运行控制位,其功能与TR1类同。

3、中断

一、中断的概念

CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生);

CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务);

待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A(中断返回),这一过程称为中断 。

MCS-51单片机的中断系统结构

编程

引起CPU中断的根源,称为中断源。中断源向CPU提出的中断请求。CPU暂时中断原来的事务A,转去处理事件B。对事件B处理完毕后,再回到原来被中断的地方(即断点),称为中断返回。实现上述中断功能的部件称为中断系统(中断机构)。

80C51的中断系统有5个中断源(8052有 6个) ,2个优先级,可实现二级中断嵌套 。

TCON的中断标志

编程

IT0(TCON.0),外部中断0触发方式控制位。

当IT0=0时,为电平触发方式。

当IT0=1时,为边沿触发方式(下降沿有效)。

IE0(TCON.1),外部中断0中断请求标志位。

IT1(TCON.2),外部中断1触发方式控制位。

IE1(TCON.3),外部中断1中断请求标志位。

TF0(TCON.5),定时/计数器T0溢出中断请求标志位。

TF1(TCON.7),定时/计数器T1溢出中断请求标志位。

SCON的中断标志

编程

RI(SCON.0),串行口接收中断标志位。

TI(SCON.1),串行口发送中断标志位。

中断允许控制

编程

EX0(IE.0),外部中断0允许位;

ET0(IE.1),定时/计数器T0中断允许位;

EX1(IE.2),外部中断0允许位;

ET1(IE.3),定时/计数器T1中断允许位;

ES(IE.4),串行口中断允许位;

EA (IE.7), CPU中断允许(总允许)位。

中断优先级控制

编程

PX0(IP.0),外部中断0优先级设定位;

PT0(IP.1),定时/计数器T0优先级设定位;

PX1(IP.2),外部中断0优先级设定位;

PT1(IP.3),定时/计数器T1优先级设定位;

PS (IP.4),串行口优先级设定位;

PT2 (IP.5) ,定时/计数器T2优先级设定位。

编程

第3章 电子时钟设计

3.1 基本电路

数码管

所谓的八段就是指数码管里有八个小LED发光二极管,通过控制不同的LED的亮灭来显示出不同的字形。数码管又分为共阴极和共阳极两种类型,其实共阴极就是将八个LED的阴极连在一起,让其接地,这样给任何一个LED的另一端高电平,它便能点亮。而共阳极就是将八个LED的阳极连在一起。其原理图如下。

编程

图3-1数码管图

其中引脚图的两个COM端连在一起,是公共端,共阴数码管要将其接地,共阳数码管将其接正5伏电源。一个八段数码管称为一位,多个数码管并列在一起可构成多位数码管,它们的段选线(即a,b,c,d,e,f,g,dp)连在一起,而各自的公共端称为位选线。显示时,都从段选线送入字符编码,而选中哪个位选线,那个数码管便会被点亮。数码管的8段,对应一个字节的8位,a对应最低位,dp对应最高位。所以如果想让数码管显示数字0,那么共阴数码管的字符编码为00111111,即0x3f;共阳数码管的字符编码为11000000,即0xc0。可以看出两个编码的各位正好相反。

2.DS1302的结构和工作原理

DS1302是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。

2.1 引脚功能及结构

DS1302的引脚排列,其中Vcc1为后备电源,VCC2为主电源。在主电源关闭的情况下,也能保持时钟的连续运行。DS1302由Vcc1或Vcc2两者中的较大者供电。当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电。当Vcc2小于Vcc1时,DS1302由Vcc1供电。X1和X2是振荡源,外接32.768kHz晶振。RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据的传送手段。当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。上电运行时,在Vcc≥2.5V之前,RST必须保持低电平。只有在SCLK为低电平时,才能将RST置为高电平。I/O为串行数据输入输出端(双向),后面有详细说明。SCLK始终是输入端。

2.2数据输入输出(I/O)

在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。

2.4 DS1302的寄存器

DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式,其日历、时间寄存器及其控制字见表1。

此外,DS1302 还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。DS1302与RAM相关的寄存器分为两类:一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H~FDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。

3.2 设计原理

编程思想

1.数据输出

从P0口输出段选码,从P1口输出位选码,数码管就会显示出数字来。

2.计时功能的实现与中断服务程序

时间的运行依靠定时中断子程序对时钟单元数值为进行进位调整来实现的。计数器T0打开后,进入计时,满50ms后,重装定时,中断一次。中断二十次后,满一秒进位,满60秒后即为1分钟,分钟单位进位,60分到了后,时单位进位,24小时满后,清0;通过扫描程序送数码管显示出来,实现时钟计时功能。

编程

图3-1 电子时钟软件流程图

3.3实现方法

本实验完全使用软件实现数字时钟。系统以AT89C52为核心,具有时间显示功能。硬件电路包括AT89C52单片机最小系统电路,数码管模块。采用单片机内部的定时/计数器来实现电子时钟。原理为:在单片机内部存储器设三个字节分别存放时钟的时、分、秒信息。利用定时器与软件结合50ms秒定时中断,产生二十次中断,达到一秒,秒计算到60时,要软件清零并向分进1;分计算到60时,要自己清零并向时进1;时计算到24时,要清零。这样才能循环计时。该方案具有硬件电路简单,性能可靠,实时性好,操作简单,编程容易的特点。但由于每次执行程序时,定时器都要重新赋初值,所以该时钟精度不高。而且,由于是软件实现,当单片机不上电,程序不执行时,时钟将不工作。

3.4(1)数码管的动态显示

显示格式如10-45-10.在多位LED显示时,为了降低成本和功耗,将所有位的段选线并联起来,由一个8位口控制,由另一个端口进行显示位的控制。但是,由于段选是公用的,要让各位数码管显示不同的字符,就必须采用扫描方式,即动态扫描显示方式。首先从段选线上送出字段码,再控制位选线,字符就显示在指定位置上,持续1~5ms时间;接下来又送出新的字段码,按照上述过程又显示在新的位置上,直到每一位数码管都扫描完为止,即为一个扫描周期。由于人的视觉停留效应,因此当扫描周期小到一定程度时,人就感觉不出字符的移动或闪烁,觉得每位数码管到一直在显示,达到一种稳定的视觉效果。

3.5 动态扫描显示的扫描方式有程序控制和定时中断扫描两种。程序控制扫描方式要占用许多CPU时间,在计算机的任务较重时,难以得到好的效果,所以在实际中常采用定时中断扫描方式,这种方式是每隔一定时间(如1ms)显示一位数码管,假设有8位数码管,显示扫描周期为8ms,显示效果十分良好。本次设计采用这种方法。

3.6 (2)数码管的字型码设计

3.7八段LED显示器由8个发光二极管组成。基中7个长条形的发光管排列成"日"字形,另一个贺点形的发光管在显示器的右下角作为显示小数点用,它能显示各种数字及部份英文字母。LED显示器有两种不同的形式:一种是8个发光二极管的阳极都连在一起的,称之为共阳极LED显示器;另一种是8个发光二极管的阳极都连在一起的,称之为共阳极LED显示器。共阴和共阳结构的LED显示器各笔划段名和安排位置是相同的。当二极管导通时,相应的笔划段发亮,由发亮的笔划段组合而显示的各种字符。这里必须注意的是:很多产品为方便接线,常不按规则的方法去对应字段与位的关系,这时字形码就必须根据接线来自行设计了。单片机上数码管接法为共阳型,也就是相应的输出位为0时笔段亮,则字型码为:

第4章 实习总结

4.1 实习体会

这几天的实习分为两大部分,前几天进行单片机的焊接,之后老师布置作业,进行编程调试,最后进行检查。在对AT89C52单片机焊接和调试过程中,我学到了很多东西,无论是在单片机理论方面还是在电子器件焊接方面都取得了很大的进步。

在单片机焊接过程中注意以下几点:

1、注意电解电容、发光二极管、蜂鸣器的正负极性不能接反、三者均是长的管脚接正极、短的管脚接负极,如接反轻则烧毁元气件,重则发生轻微爆炸。

2、三极管8550的E、B、C、注意接法,板子上面有相应的图形形状。按照那个图形焊接。

3、焊接元气件的过程之中焊接时间应在2-4秒。焊接时间不宜过长,否则不仅会烧毁元气件、而且易使焊点容易脆裂

4、电阻焊接过程中注意相应的阻值对应,不要焊错。否则影响相应的电流大小。

5、排阻焊接过程之中公共端应该接VCC、其余管脚为相应的独立端。

6、ISP插槽应该注意方向。缺口对应板子的外面、如果接反下载线将不能接好。

7、数码管的焊接应该是有小数点的一侧在下面、接反影响数码管的显示。

焊接的顺序如下:应该先焊器件高度小的,再焊高度大的。

单片机主要包括AT89C52芯片,数码管,蜂鸣器,发光二极管,按键,12864,1206,红外接收,24c04,18b20温度传感器。

在实现某些功能时要对单片机引脚,内部结构,寄存器和原理有一定的了解和感官认识,它是怎样工作的,能干什么?单片机是一门应用性和实践性很强的学科,要是一段时间不接触就会把学会的东西忘记,因此要经常制作一些小东西,巩固单片机的一些知识点。

4.2设计硬件体会

虽然硬件部分有的硬件比较少,做出来的时间比较少,但在制作这些硬件的过程中仍然从某种意义上遵循着硬件开发的一些既定的程序。在设计硬件时,先将各部分硬件用PTOTEL画出来,然后最后根据总的要求将各个部件连接在一起。硬件最好使用覆铜板将电路焊出来,最好不要使用万用板焊接,这样误差比较大。在制作过程中必须注意比较细致的分析。在使用软件进行编程时,必须结合硬件。

在元器件的布局方面,应该把相互有关的元件尽量放得靠近一些,对于那些易产生噪声的器件、小电流电路、大电流电路开关电路等,应尽量使其远离单片机的逻辑控制电路和储存电路,如果可能的话,可能将这些电路另外制成电路板,这样有利于抗干扰,提高电路工作的可靠性。

尽量在关键元件,如ROM、RAM等芯片旁边安装去耦电容。实际上,印制电路板走线、引脚连线等都可能含有较大的电感效应。大的电感可能会在VCC走线上引起严重的开关噪声尖峰。防止VCC走线上开关噪声尖峰的唯一方法,是在VCC与电源地之间安防一个合适大小的去耦电容。最好使用瓷片电容,因为这种电容具有较低的高频阻抗,另外这种电容温度和时间上的介质稳定性也很不错。如果不会设计硬件电路,可以根据典型电路进行设计,然后再根据实际情况进行加各种电容、电阻等元器件。

参考文献

[1]郭天祥 51单片机C语言教程2009

[2] 华成英,童诗白 模拟电子技术基础 2006

[3] 闫石 数字电子技术基础 2006

[4] 谢自美 电子线路设计 1992

[5] 何利民 单片机应用系统设计 1993

[6] 付家才 单片机工程时间技术 2004.3

[7] 朱定华 单片机原理及接口技术 2002.11

[8] 刘湘涛 江世明 单片机原理与应用 2006

附录2系统主要程序

#include< reg52.h >                                  /////////////////////////////////////////////////
#define uchar unsigned char
#define uint unsigned int


/////////////////////////////////////////////////
uint miaod,miaog,fend,feng,shid,shig;
uint t,num,max,temp;
////////////////////////////////////////////////
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x98};
uchar code wela[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
//////////////////////////////////////////////////
void delay(uint z) //如果数码管有显示太快。可以开这个延时。
{
  uint x,y;
  for(x=z;x >0;x--)
    for(y=100;y >0;y--);
}
////////////////////////////////////////////////
void display(uchar shig,uchar shid,uchar feng,uchar fend,uchar miaog,uchar miaod)
{
  P1=0X00;     //消隐,防止余晖
  shig=temp/10;
  shid=temp%10;
  feng=max/10;
  fend=max%10;
  miaog=num/10;
  miaod=num%10; 
  P1=wela[0];
  P0=table[miaod];
  delay(2);
  P1=wela[1];
  P0=table[miaog];
  delay(2);
  P1=wela[2];
  P0=0xbf;
  delay(2);
  P1=wela[3];
  P0=table[fend];
  delay(2);
  P1=wela[4];
  P0=table[feng];
  delay(2);
  P1=wela[5];
  P0=0xbf;
  delay(2);
  P1=wela[6];  
  P0=table[shid];
  delay(2);
  P1=wela[7];
  P0=table[shig];
  delay(2);
}


void init()
{
  TMOD=0x01;
     TH0=(65535-45872)/256;
     TL0=(65535-45872)%256;
     ET0=1;
     TR0=1;
     EA=1;
  num=0;                
}
/*void delay(uint z) //如果数码管有显示太快。可以开这个延时。
{
  uint x,y;
  for(x=z;x >0;x--)
    for(y=100;y >0;y--);
}*/
void main()
{
  init();
  while(1)
  {
    display(shig,shid,feng,fend,miaog,miaod);
  }
}
void time0() interrupt 1
{
  TH0=(65536-45872)/256;
  TL0=(65536-45872)%256;
  t++;
  if(t==20)
  {
    t=0;
    num++;
    if(num==60)
    {
      num=0;
      max++;
      if(max==60)
      {  
        max=0;
        temp++;
        if(temp==24)
          temp=0;
      }
    }
  }


}
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表德赢Vwin官网 网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分