目录
一.实验目的:
1.掌握51单片机前后台程序结构及编程方法;
2.了解数码管段码和位码的控制。
二.实验内容:
通过手动按键K3,使得数码管0位从“0”-“f”显示
通过手动按键K4,使得数码管1位从“0”-“f”显示
三.实验步骤:
1.理解共阴极数码管工作原理。
2.理解3-8译码器工作原理.
3.查询按键小兜并使得内存单元加1。
4.依次显示数码管0,1位上变化的数据。
四.实验程序
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP INT_K3;使机器执行下一条指令时无条件转移到addr16处执行程序,对应题目要求按动K3数码管0位显示次数(16进制)
ORG 0013H
LJMP INT_K4;同上,对应题目要求按动K4数码管1位显示次数(16进制)
ORG 0030H
MAIN:
SETB EA;EA置1,打开总中断
SETB IE0;允许定时器0中断
SETB IE1;允许外部中断
CLR IT0 ;令中断0为电平触发,这个方式需要有延时程序。否则,单片机处理速度快,按一下按键,已经处理了很多个低电平中断了
CLR IT1;外部中断1以低电平方式触发
SETB EX0;外部中断INT0的中断允许EX0=1打开外部中断
SETB EX1;打开定时器1的中断
MOV DPTR,#TAB;将表的首地址赋值给数据指针DPTR
MOV R5,#0;将寄存器R5清零
MOV R6,#0;将寄存器R6清零
L1:;本实验应用了3-8译码器的原理,本句指令为3-8评码器输出Y1
ACALL LOOP;调用循环,显示F后要求重新为0,不是进位变成1,需要用循环查表,此处为调用循环指令
LJMP L1;转移至L1
INT_K3:
ACALL LOOP
JNB P3.2,INT_K3;控制数码管0位
INC R5;R5内容加一
CJNE R5,#16,EIXT;判断R5是否为16,如果是的
MOV R5,#0;将R5清零(不进位)
RETI;中断返回指令
INT_K4:
ACALL LOOP
JNB P3.3,INT_K4;控制数码管1位
INC R6;R6内容加一
CJNE R6,#16,EIXT;判断R6是否为16,如果是的
MOV R6,#0;将R6清零(不进位
RETI;中断返回指令
LOOP:
MOV P2,#11111111B;将二进制数11111111B传送到P2锁存器中
MOV A,R5;
MOVC A,@A+DPTR;将形成的新地址中的数取出给A
MOV P0,A
ACALL DELAY;调用延时
MOV A,#11111011B
MOV P2,A;将二进制数11111011B传送到P2锁存器中
MOV A,R6
MOVC A,@A+DPTR;将形成的新地址中的数取出给A
MOV P0,A
ACALL DELAY;调用延时
RET
EIXT:
RETI
DELAY:
MOV R1,#10
DELY1: MOV R2,#10
DJNZ R2,$;R2内容减一,非0跳转
DJNZ R1,DELY1;
RET
TAB:
DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H;端口控制状态值
END
五、实验结果
六、实验小结
红外线对数码管有影响,红外源从数码管旁经过一次,即使没有按键,数码管的数值也会加一,所以当按动一次数值加多了的话,可以尝试一下将红外源远离单片机。要求不要有进位,即显示F后不可以为1,所以应用了循环查表。