08第八讲 单片机中断技术实验及应用.docx

上传人:b****6 文档编号:8430703 上传时间:2023-01-31 格式:DOCX 页数:17 大小:100.31KB
下载 相关 举报
08第八讲 单片机中断技术实验及应用.docx_第1页
第1页 / 共17页
08第八讲 单片机中断技术实验及应用.docx_第2页
第2页 / 共17页
08第八讲 单片机中断技术实验及应用.docx_第3页
第3页 / 共17页
08第八讲 单片机中断技术实验及应用.docx_第4页
第4页 / 共17页
08第八讲 单片机中断技术实验及应用.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

08第八讲 单片机中断技术实验及应用.docx

《08第八讲 单片机中断技术实验及应用.docx》由会员分享,可在线阅读,更多相关《08第八讲 单片机中断技术实验及应用.docx(17页珍藏版)》请在冰豆网上搜索。

08第八讲 单片机中断技术实验及应用.docx

08第八讲单片机中断技术实验及应用

第八讲单片机中断技术、实验及应用

电工电子实验教学中心艾庆生

“中断”是计算机技术里一个非常重要的内容,可以说,没有中断就没有计算机;也可以说,没有中断,计算机就不能“同时”做多件事情。

关于中断的概念及原理等,请参见教科书。

下面简单地对51单片机的中断系统作一个归纳总结。

一、51单片机的中断系统

1.中断系统框图

可归纳为“五个中断源、六个中断标志、两级中断开关、两级中断优先权”。

2.中断矢量

工程师们在设计51单片机的5个中断源时,也为这5个中断源确定了各自的矢量位置。

见下表。

中断源

中断矢量

外部0

0003H

定时/计数器0

000BH

外部1

0013H

定时/计数器1

001BH

串口

0023H

3.与中断有关的SFR

专用寄存器名称

符号

地址

位地址与位名称

D7

D6

D5

D4

D3

D2

D1

D0

定时/计数器控制

TCON

88H

TF1

8FH

TR1

8EH

TF0

8DH

TR0

8CH

IE1

8BH

IT1

8AH

IE0

89H

IT0

88H

串行控制

SCON

98H

SM0

9FH

SM1

9EH

SM2

9DH

REN

9CH

TB8

9BH

RB8

9AH

TI

99H

RI

98H

中断允许控制

IE

A8H

EA

AFH

ES

ACH

ET1

ABH

EX1

AAH

ET0

A9H

EX0

A8H

中断优先级控制

IP

B8H

PS

BCH

PT1

BBH

PX1

BAH

PT0

B9H

PX0

B8H

二、中断实验

1.定时/计数器中断实验1

实验一:

定时实验。

P0口发光管交叉闪亮(闪亮速率由定时器定时并通过中断实现)。

分析:

主程序只需做好初始化的工作即可,在周期性执行的中断子程序里改变P0口的发光管状态,实现交叉闪亮。

;***********************************************************

Org0000H

Ljmpmain

Org000BH

LjmpT0_int

;主程序

Org0030H

Main:

Movtmod,#00000001B;选用T0,定时,方式1

Setbet0;开T0单级中断

Setbea;开总中断

Setbtr0;启动T0

Movp0,#01010101B;P0口发光管交叉亮

NextStep:

sjmpNextStep;此处代表主程序去忙其它事了。

;定时器中断子程序

T0_int:

mova,p0;读入P0口内容

Cpla;将各位取反

Movp0,a;再送回P0口,实现交叉点亮

Reti

End

;思考题:

;1)。

此实验发光管闪亮间隔约为65.5ms,若定闪亮间隔为30ms,应怎样修改?

;2)。

若想实现长延时,如1S、10S、1分、1小时等,应如何编程?

;参考定时器中断子程序(1S)

T0_int:

Movth0,#3ch

Movtl0,#0b0h;预置常数15536,实现50ms定时

Incr7

Cjner7,#20,T0_end;不够1秒退出

Movr7,#0;够1秒将r7清0,为下一秒做准备

Mova,p0;读入P0口内容

Cpla;将各位取反

Movp0,a;再送回P0口,实现交叉点亮

T0_end:

Reti

End

;****************************************************************

2.定时/计数器中断实验2

实验二:

计数实验

T0的计数脚P3.4接有一开关模拟计数输入,单片机应随时将输入情况通过P0口显示出来,当输入满100个数时,单片机声音提示。

同时继续下一次的计数,循环往复。

分析:

由于只计100个数,可选方式2,自动重新装载方式,预置常数156;在主程序里做完初始化工作后,可以不断地读取TL0的值并送P0口显示;而在中断子程序里启动声音提示(最好2秒后关闭声音提示)。

;****************************************************************

Org0000H

Ljmpmain

Org000BH;T0的中断矢量

LjmpT0_int

Org001BH

LjmpT1_int;T1的中断矢量

;主程序

Org0030H

Main:

Movtmod,#00010110B;选用T0,计数,方式2

;选用T1,定时,方式1

Movth0,#156

Movtl0,#156;为T0预置初始值156

Movth1,#3cH

Movtl1,#0b0H;为T1预置初始值15536

Setbet0;开启T0中断

Setbea;开总中断

Setbtr0;启动T0计数

Loop:

Mova,tl0;读取T0的计数值,送A寄存器

MovP0,a;再送P0口显示

SjmpLoop

;****************************************************************

;T0中断子程序,完成声音提示,开T1中断启动2秒定时

T0_int:

Setbet1;开启T1中断

Setbtr1;启动T1定时器

Clrp1.4;开启声音提示

Movr7,#0;设置2秒定时的计数器

Reti

;****************************************************************

;T1中断子程序,完成2秒钟声音的短促发声后关闭T1中断

T1_int:

Movth1,#3cH

Movtl1,#0b0H;为T1预置初始值15536

Cplp1.4;使声音短促发声,周期100ms

Incr7

Cjner7,#40,T1_end;够2秒了吗?

(40次中断是2秒)

Setbp1.4;停止声音

Clret1;关闭T1中断

T1_end:

Reti

;****************************************************************

3.外部中断扩展实验

如图可知,在我们的实验板上有4个简单按键,当把短路帽短路JMP1的1-2脚时,可做外部中断1的扩展实验。

设这4个按键为4个不同地方的防盗装置,按下按键模拟盗情发生。

编程序当盗情发生时,用P0口指示哪个地方发生了盗情,并声音报警。

分析:

当任意地方的盗情发生时,都会通过D1-D4拉低P3.3脚,申请外部1中断。

在外部1的中断子程序里,识别盗情发生地送P0口显示。

;****************************************************************

;外部中断1扩展实验

Org0000H

Ljmpmain

Org0013H

LjmpX1_int

;主程序

Org0030H

Main:

MovP0,#0;关P0口所有发光管

MovP3,#0ffH

Setbit1;设置外部1中断为下降沿触发

Setbex1;开外部1中断

Setbea;开总中断

Sjmp$;此处代表主程序去做其它事情了。

;外部1中断子程序

X1_int:

Mova,P3;获取防盗装置的情况

Cpla;为送P0口做准备(反相的缘故)

MovP0,a

ClrP1.4;声音报警

Reti

;注:

以上程序未考虑盗情的解除问题,在做实验时可按复位键重新开始,注意观察P0口的灯亮情况,表示不同的盗情地点。

;思考题:

1。

若用数码管显示不同的盗情地点,如何编程?

;2。

若声光报警信号只需30秒,然后自动解除,如何编程?

;****************************************************************

三、中断的应用

1.简易方波发生器和数字频率计

;*********************************************************

;*******************数字频率计程序****************

;任务:

利用定时器T0定时,产生2KHz方波,从P3.6脚输出;

;此方波还送P3.5脚(T1的计数脚),以便T1进行计数;

;T0还产生1秒定时,不断地打开和关闭T1计数器,

;并将读取到的频率值送数码管显示。

;分析:

2KHz方波,设占空比为50%,则高低电平的时间各为250uS,

;可用T0定时,选方式2,自动重新装载初始值。

T1计数,方式1。

;硬件上,将P3.6脚与P3.5脚相连(注意从排针上相连,用短路帽)即可。

org0000h

ljmpmain

;*********************************************************

org000bh

ljmpt0_int

;*********************************************************

;主程序

org0030h

main:

movp0,#0

movp1,#0ffh

movp3,#0ffh;初始化,关闭所有发光管

movr3,#0

movr4,#0;r3-r4组成1秒计数器

movtmod,#01010010B;T1计数,方式1;

;T0定时,方式2。

movth0,#6

movtl0,#6;预置初始值6,准备计数250

movth1,#0

movtl1,#0

setbet0

setbea;开T0中断

setbtr0;启动定时器T0

main_disp:

lcallsmg_disp

ajmpmain_disp

;*********************************************************

;数码管显示4位子程序

smg_disp:

movdptr,#disp_tab;指向显示代码表

movr0,#78h;指向数据显示区

movr7,#0feh;显示模式(即“位选码”)

disp_loop:

mova,@r0;取一个数据

movca,@a+dptr;转换成显示代码

movp0,a;送P0口(“段选码”)

mova,r7;取显示模式

movp2,a;送P2口(“位选码”)

incr0;指向下一数据

rla;移向下一位

movr7,a;并保存

lcallys1ms

lcallys1ms

cjnea,#0efh,disp_loop;扫描4位了吗?

movp2,#0ffh;确保扫描完后数码管都灭

ret

;*********************************************************

;延时1ms子程序

ys1ms:

movr6,#2

ys0:

movr5,#250

djnzr5,$

djnzr6,ys0

ret

;*********************************************************

;T0中断子程序

t0_int:

pushacc

cplp3.6;输出方波

incr3

cjner3,#0,next

incr4

t0_end:

popacc

reti

next:

cjner3,#0a0h,t0_end

cjner4,#0fh,t0_end;判断够4000次计数吗?

;因为中断4000次为1秒。

movr3,#0

movr4,#0;1秒计数器清0

cpltr1;启动或关闭T1计数器

jbtr1,t0_end;若T1启动则返回

mova,tl1

anla,#0fh

mov78h,a

mova,tl1

swapa

anla,#0fh

mov79h,a;送低8位频率值到数据区

mova,th1

anla,#0fh

mov7ah,a

mova,th1

swapa

anla,#0fh

mov7bh,a;送高8位频率值到数据区

movtl1,#0

movth1,#0;T1计数器清0

ljmpt0_end

;注:

以上送显示区的数据为16进制。

经实验,得到的16进制值为07H、0D0H。

;思考题:

若用10进制显示,如何编程?

;*********************************************************

;数据区数据显示代码表

disp_tab:

db3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh

db6fh,77h,7ch,39h,5eh,79h,71h

end

;*********************************************************

2.带按键调整的数字钟

;任务:

用单片机最小系统实现数字钟显示;用4个简单按键(P3.4---P3.7)实现

;小时和分钟的调整。

;*********************************************************

;*************带按键调整的数字钟***************

;*********************************************************

;定义:

K34为“小时+”键,K35为“小时-”键;

;K36为“分钟+”键,K37为“分钟-”键。

;78H-7FH为时钟数据存放区:

;(78H放“秒”值,79H放“十秒”值)

;(7BH放“分”值,7CH放“十分”值)

;(7EH放“时”值,7FH放“十时”值)

;(7AH放“-”,7DH放“-”)

;75H-77H放压缩式BCD码的“秒、分、时”的值

;74H为T0中断次数计数器,计够20次为1秒。

Org0000H

Ljmpmain

Org000BH

LjmpT0_int

;主程序

Org0030H

Main:

Movsp,#30H;调整堆栈指针

Mov74H,#0;清中断次数计数器

Mov75H,#0;“十秒和秒”清0

Mov76H,#0;“十分和分”清0

Mov77H,#0;“十时和时”清0

Mov7ah,#10;“-”

Mov7dh,#10;“-”

Movtmod,#01H;定义T0为定时、方式1

Movth0,#3cH

Movtl0,#0b0H;预置常数15536

Setbet0;开T0中断

Setbea;开总中断

Setbtr0;启动定时器T0

Loop:

Lcallsmg_disp;调数码管显示一遍

LcallKey_Check;调时钟按键调整

SjmpLoop

;*********************************************************

;T0中断子程序

T0_int:

Pushacc;断点保护

Movth0,#3cH

Movtl0,#0b0H

Inc74H;中断次数加1(每次50ms)

Mova,74H

Cjnea,#20,T0_end;中断次数够20次(1秒)吗?

Mov74H,#0;;够20次(1秒)清0

Mova,75H;取“十秒、秒值”

Adda,#1

Daa;十进制调整(调整成压缩式BCD码)

Mov75H,a

Cjnea,#60H,fenjie;秒处理

Mov75H,#0;够60秒清0

Mova,76H;取“十分、分值”

Adda,#1

Daa

Mov76H,a

Cjnea,#60H,fenjie;分处理

Mov76H,#0;够60分清0

Mova,77H;取“十时、时值”

Adda,#1

Daa

Mov77H,a

Cjnea,#24H,fenjie;时处理

Mov77H,#0;够24时清0

Fenjie:

LcallFJ_data

T0_end:

Popacc

Reti

;*********************************************************

;分解压缩式BCD码数据子程序

FJ_data:

Movr1,#78H;指向显示区“秒”的位置

Mova,75H;取压缩式BCD码的“秒”

Xchda,@r1;分解保存

Incr1

Swapa

Xchda,@r1;分解保存

Movr1,#7bH;指向显示区“分”的位置

Mova,76H;取压缩式BCD码的“分”

Xchda,@r1;分解保存

Incr1

Swapa

Xchda,@r1;分解保存

Movr1,#7eH;指向显示区“时”的位置

Mova,77H;取压缩式BCD码的“时”

Xchda,@r1;分解保存

Incr1

Swapa

Xchda,@r1;分解保存

Ret

;*********************************************************

;时钟调整子程序

Key_check:

Movp3,#0ffh;为读入P3口内容做准备

Mova,p3;读入P3口内容到A

Cpla

Jnzadd_sub;有键按下跳去处理

Key_end:

Ret

Add_sub:

lcallsmg_disp

lcallsmg_disp;数码管显示两遍,延时若干ms抗干扰

Mova,p3;再次读入P3口内容到A

Cpla

Jzkey_end;无键按下返回

Jbacc.4,hour_add;判是P3.4脚接的按键吗?

Jbacc.5,hour_sub;判是P3.5脚接的按键吗?

Jbacc.6,min_add;判是P3.6脚接的按键吗?

Jbacc.7,min_sub;判是P3.7脚接的按键吗?

Sjmpkey_end

hour_add:

Mova,77H;取“小时”

Adda,#1;加1

Daa

Mov77H,a

Cjnea,#24H,key_wait

Mov77H,#0;为24点则清0

Sjmpkey_wait

hour_sub:

Mova,77H;取“小时”

jznext_23;为0点则跳转

anla,#0fH

jzsub_7;为10点或20点则跳转

dec77H;不为以上值时直接减1

Sjmpkey_wait

Next_23:

Mov77H,#23H;赋值23点

Sjmpkey_wait

Sub_7:

Mova,77H

Subba,#7;减7

Mov77H,a

Sjmpkey_wait

min_add:

Mova,76H;取“分”

Adda,#1;加1

Daa

Mov76H,a

Cjnea,#60H,key_wait

Mov76H,#0;够60分清0

Sjmpkey_wait

min_sub:

Mova,76H;取“分”

jznext_59;“十分和分”都为0则跳转

anla,#0fh

jzjian_7;“分”为0则跳转

dec76H;“分”不为0则直接减1

Sjmpkey_wait

Next_59:

Mov76H,#59H

Sjmpkey_wait

Jian_7:

Mova,76H

Subba,#7

Mov76H,a

Key_wait:

LcallFJ_data

Wait:

lcallsmg_disp;等候按键释放并保持数码管的显示不

;断续

movp3,#0ffh

Mova,p3;再次读入P3口内容到A

Cpla

Jnzwait;等候按键释放

Ret

;*********************************************************

思考题:

以上的实验里,每按一下按键,只能加1或减1;若想按下按键1秒后,能自动连续加1或减1,一直到松开按键为至,如何编程?

 

以上的程序为新增的学习内容,要做完整的该实验,还需将过去学过的部分程序添加进去,如以下部分:

;************************************************************

;数码管显示一遍子程序

smg_disp:

movdptr,#disp_tab;指向显示代码表

movr0,#78h;指向数据显示区

movr7,#0feh;显示模式(即“位选码”)

disp_loop:

mova,@r0;取一个数据

movca,@a+dptr;转换成显示代码

movp0,a;送P0口(“段选码”)

mova,r7;取显示模式

movp2,a;送P2口(“位选码”)

incr0;指向下一数据

rla;移向下一位

movr7,a;并保存

lcallys1ms

cjnea,#0feh,disp_loop;扫描一遍了吗?

Ret

;************************************************************

;延时1ms子程序

ys1ms:

movr6,#2

ys0:

movr5,#250

djnzr5,$

djnzr6,ys0

ret

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1