CR=1;//16位计数器开始工作 while(1); }
8-9甲乙两机利用串行口1的方式1实现双机通信,甲机将片内RAM中30H-3FH单元的内容传送到乙机片内RAM的50H-5FH单元,假设甲乙两机的波特率为2400bps,系统的时钟频率为11.0592MHz,试画出双机通信的电路图,并用汇编语言和C51分别编写相应的程序实现上述任务。
分析:甲乙两机都选择串行口1工作在方式3,9位异步通信方式,TB8作为奇偶校验位,甲机控制字SCON=0C0H,乙机SCON=0D0H。利用定时器T1工作在12T模式,方式2作为串行口的波特率发生器,TMOD=20H,设SMOD=0,PCON=7FH,波特率为2400bps,系统的时钟频率为11.0592MHz,可知T1的重装初值为F4H,
汇编子程序:
TRA_UART:MOV TMOD,#20H ANL AUXR,#0BFH MOV TL1,#0F4H MOV TH1,#0F4H ANL PCON,#7FH MOV SCON,#0C0H MOV R0,#30H
MOV R7,#10H SETB TR1 LOOP: MOV A,@R0 MOV C,P MOV TB8,C MOV SBUF,A WAIT: JNB TI,WAIT CLR TI INC R0
DJNZ R7,LOOP RET 已机接收子程序:
RES_UART: MOV TMOD,#20H MOV TL1,#0F4H MOV TH1,#0F4H ANL AUXR,#0BFH ANL PCON,#7FH MOV SCON,#0D0H MOV R0,#50H MOV R7,#10H SETB TR1 LOOP: NOP
WAIT: JNB RI,WAIT CLR RI MOV A,SBUF MOV C,P ANL C,/RB8 MOV F0,C MOV C,RB8
ANL C,/P ORL C,F0
JC ERROR MOV @R0,A INC R0
DJNZ R7,LOOP RET ERROR: … … RET
C语言程序:甲乙两机都选择方式1,8位异步通信方式,甲机的控制字SCON=40H,乙机的控制字SCON=50H,选择校验方式为和校验,其他不变 甲机的发送程序: #include
unsigned char i,j; SCON=0x40; TMOD=0x20; PCON=PCON&0x7F; AUXR=AUXR&0xBF; TL1=0xF4; TH1=0xF4; TR1=1; pf=0;
for(i=0;i<16;i++) {
SBUF=buf[i]; pf+=buf[i];
while (TI==0); TI=0;
} SBUF=pf; while (TI==0); TI=0; } while(1); }
已机接收程序: #include
unsigned char i,j; SCON=0x50; TMOD=0x20; PCON=PCON&0x7F; AUXR=AUXR&0xBF; TL1=0xF4; TH1=0xF4; TR1=1; pf=0;
for(i=0;i<16;i++) { while(RI==0) ;
RI=0;
buf[i] =SBUF; pf+=buf[i]; }
while (RI==0); RI=0;
if(SBUF^pf) error(); while(1); }
void error() {………..}
11-4 设计电路并编写程序:使用8255A驱动2个共阳极数码管,从0开始显示,每隔1秒钟加1,直到99,反复循环。
设计电路如图习题11—4。(此处74HC373作驱动之用,不是锁存)
汇编语言程序段:
APORT EQU 0F8FFH ;A口 BPORT EQU 0F9FFH ;B口 CONPORT EQU 0FBFFH ;控制字端口 AUXR EQU 8EH ORG 0H LJMP MAIN MAIN: MOV SP,#0AFH
ORL AUXR,#00000010B MOV A,#80H