实验2INT0中断与AT89C51单片机定时/计数器应用技术仿真实验一、实验目的1.学习外部中断技术的基本使用方法。2.学习中断处理程序的编程方法。3.初步了解C51芯片来驱动动态数码管计数原理。二、实验器材计算机,windows7旗舰版,keiluVision4,proteus7.8,所需元件清单有:AT89C51,普通电容,电解电容,晶体振荡器,电阻,数码管排阻及按键。三、实验原理MCS-51是一个多中断源的单片机,以8051为例,有三类共五个中断源,分别是外部中断两个,定时器中断两个和串行中断一个(其中断控制字在后面实验中详细讲到)。外部中断是由外部原因引起的,共有两个中断源,既外部中断0和外部中断1。它们的中断请求信号分别由引脚(P3.2)和(P3.3)引入;外部中断请求信号有两种,既低电平有效方式和脉冲后沿负跳有效方式。中断开放和屏蔽-IE寄存器其作用是用来对各中断源进行开放或屏蔽的控制,各位定义如下:位地址AFAEADACABAAA9A8位符号EA//ESET1EX1ET0EX0EA—中断允许总控制位EA=0中断总禁止,禁止所有中断。EA=1中断总允许。EX0(EX1)--外部中断允许控制位EX0(EX1)=0禁止外中断。EX0(EX1)=1允许外中断。ET0(ET1)--定时/计数中断允许控制位ET0(ET1)=0禁止定时/计数中断。ET0(ET1)=1允许定时/计数中断。ES–串行中断允许控制位ES=0禁止串行中断。ES=1允许串行中断。中断优先级控制寄存器(IP)地址为B8H,位地址为BFH-B8H,各位定义如下:位地址BFBEBDBCBBBAB9B8位符号///PSPT1PX1PT0PX0PX0—外部中断0优先级设定位PT0—定时中断0优先级设定位PX1--外部中断1优先级设定位PT1—定时中断1优先级设定位PS—串行中断优先级设定位为0的位优先级为低;为1的位优先级为高;中断优先级是为中断嵌套服务的,MCS-51中断优先级的控制原则是:(1)低优先级中断请求不能打断高优先级的中断服务;但高优先级中断请求可以打断低优先级的中断服务,从而实现中断嵌套。(2)如果一个中断请求已被响应,则同级的其它中断响应将被禁止。(3)如果同级的多个中断请求同时出现,则按CPU查询次序确定哪个中断请求被响应。其查询次序为:外部中断0—定时中断0—外部中断1—定时中断1—串行中断。1.数码管数码管是一种半导体发光器件,其基本单元是发光二极管。(1)数码管的分类数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示);按能显示多少个“8”可分为1位、2位、4位等等数码管;按发光二极管单元连接方式分为共阴极数码管和共阳极数码管(图1)。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管,共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮,当某一字段的阴极为高电平时,相应字段就不亮。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管,共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮,当某一字段的阳极为低电平时,相应字段就不亮。(2)led数码管的结构led数码管(LEDSegmentDisplays)是由多个发光二极管封装在一起组成“8”字型的器件,引线已在内部连接完成,只需引出它们的各个笔划,公共电极。led数码管常用段数一般为7段有的另加一个小数点,led数码管根据LED的接法不同分为共阴和共阳两类,了解LED的这些特性,对编程是很重要的,因为不同类型的数码管,除了它们的硬件电路有差异外,编程方法也是不同的。共阴和共阳极数码管的内部电路,它们的发光原理是一样的,只是它们的电源极性不同而已。颜色有红,绿,蓝,黄等几种。led数码管广泛用于仪表,时钟,车站,家电等场合。下面将介绍常用LED数码管内部引脚图(图2)LED数码管引脚定义:每一笔划都是对应一个字母表示DP是小数点.(图3)abcdegGNDfdpGNDabcefgd·dpabcdefgdpdpgfedcba+5V(a)(b)图1共阴极数码管和共阳极数码管图2引脚定义图37段两位带小数点10引脚的LED数码管(3)10引脚的LED数码管①驱动方式数码管要正常显示,就要用驱动电路来驱动数码管的各个段码。数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划a,b,c,d,e,f,g,dp的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示,这就是动态驱动。在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。2.INT0中断计数用AT89C51及电阻、电容、晶闸管、数码管、排阻等实现中断计数。INTO中断计数,每次按下计数键时触发INTO中断,中断程序累加计数,计数值显示在静态数码管上,按下清零键时数码管清零。用单片机的P2.0/A8-P2.6/AD14端口接其中一组数码管的七个端口,P1.0-P1.6接数码管的P1.0-P1.6的端口,P0.0/AD0-P0.6/AD6接数码管的P0.0-P0.6的端口。每次按下计数键时触发INTO中断,中断程序累加计数,计数值显示在静态数码管上,按下清零键时数码管清零。实验原理图四、实验过程1、定时/计数器的仿真(1)工程建立①先建立一个该工程的文件夹,保存到要存放的路径,如放在E:\keil工程。②打开Keil软件,先新建一个工程文件,点击“Project-NewProject…”菜单。会弹出工程创建对话框。选择工程文件要存放的路径选择将工程安装在我们创建的E:\keil工程文件夹下面,并给该工程命名输入工程文件名,如INT0最后单击保存。③在弹出的对话框中选择CPU厂商及型号,选择好Atmel公司的AT89C51后,单击确定。在接着出现的对话框中选择“OK”。④新建一个C51文件,单击左上角的NewFile,保存新建的文件,单击SAVE。⑤在出现的对话框中输入保存文件名(注意后缀名必须为.C如INT0.c),再单击“保存”。⑥保存好后把此文件加入到工程中方法如下:用鼠标在SourceGroup1上单击右键,然后再单击左键选择AddFilestoGroup‘SourceGroup1'。选择要加入的文件,找到你所保存的.C文件后(后缀名为.C的文件),单击Add,然后单击Close。⑦在编辑框里输入代码即可。至此我们已将程序代码生成Proteus仿真图和单片机芯片可利用的.hex文件(后缀名为.hex的文件)。(2)Proteus仿真①按照原理图在Proteus中画图,首先找出元器件。②将各元器件接入后,要对其相关参数进行调整。③画完图后,在Proteus仿真图中双击89C51芯片,在出现的对话框中的programFile一栏中选择生成的INT0.hex文件并确定,再运行之,观察现象。若与预期的实验现象相符,则表示实验可以成功打开开关后,运行结果如下:点击红色圈圈中的按钮(即按下计数建)时触发INTO中断,中断程序累加计数,计数值显示在数码管上,如下图:2、INT0中断计数实验在keil中创建中断PROJECT时,其步骤与计时定时器一样。只是把工程命名为“中断”。编译的是C语言程序,所以在保存文件时,后缀为.c。在Proteus中画图时,保存为“中断.dsn”。在画完图后,同样双击AT89C51,选择“中断.hex”。Play以后,点击第三个按钮,每按下一次,计数器增加1.如下图:五、实验总结1.在编译汇编语言程序时,在build时出现了错误,有好多都是undefined,这是因为在编写源程序时,程序中的逗号是中文的,所以把这些改过来后就没有错误了。但是程序还是有三个警告,但这些警告可以忽视,因为它们没有妨碍Proteus的仿真调试。2.在画图过程中,其中出现了duplicate和simulationfailedduetonetlistcompiler的错误,这是因为我们在放置pullup电阻时重复命名为R2了,我们经过排查,由于电阻的名称hide了,所以我们删除修改了它。然后我们在重新play了,结果是正确显示计时器的变化。3在仿真中断的实验时,计数器有时候不亮。我们选择在keil程序中重新编译build了源程序,生成“.hex”文件,然后在Proteus中选择一下“.hex”的文件。结果计数器的仿真成功了。