现在情况是通电后就显示乱码而且有时候重新通电后显示的不一样,硬件图如下: 但有几点需说明下 1、电容是选择了5PF,因手头上没有6PF电容,有些资料上好象都没接 2、上拉电阻是用4.7K,也是因为现手头上无10K的,有些资料上好象都没接 3、晶振的3脚电压为2.4V,2脚电压为0V,由于没有示波器,所以不能量频率,也就不能判断电路是否起振
软件程序如下: 且做几点补充说明 1、对控制字(写保护控制字)8EH写入了00H; 2、对秒寄存器80H写入了00H;
显示电路,程序是正常的, 测试过,显示是4位一体数码管,中间两点0.5S闪烁一次,现在我不能判断DS1302是否起振,所以也不知道是程序的问题还是硬件的问题,还请各位指点! SCLK BIT P3.2; IO BIT P3.3; RST BIT P3.4; HOUR EQU 62H; MIN EQU 61H; SECOND EQU 60H; DS1302_ADDR EQU 31H; DS1302_DATA EQU 32H; ORG 0000H; LJMP START;跳转到标号START处执行 ORG 0003H; RETI ; ORG 000BH;定时器T0中断程序入口 LJMP INTT0;跳转到T0中断服务程序 ORG 0013H; RETI ; ORG 001BH;定时器T1中断程序入口 LJMP INTT1;跳转到T1中断服务程序 ORG 0023H;串行中断入口程序 RETI ; ;\\\\\\\\\\\\\\\\\\\\\\\\ ;主程序 ;\\\\\\\\\\\\\\\\\\\\\\\\ START: MOV P1,#0FFH; MOV SCON,#00H; MOV TMOD,#011H;工作方式1 MOV TL0,#0B0H;T0计数用,50MS定时初值,用于秒点闪烁定时 MOV TH0,#3CH; MOV TL1,#0B0H; T1闪烁用,50MS定时初值,用于闪烁定时 MOV TH1,#3CH; SETB EA ; SETB ET0; SETB TR0; MOV R3,#0AH; SETB 00H;清秒点闪烁标志位 SETB 01H;清定时模式显示位标志位 CLR P1.5;禁止蜂鸣器开机发声 MOV DS1302_ADDR,#8EH;写入控制字地址 MOV DS1302_DATA,#00H;允许写1302,8EH最高位为0时允许写操作,为1时允许读操作; LCALL WRITE; 调用写程序 MOV DS1302_ADDR,#82H;对分初始化 MOV DS1302_DATA,#00H; LCALL WRITE; 调用写程序 MOV DS1302_ADDR,#84H;对时初始化 MOV DS1302_DATA,#00H; LCALL WRITE; 调用写程序 MOV DS1302_ADDR,#80H;启动DS1302 MOV DS1302_DATA,#00H;对秒位最高位置0,启动DS1302 LCALL WRITE; 调用写程序 MOV DS1302_ADDR,#8EH;写入控制字地址 MOV DS1302_DATA,#80H;禁止写1302,8EH最高位为0时允许写操作,为1时允许读操作; LCALL WRITE; 调用写程序
MAIN: MOV DS1302_ADDR,#81H;读出秒 LCALL READ; MOV SECOND,DS1302_DATA; MOV DS1302_ADDR,#83H;读出分 LCALL READ; MOV MIN,DS1302_DATA; MOV DS1302_ADDR,#85H;读出时 LCALL READ; MOV HOUR,DS1302_DATA; MOV R0,SECOND; LCALL LEAVE;将秒分离成两个数 MOV 41H,R1;将秒位分别存到两个内存单元和两个秒显示单元; MOV 71H,41H; MOV 42H,R2; MOV 72H,42H;
MOV R0,MIN; LCALL LEAVE;将分分离成两个数 MOV 43H,R1;将分位分别寸到两个内存单元和两个分显示单元; MOV 73H,43H; MOV 44H,R2; MOV 74H,44H; MOV R0,HOUR; LCALL LEAVE;将时分离成两个数 MOV 45H,R1;将时位分别寸到两个内存单元和两个分显示单元; MOV 75H,45H; MOV 46H,R2; MOV 76H,46H; LCALL DISP; ;JNB P1.0,TIME0;判断SET键是否按下 LJMP MAIN;
;\\\\\\\\\\\\\\\\\\\\\\\\ ;时间调整程序 ;\\\\\\\\\\\\\\\\\\\\\\\\ TIME0: ;\\\\\\\\\\\\\\\\\\\\\\\\ ;调时闪动程序 ;\\\\\\\\\\\\\\\\\\\\\\\\ INTT1: ;\\\\\\\\\\\\\\\\\\\\\\\\ ;分离程序 ;\\\\\\\\\\\\\\\\\\\\\\\\ LEAVE: MOV A,R0;分离程序 ANL A,#0FH; MOV R1,A; MOV A,R0; SWAP A; ANL A,#0FH; MOV R2,A; RET;
;\\\\\\\\\\\\\\\\\\\\\\\\ ;写DS1302 ;\\\\\\\\\\\\\\\\\\\\\\\\
WRITE: CLR SCLK; NOP; SETB RST; NOP; MOV A,DS1302_ADDR; MOV R4,#08H; WRITE1: RRC A;从低位到高位 NOP; NOP; CLR SCLK; NOP; NOP; NOP; MOV IO,C;CLK上升沿时写入地址到1302 NOP; NOP; NOP; SETB SCLK; NOP; NOP; DJNZ R4,WRITE1; CLR SCLK; NOP; MOV A,DS1302_DATA; MOV R4,#08H; WRITE2: RRC A; NOP; CLR SCLK; NOP; NOP; MOV IO,C;CLK上升沿时写入数据到1302 NOP; NOP; NOP; SETB SCLK; NOP; NOP; DJNZ R4,WRITE2; CLR RST; RET; ;\\\\\\\\\\\\\\\\\\\\\\\\ ;读DS1302 ;\\\\\\\\\\\\\\\\\\\\\\\\ READ: CLR SCLK; NOP; NOP; SETB RST; NOP; MOV A,DS1302_ADDR; MOV R4,#08H; READ1: RRC A;从低位到高位 NOP; MOV IO,C;CLK上升沿时写入地址到1302 NOP; NOP; NOP; SETB SCLK; NOP; NOP; NOP; CLR SCLK;添加 NOP; NOP; DJNZ R4,READ1; MOV R4,#08H; READ2: CLR SCLK;注意是CLK第8个脉冲的下降沿,不是第9个 NOP; NOP; NOP; MOV C,IO;CLK下沿时从1302读出数据 NOP; NOP; NOP; NOP; NOP; RRC A;从最低位开始读数据 NOP; NOP; NOP; NOP; SETB SCLK; NOP; DJNZ R4, READ2; MOV DS1302_DATA,A; CLR RST; RET;
INTT0: PUSH ACC;累加器入栈 PUSH PSW;状态字入栈 CLR ET0; CLR TR0;关闭T0 MOV A,#0B7H ADD A,TL0 MOV TL0,A MOV A,#3CH ADDC A,TH0 MOV TH0,A SETB TR0;启动定时器T0 DJNZ R3,OUT0;中断10次未到继续中断 CPL 00H;对秒点闪烁标志位取反 MOV R3,#0AH;0.5S到重新赋值 OUT0: POP PSW;状态字入栈 POP ACC;累加器入栈 SETB ET0; RETI;中断返回
;\\\\\\\\\\\\\\\\\\\\\\\\ ;显示程序 ;\\\\\\\\\\\\\\\\\\\\\\\\ DISP: MOV P0,#0FFH; DISPLAY: MOV DPTR,#TAP;取断码表地址 JNB 00H,NEXT; MOV P0,#07FH; CLR P2.2; 开秒位上面小数点 LCALL D1MS; 延时1MS SETB P2.2; MOV P0,#07FH; CLR P2.3; 开秒位上面小数点 LCALL D1MS; 延时1MS SETB P2.3; AJMP NEXT1;
NEXT: MOV P0,#0FFH; CLR P2.2; 关秒位上面小数点 LCALL D1MS; 延时1MS SETB P2.2; MOV P0,#0FFH; CLR P2.3; 关秒位上面小数点 LCALL D1MS; 延时1MS SETB P2.3; NEXT1: MOV A,73H; 分个位显示 MOVC A,@A+DPTR;查显示数据对应断码 MOV P0,A; 送P0口显示 CLR P2.3; 开分个位显示器位口 LCALL D1MS; 延时1MS SETB P2.3; 关分个位显示器位口
MOV A,74H; 分十位显示 MOVC A,@A+DPTR;查显示数据对应断码 MOV P0,A; 送P0口显示 CLR P2.2; 开分十位显示器位口 LCALL D1MS; 延时1MS SETB P2.2; 关分十位显示器位口 MOV A,75H; 时个位显示(同时秒小数点亮) MOVC A,@A+DPTR;查显示数据对应断码 MOV P0,A; 送P0口显示 CLR P2.1; 开时个位显示器位口 LCALL D1MS; 延时1MS SETB P2.1; 关时个位显示器位口 MOV A,76H; 时十位显示 MOVC A,@A+DPTR;查显示数据对应断码 MOV P0,A; 送P0口显示 CLR P2.0; 开时十位显示器位口 LCALL D1MS; 延时1MS SETB P2.0; 关时十位显示器位口 JB 01H,DISPOUT;不是定时值设置模式将不显示模式位,是则显示 MOV A,78H; MOVC A,@A+DPTR;查显示数据对应断码 MOV P0,A; 送P0口显示 CLR P2.4; 开定时模式位显示器位口 LCALL D1MS; 延时1MS SETB P2.4; 关定时模式位显示器位口
DISPOUT: RET; TAP: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH;共阳数码管 ; 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 , "不亮" ;\\\\\\\\\\\\\\\\\\\\\\\\ ;延时程序 ;\\\\\\\\\\\\\\\\\\\\\\\\ D1MS: MOV R7,#250;延时1MS DL0: NOP; NOP; DJNZ R7,DL0; RET; END;
|