1、单片机实验利用中断控制 LED 灯1.实验目的(1)掌握单片机中断的基本原理。(2)掌握单片机中断程序的编制方法。2.预习要点(1)单片机中断基本原理(2)中断程序编制方法3.实验设备计算机、单片机实验箱、信号发生器。4.实验内容基本要求:将信号发生器输出的脉冲信号连接到 CPU 的 INT0 上,将 CPU 的 P1.0 到 P1.7和八个 LED 连接,脉冲信号为 5V、100Hz ,每输入一百个脉冲 LED 灯亮一次,并且 LED 灯顺序循环移位一次,形成跑马灯。扩展要求:提高输入脉冲频率,但跑马灯的显示频率不变。实验 4ORG 0000HAJMP MAIN;*;中断子程序入口地址ORG
2、 0003HLJMP EXINT0;*;主程序ORG 0030HMAIN:MOV SP,#70HSETB IT0 ;设置为下降沿触发SETB EX0 ;开 INT0 的中断开关SETB EA ;开总中断开关MOV R0,#01H ;只让一盏灯亮,R0 赋给 P1 口MOV R3,#00H ;R3 用来记中断次数MOV A,R0MOV P1,AHERE:SJMP HERE ;死循环,还有另外一种形式是 SJMP $;*;外中断 0 服务程序EXINT0:INC R3 ;每来一次中断 R3 自加 1CJNE R3,#100,NEXT ;当来了 100 次中断之后,R3 清零,然后 P1 口的MOV
3、 R3,#00H ;数左移一位,也就是让下一个 LED 亮MOV A,R0RL AMOV P1,AMOV R0,A ;保存左移之后的结果NEXT:RETI;*END实验 4 扩展ORG 0000HAJMP MAIN;*;中断入口地址ORG 0003HLJMP EXINT0;*;主程序ORG 0030HMAIN:MOV SP,#70H;初始化外中断 0SETB IT0SETB EX0SETB EA;初始化 8155MOV DPTR,#0100HMOV A,#03HMOVX DPTR,A;显示缓存区MOV 30H,#1MOV 31H,#2MOV 32H,#3MOV 33H,#4MOV 34H,#5
4、MOV 35H,#6MOV 36H,#7MOV 37H,#8MOV 38H,#9 ;这一句后面的 CJNE 会用到,用来判断 1-8 是否已经显示完了MOV R2,#00H ;用 R2 来记中断来的次数MOV 40H,#01H ;用 40H 存放 LED 的状态MOV A,40HMOV P1,AMOV R0,#30H ;显示缓存区首地址给 R0MOV R4,#0FEH ;字位送 R4,因为只需要亮一个数码管 ,所以选择静态显示,没必要用动态显示LOOP:LCALL DISPLAY ;循环调用显示程序SJMP LOOP;*;中断子程序EXINT0:INC R2CJNE R2,#100,NEXT
5、;来 100 次中断之后才进行操作MOV R2,#00HMOV A,40H ;移动 LEDRL AMOV P1,AMOV 40H,AINC R0 ;让显示的数+1CJNE R0,#9,NEXT ;如果到了 9 就回到 1,因为我们只显示 1-8MOV R0,#30HNEXT:RETI;*;显示子程序DISPLAY:MOV DPTR,#0102H ;送字位MOV A,R4MOVX DPTR,AMOV DPTR,#DTAB ;查表,送字形MOV A,R0MOVC A,A+DPTRMOV DPTR,#0101HMOVX DPTR,ALCALL DELAYLD1:RET;*;字形表DTAB:DB 3F
6、H,06H,5BH,4FH,66HDB 6DH,7DH,07H,7FH,6FH ;0-FDB 77H,7CH,39H,5EH,79HDB 71H;*;延时 1ms 子程序DELAY:MOV R7,#02HDEL1:MOV R6,#0FFHDEL2:DJNZ R6,DEL2DJNZ R7,DEL1RET;*ENDORG 0000HAJMP MAIN;中断入口地址ORG 0003HLJMP EXINT0;*主程序ORG 0030HMAIN:MOV SP,#70H;初始化外中断 0SETB IT0SETB EX0SETB EA;初始化 8155MOV DPTR,#0100HMOV A,#03HMOV
7、X DPTR,A;显示缓存区MOV 30H,#1MOV 31H,#2MOV 32H,#3MOV 33H,#4MOV 34H,#5MOV 35H,#6MOV 36H,#7MOV 37H,#8MOV 38H,#9MOV 40H,#01H ;用 40H 存发光二极管的状态MOV R2,#00HMOV A,40HMOV P1,AMOV R0,#30HMOV R4,#0FEHLOOP:LCALL DISPLAYSJMP LOOP;*;中断子程序EXINT0:INC R2CJNE R2,#100,NEXT MOV R2,#00HMOV A,40HRL AMOV P1,AMOV 40H,AINC R0CJN
8、E R0,#9,NEXT1MOV R0,#30HNEXT1:MOV A,R4 RL AMOV R4,A NEXT:RETI;显示子程序 DISPLAY:MOV A,R4MOV DPTR,#0102HMOVX DPTR,A MOV DPTR,#DTABMOV A,R0MOVC A,A+DPTRMOV DPTR,#0101HMOVX DPTR,ALCALL DELAYLD1:RET ;字形表DTAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH;延时 1ms 子程序 DELAY: MOV R7,#02HDEL1:MOV R6,#0FFHDEL2:DJNZ R6,D
9、EL2DJNZ R7,DEL1RETEND;说明: ;R4 是保存数码管字位;R3;R2 是保存中断次数 满 100 清 0;R1;R0 是保存数码管的字型实验 5(1)ORG 0000HSJMP MAIN;*8*;中断入口地址ORG 000BHLJMP T0INT;*;主程序ORG 0030H MAIN:MOV SP,#70HMOV TMOD,#01H ;T0 选择方式 1,16 位定时器MOV TH0,#0F6H ;#9EH ;因为用示波器观察 20HZ 的方波不易观察,频率太低了,所以我换成了MOV TL0,#3CH ;#58H ;200HZ 的,原理都是一样的 ,这样只是为了让波形更容易观察,后者是 20HZ 的初值SETB EA ;开总中断 SETB ET0 ;开定时器 0 中断 SETB TR0 ;启动定时器 0SJMP$ ;死循环;*;定时器 0 中断子程序 (25ms 2.5ms 来一次中断 )T0INT:MOV TH0,#0F6H ;#9EH ;重新赋初值 MOV TL0,#3CH ;#58HCPL P1.1 ;改变电平RETI;*