求一个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);
}
}
}
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