51单片机做的电子时钟

更新时间:2023-10-04 02:57:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

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

用定时器T0方式一控制P10,P11每250ms闪烁一次, 用定时器T1方式1控制时分秒,数码管前两个为时针(fe,fd) 中间为分针(f7,ef),最后两个为秒针(bf,7f) *************************************************/ #include

#define uchar unsigned char #define uint unsigned int sbit P10=P1^0; sbit P11=P1^1; sbit S4=P3^2; sbit S3=P3^3; sbit S2=P3^4; sbit S1=P3^5;

uchar t,fenshi,fenge,miaoshi,shishi,shige,miaoge,nu1m=0,nu2m=0,nu3m=0; unsigned int nu4m=0,nu5m=0; unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//共阳数码管段选数组 unsigned char code tabletwo[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//共阳数码管段选数组

/******************************* 1ms延时函数

*******************************/ void delay1ms(uint t) { uchar j; while(t--) {for(j=0;j<115;j++) //1ms基准延时程序 {;} } }

/****************************************************** 秒针显示子函数

*******************************************************/ void displaymiao(uchar miaoshi,uchar miaoge) //秒针显示子函数 {P0=table[miaoshi]; P2=0xbf; //打开数码管P24 delay1ms(1);

P0=table[miaoge]; P2=0x7f; //打开数码管P23 delay1ms(1);

}

/***************************************************** 分针显示子函数

*****************************************************/ void displayfen(uchar fenshi,uchar fenge) //分钟显示子函数 {P0=tabletwo[fenshi]; P2=0xf7; //打开数码管P24 delay1ms(1);

P0=tabletwo[fenge]; P2=0xef; //打开数码管P23 delay1ms(1); }

/****************************************************** 时针显示子函数

******************************************************/ void displayshi(uchar shishi,uchar shige)//时针显示子函数 {P0=table[shige]; P2=0xfd; delay1ms(1); P0=table[shishi]; P2=0xfe; delay1ms(1); }

/******************************************************** 按键控制函数,每按S1(P17)一次,T1开始或停止 每按S2(P16)一次,秒针加一,加满60归0; 每安S3(P15)一次,分针加一,加满60归0; 每按S4(P14)一次,时针加一,加满60归0; ********************************************************/ void keyscan() { if(S1==0) { delay1ms(10); if(S1==0) { while(!S1); { TR1=~TR1; //启动或停止定时器T1,既时分秒 } } } if(S2==0) {

delay1ms(10); //按键消抖 if(S2==0) { while(!S2); //等待按键释放 nu3m++; if(nu3m==60) { nu3m=0; //清0 } } } if(S3==0) { delay1ms(10); //按键消抖 if(S3==0) { nu4m++; if(nu4m==60) { nu4m=0; //清0 } while(!S3); //释放按键 } } if(S4==0) { delay1ms(10); //消抖 if(S4==0) { nu5m++; if(nu5m==24) { nu5m=0; //清0 } while(!S4); //释放按键 } } }

/*************************************************** 主函数

****************************************************/ void main() {P10=1; //初始LED关闭

P11=1; //初始LED关闭 TMOD=0x11; //T0,T1做定时器工作在工作方式1,00010001B TH0=(65536-45872)/256; //T0装入初值 TL0=(65536-45872)%6;

TH1=(65536-45872)/256; //T1装入初值 TL1=(65536-45872)%6; EA=1; //打开总中断 ET0=1; //打开定时器0中断 ET1=1; //ET打开定时器1中断 TR0=1; //启动定时器0 TR1=1; //启动定时器1 while(1) //等待中断 {displaymiao(miaoshi,miaoge); displayfen(fenshi,fenge); displayshi(shishi,shige); keyscan(); } }

void T0_time() interrupt 1 //T0中断

{ TH0=(65536-45872)/256; //t0装入初值 TL0=(65536-45872)%6; nu1m++; if(nu1m==5) { nu1m=0; P10=~P10; P11=~P11; } }

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

定时器T1中断,nu3m为秒针,nu4m为分针 nu5m为时针,miaoshi就是秒针的十位, miaoge就是秒针的个位; fenshi分针的十位, fenge分针的个位; shishi时针的十位, shige时针的个位; o(︶︿︶)o 唉,英语不好伤不起,用汉语拼音挺时尚的吧。 元芳,你怎么看?

*************************************/ void T1_time() interrupt 3

{ TH1=(65536-45872)/256; //T1装入初值 TL1=(65536-45872)%6; nu2m++; if(nu2m==20) {nu2m=0; nu3m++; if(nu3m==60) {nu3m=0; nu4m++; } miaoshi=nu3m/10; miaoge=nu3m; if(nu4m==60) { nu4m=0; nu5m++; } fenshi=nu4m/10; fenge=nu4m; if(nu5m==24) { nu5m=0; } shishi=nu5m/10; shige=nu5m; } }

本文来源:https://www.bwwdw.com/article/4dbd.html

Top