单片机--中断系统实验-定时器实验

实验三 中断系统实验

一、实验目的

1、完成中断系统的综合实验,包括中断请求源,中断请求标志,中断允许与禁止,中断优先级控制,中断响应过程,外部中断触发方式与中断响应时间等。

2、掌握中断系统的应用知识。

二、实验原理

中断系统的功能:(1)中断的屏蔽与开放;(2)实现中断及返回;(3)能实现优先级排队;

51中断系统的结构:TCON、SCON、IE、IP、自然优先级

中断处理过程分为4个阶段:中断请求→中断响应→中断服务→中断返回。 中断系统的设计过程通常由以下几个部分构成:

断服务子程序入口; (3) 中断服务子程序开始保护现场,保护与主程序或其他中断系统共享的资源; (4) 编制中断服务子程序功能主体; (5) 恢复现场。

外部中断的信号要求:低电平持续时间要超过1个机器周期。

外部中断标志的撤除:电平触发方式要软硬结合撤除,跳变触发方式自动撤除。

外部中断标志在不同触发方式下的锁存:电平触发方式下,如被屏蔽,则中断请求信号消失后,中断标志自动撤除,或者在响应中断后自动清除;跳变触发方式下,即使被屏蔽,中断标志也将锁存,在响应中断后才会被自动清除。

三、实验仪器

四、实验内容与步骤

编程并调试

1、P0口接8个LED(L1~L8),INT0接单脉冲开关(SIMPLE P-)。初始LED全部

ORG LJMP ORG LJMP MOV SETB MOV SETB SJMP JB MOV SETB LJMP MOV CLR RETI END

0000H MAIN 0003H PINT0 IE,#81H IT0

P0,#0FFH F0 $

F0,LIGHT P0#0FFH F0 RTN P0,#00H F0

MAIN:

PINT0:

LIGHT: RTN:

2、电路同上。每按一次开关,LED全部点亮,保持一段时间后全部熄灭,如此往复,保持时间自定义。

ORG

0000H

#include

MAIN:

PINT0:

DEL: DEL0: DEL1:

LJMP ORG LJMP MOV SETB MOV LJMP MOV LCALL MOV RETI MOV MOV MOV DJNZ DJNZ DJNZ END

MAIN 0003H PINT0 IE,#81H IT0

P0,#0FFH MAIN P0,#00H DEL

P0,#0FFH R5, #10 R6, #200 R7, #248 R7, $ R6, DEL1 R5, DEL0

3、电路同上。实现LED流水灯(只亮一个),间隔时间为1秒,方向自定义。按下开

4、中断计数:P0、P1口扩展2位数码管,显示中断次数。

连线:IO1~IO8按序连接LED_A~LED_DP,CAP0、SDA按序连接LED_C1、LED_C2,

}

IT0=1; while(1){ P0=table-code[counter/10]; P11=0; DelayMS(20); P11=1;

P0=table-code[counter%10]; P10=0; DelayMS(20); P10=1; }

5、中断优先级、中断嵌套。

连线:P0口接8个LED(L1~L8),INT0、INT1分别接两个拨动开关K1、K2(拨至H高电平)。

原理:如下程序,主函数初始化中断(允许INT0、INT1中断,INT0低优先级、INT1高优先级,电平触发方式),并循环间隔点亮LED。拨K1至L并拨回至H,进入int0()中断服务子函数,LED全部点亮,延时3s。如果在此期间,拨K2至L并拨回至H,由于INT1为高级中断,故进入int1()中断服务子函数,LED全部熄灭,延时1s。而后返回int0(),由于从int1()返回int0()是返回到延时函数中,故LED仍为熄灭状态;再返回主函数,LED间隔点亮。

#include “reg51.h”

#define uchar unsigned char void DelayMS(uint x){

uchar t; while(x--){

for(t=0;t

int0() interrupt 0{ P0=0x00; DelayMS(3000); }

Int1() interrupt 2{ P0=0xff; DelayMS(1000); }

main(){ IE=0x83;

PX0=0; PX1=1; while(1){ P0=0x55;

} }

6、中断优先级、中断标志的锁存与撤除。 连线:P0口接8个LED(L1~L8),INT0、INT1均接单脉冲开关(SIMPLE P-)。 原理:如下程序,主函数初始化中断(允许INT0、INT1中断,INT0高优先级、INT1低优先级,边沿触发方式),并循环间隔点亮LED。按下开关,INT0、INT1引脚均可检测到下降沿中断请求信号,则锁存至中断标志IE0、IE1。由于INT0为高级中断,则响应INT0中断,进入int0()中断服务子函数,中断标志IE0被自动清0撤除。但边沿触发方式时,被屏蔽的INT1中断标志IE1仍不会撤除,故INT0中断服务处理完返回主函数后,又会进入INT1中断服务,中断标志IE1被自动清0撤除。故现象为,初始LED间隔点亮(主函数),按下开关,LED点亮1s(int0子函数),再熄灭1s(int1()子函数),再间隔点亮(主函数)。

如果修改PX0=1;PX1=0;为PX0=0;PX1=1;,试分析执行过程,并验证。 自行编程,验证在电平触发方式时,中断标志是如何锁存与撤除的。

#include “reg51.h”

#define uchar unsigned char void DelayMS(uint x){

uchar t; while(x--){

}

int0() interrupt 0{ P0=0x00;

DelayMS(1000); }

Int1() interrupt 2{ P0=0xff; DelayMS(1000); }

main(){ IE=0x83; IT0=1;

IT1=1;

PX0=1; // PX0=0; PX1=0; // PX1=1; while(1){ P0=0x55;

} }

}

for(t=0;t

7、单步操作。

1)、连线:如下电路:

将仿真器面板上的IO1~IO8(分别对应P0.0~P0.7)按序连接到LED DISP面板的LED_A~LED_G、LED_DP; LED DISP面板的LED_C1连接到SWITCH面板上的K12,并将K12拨向L即低电平; SPISTE、SPICLK、CDAC0、CADC0、PWM0、SCL、SDA、CAP0(分别对应P1.0~P1.7)按序连接到SWITCH面板的K1~K8,K1~K8均拨向H即高电平。 2)、编程:实现功能:数码管实时显示K1~K4对应的十六进制值(LLLL~HHHH,即对应于0000~1111,显示“0~F”)。

ORG

JMP ORG JMP ORG

START: MOV MOV ANL MOV MOVC MOV JMP INT0: JNB

JB RETI

CODE_P0:DB

DB END

0000H START 0003H INT0 0100H P1,#0FFH A,P1 A,#0FH

DPTR,#CODE_P0 A,@A+DPTR P0,A START P3.2,$ P3.2,$

3FH,06H,5BH,4FH,66H,6DH,7DH,07H 7FH,6FH,77H,7CH,39H,5EH,79H,71H

#include “reg51.h” sbit P32=P3^2;

unsigned char code table-code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

void int0(void){

while( !P32 ) ; while( P32 ) ;

}

void main(void){ unsigned char key;

while(1){ P1=0xff; key=P1; key=key&0x0f; P0=table-code[key]; } }

3)、调试:INT0引脚接单脉冲开关(SIMPLE P-)。按动开关,则实现单步操作。

8、扩展外部中断源。

调试:P0口接8个LED(L1~L8),P1.0~P1.3接4个开关(K1~K4),并分别连接INT1(电路无法实现线与)。

#include “reg51.h”

unsigned char status; bit flag;

void service-int1( ) interrupt 2 using 2 {

flag=1; /* 设置标志 */ status=P1; /* 存输入口状态 */ }

void main(void) {

IP=0x04; /* INT1高优先级 */ IE=0x84; /* 开中断 */ for( ; ; ){ if(flag) { /* 有中断 */

switch(status) { /* 根据中断源分支 */

case 0: P0=0xfe; break ; /* 处理IN0 */ case 1: P0=0xfd; break ; /* 处理IN1 */ case 2: P0=0xfb; break ; /* 处理IN2 */ default: P0=0xf7; }

flag=0; /* 处理完成清标志 */ } } }

9、扩展外部中断源应用:模拟交通灯。

}

void main(void){ unsigned char key;

while(1){ P1=0xff; key=P1; key=key&0x0f; P0=table-code[key]; } }

3)、调试:INT0引脚接单脉冲开关(SIMPLE P-)。按动开关,则实现单步操作。

8、扩展外部中断源。

调试:P0口接8个LED(L1~L8),P1.0~P1.3接4个开关(K1~K4),并分别连接INT1(电路无法实现线与)。

#include “reg51.h”

unsigned char status; bit flag;

void service-int1( ) interrupt 2 using 2 {

flag=1; /* 设置标志 */ status=P1; /* 存输入口状态 */ }

void main(void) {

IP=0x04; /* INT1高优先级 */ IE=0x84; /* 开中断 */ for( ; ; ){ if(flag) { /* 有中断 */

switch(status) { /* 根据中断源分支 */

case 0: P0=0xfe; break ; /* 处理IN0 */ case 1: P0=0xfd; break ; /* 处理IN1 */ case 2: P0=0xfb; break ; /* 处理IN2 */ default: P0=0xf7; }

flag=0; /* 处理完成清标志 */ } } }

9、扩展外部中断源应用:模拟交通灯。

ORG LJMP ORG LJMP ORG LJMP ORG MAIN:SETB

MOV MOV LOOP:MOV

MOV AP1: LCALL

DJNZ MOV AP2: CPL

LCALL DJNZ MOV MOV AP3: LCALL

DJNZ MOV MOV BP1: LCALL

DJNZ MOV BP2: CPL

LCALL DJNZ MOV MOV BP3: LCALL

DJNZ SJMP ORG INT0:PUSH

MOV MOV DEL0:LCALL

DJNZ POP RETI ORG INT1:CLR

PUSH PUSH PUSH PUSH SETB JB MOV SJMP AP0: JB

MOV DEL1:MOV NEXT:LCALL

0000H MAIN 0003H INT0 0013H INT1 0030H PX0

TCON,#00H IE,#85H P1,#0F3H R1,#88 DEL

R1,AP1 R1,#6 P1.2 DEL

R1,AP2 P1,#0F5H R1,#6 DEL

R1,AP3 P1,#0DEH R1,#48 DEL

R1,BP1 R1,#6 P1.5 DEL

R1,BP2 P1,#0EEH R1,#6 DEL

R1,BP3 LOOP 0200H P1 P1,#0F6H R2,#30 DEL

R2,DEL0 P1 0300H EA P1 04H 05H 06H EA P3.0,AP0 P1,#0F3H DEL1 P3.1,EXIT P1,#0DEH R3,#30 DEL

;转向主程序

;转向紧急车辆中断服务程序 ;转向有车车道放行中断服务程序

;A道绿灯亮,B道红灯亮 ;44s延时的循环次数 ;44s不到,继续循环 ;3s延时的循环次数 ;A道绿灯闪烁

;3s未到,继续循环

;A道黄灯亮,B道红灯亮 ;3s未到,继续循环

;A道红灯亮,B道绿灯亮 ;24s未到,继续循环 ;B道绿灯闪烁

;3s未到,继续循环

;A道红灯亮,B道黄灯亮 ;3s未到,继续循环 ;循环

;保护P1口数据

;A道红灯亮,B道红灯亮 ;15s延时的循环次数 ;15s未到,继续循环 ;恢复P1口数据 ;关中断 ;保护现场

;开中断

;A道无车,转向判断B道 ;A道绿灯亮,B道红灯亮 ;转向15s延时程序 ;B道无车,退出中断 ;A道红灯亮,B道绿灯亮 ;15s延时的循环次数

DJNZ EXIT:CLR

POP POP POP POP SETB RETI ORG DEL:MOV LP1: MOV LP2: MOV

NOP LP3:DJNZ

DJNZ DJNZ RET END

R3,NEXT EA 06H 05H 04H P1 EA 0350H R4,#10 R5,#50 R6,#248 R6,LP3 R5,LP2 R4,LP1

;15s未到继续循环 ;恢复现场

;0.5s延时子程序

#include "reg51.h"

#define uchar unsigned char #define uint unsigned int #define LEDS P1 sbit P30=P3^0; sbit P31=P3^1; uchar k;

void delayms(uint s){

uchar t; while(s--){ for(t=120;t>0;t--); } }

void int0p(void) interrupt 0{

k=LEDS; LEDS=0xf6;delayms(15000); LEDS=k; }

void int1p(void) interrupt 2{

k=LEDS;

if(!P30){ LEDS=0xf3; }else if(!P31){ LEDS=0xde; } delayms(15000); LEDS=k; }

void main(){

IE=0x85;PX0=1; while(1){ uchar i;

LEDS=0xf3;delayms(44000);

for(i=0;i

for(i=0;i

五、实验报告要求

1、实验报告由个人独立完成,每人一份;

2、写明实验目的、实验原理、实验内容和实验步骤;写明实验注意事项; 3、实验目的明确,原理清晰,步骤合理正确,内容充实,字迹工整; 4、能够应用所学的理论知识应用在实验中;

5、分析实验结果,写明实验中遇到问题及解决办法,并完成思考题。

六、参考思考题

1、响应中断有哪些条件?

2、中断响应后,怎样保护断点和保护现场? 3、自然优先级和设置优先级的区别是什么?

实验四 定时/计数器实验

一、实验目的

1、完成定时/计数器的综合实验。 2、掌握定时/计数器的应用知识。

二、实验原理

中断初始化,即对定时器及中断相关SFR赋值;(3) 中断服务程序设计。

初始化一般有以下几个步骤:(1) 确定工作方式,对方式寄存器TMOD赋值;(2) 预置定时或计数初值,直接将其写入T0、T1中;(3) 根据需要对中断允许寄存器有关位赋值,以开放或禁止定时/计数器中断;(4) 启动定时/计数器,将TRi 赋值为“1”。

计数初值的设定:X=M-N=最大计数值-计数值;X=M-N=最大计数值-定时时间/Tcy。 应用:

一般应用:定时/计数器:较短时间的定时;较长时间的定时。

特殊应用:门控位的使用;频率测量;PWM;即时读取计数值;溢出同步修正。

三、实验仪器

四、实验内容与步骤

编程并调试

P1.0输出,采用中断方式。

2、fosc=12MHz,T0产生10ms周期方波,自P1.0输出,采用中断方式。

ORG LJMP ORG LJMP ORG MAIN: CLR

MOV MOV MOV MOV SETB SJMP

0000H MAIN 001BH PT1 0030H P1.0

TMOD,#10H TH0,#0ECH TL0,#78H IE,#88H TR1 $

PT1: MOV

MOV CPL RETI END

TH1,#0ECH TL1,#78H P1.0

P1.0输出,采用中断方式。

4、fosc=12MHz,T0产生3s周期1:3占空比(占空比=高电平:周期=1s:3s)的方波,自

5、fosc=12MHz,T0产生30ms周期1:3占空比(占空比=10ms:30ms)的方波,自P1.0输出,采用中断方式。(定时时间短,可利用改变定时器初值,实现不同定时时间)

6、用T0模拟一个外部中断源。

调试:SIMPLE P-接至T0孔,模拟外部中断请求信号。

7、用GATE控制位,测量INT1(P3.3)引脚上正脉冲的宽度。晶振12MHz。

查询方式:宽度≤65536Tcy适用。

#include "reg51.h" sbit Port=P3^3; int nvar1,nvar2; void main(){ TMOD=0x90; TH1=0; TL1=0; EA=1; ET1=1; TF1=0; while(Port==1); TR1=1; while(Port==0); while(Port==1); TR1=0; nvar1=TH1; nvar2=TL1; while(1); } //等待INT1变低 //变低则软启动 //等待INT1变高 //变高则硬启动 //等待INT1再变低 //变低则软停止 //观察变量nvar1、nvar2的值

中断方式:宽度>65536Tcy适用。

T0为基准定时器,溢出时间50ms,对T0溢出次数计数,则脉宽= (定时溢出时间×溢出次数)+本次定时时间。

ORG SJMP ORG AJMP ORG AJMP ORG MOV MOV MOV MOV MOV MOV SETB SETB MOV SETB SETB SETB SETB SETB JB JB SJMP MOV MOV INC CPL RETI CLR CLR CLR CLR CLR RETI END 0000H MAIN 000BH TP0 001BH TP1 0030H R0, #0 TMOD, #95H TH0, #0FFH TL0, #0FEH TH1, #3CH TL1, #0B0H TR0 TR1 IP, #08H ET1 ET0 EA 20H F0 F0, $ 20H, LOOP $ TL0, #0B0H TH0, #3CH R0 F0 F0 20H ET0 ET1 EA MAIN: ;T0定时中断次数计数器 LOOP: ;设20H为T1计数中断标志 ;设F0为T0定时中断标志 ;T0定时未溢出,等待 ;T1计数未溢出则循环,否则结束 TP0: ;T0定时溢出计数器加1 ;清T0定时中断标志 ;清T0定时中断标志 ;清T1计数中断标志 TP1:

8、测量脉冲频率。

测量频率最简单的接口电路,可将脉冲直接连接到T1端,将T0用作定时器,T1用作计数器。在T0定时时间里,对脉冲进行计数。T1的计数值便是单位定时时间里的脉冲个数。

设T0为定时方式,提供50ms的基准闸门时间Tr。在20Tr即1s期间,T1对外部脉冲进行计数,所获得计数值即为被测脉冲信号的频率。

#include “reg51.h”

sbit P35=P3^5;

int nvar1,nvar2,nCounter=0;

main(){

TMOD=0x51;

TH0=0x3c;TL0=0xb0;TH1=0;TL1=0;TF0=0;

P35=1; //置引脚为输入

while(P35==1); //等待变低

TR0=1;TR1=1; //启动

for(nCounter=0;nCounter

while(TF0==0);

TH0=0x3c;TL0=0xb0;

}

TR0=0;TR1=0;

nvar1=TH1;nvar2=TL1;

while(1); //观察nvar1、nvar2的值

}

9、PWM调节功率。 单个呼吸灯实现方法二

#include "reg51.h" #define LED P0 unsigned char PWM_T=0x00; //占空比控制 void led_int() interrupt 1 using 0{ static unsigned char t; //范围0~255 t++; //每溢出一次加1 if(t==100){t=0;LED=0x00;} //PWM周期 if(PWM_T==t){LED=0xff;} } void main(){ bit flag=1; //渐亮或渐灭 unsigned int n; TMOD=0x02; TH0=210; TL0=210 ; EA=1; ET0=1; TR0=1; LED=0xff; while(1) { for(n=0;n=100){flag=0;} if(PWM_T==0){flag=1;} } } 多个呼吸灯基于方法二

#include "reg51.h“ #include "intrins.h" #define LED P0 sbit LED0=LED^0;sbit LED1=LED^1;sbit LED2=LED^2;sbit LED3=LED^3; sbit LED4=LED^4;sbit LED5=LED^5;sbit LED6=LED^6;sbit LED7=LED^7; bit LIGHT=0;unsigned char PWM_T=0x00; //占空比控制 void led_int() interrupt 1 using 0{ static unsigned char t; t++; //每溢出一次加1 if(t==45){t=0;LIGHT=0;} //PWM周期 if(PWM_T==t){LIGHT=1;} if(t>0){LED0=LIGHT;}if(t>5){LED1=LIGHT;} if(t>15){LED2=LIGHT;}if(t>20){LED3=LIGHT;} if(t>25){LED4=LIGHT;}if(t>30){LED5=LIGHT;} if(t>35){LED6=LIGHT;}if(t>40){LED7=LIGHT;} } void main(){ bit flag=1; //渐亮或渐灭 unsigned int n; TMOD=0x02;TH0=210;TL0=210;EA=1;ET0=1;TR0=1; LED=0xff; while(1){ for(n=0;n=45){flag=0;} if(PWM_T==0){flag=1;} } }

10、简易秒时钟,利用P0口LED,高低各4位分别显示2进制的秒十位与个位。 #include char i=0; char j=0; char k;

void main(){ TMOD=0x01; TH0=0x3c;TL0=0xbc; EA=1;ET0=1; TR0=1; while(1); } void time0_int(void) interrupt 1{ TH0=0x3c;TL0=0xb0; i++; if (i==20) { j++; if(j==60){j=0;} k=((j/10)

五、实验报告要求

六、参考思考题

1、fosc=12MHz,用T1定时,编写由P1.0输出周期为2ms的方波的程序。

2、定时器/计数器的方式3,分别用TL0和TH0作为两个独立的8位定时器/计数器,产生100µsz和200µs定时中断,使P1.0和P1.1产生周期为200µs和400µs方波。晶振频率6MHz。

实验三 中断系统实验

一、实验目的

1、完成中断系统的综合实验,包括中断请求源,中断请求标志,中断允许与禁止,中断优先级控制,中断响应过程,外部中断触发方式与中断响应时间等。

2、掌握中断系统的应用知识。

二、实验原理

中断系统的功能:(1)中断的屏蔽与开放;(2)实现中断及返回;(3)能实现优先级排队;

51中断系统的结构:TCON、SCON、IE、IP、自然优先级

中断处理过程分为4个阶段:中断请求→中断响应→中断服务→中断返回。 中断系统的设计过程通常由以下几个部分构成:

断服务子程序入口; (3) 中断服务子程序开始保护现场,保护与主程序或其他中断系统共享的资源; (4) 编制中断服务子程序功能主体; (5) 恢复现场。

外部中断的信号要求:低电平持续时间要超过1个机器周期。

外部中断标志的撤除:电平触发方式要软硬结合撤除,跳变触发方式自动撤除。

外部中断标志在不同触发方式下的锁存:电平触发方式下,如被屏蔽,则中断请求信号消失后,中断标志自动撤除,或者在响应中断后自动清除;跳变触发方式下,即使被屏蔽,中断标志也将锁存,在响应中断后才会被自动清除。

三、实验仪器

四、实验内容与步骤

编程并调试

1、P0口接8个LED(L1~L8),INT0接单脉冲开关(SIMPLE P-)。初始LED全部

ORG LJMP ORG LJMP MOV SETB MOV SETB SJMP JB MOV SETB LJMP MOV CLR RETI END

0000H MAIN 0003H PINT0 IE,#81H IT0

P0,#0FFH F0 $

F0,LIGHT P0#0FFH F0 RTN P0,#00H F0

MAIN:

PINT0:

LIGHT: RTN:

2、电路同上。每按一次开关,LED全部点亮,保持一段时间后全部熄灭,如此往复,保持时间自定义。

ORG

0000H

#include

MAIN:

PINT0:

DEL: DEL0: DEL1:

LJMP ORG LJMP MOV SETB MOV LJMP MOV LCALL MOV RETI MOV MOV MOV DJNZ DJNZ DJNZ END

MAIN 0003H PINT0 IE,#81H IT0

P0,#0FFH MAIN P0,#00H DEL

P0,#0FFH R5, #10 R6, #200 R7, #248 R7, $ R6, DEL1 R5, DEL0

3、电路同上。实现LED流水灯(只亮一个),间隔时间为1秒,方向自定义。按下开

4、中断计数:P0、P1口扩展2位数码管,显示中断次数。

连线:IO1~IO8按序连接LED_A~LED_DP,CAP0、SDA按序连接LED_C1、LED_C2,

}

IT0=1; while(1){ P0=table-code[counter/10]; P11=0; DelayMS(20); P11=1;

P0=table-code[counter%10]; P10=0; DelayMS(20); P10=1; }

5、中断优先级、中断嵌套。

连线:P0口接8个LED(L1~L8),INT0、INT1分别接两个拨动开关K1、K2(拨至H高电平)。

原理:如下程序,主函数初始化中断(允许INT0、INT1中断,INT0低优先级、INT1高优先级,电平触发方式),并循环间隔点亮LED。拨K1至L并拨回至H,进入int0()中断服务子函数,LED全部点亮,延时3s。如果在此期间,拨K2至L并拨回至H,由于INT1为高级中断,故进入int1()中断服务子函数,LED全部熄灭,延时1s。而后返回int0(),由于从int1()返回int0()是返回到延时函数中,故LED仍为熄灭状态;再返回主函数,LED间隔点亮。

#include “reg51.h”

#define uchar unsigned char void DelayMS(uint x){

uchar t; while(x--){

for(t=0;t

int0() interrupt 0{ P0=0x00; DelayMS(3000); }

Int1() interrupt 2{ P0=0xff; DelayMS(1000); }

main(){ IE=0x83;

PX0=0; PX1=1; while(1){ P0=0x55;

} }

6、中断优先级、中断标志的锁存与撤除。 连线:P0口接8个LED(L1~L8),INT0、INT1均接单脉冲开关(SIMPLE P-)。 原理:如下程序,主函数初始化中断(允许INT0、INT1中断,INT0高优先级、INT1低优先级,边沿触发方式),并循环间隔点亮LED。按下开关,INT0、INT1引脚均可检测到下降沿中断请求信号,则锁存至中断标志IE0、IE1。由于INT0为高级中断,则响应INT0中断,进入int0()中断服务子函数,中断标志IE0被自动清0撤除。但边沿触发方式时,被屏蔽的INT1中断标志IE1仍不会撤除,故INT0中断服务处理完返回主函数后,又会进入INT1中断服务,中断标志IE1被自动清0撤除。故现象为,初始LED间隔点亮(主函数),按下开关,LED点亮1s(int0子函数),再熄灭1s(int1()子函数),再间隔点亮(主函数)。

如果修改PX0=1;PX1=0;为PX0=0;PX1=1;,试分析执行过程,并验证。 自行编程,验证在电平触发方式时,中断标志是如何锁存与撤除的。

#include “reg51.h”

#define uchar unsigned char void DelayMS(uint x){

uchar t; while(x--){

}

int0() interrupt 0{ P0=0x00;

DelayMS(1000); }

Int1() interrupt 2{ P0=0xff; DelayMS(1000); }

main(){ IE=0x83; IT0=1;

IT1=1;

PX0=1; // PX0=0; PX1=0; // PX1=1; while(1){ P0=0x55;

} }

}

for(t=0;t

7、单步操作。

1)、连线:如下电路:

将仿真器面板上的IO1~IO8(分别对应P0.0~P0.7)按序连接到LED DISP面板的LED_A~LED_G、LED_DP; LED DISP面板的LED_C1连接到SWITCH面板上的K12,并将K12拨向L即低电平; SPISTE、SPICLK、CDAC0、CADC0、PWM0、SCL、SDA、CAP0(分别对应P1.0~P1.7)按序连接到SWITCH面板的K1~K8,K1~K8均拨向H即高电平。 2)、编程:实现功能:数码管实时显示K1~K4对应的十六进制值(LLLL~HHHH,即对应于0000~1111,显示“0~F”)。

ORG

JMP ORG JMP ORG

START: MOV MOV ANL MOV MOVC MOV JMP INT0: JNB

JB RETI

CODE_P0:DB

DB END

0000H START 0003H INT0 0100H P1,#0FFH A,P1 A,#0FH

DPTR,#CODE_P0 A,@A+DPTR P0,A START P3.2,$ P3.2,$

3FH,06H,5BH,4FH,66H,6DH,7DH,07H 7FH,6FH,77H,7CH,39H,5EH,79H,71H

#include “reg51.h” sbit P32=P3^2;

unsigned char code table-code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

void int0(void){

while( !P32 ) ; while( P32 ) ;

}

void main(void){ unsigned char key;

while(1){ P1=0xff; key=P1; key=key&0x0f; P0=table-code[key]; } }

3)、调试:INT0引脚接单脉冲开关(SIMPLE P-)。按动开关,则实现单步操作。

8、扩展外部中断源。

调试:P0口接8个LED(L1~L8),P1.0~P1.3接4个开关(K1~K4),并分别连接INT1(电路无法实现线与)。

#include “reg51.h”

unsigned char status; bit flag;

void service-int1( ) interrupt 2 using 2 {

flag=1; /* 设置标志 */ status=P1; /* 存输入口状态 */ }

void main(void) {

IP=0x04; /* INT1高优先级 */ IE=0x84; /* 开中断 */ for( ; ; ){ if(flag) { /* 有中断 */

switch(status) { /* 根据中断源分支 */

case 0: P0=0xfe; break ; /* 处理IN0 */ case 1: P0=0xfd; break ; /* 处理IN1 */ case 2: P0=0xfb; break ; /* 处理IN2 */ default: P0=0xf7; }

flag=0; /* 处理完成清标志 */ } } }

9、扩展外部中断源应用:模拟交通灯。

}

void main(void){ unsigned char key;

while(1){ P1=0xff; key=P1; key=key&0x0f; P0=table-code[key]; } }

3)、调试:INT0引脚接单脉冲开关(SIMPLE P-)。按动开关,则实现单步操作。

8、扩展外部中断源。

调试:P0口接8个LED(L1~L8),P1.0~P1.3接4个开关(K1~K4),并分别连接INT1(电路无法实现线与)。

#include “reg51.h”

unsigned char status; bit flag;

void service-int1( ) interrupt 2 using 2 {

flag=1; /* 设置标志 */ status=P1; /* 存输入口状态 */ }

void main(void) {

IP=0x04; /* INT1高优先级 */ IE=0x84; /* 开中断 */ for( ; ; ){ if(flag) { /* 有中断 */

switch(status) { /* 根据中断源分支 */

case 0: P0=0xfe; break ; /* 处理IN0 */ case 1: P0=0xfd; break ; /* 处理IN1 */ case 2: P0=0xfb; break ; /* 处理IN2 */ default: P0=0xf7; }

flag=0; /* 处理完成清标志 */ } } }

9、扩展外部中断源应用:模拟交通灯。

ORG LJMP ORG LJMP ORG LJMP ORG MAIN:SETB

MOV MOV LOOP:MOV

MOV AP1: LCALL

DJNZ MOV AP2: CPL

LCALL DJNZ MOV MOV AP3: LCALL

DJNZ MOV MOV BP1: LCALL

DJNZ MOV BP2: CPL

LCALL DJNZ MOV MOV BP3: LCALL

DJNZ SJMP ORG INT0:PUSH

MOV MOV DEL0:LCALL

DJNZ POP RETI ORG INT1:CLR

PUSH PUSH PUSH PUSH SETB JB MOV SJMP AP0: JB

MOV DEL1:MOV NEXT:LCALL

0000H MAIN 0003H INT0 0013H INT1 0030H PX0

TCON,#00H IE,#85H P1,#0F3H R1,#88 DEL

R1,AP1 R1,#6 P1.2 DEL

R1,AP2 P1,#0F5H R1,#6 DEL

R1,AP3 P1,#0DEH R1,#48 DEL

R1,BP1 R1,#6 P1.5 DEL

R1,BP2 P1,#0EEH R1,#6 DEL

R1,BP3 LOOP 0200H P1 P1,#0F6H R2,#30 DEL

R2,DEL0 P1 0300H EA P1 04H 05H 06H EA P3.0,AP0 P1,#0F3H DEL1 P3.1,EXIT P1,#0DEH R3,#30 DEL

;转向主程序

;转向紧急车辆中断服务程序 ;转向有车车道放行中断服务程序

;A道绿灯亮,B道红灯亮 ;44s延时的循环次数 ;44s不到,继续循环 ;3s延时的循环次数 ;A道绿灯闪烁

;3s未到,继续循环

;A道黄灯亮,B道红灯亮 ;3s未到,继续循环

;A道红灯亮,B道绿灯亮 ;24s未到,继续循环 ;B道绿灯闪烁

;3s未到,继续循环

;A道红灯亮,B道黄灯亮 ;3s未到,继续循环 ;循环

;保护P1口数据

;A道红灯亮,B道红灯亮 ;15s延时的循环次数 ;15s未到,继续循环 ;恢复P1口数据 ;关中断 ;保护现场

;开中断

;A道无车,转向判断B道 ;A道绿灯亮,B道红灯亮 ;转向15s延时程序 ;B道无车,退出中断 ;A道红灯亮,B道绿灯亮 ;15s延时的循环次数

DJNZ EXIT:CLR

POP POP POP POP SETB RETI ORG DEL:MOV LP1: MOV LP2: MOV

NOP LP3:DJNZ

DJNZ DJNZ RET END

R3,NEXT EA 06H 05H 04H P1 EA 0350H R4,#10 R5,#50 R6,#248 R6,LP3 R5,LP2 R4,LP1

;15s未到继续循环 ;恢复现场

;0.5s延时子程序

#include "reg51.h"

#define uchar unsigned char #define uint unsigned int #define LEDS P1 sbit P30=P3^0; sbit P31=P3^1; uchar k;

void delayms(uint s){

uchar t; while(s--){ for(t=120;t>0;t--); } }

void int0p(void) interrupt 0{

k=LEDS; LEDS=0xf6;delayms(15000); LEDS=k; }

void int1p(void) interrupt 2{

k=LEDS;

if(!P30){ LEDS=0xf3; }else if(!P31){ LEDS=0xde; } delayms(15000); LEDS=k; }

void main(){

IE=0x85;PX0=1; while(1){ uchar i;

LEDS=0xf3;delayms(44000);

for(i=0;i

for(i=0;i

五、实验报告要求

1、实验报告由个人独立完成,每人一份;

2、写明实验目的、实验原理、实验内容和实验步骤;写明实验注意事项; 3、实验目的明确,原理清晰,步骤合理正确,内容充实,字迹工整; 4、能够应用所学的理论知识应用在实验中;

5、分析实验结果,写明实验中遇到问题及解决办法,并完成思考题。

六、参考思考题

1、响应中断有哪些条件?

2、中断响应后,怎样保护断点和保护现场? 3、自然优先级和设置优先级的区别是什么?

实验四 定时/计数器实验

一、实验目的

1、完成定时/计数器的综合实验。 2、掌握定时/计数器的应用知识。

二、实验原理

中断初始化,即对定时器及中断相关SFR赋值;(3) 中断服务程序设计。

初始化一般有以下几个步骤:(1) 确定工作方式,对方式寄存器TMOD赋值;(2) 预置定时或计数初值,直接将其写入T0、T1中;(3) 根据需要对中断允许寄存器有关位赋值,以开放或禁止定时/计数器中断;(4) 启动定时/计数器,将TRi 赋值为“1”。

计数初值的设定:X=M-N=最大计数值-计数值;X=M-N=最大计数值-定时时间/Tcy。 应用:

一般应用:定时/计数器:较短时间的定时;较长时间的定时。

特殊应用:门控位的使用;频率测量;PWM;即时读取计数值;溢出同步修正。

三、实验仪器

四、实验内容与步骤

编程并调试

P1.0输出,采用中断方式。

2、fosc=12MHz,T0产生10ms周期方波,自P1.0输出,采用中断方式。

ORG LJMP ORG LJMP ORG MAIN: CLR

MOV MOV MOV MOV SETB SJMP

0000H MAIN 001BH PT1 0030H P1.0

TMOD,#10H TH0,#0ECH TL0,#78H IE,#88H TR1 $

PT1: MOV

MOV CPL RETI END

TH1,#0ECH TL1,#78H P1.0

P1.0输出,采用中断方式。

4、fosc=12MHz,T0产生3s周期1:3占空比(占空比=高电平:周期=1s:3s)的方波,自

5、fosc=12MHz,T0产生30ms周期1:3占空比(占空比=10ms:30ms)的方波,自P1.0输出,采用中断方式。(定时时间短,可利用改变定时器初值,实现不同定时时间)

6、用T0模拟一个外部中断源。

调试:SIMPLE P-接至T0孔,模拟外部中断请求信号。

7、用GATE控制位,测量INT1(P3.3)引脚上正脉冲的宽度。晶振12MHz。

查询方式:宽度≤65536Tcy适用。

#include "reg51.h" sbit Port=P3^3; int nvar1,nvar2; void main(){ TMOD=0x90; TH1=0; TL1=0; EA=1; ET1=1; TF1=0; while(Port==1); TR1=1; while(Port==0); while(Port==1); TR1=0; nvar1=TH1; nvar2=TL1; while(1); } //等待INT1变低 //变低则软启动 //等待INT1变高 //变高则硬启动 //等待INT1再变低 //变低则软停止 //观察变量nvar1、nvar2的值

中断方式:宽度>65536Tcy适用。

T0为基准定时器,溢出时间50ms,对T0溢出次数计数,则脉宽= (定时溢出时间×溢出次数)+本次定时时间。

ORG SJMP ORG AJMP ORG AJMP ORG MOV MOV MOV MOV MOV MOV SETB SETB MOV SETB SETB SETB SETB SETB JB JB SJMP MOV MOV INC CPL RETI CLR CLR CLR CLR CLR RETI END 0000H MAIN 000BH TP0 001BH TP1 0030H R0, #0 TMOD, #95H TH0, #0FFH TL0, #0FEH TH1, #3CH TL1, #0B0H TR0 TR1 IP, #08H ET1 ET0 EA 20H F0 F0, $ 20H, LOOP $ TL0, #0B0H TH0, #3CH R0 F0 F0 20H ET0 ET1 EA MAIN: ;T0定时中断次数计数器 LOOP: ;设20H为T1计数中断标志 ;设F0为T0定时中断标志 ;T0定时未溢出,等待 ;T1计数未溢出则循环,否则结束 TP0: ;T0定时溢出计数器加1 ;清T0定时中断标志 ;清T0定时中断标志 ;清T1计数中断标志 TP1:

8、测量脉冲频率。

测量频率最简单的接口电路,可将脉冲直接连接到T1端,将T0用作定时器,T1用作计数器。在T0定时时间里,对脉冲进行计数。T1的计数值便是单位定时时间里的脉冲个数。

设T0为定时方式,提供50ms的基准闸门时间Tr。在20Tr即1s期间,T1对外部脉冲进行计数,所获得计数值即为被测脉冲信号的频率。

#include “reg51.h”

sbit P35=P3^5;

int nvar1,nvar2,nCounter=0;

main(){

TMOD=0x51;

TH0=0x3c;TL0=0xb0;TH1=0;TL1=0;TF0=0;

P35=1; //置引脚为输入

while(P35==1); //等待变低

TR0=1;TR1=1; //启动

for(nCounter=0;nCounter

while(TF0==0);

TH0=0x3c;TL0=0xb0;

}

TR0=0;TR1=0;

nvar1=TH1;nvar2=TL1;

while(1); //观察nvar1、nvar2的值

}

9、PWM调节功率。 单个呼吸灯实现方法二

#include "reg51.h" #define LED P0 unsigned char PWM_T=0x00; //占空比控制 void led_int() interrupt 1 using 0{ static unsigned char t; //范围0~255 t++; //每溢出一次加1 if(t==100){t=0;LED=0x00;} //PWM周期 if(PWM_T==t){LED=0xff;} } void main(){ bit flag=1; //渐亮或渐灭 unsigned int n; TMOD=0x02; TH0=210; TL0=210 ; EA=1; ET0=1; TR0=1; LED=0xff; while(1) { for(n=0;n=100){flag=0;} if(PWM_T==0){flag=1;} } } 多个呼吸灯基于方法二

#include "reg51.h“ #include "intrins.h" #define LED P0 sbit LED0=LED^0;sbit LED1=LED^1;sbit LED2=LED^2;sbit LED3=LED^3; sbit LED4=LED^4;sbit LED5=LED^5;sbit LED6=LED^6;sbit LED7=LED^7; bit LIGHT=0;unsigned char PWM_T=0x00; //占空比控制 void led_int() interrupt 1 using 0{ static unsigned char t; t++; //每溢出一次加1 if(t==45){t=0;LIGHT=0;} //PWM周期 if(PWM_T==t){LIGHT=1;} if(t>0){LED0=LIGHT;}if(t>5){LED1=LIGHT;} if(t>15){LED2=LIGHT;}if(t>20){LED3=LIGHT;} if(t>25){LED4=LIGHT;}if(t>30){LED5=LIGHT;} if(t>35){LED6=LIGHT;}if(t>40){LED7=LIGHT;} } void main(){ bit flag=1; //渐亮或渐灭 unsigned int n; TMOD=0x02;TH0=210;TL0=210;EA=1;ET0=1;TR0=1; LED=0xff; while(1){ for(n=0;n=45){flag=0;} if(PWM_T==0){flag=1;} } }

10、简易秒时钟,利用P0口LED,高低各4位分别显示2进制的秒十位与个位。 #include char i=0; char j=0; char k;

void main(){ TMOD=0x01; TH0=0x3c;TL0=0xbc; EA=1;ET0=1; TR0=1; while(1); } void time0_int(void) interrupt 1{ TH0=0x3c;TL0=0xb0; i++; if (i==20) { j++; if(j==60){j=0;} k=((j/10)

五、实验报告要求

六、参考思考题

1、fosc=12MHz,用T1定时,编写由P1.0输出周期为2ms的方波的程序。

2、定时器/计数器的方式3,分别用TL0和TH0作为两个独立的8位定时器/计数器,产生100µsz和200µs定时中断,使P1.0和P1.1产生周期为200µs和400µs方波。晶振频率6MHz。


相关文章

  • 51单片机定时器实验
  • 电子信息工程学系实验报告 课程名称:单片机原理 实验项目名称:51定时器实验 实验时间:2012-11-27 班级:测控081 姓名: 学号:810707132 实 验 目 的: 熟悉keil仿真软件.伟福仿真器的使用和C51定时程序的编写 ...查看


  • 简易交通灯
  • 单片机课程设计 --简易交通灯的设计 摘要 本次单片机课程设计利用AT89C51单片机的定时器定时,令十字路口的红绿灯交替点亮和熄灭30s ,并用LED 灯显示倒计时时间,最终完成一个能够控制十二盏交通信号灯的模拟系统.简要设计思路如下: ...查看


  • 单片机教案
  • 吴允志 单 片 机 1 2011年2月21日 08高职电子2班 2 单片机概述(一) 通过本讲教学,要求学生了解单片机的概念及组成.单片机 与通用微机的区别与联系,单片机的特点及其广泛应用.了解本课程的性质.任务及其在本专业中的地位,结合单 ...查看


  • 毕业论文交通灯单片机
  • 毕业论文 交通灯 单 片机 题 目:LED点阵系统设计 系 部:机电工程系 专 业:机电一体化 班 级:098班 姓 名:范旭辉 学 号:2009048042 指导教师:范旭辉 目录 摘要 ......................... ...查看


  • 实验报告基于AT89C51的液晶显示频率计的设计
  • 本科学生单片机课程设计报告 题 目 基于单片机的频率计设计 姓 名 学 号 院 (系) 专业.年级指导教师 杨 进 宝 课程设计成绩评定表 实评总分 指导教师签名 引言 在设计单片机和数字电路时经常需要测量脉冲个数.脉冲宽度.脉冲周期.脉冲 ...查看


  • 单片机定时器实验
  • 实验三 单片机内部定时器应用 实验目的 1.理解单片机内部定时器的工作原理及使用方法 2.了解单片机定时中断程序的编写和调试方法 3.掌握定时器的基本使用方法 实验仪器 单片机开发板.万利仿真机.稳压电源.计算机 实验原理 1. 单片机定时 ...查看


  • 智能时控开关设计
  • 智能时控开关设计 摘要 本系统通过单片机的定时器功能,利用8279键盘及显示功能,实现了5路开关的时控功能.通过8279控制的键盘0-9输入调节时间的数字键,A为启动定时器,B设置时间,C时间清零,D停止,E通过外部干预停止提示,F设置开关 ...查看


  • 单片机实验3 中断.定时器计数器实验
  • 西南科技大学 实验报告 课程名称: 单片机原理及应用A 实验名称: 中断.定时器/计数器实验 姓 名: 学 号: 班 级: 生医1401 指导教师: 雷华军 西南科技大学信息工程学院制 实验题目 数码管动态扫描显示驱动.键盘动态扫描驱动 一 ...查看


  • 直流电机转速及方向控制
  • 专业课程设计 设计报告 直流电机转速及方向的控制 班级: 专业: 电气工程及其自动化 设计人(学号): 完成日期: 成都信息工程学院控制工程学院 二零一一年十月 摘 要 当今,自动化控制系统已经在各行各业得到了广泛的应用和发展,而直流驱动控 ...查看


热门内容