求单片机C语言的电子闹钟设计程序 其功能只要有闹钟,一天24小时的时钟功能就行。

求单片机C语言的电子闹钟设计程序 其功能只要有闹钟,一天24小时的时钟功能就行。,第1张

你看看行不行
#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;
        }
      }
    }
}


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

原文地址: http://outofmemory.cn/yw/13217163.html

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

发表评论

登录后才能评论

评论列表(0条)

保存