数字时钟C语言设计.用的是51单片机。 00 秒 00 分 00 小时 还有小数点。 麻烦把程序代码告诉我把

数字时钟C语言设计.用的是51单片机。 00 秒 00 分 00 小时 还有小数点。 麻烦把程序代码告诉我把,第1张

我这写了一个!使用数码管显示的!可以用键盘校对时间!你参考下。还写了一个液晶显示的!你要的话也可以发给你!

#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单片机的电子时钟设计程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10096883.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存