#include<reg51h>
uchar code tab[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}
void view() /七段数码管显示程序 七个管轮流显示/
{P3=0x01;
unsigned int i=0;
while(i<6)
{n=vnum;
P1=tab[n];
P3<<=1;
i++;
}
}
void mDelay(unsigned int Delay) /延时程序/
{ unsigned int i;
for(;Delay>0;Delay--)
{ for(i=0;i<124;i++)
{;}
}
}
void jumpnum() /用于钟表时分秒的进位/
{if(jnum(5)>9) /秒进位
{jnum[4]=jnum[4]+1;
jnum[5]=0;
if(jnum[4]>6) /秒到分进位
{jnum[3]=jnum[3]+1;
jum[4]=0;
if(jnum[3]>9) /分进位
{jnum[2]=jnum[2]+1;
jnum[3]=0;
if(jnum[2]>6) /分到时进位
{jnum[1]=jnum[1]+1;
jnum[2]=0;
if(jnum[1]>9) /时的进位
{jnum[1]=0;
jnum[0]=jnum[0]+1;
}
else if(jnum[1]>4&&jnum[0]>=2)
{jnum[1]=0;
jnum[0]=0;
}
}
}
}
}
void key() /键盘控制程序
{if((P2&0xFF)!=0xFF); /防抖动
{mDelay(3000);
if((P2&0xFF)!=0xFF)
{unsign int c;
c=1;
while(c<4)
{ if((P2&0xFF)!=0xFF);
{mDelay(3000);
vnum[]=num[];
void view();
if((P2&0xFF)!=0xFF)
{switch(P2): /判断不同的按键
{case 0xFE: c++; /c用于判断是闹钟调时c=3还是时钟调时c=2
case oxFD :if(c=2) /分位增加
{num[3]++;}
else if(c=3)
{lnum[3]++;
}
case oxFC :if(c=2) /时位增加
{num[1]++;}
else if(c=3)
{lnum[1]++;
}
}
if(c=2) /增加后判断是否需要进位
{jnum[]=num[];
jumpnum();
vnum[]=num[];
void view[];}
if(c=3)
{jnum[]=lnum[];
jumpnum();
vnum[]=num[];
void view[];}}}}}}}
void clock() /闹钟程序
{for(cl=0;num[cl]==lnum(cl);cl=cl+1) /当前时间与设定时间相同
{;}
unsigned int kp=0;
if(cl==5&&kp==0) /闹钟铃声
{for(i=1;i<100;i++)
{P1_7=~P1_7;
for(j=1;i<=100;j++);}
void mDelay(3000);
for(i=1;i<100;i++)
{P1_7=~P1_7;
for(j=1;i<=100;j++);}
vnum[]=num[];
void view();
if((P2&0xFF)!=0xFF); /判断是否有按键,有则停止闹钟
{mDelayd(3000)
void view();
if((P2&0xFF)!=0xFF)
{kp=1;}
}}}
viod intclock() /整点报时程序
{unsigned int ic,i;
if(num[2]==5&&num[3]==9&&num[4]==5&&num[5]==0) /判断差十秒整点
{if(ic=num[5]+2;(ic==(num[5]+2))&&num[5]<59;ic=num[5]) /开始发出500hz声因
{for(i=0;i<100;i++)
{P1_7=~P1_7;
for(i=0;i<=100;i++)
}
for(i=1;i<150;i++) /1000hz声音
{P1_7=~P1_7;
for(i=0;i<=50;i++)
}}}}
void count() inturrupt 1 using 2 /计时程序
{cn++;
if(cn==20)
{num[5]++;
cn=0;
}
}
void main()
{ P2=0x00;
unsigned int num[5],jnum[5],lnum[5];
ET0=1;
EA=1;
TR0=1;
EX0=1;
EX1=1;
IT0=1;
IT1=1;
TMOD=0x01;
TH0=0x3C;
TL0=0xB0;
unsigned int cn=0;
P2=0x00;
while(1)
{void key();
void view();
void jumpnumber();
void clock();
void intclock();
}
}像做电子钟一般你要先确定你的各个模块用什么实现,比如显示是用LCD还是数码管,计时用定时器还是时钟芯片。对于你这个我推荐你用专门的日历时钟芯片,如DS1302。虽然看起来加个模块更复杂了,其实不然,对于你这个功能比较多的项目,不用时钟芯片,程序会变得很复杂。本人大学是做过这个,完全软件实现。后来又做过DS1302的,其实这个不难,你只需要通过SPI接口对它进行简单的读写,至于如何计时不用在程序中专门去写。设置一个测试位。在闹钟起闹前软件先查看启动位是否符合要求。 简单的说就是让把 一个位设置为1 或0 。比如1就闹。0就停。
可以设置一个按键 来改变测试位的状态。从而实现设置开启功能这个很好理解啊,if(a==1||b==1)两者之间是或的关系,只要有一个成立,那么下面你写的两个显示函数都会显示,肯定不能正常显示。你可以用if(a==1) display{};
else if(b==1) display{};其实不用定时中断也能实现功能:
#include<reg51h> 主函数
unsigned char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};定义0-9数组
unsigned int tmp;定义变量
void delay(unsigned int xms)定义延时函数
{unsigned int j,i;
for(i=0;i<xms;i++)
for(j=0;j<100;j++);
}
void disp()定义子函数
{
P1=tmp;
delay(1);
P2=0xff;
tmp=tmp<<1;
}
void main( )
{
unsigned char z,s=00,m=00,h=00;给时钟初始值
while(1)
{
for(z=0;z<100;z++)
{
tmp=0x01;
P2=tab[h/10];小时显示
disp();
P2=tab[h%10];
disp();
P2=tab[m/10];分钟显示
disp();
P2=tab[m%10];
disp();
P2=tab[s/10];秒显示
disp();
P2=tab[s%10];
disp();
}
s++;
while(s==60)秒进一位,到60清0
{
m++;
s=00;
}
while(m==60)分钟进一位,到60清0
{
h++;
m=00;
}
while(h==24)小时进一位,到24清0
{
h=00;
}
}
}
把按键检测,和执行按键功能,分开。
参考如下程序:
void main(){
mm = 0, kk = 0;
while(1) {
kk = keyscan(); //返回0、1、2、3
if(kk == 0) display(shi, fen, miao); //没有按就正常走时
if(kk == 1) {mm++; if(mm == 4) mm = 0;} //改变项目
if(kk == 2) {
switch(mm) {
case 1 : if(miao < 59) miao++; break;
case 2 : if(fen < 59) fen++; break;
case 3 : if(shi < 23) shi++; break;
}
}
if(kk == 3) {
switch(mm) {
case 1 : //相应项目--; break;
case 2 : //相应项目--; break;
case 3 : //相应项目--; break;
}
}
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)