4.9 #define uint unsigned int main() {
uint data*m,*n,*P; for(;;){
m=0x20;n=0x22;P=0x24; if(*m<*n)*P=*n; else *P=*m: } }
4.10 将内部RAM 21H单元存放的BCD码数转换为二进制存入30H为首址的单元,BCD码的长度存放在20H单元中。 4.10 main() {
int data a=O,*P3: char i,*P1,*P2; Pl=0x20: P2=0x21: P3=0x30;
for(i=O;i<*P1;i++) {
a=a*10+*P2; P2++; }
*P3=a; }
4.11 将内部RAM 30H单元存放的2字节二进制数转换为十进制数存于21H为首的单元中,长度存放于20H单元中。 4.11 main()
{unsigned int a,k,*P3; char i,*P1,*P2: P1=0x20: P2=0x25: P3=0x30;
a=*P3;k=10000;
while(a/k==0)k=k/10; for(i=0;a!=0;i++) {*P2=a/k; a=a%k; P2++; k=k/10: *P1=i: }
第5章 并行口
17
5.1 8XX51的4个I/()端口的作用是什么?8XX51对外的三总线是如何分配的? 5.2 8XX51的4个I/0端口在结构上有何异同?使用时应注意什么? 5.3 为什么说8XX51能全部作为I/O口使用的仅有P1端口? 5.1~5.3 参阅5.1节
5.4 在例5-2中有如下语句:
MOV P1,#0FFH ;高4位的LED全灭,低4位输入线送“1” ABC: MOV A,P1 ;读P1口引脚开关状态,并送入A
为什么执行了ABC语句后A的值低4位为开关状态,而不是前一句的FFH,那么它的高4位值是什么呢?
5.4 由内部结构图可知,MOV P1,#0FFH将使锁存器Q=1,同时Q=0,VT截止,当执行MOV A,P1时,读引脚信号有效,低4位的开关电平通过门2进入内部总线到A,而读锁存器信号无效,门1关闭,Q的信号进不了内部总线,高4位没有引脚新的电平变化,由于VT截止,二极管也截止,进入门2的是VT的漏极电压Vcc,因此,高4位通过门2读入的均是高电平即1111 B。
5.5 利用8XX51的P1口,监测某一按键开关,使每按键一次,输出一个正脉冲(脉宽随意),画出电路并编出程序。 5.5 用P1.7监测按键开关,P1.0引脚输出正脉冲,正脉冲的产生只需要将P1.0置零、置1、延时、再置零即可。P1.0接一示波器可观察波形。如果再接一发光二极管,可观察到发光二极管的闪烁。电路设计图如习题5.5图。 汇编语言程序 ORG 0000H ABC:CLR P1.0 SETB P1.7
JB P1.7,$ ;等键按下 JNB P1.7,$ ;待键弹起 SETB P1.0
MOV R2,#0 DAY:NOP NOP
DJNZ R2,DAY
SJMP ABC
C语言编程
sfr P1=0x90: sbit p1_O=P1^O; sbit p1_7=P1^7; main(){
unsigned char i; while(1){ P1=0x80:
do{}while(p1_7==1);/*等键按下*/ do{}while(p1_7==O);/*等键弹起*/
p1_0=1; for(i=O;i<255;i++); }}
18
5.6 利用8XX51的P1口控制8个发光二极管LED。相邻的4个LED为一组,使两组每隔0.5s交替发亮一次,周而复始,画出电路并编写程序(设延时0.5s子程序为D05,已存在)。
5.6 电路见习题5.6图,初始值送0FH到P1,再和0FFH异或从P1口输出,或使用SWAP A指令。然后从P1口输出,循环运行,注意输出后要延时。
汇编语言程序 ORG 0000H MOV A,#OFH ABC:MOV P1,A ACALL D05 SWAP A SJMP ABC
D05:MoV R6,250 DY:MOV R7,250 DAY:NOP NOP
DJNZ R7,DAY DJNZ R6,DY RET END
C语言编程
sfr P1=0x90; main( ){ int i;
19
P1=0xf0; while(1){ P1=~P1;
fOr(i=0;i<5000;i++); }
5.7 用89C51/89S51并行口设计显示?个数码的电路,使数码管循环显示“O”~“F”。 5.7 如使用共阴极数码管,阴极接地,阳极a~g分别接P0~P3的某个口的7位,将0~F的段码列成表,表的内容顺次从该口输出。如数码管接P3口。 汇编语言程序 0RG 0000H
MOV DPTR,#TAB AGAIN:MOV R0,#0 NEXT:MOV A,RO MOVC A,@A+DPTR MOV P3,A MOV R7,#0 DAY:NOP NOP
DJNZ R7,DAY INC R0
CJNE R0,#10H,NEXT
SJMP AGAIN ;段码表(略) TAB:DB 3FH,06H? END
C语言程序
#include(reg51.h)
#defint uint unsigned int #define uchar unsigned char main(){ umtj; uchar i; uchar code
tab[16]={0x3f,0x06??);,/*段码表(略)*/ while(1){ for(i=O;i<=15;i++) {P3=tab[i]};
for(j=O;j<10000;j++);/*延时*/ } }
5.8 设计一个能显示4位数码的电路,并用C语言和汇编语言编程使“8”能跑马显示8遍。
5.8 电路设计见习题5.8图,分别用汇编语言和C语言的编程如下: 汇编语言程序
20