
我这写了一个!使用数码管显示的!可以用键盘校对时间!你参考下。还写了一个液晶显示的!你要的话也可以发给你!
#include<reg52h>
#define uchar unsigned char
#define uint unsigned int
sbit K1=P3^0;
sbit K2=P3^1;
sbit K3=P3^2;
uchar table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f};
uchar table1[]={0x5b,0x66,0x6d,0x6f,0x6d,0x6f};
uchar table2[]={0,1,0,0,0,0};
int shi=1,fen=0,miao=0;
uchar a,i,j,temp=-2,temp1;
void sfm(uchar dz,uchar shu);//将计的数的十位和个位分开
void display();//将时间显示出来
void display1(uchar dz);//只显示要校对的数
void init();//初始化
void jiaoshi();//定义一个校时函数
void delay(uchar z)//定义一个延时函数
{
uchar x,y;
for(x=0;x<50;x++)
for(y=0;y<z;y++);
}
void main()
{
init();
while(1)
{
jiaoshi();
}
}
void init()
{
EA=1;
ET0=1;
ET1=1;
TR1=1;
TR0=0;
TMOD=0x11;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
K1=K2=1;
temp1=0;
while(TR1)
{
for(i=0;i<6;i++)
{
delay(3);
P1=i;
P2=table1[i];
delay(3);
}
}
}
void sfm(uchar dz,uchar shu)
{
if(shu==60&dz!=0) shu=0;
table2[dz]=shu/10;
table2[dz+1]=shu%10;
}
void display()
{
uchar j;
for(j=0;j<6;j++)
{
delay(3);
P1=j;
P2=table[table2[j]];
delay(3);
}
}
void display1(uchar dz)
{
uchar j;
for(j=0;j<2;j++)
{
delay(3);
P1=dz+j;
P2=table[table2[dz+j]];
delay(3);
}
}
void jiaoshi()
{
uchar a;
if(K1==0)
{
delay(5);
if(K1==0)
{
TR0=0;
a++;
temp+=2;
if(a==4|temp==6)
{
a=0;
temp=-2;
TR0=1;
}
}
}
while(!K1)
{
delay(5);
display1(temp);
}
while(!K1);
display1(temp);
if(K2==0)
{
delay(5);
if(K2==0)
{
if(a==1)
{
temp=0;
if(shi==24)
shi=0;
shi++;
sfm(0,shi);
}
if(a==2)
{
temp=2;
if(fen==59)
fen=-1;
fen++;
sfm(2,fen);
}
if(a==3)
{
temp=4;
if(miao==59)
miao=-1;
miao++;
sfm(4,miao);
}
}
}
while(!K2)
{
delay(5);
display1(temp);
}
while(!K2);
if(K3==0)
{
delay(5);
if(K3==0)
{
if(a==1)
{
shi--;
if(shi==0)
shi=24;
sfm(0,shi);
}
if(a==2)
{
fen--;
if(fen==-1)
fen=59;
sfm(2,fen);
}
if(a==3)
{
miao--;
if(miao==-1)
miao=59;
sfm(4,miao);
}
}
}
while(!K3)
{
delay(5);
display1(temp);
}
while(!K3);
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
a++;
if(a==16)
{
a=0;
miao++;
sfm(4,miao);
if(miao==60)
{
miao=0;
display();
fen++;
sfm(2,fen);
if(fen==60)
{
fen=0;
shi++;
sfm(0,shi);
if(shi==25)
{
shi=1;
sfm(0,shi);
}
}
}
}
display();
}
void timer1() interrupt 3
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
j++;
if(j==20)
{
TR0=1;
TR1=0;
}
}
第一问比较简单,拓展功能比较繁琐,要考虑闰年的影响,计算复杂一些。
以下是简单的时钟:
#include<reg52h>
#define uchar unsigned char
#define uint unsigned int
uchar a=0;//中断次数
uchar sec=0,min=0,hour=0;//时分秒
uchar date=1,mon=1, year=19;//年月日,年只计算后2 位,如2019,只考虑19
uchar tablemon[12]={31,28,31,30,31,30,31,31,30,31,30,31};//每月有多少天,2月按28天考虑
void main(void )//主程序
{
TMOD=0x01;// 定时器0工作方式一,方式2一次只能定时256us,中断太频繁 ,不建议使用
ET0=1;
EA=1;
TH0=(65536-50000)/256;//定时50ms
TL0=(65536-50000)%256;
TR0=1;
while(1)
{ dislpay();}//显示子程序,与硬件连接有关
}
//中断子程序
void Timer0(void) interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
a++;
if(a==20) {a=0;sec++;}//20次是1秒
if(sec==60) {sec=0;min++;}
if(min==60) {min=0;hour++;}
if(hour==24){hour=0;date++;}
if(date>tablemon[ mon-1]){date=1;mon++;}
if(mon==13){mon=1;year++;}
}
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;系统名称: 数字钟
;创健人:济南, 日期:2005619
;系统功能描述:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;修改人: 修改日期:
;修改原因:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;蕊片型号:AT89C51 晶振:12MHZ
;-------------硬件连接---------------------
;
;
;-----------------------------------------------
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;程序名称: 声明区
;功能描述: 声明各常量和变量
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SECOND EQU 30H ;存储妙
MINITE EQU 31H ;存储分
HOUR EQU 32H ;存储时
SPEAKER BIT P37
HOURK BIT P32 ;时键
MINITEK BIT P33 ;分键
SECONDK BIT P30 ;妙键
FLAG BIT 00H
FLAG1S BIT 01H ;1S到标志位
DISPBUF EQU 40H ; 段选标志
DISPBIT EQU 48H ; 位选通标志
T2SCNTA EQU 49H ; 中断次数
T2SCNTB EQU 4AH ; 中断次数
TEMP EQU 4BH ; 初始化位
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;程序名称:主程序
;功能描述;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORG 00H
LJMP START
ORG 0BH
LJMP INT_T0 ;T0中断入口
START: MOV SECOND,#00H ;妙初始化0
MOV MINITE,#00H ;分初始化0
MOV HOUR,#12 ;时始化送12
MOV DISPBIT,#00H ;位选通标志
MOV T2SCNTA,#00H ;标志
MOV T2SCNTB,#00H ;标志
CLR FLAG
CLR FLAG1S
SETB SPEAKER
MOV TEMP,#07FH ;初始位,让第一个位选通
LCALL DISP ;调用显示处理程序
MOV TMOD,#01H ;方式1
MOV TH0,#0F8H ;赋值20MS
MOV TL0,#030H
SETB TR0 ;开中断启动
SETB ET0
SETB EA
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;程序名称:按键程序
;功能描述;调整分,时
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
WT: JNB FLAG,CC
LCALL SPEAKING
CC: JB SECONDK,NK1 ;妙末按下,转去判断分键
LCALL DELY10MS ;按下,延时,消抖动
JB SECONDK,NK1 ;再次判断是否按下
INC SECOND ;按下,按下一次加1
MOV A,SECOND ;送A判断
CJNE A,#60,NS60 ;妙末到60转分
MOV SECOND,#00H ;到了,回0
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 ;返回
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;程序名称:显示处理程序
;功能描述;,该程序实现时,分,秒计时转换为BCD码并存储在以47H起始地址的显示
;输出数据存储单元里,即显示缓冲区47H至40H单元
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DISP:
MOV A,#DISPBUF ;送40H
ADD A,#7 ;加8
;DEC A
MOV R1,A ;送47H
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
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;程序名称:显示程序
;功能描述;在LED上显示为12-12-12显示模式
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INT_T0:
MOV TH0,#0F8H ;重赋值
MOV TL0,#030H
MOV A,#DISPBUF ;段偏移存储
ADD A,DISPBIT ;位偏移量
MOV R0,A ;段偏移存储
MOV A,@R0 ;段偏移量
MOV DPTR,#TABLE ;指向字形表
MOVC A,@A+DPTR ;取字形
MOV P0,#0 ;防闪烁
MOV P0,A ; 字形选P1口显示
MOV A,DISPBIT ;位移偏量
MOV DPTR,#TAB ;指向位选
MOVC A,@A+DPTR ;取位选通
MOV P2,A ;位送P3口选通
INC DISPBIT ;位偏移加1
MOV A,DISPBIT ;位偏移送A
CJNE A,#08H,KNA ;八个数管码扫描完不
MOV DISPBIT,#00H ;描完重新开始
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;程序名称:1秒计时程序
;功能描述;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
KNA: INC T2SCNTA
MOV A,T2SCNTA
CJNE A,#100,DONE
MOV T2SCNTA,#00H
INC T2SCNTB
MOV A,T2SCNTB
CJNE A,#05H,DONE
SETB FLAG1S
MOV T2SCNTB,#00H
INC SECOND ;秒加1
MOV A,SECOND
CJNE A,#50,BB ;50S到
MOV A,MINITE
CJNE A,#59,BB ;59分
SETB FLAG ;打开正点响标志
BB: MOV A,SECOND
CJNE A,#60,NEXT ;秒超过60了没有 没有,调用显示处理程序
MOV SECOND,#00H
INC MINITE ;分加1
MOV A,MINITE
CJNE A,#60,NEXT
MOV MINITE,#00H ;分超过60,清0
INC HOUR ;并时加1
MOV A,HOUR
CJNE A,#24,NEXT ;是否超过24小时不是,则跳至NEXT
MOV HOUR,#00H
NEXT: LCALL DISP ; 调用显示处理程序
DONE: RETI ;中断返回
TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,40H ;0到9字形(40表示横扛)
TAB: DB 07FH,0BFH,0DFH,0EFH,0F7H,0FBH,0FDH,0FEH
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;程序名称:正点报时子程序
;功能描述; 前十秒报第一声,每隔一秒报一声
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SPEAKING:MOV R5,#6
AA: CLR SPEAKER
JNB FLAG1S,$ ;延时1S
CLR FLAG1S
SETB SPEAKER
JNB FLAG1S,$
CLR FLAG1S
DJNZ R5,AA
CLR FLAG
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;程序名称:延时子程序
;功能描述;按键消抖调用
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DELY10MS:MOV R6,#10
D1: MOV R7,#248
DJNZ R7,$
DJNZ R6,D1
RET
#include<reg51h>
#include<intrinsh>
void DoKey();
unsigned char numcode[]={0xc0,0xf9,0xa4,0x0b0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char buf[8];
unsigned char g_timer;
unsigned char keyvalue;
struct Clock
{
unsigned char hour;
unsigned char minute;
unsigned char second;
} CurrentClock,BeepClock;
unsigned char ProgramStatus;
/
ProgramStatus =0--Current Clock Run ;
ProgramStatus =1--Change Current Clock minute
ProgramStatus =2--Change Current Clock hour
ProgramStatus =3--Change Beep Clock minute
ProgramStatus =4--Change Beep Clock hour
/
//定义各个键值
#define UPKEY 6
#define DOWNKEY 5
#define MODEKEY 3
void InitSystem()
{
CurrentClockhour = 11;
CurrentClockminute = 59;
CurrentClocksecond = 55;
BeepClockhour = 12;
BeepClockminute = 0;
BeepClocksecond = 0;
//initial T0
TMOD = 0x01;
TH0 = 0xE0;
TL0 = 0x20;
g_timer = 100;
EA = 1;
ET0 = 1;
TR0 = 1;
//initial INT1
IT1 = 1;
EX1 = 1;
ProgramStatus = 0;
}
void ClockRun()
{
CurrentClocksecond ++ ;
if(CurrentClocksecond>=60)
{
CurrentClocksecond = 0 ;
CurrentClockminute ++;
if(CurrentClockminute>=60)
{
CurrentClockminute = 0;
CurrentClockhour++;
if(CurrentClockhour>=24)
CurrentClockhour = 0;
}
}
g_timer = 100 ;
}
void Delay( )
{
int i = 10;
for(;i>0;i--)
;
}
void ShowClock(struct Clock DisplayClock)
{
unsigned char i;
buf[0] = numcode[DisplayClockhour/10];
buf[1] = numcode[DisplayClockhour%10];
buf[2] = 0xbf;
buf[3] = numcode[DisplayClockminute/10];
buf[4] = numcode[DisplayClockminute%10];
buf[5] = 0xbf;
buf[6] = numcode[DisplayClocksecond/10];
buf[7] = numcode[DisplayClocksecond%10];
P0 = 0xfe;
for(i=0;i<=7;i++)
{
P1 = buf[i];
Delay();
P1 = 0xff;
Delay();
P0=_crol_(P0,1);
}
}
void T0_ISR ()interrupt 1
{
TR0 = 0 ;
TH0 = 0xE0;
TL0 = 0x20;
if(g_timer)
g_timer--;
else
ClockRun();
TR0 = 1;
}
void INT1_ISR() interrupt 2 //检测到有键按下,(不考虑按键抖动)
{
keyvalue = P3&0x07;
if(keyvalue!=0x07)
DoKey();
}
void DoKey()
{
if(keyvalue==MODEKEY) //修改走时的分针状态
{
ProgramStatus++;
if(ProgramStatus==5)
ProgramStatus=0;}
if(keyvalue==UPKEY)
{
if(ProgramStatus==1)
CurrentClockminute++;
if(CurrentClockminute>=60)
CurrentClockminute=0;}
if( keyvalue==DOWNKEY)
{
if(ProgramStatus==1&&CurrentClockminute>=1)
CurrentClockminute--;
else
CurrentClockminute=59;
}
if(keyvalue==UPKEY) //修改走时的时针状态
{
if(ProgramStatus==2)
CurrentClockhour++;
if(CurrentClockhour>=24)
CurrentClockhour=0;}
if(ProgramStatus==2&&keyvalue==DOWNKEY)
{
if(CurrentClockhour>=1)
CurrentClockhour--;
else
CurrentClockhour=23;
}
if(keyvalue==UPKEY) //修改闹时分针的状态
{if(ProgramStatus==3)
BeepClockminute++;
if(BeepClockminute>=60)
BeepClockminute=0;}
if(ProgramStatus==3&&keyvalue==DOWNKEY)
{
if(BeepClockminute>=1)
BeepClockminute--;
else
BeepClockminute=59;
}
if(keyvalue==UPKEY) //修改闹时的时针状态
{
if(ProgramStatus==4)
BeepClockhour++;
if(BeepClockhour>=24)
BeepClockhour=0;}
if(ProgramStatus==4&&keyvalue==DOWNKEY)
{
if(BeepClockhour>=1)
BeepClockhour--;
else
BeepClockhour=23;
}
/ MODEKEY按键处理
当 ProgramStatus = 0 时,按下MODEKEY后,ProgramStatus = 1,系统进入修改走时的分针状态
当 ProgramStatus = 1 时,按下MODEKEY后,ProgramStatus = 2,系统进入修改走时的时针状态
当 ProgramStatus = 2 时,按下MODEKEY后,ProgramStatus = 3,系统进入修改闹时的分针状态
当 ProgramStatus = 3 时,按下MODEKEY后,ProgramStatus = 4,系统进入修改闹时的时针状态
当 ProgramStatus = 4 时,按下MODEKEY后,ProgramStatus = 0,系统进入正常的走时状态
UPKEY处理
当ProgramStatus = 1,走时的分针加1
当ProgramStatus = 2,走时的时针加1
当ProgramStatus = 3,闹时的分针加1
当ProgramStatus = 4,闹时的时针加1
DOWNKEY处理
当ProgramStatus = 1,走时的分针减1
当ProgramStatus = 2,走时的时针减1
当ProgramStatus = 3,闹时的分针减1
当ProgramStatus = 4,闹时的时针减1
/
keyvalue = 0;
}
void main()
{
InitSystem();
while(1)
{ if(BeepClockhour==CurrentClockhour&&CurrentClockminute==BeepClockminute)
P3_5=0;
else
P3_5=1;
if(ProgramStatus <=2)
ShowClock(CurrentClock);
else
ShowClock(BeepClock);
}
}
以下是6位数码管显示;供参考
#include "reg51h"
#include "intrinsh"
#include <absacch>
#define unit unsigned int
#define char unsigned char
sbit deng1=P0^1;
sbit deng2=P0^2;
sbit kongzhi=P0^0;
char code dis_7[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00, 0xff };
/共阴LED数码管段码 0 1 2 3 4 5 6 7 8 9 10 A B C D E F 灭 /
char data timedata[6]={0x00,0x00,0x00,0x00,0x00,0x00};//定义计数单元初值0,6个
unsigned long data miao;
char code weisao[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位扫描控制字
char data BUFFER[1]={0}; //定时器记数变量
char data wei=-1; //时间设置时选种位
char c=0; //闪烁次数变量
bit flag=0; //标志位
char j1,j; //计数标志
void delayxms( char t) //1T毫秒延时
{
char i,j;
for(i=0;i<t;i++)
for(j=0;j<120;j++);
}
ledxian() //LED显示子程序
{
char k;
for(k=0;k<6;k++)
{
if(wei==-1) //当WEI为-1时正常显示
{
P1=dis_7[timedata[k]];//各位时间显示值转段码
}
else //WEI不为-1时再判断哪一位K闪
{
if(k==wei) //K=WEI时闪等扫过128次时闪
{
if(j==128)
{
//j1++;
//if(j1==1)
flag=~flag; //J到128时标志位取反
}
j++;
if(!flag)
{
P1=dis_7[16]; //灭LED灯
if(j==0)
{
if(c<15) //选种后闪烁次数
{
c++ ;
}
else //20次到了清WEI标志,清闪烁次数标志
{
wei=-1;
c=0;
ET0=1; //定时中断开
}
}
}
else
{
P1=dis_7[timedata[k]]; //FLAG=1时正常显示
}
}
else
{
P1=dis_7[timedata[k]]; //J不到128则正常显示
}
}
P2=~weisao[k]; //位扫描
delayxms(1); //1毫秒延时
P2=~0xff; //屏蔽
}
}
//////////////////主函数///////////////////
void main(void)
{
P1=0xff; //初始化端口
IT0=1; //外部中0断为跳沿触发方式
EX0=1; //外部中0允许
IT1=1; //外部中1断为跳沿触发方式
EX1=1; //外部中1允许
EA=1; //开中断
ET0=1; //允许定时器0
TMOD=0x11; //T0中断工作方式1
TH0=-5240/256; //
TL0=-5240%256;
TR0=1; //TRO为T0的运行控制位,开启中断,启动定时器
TH1=-5240/256; //
TL1=-5240%256;
ET1=1;
while(1)
{
ledxian() ; //调用LED显示子程序
}
}
void timer0(void) interrupt 1 using 1 //定时器0中断,用第1组寄存器
{
ET0=0; //关T0中断
TH0=-5240/256;//定时器初值5MS
TL0=-5240%256;
BUFFER[0]=BUFFER[0]+1;
if(BUFFER[0]==200) //1秒时间到加1
{
BUFFER[0]=0;//时间到附0
/timedata[0]++; //秒个位加1
if(timedata[0]>=10) //秒个位到10则进秒十位
{
timedata[0]=0;timedata[1]++;
if(timedata[1]>=6) //秒十位到6则进分个位
{
timedata[1]=0;timedata[2]++;
if(timedata[2]>=10) //分个位位到10则进分十位
{
timedata[2]=0;timedata[3]++;
if(timedata[3]>=6) //分十位到6则进小时个位
{
timedata[3]=0;timedata[4]++;
if(timedata[4]>=10) //小时个位到10则进小时十位
{
timedata[4]=0;timedata[5]++;
}
if(timedata[5]==2) //当小时为24时下一个变0
{
if (timedata[4]==4)
{
timedata[4]=0;timedata[5]=0;
}
}
}
}
}
}/
miao++;
if(miao==86400)
{
miao=0;
}
timedata[0]=miao%10;
timedata[1]=(miao%60)/10;
timedata[2]=(miao/60)%10;
timedata[3]=((miao/60)%60)/10;
timedata[4]=(miao/3600)%10;
timedata[5]=(miao/3600)/10;
}
ET0=1; //开中断
}
void timer1(void) interrupt 3
{
TR1=0;
ET1=0; //关T1中断
EX0=1;
EX1=1;
TH1=-5240/256;//定时器初值5MS
TL1=-5240%256;
ET1=1;
}
void INT00(void) interrupt 0 using 2 //外部中断0设置时间时调准位,用第2组寄存器
{
EX0 = 0; //关中断
TR1=1;
wei++; //中断一次加1
ET0=0; //定时中断关
if(wei>=6)
{
wei=-1; //当到最高位5时付初值-1
ET0=1; //定时中断开
}
j=0;
//j1=0;
/for (k=0;k<9;k++)
{
P1=dis_7[16];//各位时间显示值转段码
//P1=0X06;
P2=~weisao[wei]; //位扫描
delayxms(300); //1毫秒延时
P1=dis_7[0];
delayxms(300);
//TR0=0;
}/
//EX0 = 1; //开中断
}
void INT11(void) interrupt 2 using 3 //外部中断时种调准(+1),用第3组寄存器
{
EX1 = 0; //关中断
TR1=1;
switch(wei) //判断要调准的是哪一位
{
case 0 :
{
if(timedata[wei]<9) // 秒个位时加到10时返回0
{
timedata[wei]=timedata[wei]+1;
}
else
{
timedata[wei]=0;
}
}
break;
case 1 :
{
if(timedata[wei]<5) // 秒十位时加到6时返回0
{
timedata[wei]=timedata[wei]+1;
}
else
{
timedata[wei]=0;
}
}
break;
case 2:
{
if(timedata[wei]<9) // 分个位时加到10时返回0
{
timedata[wei]=timedata[wei]+1;
}
else
{
timedata[wei]=0;
}
}
break;
case 3:
{
if(timedata[wei]<5) // 分十位时加到6时返回0
{
timedata[wei]=timedata[wei]+1;
}
else
{
timedata[wei]=0;
}
}
break;
case 4:
{ // 小时个位设置
if(timedata[5]==0 || timedata[5]==1 ) //当小时十位是0或1时加到10返回到0
{
if(timedata[wei]<9)
{
timedata[wei]=timedata[wei]+1;
}
else
{
timedata[wei]=0;}
}
else //当小时十位是2时加到3返回到0
{
if(timedata[wei]<4)
{
timedata[wei]=timedata[wei]+1;
}
else
{
timedata[wei]=0;
}
}
}
break;
case 5:
{
if(timedata[wei]<2) //小时十位到3返回到0
{
timedata[wei]=timedata[wei]+1;
}
else
{
timedata[wei]=0;
}
}
break;
default: break;
//////////////////////////////////////////
}
miao=(timedata[0]+timedata[1]10)+(timedata[2]+timedata[3]10)60+(timedata[4]+timedata[5]10)3600;
//EX1 = 1; //开中断
}
以上就是关于数字时钟C语言设计.用的是51单片机。 00 秒 00 分 00 小时 还有小数点。 麻烦把程序代码告诉我把全部的内容,包括:数字时钟C语言设计.用的是51单片机。 00 秒 00 分 00 小时 还有小数点。 麻烦把程序代码告诉我把、试用51单片机C51编写一电脑钟程序,定时器用方式2中断处理实现、跪求一个MCS51单片机的电子时钟设计程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)