08第八讲 单片机中断技术实验及应用.docx
- 文档编号:8430703
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:17
- 大小:100.31KB
08第八讲 单片机中断技术实验及应用.docx
《08第八讲 单片机中断技术实验及应用.docx》由会员分享,可在线阅读,更多相关《08第八讲 单片机中断技术实验及应用.docx(17页珍藏版)》请在冰豆网上搜索。
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 08第八讲 单片机中断技术实验及应用 08 第八 单片机 中断 技术 实验 应用