内容发布更新时间 : 2024/11/9 0:58:26星期一 下面是文章的全部内容请认真阅读。
0RG 0000H MOV A,#08H
M()V DPTR,#TAB MOVC A,@A+DPTR MOV P1,A
MOV R2,#08H AGAIN:M()V A,#01 NEXT:M()V P3,A ACALL DAY RL A
CJNE A,#10H,NEXT DJNZ R2,AGAIN TAB:DB 3FH,06H? END
C语言程序
#include
#definc uint unslgned int #deflne uchar unsigned char main(){ uchar code
tabl[]={0x3f,0s06?} uchar i,m; uint j;
for(m=O;m<8;i++){ P3=0x01:
for(i=0;i<4;i++){ P1=tabl[8] P3<<=1:
for(j=0;j<=25000;j++); }}}
21
5.9 利用89C51/89S51并行口设计8×8的矩阵键盘并用箭头标明信号的方向。
5.9 P1口的8根线接行线,输出行扫描信号,P3口的8根线接列线,输入回馈信号。见习题5.9图。
第6章 中断
6.1 8XXSl有几个中断源?各中断标志是如何产生的,又如何清除? 6.2 8XX51中断源的中断请求被响应时,各中断入口地址是多少?在什么物理存储空间? 6.3 MCS-51系列单片机的中断系统有几个优先级?如何设定? 6.4 简述8XX51中断处理的过程,画出流程图。 6.1~6.4 参见 6.1节~6.2节
6.5 用8XX51的P1口接8个LED发光二极管,由INT0接一消抖开关,开始P1.0的LED亮,以后每中断一次,下一个LED亮,顺序下移,且每次只一个LED亮,周而复始。画出电路图,并编制程序。
6.5 电路设计见习题6.5图 汇编语言程序 ORG 0000H AJMP MAlN 0RG 0003H
RL A ;中断服务 MOV P1.A RETI
MAIN:MOV A,#0FEH
MOV P1,A ;第一灯亮 SETB EA SETB EX0 SETB IT0 SJMP$ C语言程序
#include
22
P1=P1<<1|0x01; }
main(){ P1=0xfe; EA=1;EX0=1; IT0=1;
do{}whik(1);}
汇编语言中只有一个中断源,不存在占用别的中断源向量地址问题,程序顺序排下,应注意程序的执行过程。C语言无循环移位指令,移位后,后面补零,因此和01相或。
6.6 在题6.5电路的基础上,要求8个LED同时亮或同时灭,每中断一次,变反一次,编出程序。 6.6 略
6.7 要求同题6.6,要求亮、灭变换5次(一亮,一灭为一次),编出程序。 6.7 汇编语言程序 ORG O000H AJMP MAIN
ORG 0003H ;中断服务 XRL P1,#OFFH DJNZ R0,NE
CLR EA NE:RETI
ORG 0030H MAIN: SETB EA SETB EXO SETB ITO
MOV P1,#OFFH MOV R0,#OAH
SJMP$ ;等待中断 C语言程序
#include
ic()itrrupt 0{ i++:
if(i<=10)P1=~P1:
23
eIse EA=O: }
main()
{EA=1;EX0=1;IT0=1; P1=0xff: for(;;);/*等待中断*/
}
因一亮一灭为一次,所以共10次。
6.8 利用8XX51的并行口接2个数码管,显示INT1中断次数(次数不超过FFH)。 6.8两个数码管阳极经驱动器接P1口,阴极分别接P3.0、P3.1。 #include
unsigned char a,b,i=0;
unsigned char code
tab[16]={0x3f,0x06,0x5b,Ox4f,0x66,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x73}:
sbit p3_O=P3^0; sbit p3_1=P3^1; main(){ a=tab[O]; b=tab[0]; p3_0=O; p3_1=0; EA=1; EX0=1; IT0=1; for(;;){
p3_O=1; p3_1=0; P1=b: delay();
p3_0=O; p3_1=1; P1=a: delay(); }}
void intr()interrupt 0{ unsigned charj,k; EX0=O; i++;
j=i&0x0f; k=i&0xf0; k>>=4; a=tab[k];
24