51单片机电子时钟设计程序代码(51单片机电子时钟c语言程序)

程序设计 887
今天给各位分享51单片机电子时钟设计程序代码的知识,其中也会对51单片机电子时钟c语言程序进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录一览: 1、51单片机电子时钟程序 只要时间调整部分 急求 谢谢

今天给各位分享51单片机电子时钟设计程序代码的知识,其中也会对51单片机电子时钟c语言程序进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

51单片机电子时钟程序 只要时间调整部分 急求 谢谢

以下是一段按键调整时间的程序。

LED6:

LCALL DISPLAY

JNB P1.0,CLEAR //;判断键盘输入

JNB P1.1,SET_MINUTE

JNB P1.2,SET_HOUR

AJMP LED6

CLEAR:

LCALL DISPLAY

JNB P1.0,CLEAR

MOV 30H,#12H //;时钟显示复位 A键

MOV 31H,#0

MOV 32H,#0

SJMP LED6

SET_MINUTE:

LCALL DISPLAY

JNB P1.1,SET_MINUTE

MOV A,31H //;调节分加1 B键

CJNE A,#59H,MIN

MOV 31H,#0

SJMP LED6

SET_HOUR:

LCALL DISPLAY

JNB P1.2,SET_HOUR

MOV R1,#30H //;调节时加1 C键

MOV A,@R1

CJNE A,#23H,HOUR // 比较立即数和A,不相等则转移

MOV 30H,#0

MIN:

ADD A ,#1 //将1加到累加器

DA A // 累加器十进制调整

MOV 31H,A

LCALL DELAY1

AJMP LED6

HOUR:

ADD A,#1

DA A

MOV 30H,A

LCALL DELAY1

AJMP LED6

一个51单片机电子钟程序,求详细的解释啊急急急!!!

#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]={0,0,16,0,0,16,0,0}; //定义显示缓冲区

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) //判断P00口的按键是否按下

{

for(i=5;i0;i--)

for(j=248;j0;j--);//延时消抖

if (P0_0==0) //判断按键真的按下了

{

second++; //秒加1

if(second==60) //秒加到60?

{

second=0; //秒清零

}

dispbuf[0]=second%10; //取秒的个位放在显示缓冲

dispbuf[1]=second/10; //取秒的十位放在显示缓冲

while(P0_0==0); //等待,知道按键松开

}

}

if(P0_1==0) //p01的按键按下,设置分钟,请参考秒的程序,一样的

{

for(i=5;i0;i--)

for(j=248;j0;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) //p02的按键按下,设置小时,请参考秒的程序,一样的

{

for(i=5;i0;i--)

for(j=248;j0;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) //计时满8毫秒?

{

mstcnt=0; //累加器清零

P1=dispcode[dispbuf[dispbitcnt]]; //送显示段码

P3=dispbitcode[dispbitcnt]; //送显示位码

dispbitcnt++; //显示位加1

if(dispbitcnt==8) //8位都显示完了?

{

dispbitcnt=0; //从第一位开始显示

}

}

tcnt++; //累加器加一

if(tcnt==4000) //记满1秒

{

tcnt=0; //累加器清零

second++; //秒加一

if(second==60) //秒满60?

{

second=0; //秒清零

minite++; //分钟加一

if(minite==60) //分钟满60

{

minite=0; //分钟清零

hour++; //小时加1

if(hour==24) //小时满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;

}

}

其实这个程序不难,仔细想想,有不懂的再问我吧

51单片机求这个时钟的c语言程序

以下是四位数码管可调时带秒闪烁的c51单片机电子钟程序(c语言)。

/**** 本程序中,晶振为12MHz, ****/

/**** 时间控制采用定时中断控制方式。 ****/

/**** 模式和时间调整采用查询方式。 ****/

#includereg52.h

sbit P20=P2^0; //分个位控制端

sbit P21=P2^1; //分十位控制端

sbit P22=P2^2; //时个位控制端

sbit P23=P2^3; //时十位控制端

sbit led=P2^7; //second display led

sbit key0=P3^0; //模式设置

sbit key1=P3^1; //加

sbit key2=P3^2; //减

unsigned char hour,min,sec,T50ms;

unsigned char modstate; //模式状态

unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//段码

void init(); //初始化子程序声明

void delay500us(unsigned char X); //延时子程序声明

void display(); //显示子程序声明

void display001(); //显示子程序声明

void display002(); //显示子程序声明

void keyscan(); //按键识别子程序声明

void main()

{

init();

while(1)

{

keyscan();

}

}

void init() //初始化子程序

{

TMOD=0x01;

TH0=(65536-49990)/256;

TL0=(65536-49990)%256;

ET0=1;

EA=1;

TR0=1;

}

void delay500us(unsigned char X)

{

unsigned char i,j;

for(i=X;i0;i--)

for(j=248;j0;j--);

}

void timer0() interrupt 1 //timer0中断服务子程序,定时时间为50ms,本程序加了10us的时间修正量

{

TMOD=0x01;

TH0=(65536-49990)/256;

TL0=(65536-49990)%256;

T50ms++;

if(T50ms=20)

{

T50ms=0;

sec++;

if(sec=60)

{

sec=0;

min++;

if(min=60)

{

min=0;

hour++;

if(hour=24)hour=0;

}

}

}

}

void display()

{

P20=1;

P21=1;

P22=1;

P23=1;

P0=table[hour/10];

P23=0;

delay500us(5);

P20=1;

P21=1;

P22=1;

P23=1;

P0=table[hour%10];

P22=0;

delay500us(5);

P20=1;

P21=1;

P22=1;

P23=1;

P0=table[min/10];

P21=0;

delay500us(5);

P20=1;

P21=1;

P22=1;

P23=1;

P0=table[min%10];

P20=0;

delay500us(5);

if(T50ms=10)led=0;

if(T50ms10)led=1;

}

void display001()

{

P20=1;

P21=1;

P22=1;

P23=1;

P0=table[hour/10];

P23=0;

delay500us(10);

P20=1;

P21=1;

P22=1;

P23=1;

P0=table[hour%10];

P22=0;

delay500us(10);

}

void display002()

{

P20=1;

P21=1;

P22=1;

P23=1;

P0=table[min/10];

P21=0;

delay500us(10);

P20=1;

P21=1;

P22=1;

P23=1;

P0=table[min%10];

P20=0;

delay500us(10);

}

void keyscan() //按键识别钟程序

{

while(modstate==0)

{

display();

if(key0==0)

{

display();

if(key0==0)modstate++; //这两句加在一起为延时10ms软件防抖设计。

while(key0==0)display001(); //等待按键释放。

}

}

//****************************************************************************//

while(modstate==1)

{

display001();

if(key0==0)

{

display001();

if(key0==0)modstate++; //这两句加在一起为延时10ms软件防抖设计。

while(key0==0)display002(); //等待按键释放。

}

if(key1==0)

{

display001();

if(key1==0)

{

hour++;

if(hour=24)hour=0;

while(key1==0)display001();

}

}

if(key2==0)

{

display001();

if(key2==0)

{

hour--;

if(hour=24)hour=0;

while(key2==0)display001();

}

}

}

//****************************************************************************//

while(modstate==2)

{

display002();

if(key0==0)

{

display002();

if(key0==0)modstate=0; //这两句加在一起为延时10ms软件防抖设计。

while(key0==0)display(); //等待按键释放。

}

if(key1==0)

{

display002();

if(key1==0)

{

min++;

if(min=60)min=0;

while(key1==0)display002();

}

}

if(key2==0)

{

display002();

if(key2==0)

{

min--;

if(min=60)min=0;

while(key2==0)display002();

}

}

}

}

51单片机时钟程序设计

朋友以下是本人历时一个月殚精竭虑自主开发的一个8位51单片机时钟程序,望吾之兄弟姐妹习之,此程序乃采用一键控制,通过感知按下键持续时间的长短来进行调整时间,闹铃,6只共阳数码管输出显示,此外还包括整点铃声功能,在看程序之前我先交代一下运行该程序的硬件要求:12M晶振,P0端口驱动显示,P2.0到P2.5控制显示扫描,P2.7输出铃声,注意:铃声功放三极管应采用pnp管。以下是该程序:

ORG 00H

SETB TR0

JMP START

ORG 000BH

LJMP T0

START: MOV IE,#82H

MOV TMOD,#01H

MOV DPTR,#TAB

MOV SP,#60H

MOV 20H,#0

MOV R0,#0

MOV R1,#0

MOV R2,#0

MOV R3,#0

MOV R4,#0

MOV R5,#0

MOV R6,#0

MOV R7,#0

MOV 50H,#0

MOV 51H,#0

MOV 52H,#0

MOV 53H,#0

MOV 54H,#0

MOV 55H,#0

MOV A,TL0

ADD A,0B5H

MOV TL0,A

MOV TH0,#3CH

LOOP: ANL 20H,#08H

UNSV: MOV R1,#0

LCALL DISPLAY

JB 03H,LOP1

LCALL SOUND

LCALL HDLY

LOP1: MOV P3,#0FEH ;按键监视

MOV A,P3

CJNE A,#0FEH,LOP2

MOV R1,#0

JMP LOOP

LOP2: MOV R1,#2 ;误按判断

LOP3: LCALL HD

DJNZ R1,LOP3

JNB 04H,LOOP

CLR 04H

LOP4: INC R1

MOV C,00H ;调秒

CPL C

MOV 00H,C

LCALL HDLY

CJNE R1,#40,LOP5

JMP LOOP

LOP5: JNB 05H,LOP4

CLR 05H

MOV R1,#0

LCALL HD

CLR 00H

JB 04H,TF

MOV R2,#0

MOV R3,#0

JMP LOP4

TF: CLR 04H

LOP6: INC R1

MOV C,01H ;调分

CPL C

MOV 01H,C

LCALL HDLY

CJNE R1,#40,LOP7

JMP LOOP

LOP7: JNB 05H,LOP6

CLR 05H

MOV R1,#0

LCALL HD

CLR 01H

JB 04H,TS

INC R4

MOV R1,#0

CJNE R4,#10,LOP6

MOV R4,#0

INC R5

CJNE R5,#6,LOP6

MOV R5,#0

JMP LOP6

TS: CLR 04H

LOP8: INC R1

MOV C,02H ;调时

CPL C

MOV 02H,C

LCALL HDLY

CJNE R1,#40,LOP9

JMP LOOP

LOP9: JNB 05H,LOP8

CLR 05H

MOV R1,#0

LCALL HD

CLR 02H

JB 04H,TN

INC R6

CJNE R7,#2,NO2

CJNE R6,#4,LOP8

MOV R7,#0

MOV R6,#0

NO2: CJNE R6,#10,LOP8

MOV R6,#0

INC R7

JMP LOP8

TN: CLR 04H ;调闹铃

SETB RS0

CLR RS1

MOV R2,#0

MOV R3,#0

MOV R4,#0

MOV R5,#0

MOV R6,#0

MOV R7,#0

NS: INC R1 ;闹铃秒调整

MOV C,00H

CPL C

MOV 00H,C

LCALL HDLY

CJNE R1,#40,NS1

JMP NH2

NS1: JNB 05H,NS

CLR 05H

MOV R1,#0

LCALL HD

CLR 00H

JB 04H,NF

INC R2

CJNE R2,#10,NS

MOV R2,#0

INC R3

CJNE R3,#6,NS

MOV R3,#0

JMP NS

NF: CLR 04H ;闹铃分

NF1: INC R1

MOV C,01H

CPL C

MOV 01H,C

LCALL HDLY

CJNE R1,#40,NF2

LJMP NH2

NF2: JNB 05H,NF1

CLR 05H

MOV R1,#0

LCALL HD

CLR 01H

JB 04H,NH

INC R4

CJNE R4,#10,NF1

MOV R4,#0

INC R5

CJNE R5,#6,NF1

MOV R5,#0

JMP NF1

NH: CLR 04H ;闹铃时调整

NH1: INC R1

MOV C,02H

CPL C

MOV 02H,C

LCALL HDLY

CJNE R1,#40,NH3

NH2: MOV 50H,R2

MOV 51H,R3

MOV 52H,R4

MOV 53H,R5

MOV 54H,R6

MOV 55H,R7

CLR RS0

CLR RS1

LJMP LOOP

NH3: JNB 05H,NH1

CLR 05H

MOV R1,#0

LCALL HD

CLR 02H

JB 04H,NH2

INC R6

CJNE R7,#2,NOT2

CJNE R6,#4,NH1

MOV R6,#0

MOV R7,#0

JMP NH1

NOT2: CJNE R6,#10,NH1

MOV R6,#0

INC R7

JMP NH1

;子程序区

TIMES: CJNE R0,#20,LOOP16

MOV R0,#0

INC R2

CJNE R2,#10,LOOP16

MOV R2,#0

INC R3

CJNE R3,#6,LOOP16

MOV R3,#0

ADMINI: INC R4

CJNE R4,#10,LOOP16

MOV R4,#0

INC R5

CJNE R5,#6,LOOP16

MOV R5,#0

HOUR: INC R6

LCALL SOUND ;整点铃声

CJNE R7,#2,LOOP14

CJNE R6,#4,LOOP16

MOV R6,#0

MOV R7,#0

JMP LOOP16

LOOP14: CJNE R6,#10,LOOP16

MOV R6,#0

INC R7

LOOP16: RET

DISPLAY:MOV P2,#0FFH

MOV A,R2

MOVC A,@A+DPTR

MOV P0,A

MOV C,00H

MOV P2.0,C

MOV P2,#0FFH

MOV A,R3

MOVC A,@A+DPTR

MOV P0,A

MOV P2.1,C

MOV P2,#0FFH

MOV A,R4

MOVC A,@A+DPTR

MOV P0,A

MOV C,01H

MOV P2.2,C

MOV P2,#0FFH

MOV A,R5

MOVC A,@A+DPTR

MOV P0,A

MOV P2.3,C

MOV P2,#0FFH

MOV A,R6

MOVC A,@A+DPTR

MOV P0,A

MOV C,02H

MOV P2.4,C

MOV P2,#0FFH

MOV A,R7

MOVC A,@A+DPTR

MOV P0,A

MOV P2.5,C

MOV P2,#0FFH

RET

HDLY: MOV 40H,#2

HDL1: MOV 41H,#25

HDL2: MOV 42H,#100

HDL3: DJNZ 42H,HDL4

DJNZ 41H,HDL2

DJNZ 40H,HDL1

JMP HDOT

SOUT: SETB 05H

HDOT: RET

HDL4: MOV P3,#0FEH

MOV A,P3

CJNE A,#0FEH,SOUT

CLR 05H

LCALL DISPLAY

JMP HDL3

HD: MOV 30H,#5

HD1: MOV 31H,#50

HD2: MOV 32H,#100

HD3: LCALL DISPLAY

DJNZ 32H,HD4

DJNZ 31H,HD2

DJNZ 30H,HD1

SETB 04H ;计满标志位

JMP HDOUT

HD4: MOV P3,#0FEH

MOV A,P3

CJNE A,#0FEH,HD3

MOV 33H,#50

HD5: MOV 34H,#100

DJNZ 34H,$

DJNZ 33H,HD5

MOV P3,#0FEH

MOV A,P3

CJNE A,#0FEH,HD3

CLR 04H

HDOUT: RET

SOUND: MOV 30H,#10

SO1: MOV 31H,#100

SO2: MOV 32H,#3

MOV C,P2.7

CPL C

MOV P2.7,C

SO3: MOV 33H,#25

DJNZ 33H,$

DJNZ 32H,SO3

DJNZ 31H,SO2

DJNZ 30H,SO1

RET

T0: PUSH PSW

PUSH ACC

CLR RS1

CLR RS0

MOV A,TL0

ADD A,#0B5H

MOV TL0,A

MOV TH0,#3CH

INC R0

LCALL TIMES

MOV A,R2

CJNE A,50H,TO

SETB 03H

MOV A,R3

CJNE A,51H,TO

MOV A,R7

CJNE A,55H,TO

MOV A,R6

CJNE A,54H,TO

MOV A,R5

CJNE A,53H,TO

MOV A,R4

CJNE A,52H,TO

MOV A,R2

ADD A,R3

ADD A,R4

ADD A,R5

ADD A,R6

ADD A,R7

JZ TO

CLR 03H

TO: POP ACC

POP PSW

RETI

TAB: DB 0C0H 0F9H 0A4H 0B0H 099H

DB 092H 082H 0F8H 080H 090H

END

51单片机制作电子钟

农历转换需要以个数据库,我赠送你一C语言的农历转换

#define c_sun 0

/********阳历转换阴历********************************************************************/

code uchar year_code[597]={

0x04,0xAe,0x53, //1901 0

0x0A,0x57,0x48, //1902 3

0x55,0x26,0xBd, //1903 6

0x0d,0x26,0x50, //1904 9

0x0d,0x95,0x44, //1905 12

0x46,0xAA,0xB9, //1906 15

0x05,0x6A,0x4d, //1907 18

0x09,0xAd,0x42, //1908 21

0x24,0xAe,0xB6, //1909

0x04,0xAe,0x4A, //1910

0x6A,0x4d,0xBe, //1911

0x0A,0x4d,0x52, //1912

0x0d,0x25,0x46, //1913

0x5d,0x52,0xBA, //1914

0x0B,0x54,0x4e, //1915

0x0d,0x6A,0x43, //1916

0x29,0x6d,0x37, //1917

0x09,0x5B,0x4B, //1918

0x74,0x9B,0xC1, //1919

0x04,0x97,0x54, //1920

0x0A,0x4B,0x48, //1921

0x5B,0x25,0xBC, //1922

0x06,0xA5,0x50, //1923

0x06,0xd4,0x45, //1924

0x4A,0xdA,0xB8, //1925

0x02,0xB6,0x4d, //1926

0x09,0x57,0x42, //1927

0x24,0x97,0xB7, //1928

0x04,0x97,0x4A, //1929

0x66,0x4B,0x3e, //1930

0x0d,0x4A,0x51, //1931

0x0e,0xA5,0x46, //1932

0x56,0xd4,0xBA, //1933

0x05,0xAd,0x4e, //1934

0x02,0xB6,0x44, //1935

0x39,0x37,0x38, //1936

0x09,0x2e,0x4B, //1937

0x7C,0x96,0xBf, //1938

0x0C,0x95,0x53, //1939

0x0d,0x4A,0x48, //1940

0x6d,0xA5,0x3B, //1941

0x0B,0x55,0x4f, //1942

0x05,0x6A,0x45, //1943

0x4A,0xAd,0xB9, //1944

0x02,0x5d,0x4d, //1945

0x09,0x2d,0x42, //1946

0x2C,0x95,0xB6, //1947

0x0A,0x95,0x4A, //1948

0x7B,0x4A,0xBd, //1949

0x06,0xCA,0x51, //1950

0x0B,0x55,0x46, //1951

0x55,0x5A,0xBB, //1952

0x04,0xdA,0x4e, //1953

0x0A,0x5B,0x43, //1954

0x35,0x2B,0xB8, //1955

0x05,0x2B,0x4C, //1956

0x8A,0x95,0x3f, //1957

0x0e,0x95,0x52, //1958

0x06,0xAA,0x48, //1959

0x7A,0xd5,0x3C, //1960

0x0A,0xB5,0x4f, //1961

0x04,0xB6,0x45, //1962

0x4A,0x57,0x39, //1963

0x0A,0x57,0x4d, //1964

0x05,0x26,0x42, //1965

0x3e,0x93,0x35, //1966

0x0d,0x95,0x49, //1967

0x75,0xAA,0xBe, //1968

0x05,0x6A,0x51, //1969

0x09,0x6d,0x46, //1970

0x54,0xAe,0xBB, //1971

0x04,0xAd,0x4f, //1972

0x0A,0x4d,0x43, //1973

0x4d,0x26,0xB7, //1974

0x0d,0x25,0x4B, //1975

0x8d,0x52,0xBf, //1976

0x0B,0x54,0x52, //1977

0x0B,0x6A,0x47, //1978

0x69,0x6d,0x3C, //1979

0x09,0x5B,0x50, //1980

0x04,0x9B,0x45, //1981

0x4A,0x4B,0xB9, //1982

0x0A,0x4B,0x4d, //1983

0xAB,0x25,0xC2, //1984

0x06,0xA5,0x54, //1985

0x06,0xd4,0x49, //1986

0x6A,0xdA,0x3d, //1987

0x0A,0xB6,0x51, //1988

0x09,0x37,0x46, //1989

0x54,0x97,0xBB, //1990

0x04,0x97,0x4f, //1991

0x06,0x4B,0x44, //1992

0x36,0xA5,0x37, //1993

0x0e,0xA5,0x4A, //1994

0x86,0xB2,0xBf, //1995

0x05,0xAC,0x53, //1996

0x0A,0xB6,0x47, //1997

0x59,0x36,0xBC, //1998

0x09,0x2e,0x50, //1999 294

0x0C,0x96,0x45, //2000 297

0x4d,0x4A,0xB8, //2001

0x0d,0x4A,0x4C, //2002

0x0d,0xA5,0x41, //2003

0x25,0xAA,0xB6, //2004

0x05,0x6A,0x49, //2005

0x7A,0xAd,0xBd, //2006

0x02,0x5d,0x52, //2007

0x09,0x2d,0x47, //2008

0x5C,0x95,0xBA, //2009

0x0A,0x95,0x4e, //2010

0x0B,0x4A,0x43, //2011

0x4B,0x55,0x37, //2012

0x0A,0xd5,0x4A, //2013

0x95,0x5A,0xBf, //2014

0x04,0xBA,0x53, //2015

0x0A,0x5B,0x48, //2016

0x65,0x2B,0xBC, //2017

0x05,0x2B,0x50, //2018

0x0A,0x93,0x45, //2019

0x47,0x4A,0xB9, //2020

0x06,0xAA,0x4C, //2021

0x0A,0xd5,0x41, //2022

0x24,0xdA,0xB6, //2023

0x04,0xB6,0x4A, //2024

0x69,0x57,0x3d, //2025

0x0A,0x4e,0x51, //2026

0x0d,0x26,0x46, //2027

0x5e,0x93,0x3A, //2028

0x0d,0x53,0x4d, //2029

0x05,0xAA,0x43, //2030

0x36,0xB5,0x37, //2031

0x09,0x6d,0x4B, //2032

0xB4,0xAe,0xBf, //2033

0x04,0xAd,0x53, //2034

0x0A,0x4d,0x48, //2035

0x6d,0x25,0xBC, //2036

0x0d,0x25,0x4f, //2037

0x0d,0x52,0x44, //2038

0x5d,0xAA,0x38, //2039

0x0B,0x5A,0x4C, //2040

0x05,0x6d,0x41, //2041

0x24,0xAd,0xB6, //2042

0x04,0x9B,0x4A, //2043

0x7A,0x4B,0xBe, //2044

0x0A,0x4B,0x51, //2045

0x0A,0xA5,0x46, //2046

0x5B,0x52,0xBA, //2047

0x06,0xd2,0x4e, //2048

0x0A,0xdA,0x42, //2049

0x35,0x5B,0x37, //2050

0x09,0x37,0x4B, //2051

0x84,0x97,0xC1, //2052

0x04,0x97,0x53, //2053

0x06,0x4B,0x48, //2054

0x66,0xA5,0x3C, //2055

0x0e,0xA5,0x4f, //2056

0x06,0xB2,0x44, //2057

0x4A,0xB6,0x38, //2058

0x0A,0xAe,0x4C, //2059

0x09,0x2e,0x42, //2060

0x3C,0x97,0x35, //2061

0x0C,0x96,0x49, //2062

0x7d,0x4A,0xBd, //2063

0x0d,0x4A,0x51, //2064

0x0d,0xA5,0x45, //2065

0x55,0xAA,0xBA, //2066

0x05,0x6A,0x4e, //2067

0x0A,0x6d,0x43, //2068

0x45,0x2e,0xB7, //2069

0x05,0x2d,0x4B, //2070

0x8A,0x95,0xBf, //2071

0x0A,0x95,0x53, //2072

0x0B,0x4A,0x47, //2073

0x6B,0x55,0x3B, //2074

0x0A,0xd5,0x4f, //2075

0x05,0x5A,0x45, //2076

0x4A,0x5d,0x38, //2077

0x0A,0x5B,0x4C, //2078

0x05,0x2B,0x42, //2079

0x3A,0x93,0xB6, //2080

0x06,0x93,0x49, //2081

0x77,0x29,0xBd, //2082

0x06,0xAA,0x51, //2083

0x0A,0xd5,0x46, //2084

0x54,0xdA,0xBA, //2085

0x04,0xB6,0x4e, //2086

0x0A,0x57,0x43, //2087

0x45,0x27,0x38, //2088

0x0d,0x26,0x4A, //2089

0x8e,0x93,0x3e, //2090

0x0d,0x52,0x52, //2091

0x0d,0xAA,0x47, //2092

0x66,0xB5,0x3B, //2093

0x05,0x6d,0x4f, //2094

0x04,0xAe,0x45, //2095

0x4A,0x4e,0xB9, //2096

0x0A,0x4d,0x4C, //2097

0x0d,0x15,0x41, //2098

0x2d,0x92,0xB5, //2099

};

///月份数据表

code uchar day_code1[9]={0x0,0x1f,0x3b,0x5a,0x78,0x97,0xb5,0xd4,0xf3};

code uint day_code2[3]={0x111,0x130,0x14e};

/*

函数功能:输入BCD阳历数据,输出BCD阴历数据(只允许1901-2099年)

调用函数示例:Conversion(c_sun,year_sun,month_sun,day_sun)

如:计算2004年10月16日Conversion(0,0x4,0x10,0x16);

c_sun,year_sun,month_sun,day_sun均为BCD数据,c_sun为世纪标志位,c_sun=0为21世

纪,c_sun=1为19世纪

调用函数后,原有数据不变,读c_moon,year_moon,month_moon,day_moon得出阴历BCD数据

*/

bit c_moon;

data uchar year_moon,month_moon,day_moon,week;

/*子函数,用于读取数据表中农历月的大月或小月,如果该月为大返回1,为小返回0*/

bit get_moon_day(uchar month_p,uint table_addr)

{

uchar temp;

switch (month_p){

case 1:{temp=year_code[table_addr]0x08;

if (temp==0)return(0);else return(1);}

case 2:{temp=year_code[table_addr]0x04;

if (temp==0)return(0);else return(1);}

case 3:{temp=year_code[table_addr]0x02;

if (temp==0)return(0);else return(1);}

case 4:{temp=year_code[table_addr]0x01;

if (temp==0)return(0);else return(1);}

case 5:{temp=year_code[table_addr+1]0x80;

if (temp==0) return(0);else return(1);}

case 6:{temp=year_code[table_addr+1]0x40;

if (temp==0)return(0);else return(1);}

case 7:{temp=year_code[table_addr+1]0x20;

if (temp==0)return(0);else return(1);}

case 8:{temp=year_code[table_addr+1]0x10;

if (temp==0)return(0);else return(1);}

case 9:{temp=year_code[table_addr+1]0x08;

if (temp==0)return(0);else return(1);}

case 10:{temp=year_code[table_addr+1]0x04;

if (temp==0)return(0);else return(1);}

case 11:{temp=year_code[table_addr+1]0x02;

if (temp==0)return(0);else return(1);}

case 12:{temp=year_code[table_addr+1]0x01;

if (temp==0)return(0);else return(1);}

case 13:{temp=year_code[table_addr+2]0x80;

if (temp==0)return(0);else return(1);}

}

}

/*

函数功能:输入BCD阳历数据,输出BCD阴历数据(只允许1901-2099年)

调用函数示例:Conversion(c_sun,year_sun,month_sun,day_sun)

如:计算2004年10月16日Conversion(0,0x4,0x10,0x16);

c_sun,year_sun,month_sun,day_sun均为BCD数据,c_sun为世纪标志位,c_sun=0为21世

纪,c_sun=1为19世纪

调用函数后,原有数据不变,读c_moon,year_moon,month_moon,day_moon得出阴历BCD数据

*/

void Conversion(bit c,uchar year,uchar month,uchar day)

{ //c=0 为21世纪,c=1 为19世纪 输入输出数据均为BCD数据

uchar temp1,temp2,temp3,month_p;

uint temp4,table_addr;

bit flag2,flag_y;

temp1=year/16; //BCD-hex 先把数据转换为十六进制

temp2=year%16;

year=temp1*10+temp2;

temp1=month/16;

temp2=month%16;

month=temp1*10+temp2;

temp1=day/16;

temp2=day%16;

day=temp1*10+temp2;

//定位数据表地址

if(c==0){

table_addr=(year+0x64-1)*0x3;

}

else {

table_addr=(year-1)*0x3;

}

//定位数据表地址完成

//取当年春节所在的公历月份

temp1=year_code[table_addr+2]0x60;

temp1=_cror_(temp1,5);

//取当年春节所在的公历月份完成

//取当年春节所在的公历日

temp2=year_code[table_addr+2]0x1f;

//取当年春节所在的公历日完成

// 计算当年春年离当年元旦的天数,春节只会在公历1月或2月

if(temp1==0x1){

temp3=temp2-1;

}

else{

temp3=temp2+0x1f-1;

}

// 计算当年春年离当年元旦的天数完成

//计算公历日离当年元旦的天数,为了减少运算,用了两个表

//day_code1[9],day_code2[3]

//如果公历月在九月或前,天数会少于0xff,用表day_code1[9],

//在九月后,天数大于0xff,用表day_code2[3]

//如输入公历日为8月10日,则公历日离元旦天数为day_code1[8-1]+10-1

//如输入公历日为11月10日,则公历日离元旦天数为day_code2[11-10]+10-1

if (month10){

temp4=day_code1[month-1]+day-1;

}

else{

temp4=day_code2[month-10]+day-1;

}

if ((month0x2)(year%0x4==0)){ //如果公历月大于2月并且该年的2月为闰月,天数加1

temp4+=1;

}

//计算公历日离当年元旦的天数完成

//判断公历日在春节前还是春节后

if (temp4=temp3){ //公历日在春节后或就是春节当日使用下面代码进行运算

temp4-=temp3;

month=0x1;

month_p=0x1; //month_p为月份指向,公历日在春节前或就是春节当日month_p指向首月

flag2=get_moon_day(month_p,table_addr); //检查该农历月为大小还是小月,大月返回1,小月返回0

flag_y=0;

if(flag2==0)temp1=0x1d; //小月29天

else temp1=0x1e; //大小30天

temp2=year_code[table_addr]0xf0;

temp2=_cror_(temp2,4); //从数据表中取该年的闰月月份,如为0则该年无闰月

while(temp4=temp1){

temp4-=temp1;

month_p+=1;

if(month==temp2){

flag_y=~flag_y;

if(flag_y==0)month+=1;

}

else month+=1;

flag2=get_moon_day(month_p,table_addr);

if(flag2==0)temp1=0x1d;

else temp1=0x1e;

}

day=temp4+1;

}

else{ //公历日在春节前使用下面代码进行运算

temp3-=temp4;

if (year==0x0){year=0x63;c=1;}

else year-=1;

table_addr-=0x3;

month=0xc;

temp2=year_code[table_addr]0xf0;

temp2=_cror_(temp2,4);

if (temp2==0)month_p=0xc;

else month_p=0xd; //

/*

month_p为月份指向,如果当年有闰月,一年有十三个月,月指向13,

无闰月指向12

*/

flag_y=0;

flag2=get_moon_day(month_p,table_addr);

if(flag2==0)temp1=0x1d;

else temp1=0x1e;

while(temp3temp1){

temp3-=temp1;

month_p-=1;

if(flag_y==0)month-=1;

if(month==temp2)flag_y=~flag_y;

flag2=get_moon_day(month_p,table_addr);

if(flag2==0)temp1=0x1d;

else temp1=0x1e;

}

day=temp1-temp3+1;

}

c_moon=c; //HEX-BCD ,运算结束后,把数据转换为BCD数据

temp1=year/10;

temp1=_crol_(temp1,4);

temp2=year%10;

year_moon=temp1|temp2;

temp1=month/10;

temp1=_crol_(temp1,4);

temp2=month%10;

month_moon=temp1|temp2;

temp1=day/10;

temp1=_crol_(temp1,4);

temp2=day%10;

day_moon=temp1|temp2;

}

void nl()

{

unsigned char yy1,yy2;

Conversion(0,yy,mo,dd);

LCM_WriteDatOrCom(0,0x90);

LCM_WriteString("农历");//原代码为

LCM_WriteDatOrCom(1,year_moon/16+'0');

LCM_WriteDatOrCom(1,year_moon%16+'0');

LCM_WriteDatOrCom(1,'-');

LCM_WriteDatOrCom(1,month_moon/16+'0');

LCM_WriteDatOrCom(1,month_moon%16+'0');

LCM_WriteDatOrCom(1,'-');

LCM_WriteDatOrCom(1,day_moon/16+'0');

LCM_WriteDatOrCom(1,day_moon%16+'0');

yy1=(year_moon/16)*10+year_moon%16;

yy2=yy1%12;

switch(yy2)

{

case 0: LCM_WriteDatOrCom(0,0x87);LCM_WriteString("龙");

break;

case 1: LCM_WriteDatOrCom(0,0x87);LCM_WriteString("蛇");

break;

case 2: LCM_WriteDatOrCom(0,0x87);LCM_WriteString("马");

break;

case 3: LCM_WriteDatOrCom(0,0x87);LCM_WriteString("羊");

break;

case 4: LCM_WriteDatOrCom(0,0x87);LCM_WriteString("猴");

break;

case 5: LCM_WriteDatOrCom(0,0x87);LCM_WriteString("鸡");

break;

case 6: LCM_WriteDatOrCom(0,0x87);LCM_WriteString("狗");

break;

case 7: LCM_WriteDatOrCom(0,0x87);LCM_WriteString("猪");

break;

case 8: LCM_WriteDatOrCom(0,0x87);LCM_WriteString("鼠");

break;

case 9: LCM_WriteDatOrCom(0,0x87);LCM_WriteString("牛");

break;

case 10: LCM_WriteDatOrCom(0,0x87);LCM_WriteString("虎");

break;

case 11: LCM_WriteDatOrCom(0,0x87);LCM_WriteString("兔");

break;

}

}

还有我想你的中断函数过长不会是一件好事,主程序的显示部分可能会不正常

51单片机电子时钟设计程序代码的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于51单片机电子时钟c语言程序、51单片机电子时钟设计程序代码的信息别忘了在本站进行查找喔。

扫码二维码