实验任务
(1. 开机时,显示12:00:00的时间开始计时; (2. P0.0/AD0控制“秒”的调整,每按一次加1秒; (3. P0.1/AD1控制“分”的调整,每按一次加1分; (4. P0.2/AD2控制“时”的调整,每按一次加1个小时;
2. 电路原理图
P0_0~P0_3要加上拉电阻。
图4.20.1
3. 系统板上硬件连线
(1. 把“单片机系统”区域中的P1.0-P1.7端口用8芯排线连接到“动态数码显示”区域中的A
-H端口上;
(2. 把“单片机系统:区域中的P3.0-P3.7端口用8芯排线连接到“动态数码显示”区域中的S1
-S8端口上; (3. 把“单片机系统”区域中的P0.0/AD0、P0.1/AD1、P0.2/AD2端口分别用导线连接到“式
键盘”区域中的SP3、SP2、SP1端口上;
4. 相关基本知识
(1. 动态数码显示的方法 (2. 式按键识别过程
(3. “时”,“分”,“秒”数据送出显示处理方法
5. 程序框图
6. 汇编源程序
SECOND EQU 30H MINITE EQU 31H HOUR EQU 32H HOURK BIT P0.2 MINITEK BIT P0.1 SECONDK BIT P0.0 DISPBUF EQU 40H DISPBIT EQU 48H T2SCNTA EQU 49H T2SCNTB EQU 4AH TEMP EQU 4BH
ORG 00H LJMP START ORG 0BH LJMP INT_T0
START: MOV SECOND,#00H MOV MINITE,#00H MOV HOUR,#12 MOV DISPBIT,#00H MOV T2SCNTA,#00H MOV T2SCNTB,#00H MOV TEMP,#0FEH
LCALL DISP ;2KB范围内长调用 MOV TMOD,#01H
MOV TH0,#(65536-2000) / 256 ;2ms MOV TL0,#(65536-2000) MOD 256 SETB TR0 SETB ET0 SETB EA
WT: JB SECONDK,NK1 ;SECONDK是1转NK1,即按键SP1按下时转. LCALL DELY10MS JB SECONDK,NK1 INC SECOND MOV A,SECOND CJNE A,#60,NS60 MOV SECOND,#00H NS60: LCALL DISP JNB SECONDK,$ NK1: JB MINITEK,NK2 LCALL DELY10MS JB MINITEK,NK2 INC MINITE MOV A,MINITE CJNE A,#60,NM60 MOV MINITE,#00H NM60: LCALL DISP JNB MINITEK,$ NK2: JB HOURK,NK3 LCALL DELY10MS JB HOURK,NK3 INC HOUR MOV A,HOUR CJNE A,#24,NH24 MOV HOUR,#00H NH24: LCALL DISP
JNB HOURK,$
NK3: LJMP WT DELY10MS:
MOV R6,#10 D1: MOV R7,#248 DJNZ R7,$ DJNZ R6,D1 RET
DISP: ;将得出的时间存入40H (DISPBUF)之后的地址 MOV A,#DISPBUF ADD A,#8 DEC A MOV R1,A MOV A,HOUR MOV B,#10 DIV AB
MOV @R1,A ;累加器送内部RAM单元 @R1与R1区分?:@R1——R1为地址,@R1指向其内容。
R1 ——R1为变量,
DEC R1 MOV A,B MOV @R1,A DEC R1
MOV A,#10 ;输出符号“—” MOV@R1,A DEC R1
MOV A,MINITE MOV B,#10 DIV AB
MOV @R1,A DEC R1 MOV A,B MOV @R1,A DEC R1 MOV A,#10 MOV@R1,A DEC R1
MOV A,SECOND MOV B,#10 DIV AB
MOV @R1,A DEC R1 MOV A,B MOV @R1,A DEC R1 RET INT_T0:
MOV TH0,#(65536-2000) / 256 MOV TL0,#(65536-2000) MOD 256 MOV A, #0FFH MOV P3,A
MOV A,#DISPBUF
ADD A,DISPBIT ;地址加,并将时间的各位送到P1。 MOV R0,A MOV A,@R0
MOV DPTR,#TABLE MOVC A,@A+DPTR MOV P1,A
MOV A,DISPBIT MOV DPTR,#TAB MOVC A,@A+DPTR MOV P3,A INC DISPBIT MOV A,DISPBIT CJNE A,#08H,KNA MOV DISPBIT,#00H
KNA: INC T2SCNTA ;******时间的增加与进位****** MOV A,T2SCNTA CJNE A,#100,DONE MOV T2SCNTA,#00H INC T2SCNTB MOV A,T2SCNTB
CJNE A,#05H,DONE MOV T2SCNTB,#00H INC SECOND MOV A,SECOND CJNE A,#60,NEXT MOV SECOND,#00H INC MINITE MOV A,MINITE CJNE A,#60,NEXT MOV MINITE,#00H INC HOUR MOV A,HOUR CJNE A,#24,NEXT MOV HOUR,#00H NEXT: LCALL DISP DONE: RETI
TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,40H ;40H代表符号“—” TAB: DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FH END
7. C语言源程序
#include unsignedcharcodedispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; unsigned char dispbitcode[]={0xfe,0xfd,0xfb,0xf7, 0xef,0xdf,0xbf,0x7f};
unsigned char dispbuf[8]={0,0,16,0,0,16,2,1}; //初始化使显示时间的位全为12:00:00,其他都不点亮; 当将dispbitcode[2] 和dispbitcode[3]对应的16改为X(10~15中的一个),并将其指向dispcode[16]即0x00改为dispcode[X]即0x40。时分秒的间隔就为“—”。 unsigned char dispbitcnt; unsigned char second; unsigned char minite; unsigned char hour; unsigned int tcnt;
unsigned char mstcnt; unsigned char i,j; void main(void) {
TMOD=0x02; TH0=0x06; TL0=0x06; TR0=1; ET0=1; EA=1; hour=12; while(1) {
if(P0_0==0)
{
for(i=5;i>0;i--) for(j=248;j>0;j--); if(P0_0==0) {
second++; if(second==60) {
second=0; }
dispbuf[0]=second%10; dispbuf[1]=second/10; while(P0_0==0); } }
if(P0_1==0) {
for(i=5;i>0;i--) for(j=248;j>0;j--); if(P0_1==0) {
minite++; if(minite==60) {
minite=0; }
dispbuf[3]=minite%10; dispbuf[4]=minite/10; while(P0_1==0); } }
if(P0_2==0) {
for(i=5;i>0;i--) for(j=248;j>0;j--); if(P0_2==0) {
hour++; if(hour==24) {
hour=0; }
dispbuf[6]=hour%10; dispbuf[7]=hour/10; while(P0_2==0); } } } }
void t0(void) interrupt 1 using 0 {
mstcnt++; if(mstcnt==8) {
mstcnt=0;
P3=0xff; //关闭所有显示 P1=dispcode[dispbuf[dispbitcnt]]; P3=dispbitcode[dispbitcnt]; dispbitcnt++; if(dispbitcnt==8) {
dispbitcnt=0; } } tcnt++;
if(tcnt==4000) {
tcnt=0; second++; if(second==60) {
second=0; minite++; if(minite==60) {
minite=0; hour++; if(hour==24) {
hour=0; } } }
dispbuf[0]=second%10; dispbuf[1]=second/10; dispbuf[3]=minite%10; dispbuf[4]=minite/10; dispbuf[6]=hour%10; dispbuf[7]=hour/10; } }