单片机实验利用中断控制LED灯精.docx
《单片机实验利用中断控制LED灯精.docx》由会员分享,可在线阅读,更多相关《单片机实验利用中断控制LED灯精.docx(8页珍藏版)》请在冰豆网上搜索。
单片机实验利用中断控制LED灯精
单片机实验——利用中断控制LED灯
1.实验目的
(1掌握单片机中断的基本原理。
(2掌握单片机中断程序的编制方法。
2.预习要点
(1单片机中断基本原理
(2中断程序编制方法
3.实验设备
计算机、单片机实验箱、信号发生器。
4.实验内容
基本要求:
将信号发生器输出的脉冲信号连接到CPU的INT0上,将CPU的P1.0到P1.7和八个LED连接,脉冲信号为5V、100Hz,每输入一百个脉冲LED灯亮一次,并且LED灯顺序循环移位一次,形成跑马灯。
扩展要求:
提高输入脉冲频率,但跑马灯的显示频率不变。
实验4
ORG0000H
AJMPMAIN
;******************************************
;中断子程序入口地址
ORG0003H
LJMPEXINT0
;******************************************
;主程序
ORG0030H
MAIN:
MOVSP,#70H
SETBIT0;设置为下降沿触发
SETBEX0;开INT0的中断开关
SETBEA;开总中断开关
MOVR0,#01H;只让一盏灯亮,R0赋给P1口
MOVR3,#00H;R3用来记中断次数
MOVA,R0
MOVP1,A
HERE:
SJMPHERE;死循环,还有另外一种形式是SJMP$
;******************************************
;外中断0服务程序
EXINT0:
INCR3;每来一次中断R3自加1
CJNER3,#100,NEXT;当来了100次中断之后,R3清零,然后P1口的
MOVR3,#00H;数左移一位,也就是让下一个LED亮
MOVA,R0
RLA
MOVP1,A
MOVR0,A;保存左移之后的结果
NEXT:
RETI
;******************************************
END
实验4扩展
ORG0000H
AJMPMAIN
;******************************************
;中断入口地址
ORG0003H
LJMPEXINT0
;******************************************
;主程序
ORG0030H
MAIN:
MOVSP,#70H
;初始化外中断0
SETBIT0
SETBEX0
SETBEA
;初始化8155
MOVDPTR,#0100H
MOVA,#03H
MOVX@DPTR,A
;显示缓存区
MOV30H,#1
MOV31H,#2
MOV32H,#3
MOV33H,#4
MOV34H,#5
MOV35H,#6
MOV36H,#7
MOV37H,#8
MOV38H,#9;这一句后面的CJNE会用到,用来判断1-8是否已经显示完了
MOVR2,#00H;用R2来记中断来的次数
MOV40H,#01H;用40H存放LED的状态
MOVA,40H
MOVP1,A
MOVR0,#30H;显示缓存区首地址给R0
MOVR4,#0FEH;字位送R4,因为只需要亮一个数码管,所以选择静态显示,没必要用动态显示
LOOP:
LCALLDISPLAY;循环调用显示程序
SJMPLOOP
;******************************************
;中断子程序
EXINT0:
INCR2
CJNER2,#100,NEXT;来100次中断之后才进行操作
MOVR2,#00H
MOVA,40H;移动LED
RLA
MOVP1,A
MOV40H,A
INCR0;让显示的数+1
CJNE@R0,#9,NEXT;如果到了9就回到1,因为我们只显示1-8
MOVR0,#30H
NEXT:
RETI
;******************************************
;显示子程序
DISPLAY:
MOVDPTR,#0102H;送字位
MOVA,R4
MOVX@DPTR,A
MOVDPTR,#DTAB;查表,送字形
MOVA,@R0
MOVCA,@A+DPTR
MOVDPTR,#0101H
MOVX@DPTR,A
LCALLDELAY
LD1:
RET
;******************************************;字形表
DTAB:
DB3FH,06H,5BH,4FH,66H
DB6DH,7DH,07H,7FH,6FH;0-F
DB77H,7CH,39H,5EH,79H
DB71H
;******************************************;延时1ms子程序
DELAY:
MOVR7,#02H
DEL1:
MOVR6,#0FFH
DEL2:
DJNZR6,DEL2
DJNZR7,DEL1
RET
;******************************************END
ORG0000H
AJMPMAIN
;中断入口地址
ORG0003H
LJMPEXINT0
;******************主程序
ORG0030H
MAIN:
MOVSP,#70H
;初始化外中断0
SETBIT0
SETBEX0
SETBEA
;初始化8155
MOVDPTR,#0100H
MOVA,#03H
MOVX@DPTR,A
;显示缓存区
MOV30H,#1
MOV31H,#2
MOV32H,#3
MOV33H,#4
MOV34H,#5
MOV35H,#6
MOV36H,#7
MOV37H,#8
MOV38H,#9
MOV40H,#01H;用40H存发光二极管的状态
MOVR2,#00H
MOVA,40H
MOVP1,A
MOVR0,#30H
MOVR4,#0FEH
LOOP:
LCALLDISPLAY
SJMPLOOP
;*************************
;中断子程序
EXINT0:
INCR2
CJNER2,#100,NEXT
MOVR2,#00H
MOVA,40H
RLA
MOVP1,A
MOV40H,A
INCR0
CJNE@R0,#9,NEXT1
MOVR0,#30H
NEXT1:
MOVA,R4
RLA
MOVR4,A
NEXT:
RETI
;显示子程序
DISPLAY:
MOVA,R4
MOVDPTR,#0102H
MOVX@DPTR,A
MOVDPTR,#DTAB
MOVA,@R0
MOVCA,@A+DPTR
MOVDPTR,#0101H
MOVX@DPTR,A
LCALLDELAYLD1:
RET;字形表DTAB:
DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH;延时1ms子程序DELAY:
MOVR7,#02HDEL1:
MOVR6,#0FFHDEL2:
DJNZR6,DEL2DJNZR7,DEL1RETEND;说明:
;R4是保存数码管字位;R3;R2是保存中断次数满100清0;R1;R0是保存数码管的字型实验5(1ORG0000HSJMPMAIN;****************************************8***********;中断入口地址ORG000BHLJMPT0INT;************************************************;主程序ORG0030HMAIN:
MOVSP,#70HMOVTMOD,#01H;T0选择方式1,16位定时器MOVTH0,#0F6H;#9EH;因为用示波器观察20HZ的方波不易观察,频率太低了,所以我换成了MOVTL0,#3CH;#58H;200HZ的,原理都是一样的,这样只是为了让波形更容易观察,后者是20HZ的初值SETBEA;开总中断SETBET0;开定时器0中断SETBTR0;启动定时器0SJMP$;死循环;********************************************************
;定时器0中断子程序(25ms2.5ms来一次中断T0INT:
MOVTH0,#0F6H;#9EH;重新赋初值MOVTL0,#3CH;#58HCPLP1.1;改变电平RETI;******************************************************