AT89s52单片机教材.doc_第1页
AT89s52单片机教材.doc_第2页
AT89s52单片机教材.doc_第3页
AT89s52单片机教材.doc_第4页
AT89s52单片机教材.doc_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

单片机实用技术教材20102011年度第二学期电子工程学院大学生电子创新协会编辑一、单片机的历史1.1 单片机的由来:从1971年微型计算机问世以来,由于实际应用的需要,微型计算机向两个不同的方向发展:一个是向高速度、大容量、高性能的高档微机方向发展;而另一个则是向稳定可靠、体积小和价格廉的单片机方向发展。但两者在原理和技术上是紧密联系的。1.2单片机的名称:单片机因将其主要组成部分集成在一个芯片上而得名,具体说就是把中央处理器CPU,随机存储器RAM,只读存储器ROM、中断系统、定时器计数器以及I/O接口电路等主要微型机部件,集成在一块芯片上。虽然单片机只是一个芯片,但从组成和功能 上看,它已具备有了计算机系统的属性,为此称它为单片微型计算机SCMC,简称单片机。1.3 单片机的发展1971年微处理器的研制成功,不久后就出现了单片的微型计算机即单片机,最早的单片机是一位的。现在已经发展到32位。1976年INTEL公司推出了8位的MCS48系列单片机,它以体积小、控制功能全、价格低廉等特点受到广泛的应用和好评。其后,在MCS48成功的刺激下,许多半导体芯片商研制自己的产品。到80年代末,世界各地已经相继研制大约50多个系列300多个品种的单片机产品。其中Motorola公司的6801、6802,Zilog公司的Z-8系列,Rockwell公司的6501、6502等。从开始的一位机到现在的32位,单片机以惊人的速度向前发展。1.4单片机的应用领域单片机广泛应用于仪器仪表、家用电器、医用设备、航空航天、专用设备的智能化管理及过程控制等领域,大致可分如下几个范畴:1.在智能仪器仪表上的应用。单片机具有体积小、功耗低、控制功能强、扩展灵活、微型化和使用方便等优点,结合不同类型的传感器,可实现诸如电压、功率、频率、湿度、温度、流量、速度、厚度、角度、长度、硬度、元素、压力等物理量的测量。2.在工业控制中的应用。单片机可以构成形式多样的控制系统、数据采集系统。3.在家用电器中的应用。可以这样说,现在的家用电器基本上都采用了单片机控制,从电饭褒、洗衣机、电冰箱、空调机、彩电、其他音响视频器材、再到电子秤量设备,五花八门,无所不在。4.在计算机网络和通信领域中的应用。现代的单片机普遍具备通信接口,可以很方便地与计算机进行数据通信,为在计算机网络和通信设备间的应用提供了极好的物质条件,现在的通信设备基本上都实现了单片机智能控制,从手机,电话机、小型程控交换机、楼宇自动通信呼叫系统、列车无线通信、再到日常工作中随处可见的移动电话,集群移动通信,无线电对讲机等。5.单片机在医用设备领域中的应用。单片机在医用设备中的用途亦相当广泛,例如医用呼吸机,各种分析仪,监护仪,超声诊断设备及病床呼叫系统等等。此外,单片机在工商,金融,科研、教育,国防航空航天等领域都有着十分广泛的用途。二、应用软件Keil软件是目前最流行开发 80s51 、80s52系列单片机的软件,Keil 提供了包括 C 编译器、宏、汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案。Keil 软件的使用1. 使用Keil 前必须先安装。2. 安装好了Keil 软件以后,我们打开它。打开以后界面如下:3. 我们先新建一个工程文件,点击“p工程”菜单,如下图:4. 选择工程文件要存放的路径 ,输入工程文件名 LED, 最后单击保存:5. 在弹出的对话框中选择 CPU 厂商及型号:6. 选择好 Atmel 公司的 AT89S52后 , 单击确定:7新建一个 C51 文件 , 单击左上角的 New File (新建文件)如下图所示:8. 保存新建文件使文件名为*.C的扩展名:9. 保存好后把此文件加入到工程中方法如下 : 用鼠标在 Source Group1 上单击右键 , 然后再单击 添加文件到组Source Group 1如下图:10. 选择要加入的文件 , 找到led.C 后 , 单击 Add, 然后单击关闭:11. 程序编辑后选择左窗口“目标Target 1属性”点击右键选择 “输出”将E生成HEX文件打钩。然后,点击确定,如下图所示。12按一下,快捷键F7,编译程序。芯片选择2.下载软件双龙MCU下载器的使用下载程序窗口程序下载下载线端口设置下载速度选择三、 80s52的内部结构1、中央处理器(CPU): 通常把运算器和控制器合在一起称为中央处理器(Central Processing Unit),简称CPU。2、内部数据存储器(RAM): 8051芯片共有256个RAM单元,其中后128单元被专用寄存器占用(稍后我们详解),能作为寄存器供用户使用的只是前128单元,用于存放可读写的数据。因此通常所说的内部数据存储器就是指前128单元,简称内部RAM。地址范围为00HFFH(256B)。是一个多用多功能数据存储器,有数据存储、通用工作寄存器、堆栈、位地址等空间。 3、内部程序存储器(ROM):在前面也已讲过,8051内部有4KB的ROM,用于存放程序、原始数据或表格。因此称之为程序存储器,简称内部RAM。地址范围为0000HFFFFH(64KB)。 4、定时器/计数器 8051共有2个16位的定时器/计数器,以实现定时或计数功能,并以其定时或计数结果对计算机进行控制。定时时靠内部分频时钟频率计数实现,做计数器时,对P3.4(T0)或P3.5(T1)端口的低电平脉冲计数。 5、并行I/O口 MCS-51共有4个8位的I/O口(P0、P1、P2、P3)以实现数据的输入输出。具体功能在后面章节中将会详细论述。 6、串行口 MCS-51有一个全双工的串行口,以实现单片机和其它设备之间的串行数据传送。该串行口功能较强,既可作为全双工异步通信收发器使用,也可作为移位器使用。RXD( P3.0)脚为接收端口,TXD(P3.1)脚为发送端口。 7、中断控制系统 MCS-51单片机的中断功能较强,以满足不同控制应用的需要。共有5个中断源,即外中断2个,定时中断2个,串行中断1个,全部中断分为高级和低级共二个优先级别。 8、时钟电路 MCS-51芯片的内部有时钟电路,但石英晶体和微调电容需外接。时钟电路为单片机产生时钟脉冲序列。数码管显示单片机活动插座10针CAPUSBP0.0 P3.7 S11S21S31S41AVR1S521RS232接口powerJ1kLM3 8 6J274LS4774LS13824C02串口电路J5J3J4J6C1J7J8J9J0四、 实验装置简介五、实战练习实验一、数制转换与单片机端口的控制一、实验目的:1、熟悉十进制数与二、十六进制数的相互转换2、了解各进制数在程序中的运用3、学习单片机的四个I/O口4、掌握I/O口对LED的控制二、实验设备:1、单片机最小系统2、I/O口输出LED3、按键一个三、实验内容:1、对二、十、十六进制数进行转换2、编写一段程序,用P1口作为输出端,控制八位LED轮流点亮3、编写一段程序,P1口为输出口,P3.2为输入端口,当P3.2按下时,P1口控制的LED点亮,当P3.2没有按下时,P1口控制的LED不点亮。四、实验步骤:任务一:1、数码是一种构造数制所用的符号。各种进制的数码为:二进制:0,1十进制:0,1,2,3,4,5,6,7,8,9十六进制:0,1,2,3,4,5,6,7,8,9,A(a),B(b),C(c),D(d),E(e),F(f) (用字母代表)10 11 12 13 14 152、用余数法将十进制整数转换成二进制整数。把十进制整数不断地用2去除,将所得到的余数0或1依次记为K0,K1,K2, ,直到商是0为止,将最后一次所得的余数记为Kn,则KnKn-1 K1K0即为该整数的二进制表示。例11 (59)10=( ) 2=(Kn K1K0)2竖式演算如下: 2 59 余数1=K0 2 29 余数1=K1 2 14 余数0=K2 2 7 余数1=K3 2 3 余数1=K4 2 1 余数1=K5 0 (59)10=(K5K4K3K2K1K0)2=(111011)2例12 把0.47转换成二进制。用线图形式可演算如下: 0.470.940.880.760.520.042 整数 0 1 1 1 1 K-1 K-2 K-3 K-4 K-5 在取5位小数时有(0.47)10=(K-1 K-2 K-3 K-4 K-5 )2=(0.01111)2 3、将二进制转换成十进制把二进制数按多项式展开求和即可。(101.101)2=(122+021+120+12-1+02-2+12-3)10 =(14+11+10.5+10.125)10 =(5.625)104、二进制转十六进制一般使用8421码进行转换如:(11111011)28 4 2 1 8 4 2 11 1 1 1 1 0 1 18+4+2+1=15=F;8+0+2+1=11=B;即(111110111)=(FB)16任务二:做单一灯的左移右移,硬件电路如图4.4.1所示,八个发光二极管L1L8分别接在单片机的P1.0P1.7接口上,输出“0”时,发光二极管亮,开始时P1.0P1.1P1.2P1.3P1.7P1.6P1.0亮,重复循环。 2 电路原理图 图4.4.1 3 系统板上硬件连线 把“单片机系统”区域中的P1.0P1.7用8芯排线连接到“八路发光二极管指示模块”区域中的L1L8端口上,要求:P1.0对应着L1,P1.1对应着L2,P1.7对应着L8。 4. 程序设计 移位结构式: #include unsigned char i; /定义变量 unsigned char temp; void delay(void) /延时unsigned char m,n,s;for(m=30;m0;m-)for(n=30;n0;n-)for(s=200;s0;s-);void main(void)while(1) temp=0xfe; P1=temp; delay(); for(i=1;i8;i+) P1=(P11)+1; delay(); for(i=1;i1)+0x80; delay(); 数组结构式:#includeunsigned char a23=0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f, 0xff,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80, 0x00,0xff,0x00,0xff,0x00,0xff,0x00;unsigned char b;void delay() unsigned char i,j,k; for(i=0;i30;i+) for(j=0;j30;j+) for(k=0;k200;k+); main() while(1) P1=0xff; for(b=0;b23;b+) P1=ab; delay(); 实验二、一键多功能设计#include unsigned char ID;void delay10ms(void) unsigned char i,j; for(i=20;i0;i-) for(j=248;j0;j-);void delay02s(void) unsigned char i; for(i=20;i0;i-) delay10ms(); void main(void) while(1) if(P3_2=0) delay10ms(); if(P3_2=0) ID+; if(ID=4) ID=0; while(P3_2=0); switch(ID) case 0: P1_0=P1_0; delay02s(); break; case 1: P1_1=P1_1; delay02s(); break; case 2: P1_2=P1_2; delay02s(); break; case 3: P1_3=P1_3; delay02s(); break; 实验三、动态数码管显示一、 动态扫描多位LED数码管显示按驱动方式可分为静态显示和动态显示。静态显示,即除了在改变显示数据的时间外,所有的数码管都处于通电发光状态。动态显示,就是一位一位的轮流点亮各个数码管。人眼具有残像特征,当数码管点亮的时间间隔足够小时,观察者就不会感到数码管的闪烁,看到的现象是所有的数码管一起发光。 下面介绍的内容就是采用动态扫描的显示方式。二、 共阳(阴)数码管管脚图: 本实验电路采用共阳数码管,由于AT89S52单片机每个I/O口的拉电流只有12mA,但在灌电流驱动状态下能达到20mA左右,如果采用共阴数码管,则需要加驱动电路,而采用共阳数码管则不用加驱动电路,可以使电路设计得到简化。所以,大多时候电路设计采用共阳数码管。三、原理图 数码管显示的硬件原理图如上所示,其中用到两个主要的芯片:74LS47和74LS138,都是译码器,只不过对应的“码制”不一样而已。P0.0P0.3控制74LS47显示所需的段码(即所要显示的数字),P0.4P0.6控制74LS138输出所需的位码(即让哪个数码管亮)。注意:但凡使用动态扫描式数码管显示,电路软件设计必须处于不断扫描状态,一旦出现等待,数码管就不会正常显示。74LS47真值表74LS138真值表详细的功能将会在课上讲解。四、软件部分:此部分有三个程序,都是数码管显示程序。难度由低到高。(一)这个程序让四个数码管显示“2010”,此部分程序相对简单,也较容易理解,该程序还可以进一步缩减,缩减后不会超过十行,将在课上介绍。#includevoid delay(unsigned int t);/函数原型声明void main(void) while(1) P0=0x00; / 让右数第一个数码管显示“9” delay(2); P0=0x11; / 让第二个数码管显示“0” delay(2); P0=0x20; / 让第三个数码管显示“0” delay(2); P0=0x32; / 让第四个数码管显示“2” delay(2);void delay(unsigned int t) /延时函数,延长时间大约为t ms unsigned int i,j; for(i=0;it;i+) for(j=0;j100;j+); (二)这个程序也是单纯的让四个数码管显示数字,相对第一个程序,该程序用到了数组。而且程序的显示函数具有较好的可移植性,第三个函数将会再次用到该显示函数。#include#define uchar unsigned charuchar LED_code10=9,0,0,2,4,5,6,7,8,9; /所要显示的数字void display(uchar dat,uchar bit_num); /函数原型声明void main(void) while(1) display(LED_code,4); void display(uchar dat,uchar bit_num) /显示函数 uchar i,j; for(i=0;ibit_num;i+) P0=(i4)|dati; for(j=0;j200;j+); (三)下面的程序让数码管从0000加到9999,约一秒加一。#include#define uchar unsigned char#define uint unsigned intuint number=0;uchar LED_code10=0,1,2,3,4,5,6,7,8,9; /所要显示的数字void display(uchar dat,uchar bit_num); /函数原型声明void buffer(uint num);void main(void)uint i; while(1) /执行死循环 buffer(number);/把number的各个位求出放入数组中 for(i=0;i320;i+) display(LED_code,4);/调用显示函数 number+; if(number=9999) number=0; void display(uchar dat,uchar bit_num) /显示函数 uchar i,j; for(i=0;ibit_num;i+) P0=(i4)|dati; for(j=0;j200;j+); void buffer(uint num) /该函数把一个四位数的各个位求出,并放入LED_code10中LED_code0=num%10; LED_code1=num/10%10; LED_code2=num/100%10; LED_code3=num/1000; 实验四、计数器定时器的应用1、 五个中断要求:个定时器中断、个外部中断、个串行端口中断2、 中断控制寄存器()IE(中断使能寄存器)EAESET1EX1ET0EX0EX0:使能外部INT0的中断;ET0:使能TIMER0的中断;EX1: 使能外部INT1的中断;ET1: 使能TIMER1的中断;ES:使能串行口的中断。EA:如果EA=0时,屏蔽所有中断;如果EA=1,则各中断由各中断为加以设定;()IP(中断优先权控制寄存器)PSPT1PX1PT0PX0PX0:定义外部/INT0的优先权;PT0:定义外部TIMER0的优先权;PX1:定义外部/INT1的优先权;PT1:定义外部TIMER1的优先权;PS:定义串行端口的优先权;3、 定时器0和定时器1和外部中断定时器或计数器的功能是由特殊功能寄存器内TMOD的C/T位所决定的。这两个定时器有4种工作方式,它是由TMOD内的两个位M1和M0加以选择。()TMOD(定时器模式控制寄存器)说明如下:TIMER1TIMER0GATEC/TM1M0GATEC/TM1M0定时器模式控制器各位名称M1 M0:工作方式,如下表所示:M1M0工作方式功 能00MODE013位定时器计数器01MODE116位定时器计数器10MODE28位定时器计数自动载入11MODE3(TIMER0)TL0为8位定时器计数器,由T0控制;TH0为另一个8位定时器,由T1控制11MODE3(TIMER1) 定时器计数器1停止定时计数GATE:当TRX=1且GATE=1时,定时器只在/INTX引脚为高电平时才会计时;当GATE=0时,则定时器只在TRX=1时会计时;C/T:C/T=0时为定时器,C/T=1时为计数器。()TCON(定时器控制寄存器)TF1TR1TF0TR0IE1IT1IE0IT0TCON定时器控制寄存器各位名称IT0:/INT的中断电位控制,RT0时为下降沿触发,IT0=0时为低电平触发;IE0:/INT的中断标志位,当中断发生时,硬件会设定此位;当中断被处理时,硬件会清除此位。IT1:/INT的中断电位控制,IT1=时为下降沿触发,IT1=时为低电平触发;IE1:/INT的中断标志位,当中断发生时,硬件会设定此位;当中断被处理时,硬件会清除此位。TR0:TIMER0的启动位,TR0=1时为启动,0时为停止;TF0:TIMER0的溢出标志位,当TIMER0溢出时,会设定为;当执行中断子程序时会清除为。TR1:TIMER1的启动位,TR1=1时为启动,0时为停止;TF1:TIMER1的溢出标志位,当TIMER1溢出时,会设定为;当执行中断子程序时会清除为。4.如何计算定时器初值:定时器一旦启动,它便在原来数值上开始加1计数,若程序开始 我们没有设置THx和TLx,它们的初值默认为0,为了更方便理解,下面以定时器方式1举一个定时1s例子。16设时钟频率f=12MHz,则机器周期T=1us,所以计满TH0和TL0就需要2 一1个数,再溢出一个就向CPU申请中断。因此溢出一次共需65536us,约65.5ms,如果我们定时50ms的话,那么久需要先给TH0和TL0先装入一个初值,在这个初值基础上计50000个数后,定时溢出,此时刚好就是50ms中断一次,当需要定时一秒时,只要累加二十次就行。所以TH0和TL0应该装入65535-50000=15536,把15536对256求模:15536/256=60装入TH0中,把15536对256求余:15536%256=176装入TL0中。综上所述:定时计算公式为: THx=(65536-N)/256, TLx=(65536-N)%256;5. 中断书写格式:void 函数名()interrupt 中断号 using 工作组 中断服务程序内容实战一、用定时器写一个程序,使P2口的LED单个逐一向左移动亮起。#include#define uchar unsigned char#define uint unsigned intuchar i=0,n=0,temp;main() TMOD=0x01; TH0=0x3c; /*定时器高8位附初值*/ TL0=0xb0; /*定时器低8位附初值*/ EA=1; /*允许中断*/ ET0=1; /允许T0中断 TR0=1; /*打开定时器T0*/ temp=0xfe ; while(1) ; /*开始计时*/*定时子程序*/ void LED() interrupt 1 uchar a,b; TH0=0x3c; /*重置初值*/ TL0=0xb0; i+; if(i=10) i=0; n=n&0x07; a=temp(8-n); b=tempn; /*流水灯左移*/ P2=a|b; n+; 实战二、写一个程序,使P2口的LED流水灯逐个闪动,当外部中断INT0触发时,P2口流水灯全部取反。#include#define uchar unsigned char#define uint unsigned intvoid delay500ms(void) /*精确延时500ms*/ unsigned char i,j,k; for(i=15;i0;i-) for(j=202;j0;j-) for(k=81;k0;k-); main() uint i; uchar temp; IE=0x81; /*允许外部中断*/ IP=0x01; /*优先INT0外部中断*/ TCON=0; /*设定INT0为电平触发*/ while(1) temp=0x01; for(i=0;i8;i+) /8个流水灯逐个闪动 P2=temp; delay500ms();

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论