求一个51单片机定时闹钟程序。要C语言。能够调时间

如题所述

我来发一个C语言51单片机时钟程序,希望能帮到你

/* 程序功能:带定时闹铃时钟                                      */

/*---------------------------------------------------------------*/

#include <AT89X51.H>    /*包含器件配置文件*/

#define uchar unsigned char

#define uint unsigned int

char DATA_7SEG[10]={0xC0,0xF9,0xA4,0xB0,0x99,

                    0x92,0x82,0xF8,0x80,0x90,};/*0~9的数码管段码*/

uchar hour=0,min=0,sec=0;   /*时、分、秒单元清零*/

uchar deda=0;        /*5mS计数单元清零*/ 

bit d_05s=0;               /*0.5秒标志*/

uchar set=0;      /*模式设定标志*/

uchar m=0;

uchar flag=0;      /*RAM掉电标志*/

void delay(uint k);     /*延时?函数*/

void conv();         /*走时单元转换*/

void disp();      /*走时时间显示?函数*/

/*------------------------走时?函数部分 ----------------------*/

/*定时器T0  5mS初始化*/

void init_timer()

{

TMOD=0x01;

TH0=-(4800/256);

TL0=-(4800%256);

IE=0x82;

TR0=1;

}

/*---------------------------------*/

/*5mS定时中断服务?函数*/

void T0_srv(void) interrupt 1 

{

TH0=-(4800/256);

TL0=-(4800%256);

deda++;

}                                                                                                   

/*----------------------------------*/

/*时、分、秒单元及走时单元转换*/

void conv()                                                   

{                                          

if(deda<=100)d_05s=0;

 else d_05s=1;

if(deda>=200){sec++;deda=0;}

if(sec==60){min++;sec=0;}

if(min==60){hour++;min=0;}

if(hour==24){hour=0;}

}

          

/*------------------------ 显示?函数部分 ----------------------*/

/*走时时间显示?函数*/

void disp()

{

P0=DATA_7SEG[hour/10];P2=0xf7;delay(1);

P0=DATA_7SEG[hour%10];P2=0xfb;delay(1);

if(d_05s==1){if(P2_2==0)P0_7=0;else P0_7=1;}

delay(1);

P0=DATA_7SEG[min/10];P2=0xfd;delay(1);

P0=DATA_7SEG[min%10];P2=0xfe;delay(1);

}

/*---------------------- 调整时间?函数部分 -------------------*/

/*调整走时时间*/

void set_time()

{uchar m;

 if(P2_5==0)delay(1);

 if(P2_5==0)hour++;

 if(hour==24)hour=0;

 for(m=0;m<30;m++)

  {

  disp();

  if(P2_2==0)P0_7=0;

  else P0_7=1;

  delay(1);

  }

  

 if(P2_6==0)delay(1);

 if(P2_6==0)min++;

 if(min==60)min=0;

 for(m=0;m<30;m++)

  {

  disp();

   if(P2_2==0)P0_7=0;

  else P0_7=1;

  delay(1);

  }

}

/*------------------ 按键扫描、延时等?函数部分-------------------*/

/*走时时间程序?函数*/

void time()              

{                       

conv();    /* 走时单元转换?函数  */

disp();    /* 走时时间显示?函数  */

}              

/*------------------------------------*/

/*扫描按键?函数*/

void scan_key()

{

delay(1);

if(P2_4==0)set++;

if(set>=2)set=0;

if(set==1)flag=0x55;      

F0:if(P2_4==0)goto F0; /*按键未释放,在此等候*/

}

/*------------------------------*/

/*延时?函数*/

void delay(uint k)

{

uint i,j;

for(i=0;i<k;i++){

for(j=0;j<121;j++)

{;}}

}

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

/*主函数*/

void main()

{                          

 init_timer();             /*定时器T0初始化*/       

 while(1)     /*无限循环*/

 {

if(P2_4==0)scan_key();   /*有按键,调用按键扫描?函数*/

switch(set)      /*根据set键值散转*/

{                         

case 0:time();  break;    /*走时时间程序*/

case 1:set_time();break;       /*走时时间调整*/

default:break;     /*其它退出*/

}                                  

  if(flag!=0x55)          /*判断掉电标志*/

     

      {         

        P0=0xc0; P2=0xc0; delay(100); 

     P2=0xff; delay(400);                               

      }

    }

}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-11-21
P0=dispcode[hour10]; //显示时的十位
delay(1);

P2=0x7f;
P0=dispcode[hour1]; //显示时的个位
delay(1);
}

void main()
{
unsigned char flag;
Initial_DS1302(); //初始化DS1302这个时钟芯片,
while(1)
{
DS1302_GetTime(&time1); //读取时间参数
time[5]=(time1.Second)%10; //把秒的个位数据存入time[5]
time[4]=(time1.Second)/10; //把秒的十位数据存入time[4]
time[3]=(time1.Minute)%10; //把分的个位数据存入time[3]
time[2]=(time1.Minute)/10; //把分的十位数据存入time[2]
time[1]=(time1.Hour)%10; //把时的个位数据存入time[1]
time[0]=(time1.Hour)/10; //把时的十位数据存入time[0]
date[5]=(time1.Day)%10;
date[4]=(time1.Day)/10;
date[3]=(time1.Month)%10;
date[2]=(time1.Month)/10;
date[1]=(time1.Year)%10;
date[0]=(time1.Year)/10;

if(P1_4==0) //如果按下Time Start键一下,时钟开始正常显示时间,再按一下,显示日期
{
delay(50);
if(P1_4==0)
{
flag++;
if(flag>1)
{
flag=0;
}
}
while(P1_4==0);
}
if(P1_6==0) //如果按下Time Set键一下,开始显示日期,再按一下进入日期跟时钟的调节模式
{
delay(50);
if(P1_6==0)
{
flag++;
if(flag>7)
{
flag=0;
}
}
while(P1_6==0);
}

switch(flag)
{
case 0:display(time[0],time[1],time[2],time[3],time[4],time[5]); //调用子函数display,把存入数组time的数据给显示出来
break;

case 1:display(date[0],date[1],date[2],date[3],date[4],date[5]); //调用子函数display,把存入数组date的数据给显示出来
break;

case 2:time1.Year=button_date(time1.Year,100,99); //调整年
DS1302_SetTime(0x8c,time1.Year);
display(date[0],date[1],10,10,10,10);
break;

case 3:time1.Month=button_date(time1.Month,13,12); //调整月
DS1302_SetTime(0x88,time1.Month);
display(10,10,date[2],date[3],10,10);
break;

case 4:time1.Day=button_date(time1.Day,32,31); //调整日
DS1302_SetTime(0x86,time1.Day);
display(10,10,10,10,date[4],date[5]);
break;

case 5:time1.Hour=button_time(time1.Hour,24,23); //调整时
DS1302_SetTime(0x84,time1.Hour);
display(time[0],time[1],10,10,10,10);
break;

case 6:time1.Minute=button_time(time1.Minute,60,59); //调整分
DS1302_SetTime(0x82,time1.Minute);
display(10,10,time[2],time[3],10,10);
break;

case 7:time1.Second=button_time(time1.Second,60,59); //调整秒
DS1302_SetTime(0x80,time1.Second);
display(10,10,10,10,time[4],time[5]);
break;
}
}
}

这是数码管显示可调日期的程序,在此基础上稍加修改就可以实现定时功能,用的定时芯片是DS1302
第2个回答  2010-11-21
我晕 很长的本回答被网友采纳
相似回答