中断控制数码管显示程序解释

合集下载

LED与数码管的显示中断控制实验报告

LED与数码管的显示中断控制实验报告
}
key1() interrupt 2
{
P2=led_mod[count];
count++;
if(count==16)
count=0;
}
void main()
{
count=0;//赋初值
p0_4=1;
P2=0xff;//开机黑屏
TCON=0X05;//0x05=00000101,IT1=1,IT0=1,脉冲触发方式
(2)完成实验4的C51语言编程;
(3)练习uVision3与ISIS的联机仿真方法
实验步骤:
(1)在Keil uVision3中编写和编译C51程序,生成可执行文件;
(2)在uVision3中启动ISIS的仿真运行,并进行联机调试
一、实验原件清单
二、根据原理图画出的实验图
三、实验程序如下:
#include<reg51.h>
0x88,0x83,0xc6,0xa1,0x86,0x8e};
void delay(unsigned int time)
{
unsigned int j=0;
for(time=time;time>0;time--)
for(j=0;j<125;j++);
}
key0() interrupt 0
{
p0_4=!p0_4;
洛阳理工学院实验报告
系别
计算机系
班级
B140502
学号
B14050226
姓名
韩亚辉
课程名称
单片机原理及应用
实验日期
2016-4-22
实验名称
LED与数码管的显示中断控制
成绩

嵌入式实验报告数码管显示实验

嵌入式实验报告数码管显示实验

实验报告课程名称嵌入式系统编程实践实验仪器清华同方辰源嵌入式系统实验箱实验名称实验四:数码管显示实验系别__计算机学院_专业 _班级/学号学生姓名实验日期 2013年10月11日成绩___________________指导教师实验四:数码管显示实验一、实验问题回答(1)如何设置功能3,4中的循环速度?答:利用系统SysTick Handler中断,控制循环速度void SysTick_Handler (void){Event = 1;}(2)若是想实现类似实验(三)通过键盘动态控制循环速度,考虑一下应该如何设计?答:SysTickPeriodSet(SysCtlClockGet() / X)//设置x的大小就可以控制循环的速度。

void Reset_Counter_Speed(int x){SysTickIntDisable();SysTickDisable();SysTickPeriodSet(SysCtlClockGet() / x);// 设置x,控制计数频率,值与频率成正比SysTickEnable();SysTickIntEnable();},达到预期的效果。

二、实验目的和效果(效果即是否达到实验目的,达到的程度如何)学习、了解和掌握数码管工作原理和使用方法实验结果及检查(1)默认在在OLED屏幕上分行显示自己的学号、姓名、项目序号、时间,如“2010011001”、“zhangsan”、“work4”、“2012-11-”(2)首先在屏幕上显示四个功能选单,通过键盘A-F键选择不同功能,选择后屏幕显示相关功能提示,接受键盘输入的数字键0-9并在数码管上显示。

如:开始显示:“please choose the function:”“A: …”“B: …”“C: …”“D: …”按下“A”键后,显示”now you choose function A”(3)按下键盘后,根据不同功能在数码管上显示按键字符。

单片机 实验2-外部中断程序设计-中断按键按下次数计数数码管显示-硬件和程序设计参考

单片机 实验2-外部中断程序设计-中断按键按下次数计数数码管显示-硬件和程序设计参考

硬件电路参考如下:程序参考如下:#pragma sfr#pragma interrupt INTP0 LED_INTP0 /* 定义使用INTP0中断,中断函数名LED_INTP0*/ #pragma di /*禁止使用中断功能声明*/#pragma ei /*允许使用中断功能声明*//*数码管编码数组*/unsigned char LED_light[10]={0x30,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x3F}; unsigned char j=0; /*按键次数变量*/void hdinit() /*硬件初始化*/{PM1=0; /*P1口输出数码管字型码,所以设置为输出*/PU1=0XFF; /*由于P1口直接驱动数码管显示,为增大驱动,设置为内部上拉*/PM12.0=0; /*P12.0口线要作为中断多功能,设置为输出和内部上拉 */PU12.0=1;PIF0=0; /*中断请求标志,没有中断请求*/PMK0=0; /*中断屏蔽标志,允许中断*/PPR0=1; /*中断优先级,低优先级*/EGP.0=1; /*与EGN组合,上升沿有效*/EGN.0=0;}void main (void){DI(); /*首先做准备,禁止中断*/IMS=0XCC;IXS=0X00;hdinit();EI(); /*准备完成,允许中断*/while(1){ /*啥也不干,就等待中断,仅是在这个实验中使用中断,实际不是这样/*}}__interrupt void LED_INTP0() /*中断函数*/{ P1= LED_light[j]; /*P1赋值,数码管显示相应数值*/j++; /*按键次数加一*/if(j==10) /*如果按键次数达到十次,按键计数归0*/{j=0;} }思考: 如果用两位数码管,从0—99循环计数又该怎样设计硬件和软件呢?。

单片机实验报告——LED数码管显示实验

单片机实验报告——LED数码管显示实验

单⽚机实验报告——LED数码管显⽰实验(此⽂档为word格式,下载后您可任意编辑修改!)《微机实验》报告LED数码管显⽰实验指导教师:专业班级:姓名:学号:联系⽅式:⼀、任务要求实验⽬的:理解LED七段数码管的显⽰控制原理,掌握数码管与MCU的接⼝技术,能够编写数码管显⽰驱动程序;熟悉接⼝程序调试⽅法。

实验内容:利⽤C8051F310单⽚机控制数码管显⽰器基本要求:利⽤末位数码管循环显⽰数字0-9,显⽰切换频率为1Hz。

提⾼要求:在4位数码管显⽰器上依次显⽰当天时期和时间,显⽰格式如下:yyyy (年份)mm.dd(⽉份.⽇).asm;Description: 利⽤末位数码管循环显⽰数字0-9,显⽰切换频率为1Hz。

;Designed by:gxy;Date:2012117;*********************************************************$include (C8051F310.inc)ORG 0000H ;复位⼊⼝AJMP MAINORG 000BH ;定时器0中断⼊⼝AJMP TIME0MAIN: ACALL Init_Device ;初始化配置MOV P0,#00H ;位选中第⼀个数码管MOV R0,#00H ;偏移指针初值CLR PSW.1 ;标志位清零SETB EA ;允许总中断SETB ET0 ;允许定时器0中断MOV TMOD,#01H ;定时器0选⼯作⽅式1MOV TH0,#06HMOV TL0,#0C6H ;赋初值,定时1sLOOP: MOV A,R0ADD A,#0BH ;加偏移量MOVC +PC ;查表取,段码MOV P1,A ;段码给P1显⽰SETB TR0 ;开定时LOOP1: JNB PSW.1,LOOP1 ;等待中断CLR PSW.1INC R0 ;偏移指针加⼀CJNE R0,#0AH,LOOP3MOV R0,#00H ;偏移指针满10清零AJMP LOOP ;返回DB 0FCH,60H,0DAH,0F2H,66H ;段码数据表:0、1、2、3、4 DB 0B6H,0BEH,0E0H,0FEH,0F6H; 5、6、7、8、9 ;***************************************************************** ; 定时器0中断;***************************************************************** TIME0: SETB PSW.1 ;标志位置⼀MOV TH0,#06H ;定时器重新赋值MOV TL0,#0C6HLOOP3: CLR TR0 ;关定时RETI;***************************************************************** ;初始化配置;***************************************************************** PCA_Init:anl PCA0MD, #0BFhmov PCA0MD, #000hretTimer_Init:mov TMOD, #001hmov CKCON, #002hretPort_IO_Init:; P0.0 - Unassigned, Open-Drain, Digital ; P0.1 - Unassigned, Open-Drain, Digital ; P0.2 - Unassigned, Open-Drain, Digital ; P0.3 - Unassigned, Open-Drain, Digital ; P0.4 -Unassigned, Open-Drain, Digital ; P0.5 - Unassigned, Open-Drain, Digital ; P0.6 - Unassigned, Open-Drain, Digital ; P0.7 - Unassigned, Open-Drain, Digital ; P1.0 - Unassigned, Open-Drain, Digital ; P1.1 - Unassigned, Open-Drain, Digital ; P1.2 - Unassigned, Open-Drain, Digital ; P1.3 - Unassigned, Open-Drain, Digital ; P1.4 - Unassigned, Open-Drain, Digital ; P1.5 - Unassigned, Open-Drain, Digital ; P1.6 - Unassigned, Open-Drain, Digital ; P1.7 - Unassigned, Open-Drain, Digital ; P2.0 - Unassigned, Open-Drain, Digital ; P2.1 -Unassigned, Open-Drain, Digital ; P2.2 - Unassigned, Open-Drain, Digital ; P2.3 - Unassigned, Open-Drain, Digital mov XBR1, #040hretInterrupts_Init:mov IE, #002hretInit_Device:lcall PCA_Initlcall Timer_Initlcall Port_IO_Initlcall Interrupts_Initretend提⾼部分:;*********************************************************;Filename: shumaguan2.asm;Description:在4位数码管显⽰器上依次显⽰当天时期和时间,显⽰格式如下:; 2012 (年份); 12.07(⽉份.⽇); 12.34(⼩时.分钟);Designed by:gxy;Date:2012117;*********************************************************$include (C8051F310.inc)ORG 0000HAJMP MAINORG 000BHAJMP TIME0MAIN: ACALL Init_DeviceMOV R0,#00H ;⽤于位选MOV R1,#00H ;⽤于段选MOV R2,#22H ;置偏移量,⽤于控制模式MOV R4,#8MOV R5,#250CLR PSW.1 ;标志位清零SETB EA ;允许总中断SETB ET0 ;允许定时器0中断MOV TMOD,#01H ;定时器0选⼯作⽅式1MOV TH0,#0FFHMOV TL0,#0C0H ;定时器赋初值1msBACK: MOV P0,R0 ;位选MOV A,R0ADD A,#40H ;选下⼀位MOV R0,AMOV A,R1ADD A,R2 ;加偏移量MOVC +PC ;查表取段码MOV P1,A ;段码给P1显⽰LOOP: SETB TR0 ;开定时HERE: JNB PSW.1,HERE ;等待中断CLR PSW.1DJNZ R5,BACKMOV R5,#250DJNZ R4,BACKMOV R4,#8 ;循环2000次(2s)MOV A,R2ADD A,#04H ;偏移量加04H,到下⼀模式段码初值地址 MOV R2,ACJNE R2,#2EH,LOOP2MOV R2,#22H ;加三次后偏移量回到初值LOOP2: AJMP BACK ;返回进⼊下⼀模式;段码数据表:DB 0DAH,60H,0FCH,0DAH ; 2102DB 0E0H,0FCH,61H,60H ; 701. 1DB 66H,0F2H,0DBH,60H ; 432. 1;*****************************************************************; 定时器0中断;***************************************************************** TIME0: MOV TH0,#0FFH MOV TL0,#0C0HCLR TR0SETB PSW.1INC R1 ;偏移指针加⼀CJNE R1,#04H,LOOPMOV R1,#00H ;偏移指针满04H清零RETI;***************************************************************** ; 初始化配置;***************************************************************** PCA_Init:anl PCA0MD, #0BFhmov PCA0MD, #000hretTimer_Init:mov TMOD, #001hmov CKCON, #002hretPort_IO_Init:; P0.0 - Unassigned, Open-Drain, Digital; P0.1 - Unassigned, Open-Drain, Digital; P0.2 - Unassigned, Open-Drain, Digital; P0.3 - Unassigned, Open-Drain, Digital; P0.4 - Unassigned, Open-Drain, Digital; P0.5 - Unassigned, Open-Drain, Digital; P0.6 - Unassigned, Open-Drain, Digital; P0.7 - Unassigned, Open-Drain, Digital; P1.0 - Unassigned, Open-Drain, Digital; P1.1 - Unassigned, Open-Drain, Digital; P1.2 - Unassigned, Open-Drain, Digital; P1.3 - Unassigned, Open-Drain, Digital; P1.4 - Unassigned, Open-Drain, Digital; P1.5 - Unassigned, Open-Drain, Digital; P1.6 - Unassigned, Open-Drain, Digital; P1.7 - Unassigned, Open-Drain, Digital; P2.0 - Unassigned, Open-Drain, Digital; P2.1 - Unassigned, Open-Drain, Digital; P2.2 - Unassigned, Open-Drain, Digital; P2.3 - Unassigned, Open-Drain, Digitalmov XBR1, #040hretInterrupts_Init:mov IE, #002hretInit_Device:lcall PCA_Initlcall Timer_Initlcall Port_IO_Initlcall Interrupts_Initretend六、程序测试⽅法与结果、软件性能分析软件调试总体截图:基础部分:软件运⾏时,我们发现P0端⼝为00H,P1端⼝以依次为FCH、60H、DAH、F2H、66H、B6H、BEH、E0H、FEH、F6H。

程序功能与使用说明

程序功能与使用说明

一程序功能与使用说明1 功能在主持人的控制下完成抢答的功能。

首先判断是否有人在未开始时就提前抢答了,这是就说明有人犯规了,于是,数码管显示违规选手号码,红灯亮,扬声器报警。

在主持人允许开始后就按下开始键,绿灯亮,可以抢答,否则违规。

在这里是用中断来控制抢答的,给一中断脉冲就显示绿灯,说明已经开始了。

在开始的前提下,选手可以抢答了,抢答成功者数码管显示该选手号码,黄灯亮,扬声器鸣叫。

2 使用说明(1)在主持人侧,设置抢答指示电路和启动/复位开关。

有中断来控制开始,用绿灯来指示开始。

(2)选手侧各设置1个抢答按钮,用逻辑开关K代表竞赛抢答按钮,使用实验仪的逻辑电平开关K0-K3来代表4个抢答按钮,当开关向上拨时表示按下按钮。

(3)用数码管显示选手号码,用哪个可编程并行接口芯片8255A控制数码管的显示和扬声器的发声控制。

给脉冲就说明允许开始,同时绿灯亮。

以后就可以抢答了,抢答成功者数码管显示该选手号码,黄灯亮,扬声器鸣叫。

如果未开始就抢答说明违规,于是数码管显示违规选手号码,红灯亮,扬声器报警。

(4)主持人用按键来控制是开始下一轮比赛,还是结束。

如果按键式空格就说明开始下一轮,否则就说明比赛结束。

二设计原理和思路1设计的原理用逻辑开关K代表竞赛抢答器按钮,用数码管显示选手号码。

用可编程并行接口芯片8255A控制数码管的显示和扬声器的发声控制。

用8259A处理比赛开始。

(1)8259A是一种可编程中断控制器,它的主要任务是辅助处理器对可屏蔽中断进行优先权管理。

中断控制部分可以接收外界的8个中断请求,对应引脚IR0-IR7.当IR引脚中断请求有效时,8259A的优先权电路经过判断当前最高优先权的的中断请求,通过本身的中断请求信号INT使处理器的可屏蔽中断请求引脚INTR有效,向处理器提出可屏蔽中断请求。

处理器在条件满足时进入中断响应周期,使中断响应信号INTA有效,读取8259A提供的中断向量号。

(2)8255A内部分成与外设连接部分和与处理器接口部分。

实验四 数码管显示控制

实验四 数码管显示控制

实验四数码管显示控制一、实验目的1、熟悉Keil uVision2软件的使用;2、掌握LED数码管显示接口技术;3、理解单片机定时器、中断技术。

二、实验设备及仪器Keil μVision2软件;单片机开发板;PC机一台三、实验原理及内容1、开发板上使用的LED 数码管是四位八段共阴数码管(将公共端COM接地GND),其内部结构原理图,如图4.1所示。

图4.1共阴四位八段LED数码管的原理图图4.1表明共阴四位八段数码管的“位选端”低电平有效,“段选端”高电平有效,即当数码管的位为低电平,且数码管的段为高电平时,相应的段才会被点亮。

实验开发板中LED数码管模块的电路原理图,如图4.2所示。

SP1a~hP0.4~P0.7SP2P0.0~P0.3图4.2 LED数码管模块电路原理图图中,当P1.0“段控制”有效时,P0.0~P0.7分别对应到数码管的a~h段。

当P1.1“位控制”有效时,P0.0~P0.7分别对应到DIG1~DIG8。

训练内容一:轮流点亮数码管来检测数码管是否正常。

参考程序:ORG 00HAJMP MAINMAIN:SETB P1.2;LED流水灯模块锁存器的控制位MOV P0,#0FFH;关闭LED灯CLR P1.2SETB P1.3 ;点阵模块的行控制锁存器MOV P0,#0 ;关闭点阵行CLR P1.3MOV A,#11111110B;数码管“位选信号”初值,低电平有效LOOP:SETB P1.1;数码管位控制锁存器有效MOV P0,ACLR P1.1RL A ;形成新的“位选信号”,为选择下一位数码管做准备SETB P1.0;数码管段控制锁存器有效MOV P0,#0FFH ;数码管的所有段点亮,显示“8”CLR P1.0CALL DELAYSJMP LOOPDELAY:MOV R5,#0;延时子程序D1: MOV R6,#0D2:NOPDJNZ R6,D2DJNZ R5,D1RETEND训练内容二:静态显示,0~9计数。

数码管的接线及显示(程序)

数码管的接线及显示(程序)

共阳共阴LED数码管引脚图管脚接口共阳共阴LED数码管引脚图管脚接口常见的数码管由七个条状和一个点状发光二极管管芯制成,叫七段数码管如下图所示,根据其结构的不同,可分为共阳极数码管和共阴极数码管两种。

根据管脚资料,您可以判断使用的是何总接口类型.<LED数码管引脚图>LED数码管中各段发光二极管的伏安特性和普通二极管类似,只是正向压降较大,正向电阻也较大。

在一定范围内,其正向电流与发光亮度成正比。

由于常规的数码管起辉电流只有1~2 mA,最大极限电流也只有10~30 mA,所以它的输入端在5 V电源或高于TTL 高电平(3.5 V)的电路信号相接时,一定要串加限流电阻,以免损坏器件。

数码管使用的电流与电压电流:静态时,推荐使用10-15mA;动态时,16/1动态扫描时,平均电流为4-5mA,峰值电流50-60mA。

电压:查引脚排布图,看一下每段的芯片数量是多少?当红色时,使用1.9V乘以每段的芯片串联的个数;当绿色时,使用2.1V乘以每段的芯片串联的个数。

怎样测量数码管引脚,分共阴和共阳?找公共共阴和公共共阳首先,我们找个电源(3到5伏)和1个1K(几百的也欧的也行)的电阻, VCC串接个电阻后和GND接在任意2个脚上,组合有很多,但总有一个LED会发光的找到一个就够了,,然后用GND不动,VCC(串电阻)逐个碰剩下的脚,如果有多个LED (一般是8个),那它就是共阴的了。

5.2.1数码显示原理1.LED显示器的结构与原理LED数码显示器是由若干个发光二极管组成的,当发光二极管导通时,相应的点或线段发光,将这些二极管排成一定图形,控制不同组合的二极管导通,就可以显示出不同韵字形。

单片机应用系统中常用的LED显示器为七段显示器,再加上有一个小数点,因此也可把它称为八段显示器。

结构形式有共阴极和共阳极两种,它的结构图如图5.11所示。

共阴极是把所有发光二极管的阴极连起来,通常接地,通过控制每一只发光二极管的阳极电平来使其发光或熄灭,阳极为高电平发光,为低电平熄灭;共阳极是把所有发光二极管的阳极连起来,通常为高电平(如+5V),通过控制每一只发光二极管的阴极电平来使其发光或熄灭,阴极为低电平发光,为高电平熄灭。

利用8259A中断实现LED灯和数码管显示实验

利用8259A中断实现LED灯和数码管显示实验

实验三:利用8259A中断实现LED灯和数码管显示实验安全0901 王宇航 09283020实验报告1.实验目的:了解8259中断控制器的基本使用,掌握中断程序编程技术。

同时使同学掌握中断和其它接口芯片配合来完成某一特定任务的方法。

2.实验步骤:8254A的OUT1输出接到8259A的MIR5上,每秒产生一次中断信号向8259A发出中断请求,在中断程序里将连接在8255A口的LED灯按照中断次数二进制点亮(即中断一次L0亮,中断两次L1亮,中断三次L1L0亮,中断四次L2亮……)。

同时在数码管低位上显示中断次数。

满10次后停止。

1.8254A在主程序中初始化。

CLK0工作在方式3,则控制字为00110110B,计数常数设为1000;CLK1工作在方式3,则控制字为01110110B,计数常数设为1000,则OUT1输出为1HZ 的方波。

2.8255A在使用前需要在主程序中初始化。

A口方式0输出,B口方式0输入,则控制字为10000011B。

3.8259A不用初始化,但在程序中需要包含以下几个部分:(1)8259A的MIR5对应的中断向量号为35H,需用此来设置中断入口地址。

(2)设置中断入口地址之后,需设置中断屏蔽字OCW1,使IR5请求被允许,其他请求被禁止。

(3)中断服务程序结束之前写OCW2,送中断结束命令EOI。

4.中断服务程序的主要功能是LED指示灯和数码管显示。

图3-1 实验连线图注意:实验系统的主8259A的片选信号为20H。

3.实验代码:.Model small.386DATA SEGMENTDATA0 DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH ;分别对应字符0-9 COUNT DB 10 ;计数值为10DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AX ;DS装入段基址LEA SI,DA TA0 ;取操作数DA TA0的16位偏移地址送到寄存器SI中 ;8254初始化MOV DX,203H ;8254命令口MOV AL,00110110B ;控制字--0通道、方式3(方波发生器)、二进制计数 OUT DX,AL ;将控制字写入命令口MOV DX,200H ;0通道的数据口MOV AX,1000 ;计数常数=1000OUT DX,AL ;先写入低字节MOV AL,AHOUT DX,AL ;再写入高字节MOV DX,203H ;8254命令口MOV AL,01110110B ;控制字1通道、方式3(方波发生器)、二进制计数 OUT DX,ALMOV DX,201H ;1通道的数据口MOV AX,1000 ;计数常数=1000OUT DX,ALMOV AL,AHOUT DX,AL ;8255初始化MOV DX,213H ;8255命令口MOV AL,10000011B ;8255控制字--A口方式0输出,B口方式0输入OUT DX,AL ;将控制字写入命令口;中断入口地址设置(用串指令)CLI ;关中断MOV AX,0MOV ES,AX ;置附件段基地址为0MOV DI,4*35H ;置附件段偏移地址到DIMOV AX,OFFSET INT_35 ;置中断程序首地址的偏移量到AXCLDSTOSW ;填首地址的偏移量到中断地址表MOV AX,SEG INT_35 ;置中断程序的段基地址到AXSTOSW ;填段基地址到中断地址表IN AL,21H ;读中断屏蔽寄存器IMRAND AL,11011111B ;设置中断屏蔽字OCW1,IR5请求被允许,其他请求被禁止 OUT 21H,AL ;将OCW1写入IMR中STI ;开中断WAIT:CMP COUNT,10 ;判断10次中断是否结束JNZ WAIT ;未结束,等待CLI ;10次中断后,关中断MOV AH,4CH ;结束,返回DOSINT 21H;延时程序DELAY PROCPUSH CX ;保护现场MOV CX,100H ;延时时间为处理一次CX自减1的时间乘以100HDELAY1: LOOP DELAY1POP CX ;恢复现场RET ;返回到调用处,继续执行DELAY ENDP;中断服务程序INT_35 PROCPUSH DX ;保护现场PUSH AXPUSH CXCLI ;关中断MOV AX,DATAMOV DS,AXINC COUNT ;中断次数加1MOV AL,COUNT ;将中断次数写入AL中MOV DX,210H ;8255数据口OUT DX,AL ;将中断次数输出到LED显示灯MOV CX,680HCMP COUNT,10JB GOON-randomirandom; ;低于10时跳转到GOONCMP COUNT,10JNZ L1 ;不等于10(此处即大于10)时跳转到L1 SUB SI,9 ;第10次中断时SI减去9,即归0L1:MOV AL,[SI] ;查表,对应0-9MOV DX,220H ;地址译码器连接六位数码管电路的数据口OUT DX,ALMOV DX,221H ;数据口MOV AL,00000001B ;指定六位数码管在最低位显示0-9OUT DX,ALCALL DELAY ;调用延时程序MOV AL,06H ;对应字符'1'MOV DX,220HOUT DX,ALMOV DX,221HMOV AL,00000010B ;指定六位数码管在次低位显示1OUT DX,ALCALL DELAYLOOP L1 ;CX=680HINC SI ;SI加1JMP L ;跳转至LGOON:INC SI ;SI加1MOV AL,[SI] ;查表MOV DX,220HOUT DX,ALMOV DX,221HMOV AL,00000001BOUT DX,ALL:MOV AL,20H ;写OCW2,送中断结束命令EOIOUT 20H,ALSTI ;开中断POP CX ;恢复现场POP AXPOP DXIRET ;中断返回INT_35 ENDPCODE ENDSEND START4.试验流程图:主程序流程图中断服务程序流程图。

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






void display(unsigned int k) { P2=0xf7; P0=Tab[k/1000]; delay(); P2=0xfb; P0=Tab[(k%1000)/100]; delay(); P2=0xfd; P0=Tab[(k%100)/10]; delay(); P2=0xfe; P0=Tab[k%10]; delay(); P2=0xff; }
void Time0(void)interrupt 1 using 1 中断服务程序 { TR0=0; 关闭T0 x--; 每来一次中断,x自减1 if(x==0) { x=9999; } TH0=(65536-46083)/256; TL0=(65536-46083)%256; TR0=1; }
简易数码秒表设计示例程序
#include<reg51.h> 51单片机寄存器定义的头文件 unsigned char code Tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f}; 数码管显示0~9的断码表 unsigned char int_time; 定义无符号字符变量, 中断次数 unsigned char second; 定义秒 void delay(void) 延时函数 { unsigned char i; for(i=0;i<200;i++) 延时时间,for循环语句 ; }
1
1
0
1
2区 (10 - 17H)
3区 (18 - 1FH)






{ int_time=0; 中断次数清0 second ++; 秒加1 if(second==60) if语句 second=0; 等于60就返回 } TH0=(65536-46083)/256; 重新给计数器T0赋初值 TL0=(65536-46083)/256; TR0=1; 启动定时器T0 }
重新给定时器赋初值
实际计数值=定时时间 机器周期 Nhomakorabea=
50m s 1.085us
=46083
定时器T0的中断服务程序
void
Time0_serve(void)interrupt 1 using 1
定时器T0的中断服务函数,T0的中断编号为1,使 用第一组工作寄存器
{
TR0=0; 关闭定时器T0 int_time ++; 每来一次中断,中断次数自加1 if(int_time==20) 20次中断,即1s进行一次时间

秒显示函数

void Display_Second(unsigned char k) 定义入口参数

{
P2=0xfd; P0=Tab[k/10]; P2=11111101,P2.1引脚低电平,DS2亮 显示十位


delay();
P2=0xfe; P0=Tab[k%10]; delay(); P2=0xff; }




void main(void) { TMOD=0x01; 使用定时器T0方式1 TH0=(65536-46083)/256; 定时50ms TL0=(65536-46083)%256; EA=1; 开启总中断 ET0=1; 定时器T0允许中断 TR0=1; 启动T0 x=9999; while(1) 无限循环 { display(x); 调用显示函数 } }
使用定时器T0的中断控制数码管倒计数显示
自主思考:
比较P141页倒计数示例程序与P112倒计数 示例程序的区别
#include<reg51.h> unsigned int x; unsigned char code Tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f}; void delay(void) { unsigned int m; for(m=0;m<600;m++) ; }

控制
CPU通过对PSW中的D4、D3位内容 的修改,就能任选一个工作寄存器区, 例如: SETB PSW.3 CLR PSW.4 ;选定第1区 SETB PSW.4 CLR PSW.3 ;选定第2区 SETB PSW.3 SETB PSW.4 ;选定第3区
PSW. 4 (RS1) 0 0
PSW. 当前使用的工作 3 寄存器区R0 - R7 (RS0) 0 1 0区 (00 - 07H) 1区 (08 - 0FH)
调用延时函数
P2=11111110,P2.0引脚低电平,DS1亮 显示个位 P2=11111111,关闭所有数码管
主函数
void main(void) { TMOD=0X01;



工作方式控制寄存器TMOD=00000001,使用 定时器T0工作方式1 TH0=(65536-46083)/256; 将定时时间设为50ms TL0=(65536-46083)%256; 存入寄存器TH0和TL0 EA=1; 开启总中断 ET0=1; 定时器T0中断允许 TR0=1; 启动定时器T0开始运行 int_time=0; 中断次数初始化 second=0; 秒初始化 while(1) 无限循环 { Display_Second(second); 调用秒的显示子程序 } }
相关文档
最新文档