利用串行口扩展并口
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
附页:
实验线路图:
编译程序:
源程序代码:
1 汇编语言程序清单
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP INTT0
MAIN:
MOV SP,#60H
MOV TMOD,#01H
SETB ET0
SETB EA
MOV TH0,#3CH
MOV TL0,#0B0H
SETB TR0
MOV 30H, #0 ; 每中断一次加1
MOV 31H, #0 ; 每秒加1, 当其值为100时清0 MOV 32H, #0 ; 个位
MOV 33H, #0 ; 十位
LP:
MOV R0,#32H
MOV R7,#2
ACALL BINBCD
MOV DPTR,#TAB
DSPLY:
MOV A,@R0
MOVC A,@A+DPTR
CPL A
MOV SBUF,A
DSP1:
JNB TI,DSP1
CLR TI
INC R0
DJNZ R7,DSPLY
LP1:
MOV A,30H
CJNE A, #10, LP1
MOV 30H,#00H
INC 31H
MOV A,31H
CJNE A,#100,LP
MOV 31H,#0
SJMP LP
INTT0:
MOV TL0,#0B0H
MOV TH0,#3CH
INC 30H
RETI
TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
DB 0FFH,00H,73H
; 入口参数二进制数存放在31H中
; 出口参数 BCD数十位(33H), 个位(32H)
BINBCD:
MOV A,31H
MOV B,#10
DIV AB
MOV 33H,A
MOV A,B
MOV 32H,A
RET
END ; 程序结束
2 C 语言程序清单
#include
#include
#define uchar unsigned char
#define uint unsigned int
//共阴数码管段码:0~9,全亮,全灭,P
uchar
tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0xFF,0x00,0x 73};
uchar timer; //定时器每中断1次加1
void main(void)
{
uchar ten,one,count;
SP=0x60;
TMOD=0x01; //定时器T0方式1定时
ET0=1; //开定时器T0中断
EA=1; //开总中断
TH0=0x3C; //每100ms中断一次
TL0=0xB0;
TR0=1; //启动定时器T0
timer=0;
count=0;
do{
do{
ten=count/10; //求得十位
one=count%10; //求得个位
SBUF=~tab[one]; //发送个位
while(~TI);
TI=0;
SBUF=~tab[ten]; //发送十位
while(~TI);
TI=0;
while(timer<10); //延时1s,即10*100ms timer=0;
count++; //每隔一秒,count值加1 }while(count<100); //从0计到99
count=0;
} while(1);
}
void intt0() interrupt 1
{
TH0=0x3C;
TL0=0xB0;
timer++;
}