定时计数器实验和中断练习

合集下载

实验三 定时与中断实验

实验三  定时与中断实验

实验三定时与中断实验一、实验目的1.通过实验掌握51单片机的定时/计数器的应用。

2.掌握51单片机的中断原理及应用。

3. 进一步学习系统应用程序的设计和调试方法二、实验设备PC机一台、实验教学板一块。

图2-1三、实验内容实验线路如图2-1, 通过定时器的定时,产生一定频率的波形信号,经P2.5输出,驱动蜂鸣器,便可发出某一频率的音调,若按乐曲的音调连续发出,并使其按节拍变化,便可演奏一首乐曲。

实验要求:编程实现演奏一首乐曲C调常用音频及其对应频率如下表:定时器初值计算方法:由于软件是通过定时器溢出后对P2.5取反产生方波,故定时器溢出时间为1//2f,则计数器计数初值为:X = 65536 —n = 65536—(1/2f)/12/fosc = 65536—fosc/24f电路板上的晶振频率为11.0593MHZ,根据不同音调的频率值,就可以计算出上表的初值。

用乐曲最短的1/4拍为一个基本节拍时间,定为0.5秒,基本节拍时间由另一个定时器产生,设此定时器定时时间为50ms,定时时间常数(计数器初值)= 65536 —(50000*12/11.0593)=02C13H,可以分别通过该定时中断10、20、40、80次满足1/4拍、1/2拍、1拍、2拍的定时要求。

软件编程时,要先将乐谱转换成包含有音符和音长信息的代码,然后,以查表方式通过乐谱代码控制喇叭演奏出乐曲。

具体方法如下:(1)乐谱代码用字节结构,字节高4位代表音符,从SI到RE分别用0到9表示;字节低4位代表该音符的节拍,用1、2、3、、、8分别表示1/4拍、1/2拍、1拍、、、4拍,按照这样的规则,将整段音乐变换成相应的代码数据表,最后一个字节内容为00H,代表数据表的结束。

(2)在程序执行时按顺序查表,从字节数据中取出音符代码和节拍代码,查频率表得该音符对应频率的定时初值,再根据节拍代码控制音长,启动两个定时器后,即可发出要求的音,这样就控制演奏出完整的乐曲。

定时器中断程序设计实验

定时器中断程序设计实验

定时器中断程序设计实验定时器中断程序设计实验简介定时器中断是嵌入式系统中的常见应用之一,通过配置定时器的相关寄存器,可以定时产生中断信号,从而实现定时功能。

本文档将介绍定时器中断的基本概念和在实验中如何设计和实现定时器中断程序。

一、定时器中断的概念定时器中断是通过硬件定时器产生的中断信号,可以用于在嵌入式系统中实现定时功能。

定时器中断的原理是定时器内部的计数器自动递增,并在计数到一个特定值时产生中断信号。

通过配置定时器的相关寄存器,可以设置定时器的计数范围、计数速度和中断触发条件等参数。

二、定时器中断的实验设计步骤以下是一个基本的定时器中断程序设计实验的步骤:1. 确定定时器的类型和工作模式根据实际需求和硬件平台的支持情况,选择合适的定时器类型和工作模式。

常见的定时器类型包括定时器/计数器和看门狗定时器,常见的工作模式包括定时模式和计数模式。

2. 配置定时器的相关寄存器根据定时器的类型和工作模式,配置定时器的相关寄存器。

主要包括计数范围、计数速度和中断触发条件等参数的设置。

3. 初始化中断控制器如果使用的嵌入式系统具有中断控制器,需要初始化中断控制器,并使能相应的中断通道。

4. 编写中断服务程序通过注册中断处理函数,并在其中编写中断服务程序。

中断服务程序主要包括对中断标志位的清除、中断处理、中断函数返回等操作。

5. 启动定时器配置完成后,启动定时器开始计数。

定时器将根据配置的参数自动递增,并在计数到设定的特定值时产生中断信号。

6. 整合定时器中断功能到主程序在主程序中,可以使用定时器中断提供的功能来实现定时任务。

可以通过在中断服务程序中设置标志位,并在主循环中检测该标志位来执行相应的任务。

三、实验注意事项在设计和实现定时器中断程序时,需要注意以下事项:1. 根据实际需求进行定时器的配置,确保定时器的参数设置合理。

2. 在中断服务程序中应尽量减少对全局变量和共享资源的访问,以避免竞态条件和数据不一致等问题的发生。

实验3:M51定时器、中断实验

实验3:M51定时器、中断实验

实验三:M51定时器、中断实验实验目的:1. 学习51单片机汇编语言程序设计与上机调试方法2. 掌握51单片机定时器/计数器的使用方法3. 掌握51单片机中断系统及其应用实验内容:1. 方波发生器(必做)2. 外部中断及应用(选做)3. 频率测量(选做)4. 脉宽测量(选做)实验方法:编制程序上机调试实验要求:绘制实验电路原理图、程序流程图并解释说明 实验步骤:编制程序、上机运行调试实验分析:运行程序;观察并记录运行状况1 方波发生器实验要求:由P1.0口输出1Hz 方波(fo=12MHz) 实验电路原理图:参考程序:;实验三:方波发生器JSQL EQU30H ;辅助计数器L :200分频=50ms JSQH EQU31H ;辅助计数器H :10分频=500ms ORG0000H LJMPMAIN ORG000BH ;T0中断入口 DJNZJSQL,T0E ;第1次分频 MOVJSQL,#200 ;50ms DJNZJSQH,T0E ;第2次分频 MOVJSQH,#10 ;500ms CPLP1.0 ;P1.0取反 T0E: RETI;中断返回 MAIN: MOVTMOD,#02H ;T0: 自动重载定时器 MOV TH0,#6 ;初值=0.25msOUTMOV TL0,TH0MOV JSQL,#200 ;50ms MOV JSQH,#10 ;500ms SETB TR0 ;开T0 SETB ET0 ;开T0中断SETB EA ;开总中断SJMP $ ;等待2. 外部中断实验参考程序ORG 0000H ;上电、复位入口LJMP MAINORG 0003H ;外部中断0入口LJMP SUBX0ORG 0013H ;外部中断1入口LJMP SUBX1;主程序MAIN: MOV TCON,#1 ;INT0: 负跳变触发,INT1: 低电平触发SETB EX0 ;开外部中断0SETB EX1 ;开外部中断1MOV P1,#0FEH ;P1.0=0SETB EA ;开总中断SJMP $ ;等待;外部中断0SUBX0: PUSH PSW ;保护现场PUSH ACCMOV A,P1 ;P1口左移1位RL AMOV P1,APOP ACC ;恢复现场POP PSWRETI ;返回;外部中断1SUBX1: PUSH PSWPUSH ACCMOV A,P1 ;P1口右移1位RR AMOV P1,ALCALL YS ;延时POP ACCPOP PSWRETI ;返回;延时YS: PUSH ACCPUSH BMOV A,#0YS1: MOV B,#0DJNZ B,$DJNZ ACC,YS1POP BPOP ACCRET3. 计数法测量频率(晶振fo=12MHz);被测信号由P3.5输入,P3.3启动测量JSQL EQU 30H ;计时器LJSQH EQU 31H ;计时器H;主程序MAIN: MOV TMOD,#52H ;T0: 自动重载,T1: 16位计数器MOV TCON,#04H ;外部中断1:负跳变启动测量MOV IE,#86H ;开T0、INT1及总中断SJMP $ ;等待;T0中断入口ORG 000BHLJMP T0ZD;INT1中断入口ORG 0013H ;启动测量MOV TH0,#6 ;初值=0.25msMOV TL0,TH0MOV JSQL,#200 ;50msMOV JSQH,#20*4 ;4sMOV TH1,#0 ;频率计数器MOV TL1,#0ORL TCON,#50H ;同时开启T0、T1cpl p1.0RETIT0ZD: DJNZ JSQL,T0E ;1s时间到,结束测量DJNZ JSQH,T0EANL TCON,#0FH ;关闭T0,T1MOV DPL,TL1 ;保存测量结果MOV DPH,TH1cpl p1.0T0E: RETI4. 脉宽测量(晶振fo=12MHz);被测信号由P3.2输入(低电平有效)LJMP MAINORG 0003HLJMP X0ZD ;外部中断0ORG 000BH ;T0中断(0.1ms)INC DPTR ;脉宽计数器+1RETI;主程序MAIN: MOV TCON,#1 ;INT0负跳变触发中断MOV TMOD,#0AH;T0:自动重载,有门控GATE=1MOV TH0,#156;初值=0.1msMOV IE,#83H ;开INT0、T0及总中断SJMP $;INT0中断X0ZD: MOV R2,DPL ;存放测量结果MOV R3,DPHMOV DPTR,#0 ;脉宽计数器=0MOV TL0,TH0SETB TR0 ;开T0RETI;MAIN1: MOV TMOD,#2 ;T0:自动重载MOV TH0,#156;0.1msSETB ET0 ;开T0中断SETB EA ;开总中断MAIN2: MOV TL0,TH0 ;初值=0.1msJB P3.2,$ ;等待P3.2负跳变MOV DPTR,#0 ;脉宽计数器清零SETB TR0 ;启动T0JNB P3.2,$ ;等待P3.2正跳变CLR TR0 ;关闭T0SJMP MAIN2。

定时与中断实验

定时与中断实验

第二十课定时与中断实验二前面我们用定时器和中断做了延时的实验现在再来看一看外部计数和外部中断的实验在实际的工程应用中计数器通常会有两种要求第一种将计数的值显示出来象录音机上的计数器汽车上的里程表等等第二种计数值到一定值后即中断报警如前面提到的生产线上的计数定长定量仪等等接下来我们先来做一个外部计数器的实验要将外部计数的值显示出来最好是用数码管可我们还没有讲到这一部份为了避免把问题复杂化我们用 P1 口的 8 个 LED 来显示计到的数据为了完成这个实验我们需要用到一套附件它的作用就是输出一个宽度为 500mS 的方波这套附件不在我们的实验板上为了节约大家的学习费用我特地做了几套供大家借用各位可以到我这儿来借免费使用不过请各位爱惜哦不要搞坏了有了这套附件就可以完成我们的实验了我们把附件的两根线分别连接到实验板的电源接口和单片机的 15 脚也就是 T1 的输入端实验的程序如下一计数器实验一程序如下ORG 0000H ; AJMP START ; ORG 0030H ;START:MOV SP,#5FH ;MOVTMOD,#40H;定时/计数器 1 作计数用T0 不用全置SETBTR1;启动 T1 开始运行LOOP:MOV A,TL0 ; MOV P1,A ; AJMP LOOP ; END运行这个程序看到了什么随着 LED 的闪烁实验板上的 8 个 LED 也在不断地变化注意观察是不是按二进制 00000000 00000001 00000010 00000011 这样的顺序在变呢对了这就是 TL0 中的数据不过这个实验还看不出什么名堂接着做第二个实验二计数器实验二程序如下ORG 0000H ; AJMP START ; ORG 001BH ;AJMP TIMER1 ;定时器 1 的中断处理ORG 0030H ; START:MOV SP,#5FH ;MOV TMOD,#40H ;定时/计数器 1 作计数用工作方式 1 T0 不用置 0MOVTH1,#0FFH;MOVTL1,#0FAH;预置值每计到 6 个脉冲即为一个事件SETBEA;SETBET1;开总中断和定时器 1 中断允许SETBTR1;启动定时/计数器 1 开始运行AJMP$;TIMER1:PUSH ACC ;78----------------PUSH PSW ;CPL P1.0 ;计数值到即取反 P1.0MOVTH1,#0FFH;MOVTL1,#0FAH;重置计数初值POP PSW ;POP ACC ; RETI ; END这段程序完成的工作其实很简单就是每 6 个计数脉冲到来后取反一次 P1.0 因此实验的结果应当是 15 脚接的 LED 亮灭 6 次则 P1.0 口所接的 LED 就亮或灭一次这就是我们对输入脉冲的计数也就是每 6 个计数产生一次中断这段程序中有一个符号以前没见过需要给大家解释一下 AJMP$$ 我们称为标识符它的作用是指这条指令的开始处在这里其实就是循环执行 AJMP $这条指令执行这么多次干什么实际上它是在等待中断的产生这两个实验需要附件如果您觉得做起来不大方便没关系我们接着来做第三个实验采用两个定时/计数器合用一个作为定时器用一个作为计数器用来实现 P1.1 的延时这可以直接在我们的实验板上完成三两个定时/计数器合用的延时实验采用两个定时/计数器其中 T0 作为定时器用工作方式为方式 1 T1 作为计数器用计数次数为 1000 次 T0 溢出时产生一个间隔为 60mS 的方波也就是让 LED3 各亮灭60mS然后把 P1.2的输出作为 T1 的计数脉冲 T1 计数溢出时满 1000 次取反一次 P1.1 产生一个周期为 2 秒的方波即 LED2 每 2 秒闪烁一次程序如下ORG 0000H ; AJMP MAIN ;ORG 000BH ;定时器 T0 的中断入口AJMP T_0 ;转 T0 中断服务程序 ORG 001BH ;定时器 T1 的中断入口 AJMPT_1 ;转 T1 中断服务程序 ORG 0030H ;MAIN:MOV TMOD,#51H ;T1 为计数器方式 1 T0 为定时器方式 1MOVTH0,#15H;设置 T0 初值MOVTL0,#0A0H;MOV TH1,#0FCH ;设置 T1 初值MOVTL1,#18H;MOVIE,#8AH;允许T0T1 中断SETBTR0;启动定时器 T0SETBTR1;启动定时器 T1LL:SJMP LL ;循环T_0:MOV TH0,#15H ;给 T0 重新赋值MOV TL0,#0A0H ;T_1:MOV TH1,#0FCH ;给 T1 重新赋值MOV TL1,#18H ;CPL P1.1 ;计数到取反 P1.179----------------RETI ; END把程序下载到单片机看到什么 LED3 在不断的闪烁这就是 T0 的作用闪烁的周期是多少请大家计算一下接下来把 P1.2也就是 3 脚和 P3.5也就是 T1的输入端相连接是不是接在P1.1 上的 LED2 每 2 秒闪烁一次对了这就是 T1 作计数器的结果在这段程序里有一点请大家注意第四条—AJMP T_0,为什么要在 T 和 0 之间加上一条横线而不直接用 T0 呢原来在 MCS—51 系列单片机中是不能用 T0 T1 INT RET IP PSW 等等内部名称作为标号的如果这样做的话编译软件会出错这点我们好象很早以前曾经提到过接下来我们再来做一个外部中断的实验四外部中断实验程序如下ORG 0000H ; AJMP START ;ORG 0003H ;外部中断 0 地址入口AJMP INTO ; ORG 30H ;START: MOV SP,#5FH ;MOVP1,#0FFH;灯全灭MOVP3,#0FFH;P3 口置高电平SETBEA;SETBEX0;AJMP $ ;INTO:PUSH ACC ; PUSH PSW ; CPL P1.0 ;POPPSW;POPACC;RETI ;END本程序的功能就是按一次按键 S1接在 P3.2 引脚上的就引发一次外部中断INT0=0取反一次 P1.0 因此理论上按一下灯亮再按一下灯灭有点象我们工程应用中的自锁开关不过这段程序在实际的实验中可能会发觉有时不很灵按了它没反应但在大部份时候还是对的这是怎么回事呢其实这是因为按键没有作去抖动处理也就是说理论上我们是按了一次键但由于计算机的处理速度很快计算机实际上却认为已经按了好多次了如何来解决这个问题呢这就需要我们对按键作去抖动处理什么是按键的去抖动处理我们下一课讨论键盘接口时再作详细解释五本课总结通过这两节课的实验我们对定时/计数器和中断的使用方法已经有了一个基本的了解希望大家继续多做实验本来嘛学会单片机靠的就是不断的实践和总结80----------------第二十一课键盘接口与编程一键盘接口和数码管接口是构成单片机人机界面的主要方法对于一个初学者来说这部分的内容也是较难的我们将用四节课的时间来学习这方面的知识这一课先来讨论键盘的接口原理与编程方法键盘是单片机应用系统不可缺少的重要输入设备主要负责向计算机传递信息我们可以通过键盘向计算机输入各种指令地址和数据它一般由若干个按键组合成开关矩阵按照其接线方式的不同可分为两种一种是独立式接法一种是矩阵式接法如下面的图这一课先来讲解独立式键盘的工作原理和编程方法一独立式键盘的工作原理和编程方法独立式键盘具有结构简单使用灵活等特点因此被广泛应用于单片机系统中那么它是如何来工作的呢我们慢慢往下看1 独立式键盘的接线原理独立式键盘是由若干个机械触点开关构成的把它与单片机的 I/O 口线连起来通过读 I/O 口的电平状态即可识别出相应的按键是否被按下下面的左图就是我们实验板的按键连接图如果按键不被按下其端口就为高电平如果相应的按键被按下则端口就变为低电平在这种键盘的连接方法中我们通常采用下拉电平接法即各按键开关一端接低电平另一端接单片机 I/O口线如上左图所示这是为了保证在按键断开时各 I/O 口线有确定的高电平通常我们用来做键盘的按键有触点式和非触点式两种单片机中应用的一般是由机械触点构成的触点式微动开关这种开关具有结构简单使用可靠的优点但当我们按下按键或释放按键的时候它有一个特点就是会产生抖动看上图的按键脉冲波形这种抖动对于人来说是感觉不到的但对单片机来说则是完全可以感应到的因为单片机处理的速度是在微秒级的而机械抖动的时间至少是毫秒级对计算机而言这已是一个很漫长的过程了下面我们通过一个实验来验证一下实验程序如下ORG 0000H ; AJMP START ; ORG 0030H ; START:MOV SP,5FH ;81----------------MOVP1,#0FFH;MOVP3,#0FFH;L1:JNB P3.4,L2 ;按下按键开关取反一次 P1.0灯亮再按一下灯灭JNB P3.5,L3 ;按下按键开关取反一次 P1.1灯亮再按一下灯灭LJMPL1;L2:CPLP1.0;LJMPL1;L3:CPLP1.1;LJMPL1;END把这个程序下载到单片机我们会发现当按下相应的按键时灯并不是想象中的按一下亮再按一下就灭而是有时灵有时不灵为什么会这样呢原来当你按了一次按键可是单片机却早已执行了好多次如果执行的次数正好是奇数次那么结果正如你所料如果执行的次数是偶数次那结果就不对了为了使 CPU 能正确地读出端口的状态对每一次按键只作一次响应就必须考虑如何去除按键的抖动2 按键的去抖动原则和方法常用的去抖动的方法有两种硬件方法和软件方法硬件去抖动的方法很多好多书都有介绍这不在我们的讨论范围单片机中常用软件去抖动法软件法其实也很简单就是在单片机获得端口为低电平的信息后不是立即认定按键已被按下而是延时10 毫秒或更长一些时间后再次检测该端口如果仍为低说明此键的确被按下了这实际上是避开了按键按下时的抖动时间而在检测到按键释放后端口为高电平时再延时 5-10 毫秒消除后沿的抖动然后再对按键进行处理不过一般情况下我们通常不对按键释放的后沿进行处理实践证明也能满足通常的要求下面我们把前面的程序改一下看看按键的去抖动是如何实现的看下面的程序ORG 0000H ; AJMP START ; ORG 0030H ; START:MOV SP,#5FH ; MOVP1,#0FFH ; MOV P3,#0FFH ;L1:JB P3.4,L2 ;P3.4 为 1不做处理转 P3.5 否则说明有键按下LCALL D10mS ; 调用延时程序去除抖动JB P3.4,L1 ; P3.4 为 0说明此键确实被按下了CPL P1.0 ;取反 P1.0L3:JNB P3.4,L3 ;直到 P3.4 释放后转去判断第二个键L2:JB P3.5,L1 ;P3.5 为 1返回去继续处理 P3.4 否则说明有键按下LCALL D10mS ; 调用延时程序去除抖动JB P3.5,L2 ; P3.5 为 0说明此键确实被按下了CPL P1.1 ; 取反 P1.1L4:JNBP3.5,L4;直到 P3.5 释放为止LJMPL1;返回D10mS:MOV R7,#50 ;延时的时间一般为 5-20mSD1:MOV R6,#100 ; D2:DJNZ R6,D2 ; DJNZ R7,D1 ;82----------------RET ; END把这段程序写入单片机试试看是不是行了这就是独立式按键去抖动的基本方法不过这个程序在实际应用中并没有多大的意义因为如果按键数量比较多的话程序就会变得很长为什么会这样呢因为这里我们采用了直接寻址的方式如果我们把键值放入一个表格中再通过查表程序来判断到底是哪个按键被按下了再去处理相应的程序就会很简单想想看该怎么做二独立式键盘的编程方法我们刚才的程序演示了按键的去抖动原理和基本方法接下来让我们做一个按键使用的实验来验证一下大家看附图的电路图我们的实验板上有 4 个按键分别接到了 P3 口的 P3.2,P3.3,P3.4,P3.5 引脚上现在我们用 P3.2,P3.3,P3.4 和 P3.5 这四个按键来做一个实验实验之前先定义各个按键的功能实验程序如下按此键则灯开始流动(由左向右)按此键则停止流动所有灯为灭按此键则灯反向流动由右向左按此键则灯正向流动由左向右UpDown EQU 00H ; 上下行标志StartEndEQU01H;起动及停止标志LampCodeEQU21H;存放流动的数据代码ORG 0000H ;AJMP MAIN ; ORG 30H ; MAIN:MOV SP,#5FH ;MOVP1,#0FFH;CLRUpDown;启动时处于向上的状态CLRStartEnd;启动时处于停止状态MOV LampCode,#0FEH;单灯流动的代码LOOP:ACALL KEY ;调用键盘程序JNB F0,LNEXT ;如果无键按下则继续 ACALL KEYPROC ;否则调用键盘处理程序LNEXT:ACALL LAMP ;调用灯显示程序AJMP LOOP ;反复循环主程序到此结束DELAY:MOV R7,#100 ; D1:MOV R6,#100 ;DJNZR6,$;DJNZR7,D1;RET ;延时程序键盘处理中调用KEYPROC:MOV A,B ;从 B 寄存器中获取键值JB ACC.2,KeyStart ;分析键的代码某位被按下则该位为”1”在键盘程序中已取反JB ACC.3,KeyOver ;JBACC.4,KeyUp;JBACC.5,KeyDown;AJMP KEY_RET ;KeyStart:SETB StartEnd ;第一个键按下后的处理AJMP KEY_RET ;83----------------KeyOver:CLR StartEnd;第二个键按下后的处理AJMP KEY_RET ;KeyUp:SETB UpDown ;第三个键按下后的处理AJMP KEY_RET ;KeyDown:CLRUpDown;第四个键按下后的处理KEY_RET:RET;KEY:CLR F0 ;清 F0 表示无键按下ORLP3,#01111000B;将 P3 口接有四个键的位置1JZ K_RET ;如果为 0 则无键按下ACALL DELAY ;否则延时去键抖ORLP3,#01111000B;MOVA,P3;ORLA,#10000111B;CPLA;JZ K_RET;MOV B,A;确实有键按下将键值存入 B 中SETB F0 ;设置有键按下的标志K_RET:ORL P3,#01111000B ;此处循环等待键的释放MOVA,P3;ORLA,#10000111B;CPLA;JZ K_RET1 ;直到读取的数据取反后为”0”说明键释放了才从键盘处理程序返回AJMP K_RET ;K_RET1:RET ;D500mS: ;流水灯的延迟时间PUSHPSW;SETBRS0;MOV R7,#200 ;D51:MOV R6,#250 ; D52:NOPNOPNOPNOPDJNZR6,D52;DJNZR7,D51;POP PSW ;RET ;LAMP:JB StartEnd,LampStart ;如果 StartEnd=1 则启动MOV P1,#0FFH;AJMP LAMPRET;否则关闭所有显示返回LampStart:JB UpDown,LAMPUP ;如果 UpDown=1 则向上流动MOV A,LAMPCODE ;84 单片机学习中心,为您免费发布大量的学习资源以及商业代码RL A ;实际就是左移位MOVLAMPCODE,A;MOVP1,A;LCALL D500mS ;AJMP LAMPRET ; LAMPUP:MOV A,LAMPCODE ;RR A ;向下流动实际就是右移MOVLAMPCODE,A;MOVP1,A;LCALL D500mS ;LAMPRET:RET ; END这段程序是我们到目前为止最长的程序相信大多数指令大家应该能看懂开始三条 UpDown EQU00H StartEnd EQU 01H LampCode EQU 21H 给大家解释一下 EQU 叫做等值伪指令它的功能是将一个常数或者特定的符号赋予规定的字符串什么意思呢举个例子ORG 200HABC EQU R6MOV A ABC这里将 ABC 等值为寄存器 R6 也就是说在指令中 R6 这个寄存器可以用字符串 ABC 来代替为什么要这样写呢当然是为了增加程序的可读性不过有一点大家要记住了这里使用的字符串不是标号不能用来做分隔符比如这样写 ABC:EQU R6 如果加上汇编程序会出错当然用 EQU指令除了可以赋值数据和地址外还可以赋值直接地址或者直接当作一个立即数来使用例如ABC EQU 10HDELAY EQU 05AFHMOV A ABCLCALL DELAY这里 ABC 赋值以后被当作了直接地址使用而 DELAY 被赋值以后则成了一个16 位的地址如此一来上面的三条指令也就很清楚了这里有一个问题大家需注意使用 EQU 伪指令必须先赋值后使用所以一般的程序都把赋值指令放在程序的开头部分既然讲到了赋值伪指令我们再讲一下另外三条赋值伪指令.A 位地址定义伪指令 BIT它的功能是将一个可直接寻址的位地址赋予所规定的字符名称例如ABC BIT P1.0 把 P1.0 赋值给 ABC 即字符串 ABC 就是直接寻址位 P1.0这里注意与 EQU 不同的是这条指令只能对位地址赋值而不能对寄存器或直接地址和立即数赋值相反 EQU 指令却可以用来定义位地址变量不过这时所赋的值应当是具体的位地址值比如 P1.0 要用 90H 来代替 P2.0 要用 AOH 来代替等等B 内部 RAM 定义伪指令 DATA它的功能是给一个 8 位的内部 RAM 起一个名称例如ABC DATA 20H 把内部 RAM 的 20H 定义为 ABCC 外部 RAM 定义伪指令 XDADT给一个 8 位的外部 RAM 起一个名称例如ABC XDATA 0ACH 由于 89C51 的内部 RAM 寻址范围为 00H-FFH 所以这个地址必然大于 FFH讲了赋值伪指令再回到上面的按键处理程序这段程序的功能虽然很简单但它演示了一个键盘处理程序的基本思路程序本身很简单也不很实用实际工作中还会有好多要考虑的因素比如主循环每次都调用了灯的循环程序会造成按键反应迟钝而如果一直按着键不放则灯不会再流动85----------------一直要到松开手为止大家可以仔细考虑一下这些问题想想有什么好的解决办法独立式键盘除了上面介绍的这种连接方法我们还可以采用上图右边所示的连接方法用一个与非门把四个输入端连接起来当有任何一个按键按下时都会使与非门输出为低电平从而引起单片机的中断它的好处是不用在主程序中不断地循环查询了如果有键按下单片机就去作相应的处这一课通过两个实验讲解了独立式键盘的工作原理和基本的去抖动方法由于键盘的实际使用是千差万别的所以工程中您还得根据实际情况灵活应用这里只能给大家一个基本的认识四第 21 课习题1什么是键盘的去抖动问题为什么要对键盘进行去抖动处理2找一个硬件的去抖动电路并自行分析其工作原理。

单片机定时器及外部中断实验

单片机定时器及外部中断实验

单片机实验报告实验名称:定时器及外部中断实验*名:***学号:*********班级:通信3班时间:2014.5南京理工大学紫金学院电光系一、实验目的1、理解定时/计数器的工作原理;2、掌握外部中断的基本处理方法;3、学习中断处理程序的编程方法;二、实验原理1、P1口为计数值输出口,利用定时器实现1秒定时,计数初值为0,每隔1秒加1;另外,外部中断0引脚外接键盘BUTTON,按键使得显示数值加1。

电路原理图如图:2、系统板上硬件连线把“单片机系统”A2区的J61接口的P1.0~P1.6端口与D1区的J52接口相连。

把“单片机系统”A2区的INT0端口用导线连接到D1区的KEY1端口上。

3、程序设计流程三、 实验内容1、代码:#include<reg51.h>#define uchar unsigned charsbit p32=P3^2;sbit p33=P3^3;uchar num,a;uchar b;void main(){ (b)定时器中断流程图(c)外部中断流程 (a )主流程图TMOD=0x01;TH0=(65536-46082)/256; TL0=(65536-46082)%256; EA=1;ET0=1;TR0=1;TF0=0;EX0=1;IT0=0;EX1=1;IT1=0;P1=0xff;a=0;while(1){b=a+(a/10*6);P1=b;if(b==160){a=0;}}}void T0_time()interrupt 1 {TH0=(65536-46082)/256; TL0=(65536-46082)%256; num++;if(num==20){num=0;a++;}}void X0()interrupt 0{a++;while(!p32);}void X1()interrupt 2{a=0;while(!p33);}2、电路图:四、小结与体会通过此次实验,我更深地理解了定时/计数器的工作原理,掌握了外部中断的基本处理方法以及在学习中断处理程序的编程方法。

单片机-实验二-定时器计数器实验

单片机-实验二-定时器计数器实验

实验二定时器/计数器实验一、实验目的1、掌握数码管动态驱动方式的工作原理;2、掌握单片机定时器中断服务程序的编写方法;3、掌握基于单片机定时器中断调度方式的数码管动态显示驱动程序的编写方法。

二、实验内容及要求单片机通过P1 端口连接独立数码管,INT0 引脚(P3.2)和T0 引脚(P3.4)各连接一个独立按键。

通过按键向T0 引脚输入负脉冲,单片机对其进行计数,并将计数值显示在独立数码管上。

观察门控位(GATE)对计数过程的影响。

三、实验设备硬件:PC 机,nKDE-51 单片机实验教学系统;软件:Keil C51 集成开发环境,FlashMagic 单片机程序烧写软件。

四、实验原理及步骤MCS-51 定时器/计数器的结构、功能及设置方法,请参考教材相关内容。

步骤如下:1、创建新项目:Project—New Project—命名、存储—CPU类型(philips P89C52X2)2、创建新程序:编译程序—完成后保存为“.c”格式3、添加程序:Target1—Source Group—add……(程序)4、检测程序:Project—Build Target5、选择烧录程序的方式(右键点target1--opption):output—Creat Execulate:Dubug Information Browse、Creat HexDebug 右侧选择use “Keil Monitor-51 Driver”6、选择程序执行点:在Debug程序烧路后,在开始执行的程序断点上鼠标右键—Set Program Counter7、Go执行五、实验过程1. 电路连接CPU 板上的P3.2 和P3.4(J4 或J8)和基本IO 板上的独立按键SW1 和SW3(J6)相连;CPU板上的P1(J2 或J6)和基本IO 板上的独立数码管LED1(J5)相连,连接方向为P1.0 和数码管的SEG_A 对齐。

2. 程序设计按照实验要求,实验参考程序如下:#include <reg51.h>unsigned char code CharCode[] ={0xc0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};void main(void){unsigned char cc,count;TMOD = 0x05; // GATE=0,C/#T=1,Mode=2,工作于计数器模式TH0 = 0;TL0 = 0;TR0 = 1; // T0 开始运行,开启计数器P1 = CharCode[0]; // 显示 0count = 0;cc = TL0; // 设置变量初始值while(1) // 按一次 SW3,TL0 加 1{if(cc != TL0) // 计数值有变化{ cc = TL0; // 更新本次计数器值count ++; // 计数值+1if(count >= 10) count = 0; // 计数值>=10 则从 0 开始P1 = CharCode[count]; // 送数码管显示}}}3. 验证结果在Keil 中建立新工程,将上述程序代码加入工程,编译链接后,将生成的.HEX 文件烧写到单片机中,烧写完毕后复位单片机系统,按下SW3,观察数码管显示的计数值的变化,验证运行结果和设计要求是否相符。

实验三 中断与定时器实验

实验三 中断与定时器实验

ab cd e fg h(dp) 实验三 中断、定时器实验一、实验目的1. 学习外部中断和定时器的工作原理及使用方法。

2. 学习外部中断和定时器的初始化程序、应用程序的编写和调试。

二、实验说明本实验1通过开关向单片机提出中断请求,单片机响应中断进行计数,并通过LED 数码管指示出计数值,从而观察中断的请求、响应的过程。

实验2通过单片机的定时器产生延时,模拟交通灯控制的方法。

通过本实验学生可以掌握单片机中断和定时器的工作原理及使用方法以及中断和定时器的初始化程序、应用程序的编写和调试。

要求预先编写好程序并通过伟福仿真软件调试。

三、实验内容1、开关S0—S1连接P3口做输入,P0输出接LED 数码管,通过S2产生外部中断请求(/INT0)信号,在中断服务程序中完成十进制递增计数,并将计数值显示在LED 数码管上,要求分别采用电平触发和边沿触发。

按上述要求完成S3产生外部中断请求。

编写初始化程序和中断服务程序。

(注意开关抖动处理)2、P1.0--P1.7作输入口接拨动开关S0--S7;P0.0--P0.7作输出口,接发光二极管L1—L8,编写程序读取开关状态,将此状态在对应的发光二极管上显示出来,要求发光二极管(LED )按亮0.5秒、暗0.5秒闪烁,LED 亮的同时,从P2.0送出1kHz 的音频信号到音频驱动电路发声(持续0.5秒),将开关编号(0—7)显示在LED 数码管上。

要求延时采用内部定时器T0,音频的产生采用内部定时器T1。

编写初始化程序和中断服务程序。

四、实验电路连线P0.0 ---- LED0 P3.2(/INT0)----- S2P0.1 ---- LED1 P3.3(/INT1)----- S3P0.2 ---- LED2P0.3 ---- LED3P0.4 ---- LED4P0.5 ---- LED5P0.6 ---- LED6P0.7 ---- LED7LED 连接 外部中断请求输入a b c d e f g h(dp) P2.0 P2.1 P2.2 P2.3 P2.4 P2.5 P2.6 P2.7LED 数码管各段与I/O 的连接五、实验仪器和设备PC机、WA VE软件、仿真器+仿真头、实验板、电源等。

实验三定时器及外部中断实验

实验三定时器及外部中断实验

实验三定时器及外部中断实验一、实验目的1)熟悉VC5416的定时器工作原理。

2)掌握VC5416定时器的编程控制方法。

3)学会使用定时器的中断方式来控制程序执行方法。

4)掌握外部中断的编程控制方法,理解DSP对于中断的响应的过程。

5)了解并学习混合编程的实现方法。

二、实验设备1)计算机一套,DSP硬件仿真器一台,实验箱一台。

2)CCS4.1-CCS5.5软件版本。

3)源程序及链接命令文件见:D:\ EXPER\EXP3目录下的.asm 、.cmd、.C 和.lib文件。

三、实验步骤(一)、连接仿真器,将仿真器插接到C5416的JTAG接口上,另一头插接到电脑的USB接口上,因为仿真器是金属外壳,容易和箱子内部的电路触碰造成短路,从而对实验箱造成损坏,这个要特别注意,也不允许在机箱打开电源情况下插拔仿真器。

(二)、实验箱配置及连线:C5416DSP核心板上的SW1的1-6的开始设置为off off off off on on(上电后工做于1/2分频器方式,其它实验也按照此设置不变,我试验过改为PLL*2方式仿真器就连接不上了),SW2设置为on on on on。

将DSP核心板所在试验箱引脚连线区的BCANRX(C54的XF)引脚,与指示灯连线区LAMP的L1连接起来,这样就可以通过XF控制这个L1这个方光管的亮灭了。

将DSP核心板所在试验箱引脚连线区的INT0(C54的外部中断0输入)引脚与单脉冲按键PAULSE的P-(按下输出负脉冲)连接起来,这样按下按键时,就会给DSP的INT0中断引脚发送一个负脉冲。

连线照片见程序目录中的图片文件。

(二)、打开实验箱电源开关。

(三)、使用给定的文件,按照实验一的步骤建立实验项目,例如工作区目录为D:\ exp3 中建立一个exp3的实验项目,添加所有的给定的文件。

(四)、仿真调试方法1、通过菜单Project- Build All 对项目进行编译和链接,如下:如果有错误会出现在problem 窗口中。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include
void init(void); //initiation
unsigned char counter_2000ms;
unsigned char th;
unsigned char tl;
bit ff; //flag
main()
{
init(); //initiation of the MCU
while(1) //查询、等待
{
if (ff==0) //ff=0 no thing
{
}
else // ff=1
{
counter_2000ms = 0;
P0=~P0;
ff = 0;
}
}
}
void T0_50ms() interrupt 1
{
EA = 0; //interrupt masked
TH0 = th; //reload
TL0 = tl;
counter_2000ms++;
if (counter_2000ms==40) ff=1; //2.0sec. is on
EA = 1; //interrupt enabled
}
//
void init(void)
{
IE |= 0x82; //T0 enabled
// EA = 1; //enabled all interrupts
// ET0 = 1; //external interrupt ebnabled
TMOD = 0x01; // 16-bit timer
th = 0x3c;
tl = 0xb0;
TH0 = th;
TL0 = tl;
P0 = 0x55;
/**********************************************
;12MHz/12=100 0000Hz, t=1 us
;50ms=50 000 us, 50 000/1=50 000
;65536-50 000=15536=3cb0h, TH0=3ch, TL0=b0h,
;interupt gets 50ms
; 2.0sec=2000ms, 2000/50=40
;**********************************************/
counter_2000ms=0x00;
ff = 0;
TR0 = 1; //start t0
}

练习:
P1口上接有8只LED。在外部输入引脚P3.2和P3.3上各接有一只
按钮开关K1和K2。程序要求K1和K2都未按下时,P1口的8只LED呈
流水灯显示,仅K1(P3.2)按下时,左右4只LED交替闪烁一次。仅按
下K2(P3.3)时,P1口的8只LED全闪亮。两个外中断的优先级相同。

相关文档
最新文档