求助单片机c语言数字时钟设计程序连接图!!!!

如题所述

数字钟〔★〕这里用了两种编写方法(即汇编语言与C语言)
(1. 开机时,显示12:00:00的时间开始计时;
(2. P0.0/AD0控制“秒”的调整,每按一次加1秒;
(3. P0.1/AD1控制“分”的调整,每按一次加1分;
(4. P0.2/AD2控制“时”的调整,每按一次加1个小时;
2. 电路原理图

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.0
MINITEK BIT P0.1
SECONDK BIT P0.2
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
MOV TMOD,#01H
MOV TH0,#(65536-2000) / 256
MOV TL0,#(65536-2000) MOD 256
SETB TR0
SETB ET0
SETB EA
WT: JB SECONDK,NK1
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:
MOV A,#DISPBUF
ADD A,#8
DEC A
MOV R1,A
MOV A,HOUR
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,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,#DISPBUF
ADD A,DISPBIT
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
TAB: DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FH
END

7. C语言源程序
#include <AT89X51.H>
unsigned char code dispcode[]={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]=;
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;
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;
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;
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-06-05
我有汇编语言的,你可以参考下:
ORG 0000H
LJMP MAIN ;上电,转主程序
ORG 0003H ;外部中断0入口地址
LJMP KEY1 ;跳转至校时程序
ORG 001BH ;定时器1中断入口地址
LJMP TIME ;跳转至时间服务程序
ORG 0013H ;外部中断1入口地址
LJMP KEY2 ;跳转至校分程序
ORG 0200H
MAIN: MOV TMOD,#10H ;设置T1为工作模式1
MOV TH1,#3CH
MOV TL1,#0F0H ;赋初值,定时50ms
MOV R7,#20 ;设置中断次数
MOV A,#00H
MOV 30H,A ;秒个位单元清零
MOV 31H,A ;秒十位单元清零
MOV 32H,A ;分个位单元清零
MOV 33H,A ;分十位单元清零
MOV 34H,A ;时个位单元清零
MOV 35H,A ;时十位单元清零
SETB EA ;CPU开中断
SETB ET1 ;允许T1中断
SETB EX0 ;允许外部中断0中断
SETB IT0 ;选择边沿触发方式
SETB EX1 ;允许外部中断1中断
SETB IT1 ;选择边沿触发方式
SETB TR1 ;启动T1定时
LCALL DISPLAY
SJMP $ ;等待
TIME: MOV TH1,#3CH
MOV TL1,#0F0H ;重新赋初值
SECOND: DJNZ R7,RETURN ;判断是否达到1s
MOV R7,#20
INC 30H ;秒个位单元加1
MOV A,30H
CJNE A,#10,RETURN ;如果秒个位等于10,则清零
MOV 30H,#00H
INC 31H ;秒十位单元加1
MOV A,31H
CJNE A,#6,RETURN ;如果秒十位等于6,则清零
MOV 31H,#00H
INC 32H ;分个位单元加1
MINENT: MOV A,32H
CJNE A,#10,RETURN ;如果分个位等于10,则清零
MOV 32H,#00H
INC 33H ;分十位单元加1
MOV A,33H
CJNE A,#6,RETURN ;如果分十位等于6,则清零
MOV 33H,#00H
INC 34H ;时个位单元加1
HOUR1: MOV A,35H
CJNE A,#2,HOUR2 ;若时的十位不等于2,再判断时的个位
MOV A,34H
CJNE A,#4,RETURN ;如果时的个位等于4,则清零
MOV 34H,#00H ;时个位清零
MOV 35H,#00H ;时十位清零
LJMP RETURN
HOUR2: MOV A,34H
CJNE A,#10,RETURN ;如果时个位等于10,则清零
MOV 34H,#00H
INC 35H ;时的十位加1
RETURN: LCALL DISPLAY ;调用显示子程序

RETI

DISPLAY:MOV DPTR,#TABLE
MOV A,30H
MOVC A,@A+DPTR
MOV P2,A ;送出秒个位
SETB P1.0
LCALL DELAY
CLR P1.0 ;显示秒个位
MOV A,31H
MOVC A,@A+DPTR
MOV P2,A ;送出秒十位
SETB P1.1
LCALL DELAY
CLR P1.1 ;显示秒十位
MOV A,32H
MOVC A,@A+DPTR
MOV P2,A ;送出分个位
SETB P1.2
LCALL DELAY
CLR P1.2 ;显示分个位
MOV A,33H
MOVC A,@A+DPTR
MOV P2,A ;送出分十位
SETB P1.3
LCALL DELAY
CLR P1.3 ;显示分十位
MOV A,34H
MOVC A,@A+DPTR
MOV P2,A ;送出时个位
SETB P1.4
LCALL DELAY
CLR P1.4 ;显示时个位
MOV A,35H
MOVC A,@A+DPTR
MOV P2,A ;送出时十位
SETB P1.5
LCALL DELAY
CLR P1.5 ;显示时十位

RET

KEY1: INC 34H ;校时
LJMP HOUR1
RETI

KEY2: INC 32H ;校分
LJMP MINENT
RETI

DELAY: MOV R6,#02H ;延时子程序
DLP1: MOV R5,#0FFH
DLP2: DJNZ R5,DLP2
DJNZ R6,DLP1
RET
TABLE: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ;字形显示编码.数码管字形显示编码表,共阳
;DB 03FH,06H,05BH,04FH,066H,06DH,07DH,07H,07FH,06FH 字形显示编码.数码管字形显示编码表,共阴
END本回答被提问者和网友采纳
相似回答