自己弄了个四位共阴数码管显示电子时钟带按键带闹铃 现在想另加个1302芯片让掉电后时钟继续走 望高人帮帮我怎么在程序里面实现 谢谢 我把我的源程序贴上望高人指点 在此谢过
//闹铃功能说明: //按下KEY之后 进入设置闹铃模式 小数点不闪烁 //设置完闹铃时间后 再按一下KEY 继续显示时钟 //时钟到达设置时间后 P1^0变为高电平 持续一秒钟
#include <at89x51.h> //头文件包含
#define uchar unsigned char //宏定义
#define uint unsigned int
#define ON 0 //定义0为打开
#define OFF 1 //定义1为关闭
#define LEDBus P2 //定义p2口为数码管段码口
sbit MIAO =P1^7; //秒点 ,数码管第二位小数点,可以自己随意定义.
sbit HOU_S=P3^3; //时十位位选
sbit HOU_G=P3^2; //时个位位选
sbit MIN_S=P3^1; //分十位位选
sbit MIN_G=P3^0; //分个位位选
sbit ALA=P1^0; //闹铃蜂鸣
sbit KEY =P0^0; //闹铃设置按键
sbit H_KEY=P0^5; //时调整键
sbit M_KEY=P0^4; //分调整键
bit SHAN; //闪烁标志位
uchar second,minute,hour,m,h,flag; //定义秒、分、时寄存器
uchar code LEDTab[]={0x3f,0x06,0x5b, //共阴数码管段码表0--9码
0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void delay(uchar t); //延时函数
void init(); //初始化函数
void display(uchar,uchar); //显示函数
void min_tiao(); //分调整函数
void hou_tiao(); //时调整函数
void alarm_tiao();
/***************************************
函 数 名:main
功 能:主函数
说 明:
入口参数:无
返 回 值:无
****************************************/
void main()
{
init(); //调用初始化函数
while(1) //主程序循环
{
if(!H_KEY) hou_tiao(); //如果时调整键按下(为0),调用时调整函数
if(!M_KEY) min_tiao(); //如果分调整键按下(为0),调用分调整函数
if(!KEY)
{
while(!KEY);
alarm_tiao();
}
if((m==minute)&&(h==hour)==1) ALA=1;
else ALA=0;
display(minute,hour); //调用显示函数
}
}
/***************************************
函 数 名:init
功 能:初始化函数
说 明:初始化定时器及中断
入口参数:无
返 回 值:无
***************************************/
void init()
{
TMOD=1;TH0=0X3C;TL0=0XB0; //定时器0模式1,50毫秒
ET0=1;TR0=1;EA=1; //开定时器0中断、启动定时器0、开总中断
m=0;h=0;flag=0;
}
/***************************************
函 数 名:display
功 能:显示函数
说 明:
入口参数:无
返 回 值:无
***************************************/
void display(uchar minute,uchar hour)
{
LEDBus=LEDTab[minute%10]; //分个位送数码管显示
MIN_G=ON; //打开分个位位选
delay(1); //显示1毫秒
MIN_G=OFF; //关闭分个位位选
LEDBus=LEDTab[minute/10]; //分十位送数码管显示
MIN_S=ON; //打开分十位位选
delay(1); //显示1毫秒
MIN_S=OFF; //关闭分十位位选
LEDBus=LEDTab[hour%10]; //时个位送数码管显示
MIAO=SHAN; //秒点闪烁
HOU_G=ON; //打开时个位位选
delay(1); //显示1毫秒
HOU_G=OFF; //关闭时个位位选
if(hour/10) //如果时十位为0,不显示十位数字
{
LEDBus=LEDTab[hour/10]; //时十位送数码管显示
HOU_S=ON; //打开时十位位选
delay(1); //显示1毫秒
HOU_S=OFF; //关闭时十位位选
}
}
/***************************************
函 数 名:min_tiao
功 能:分调整
说 明:
入口参数:无
返 回 值:无
***************************************/
void min_tiao()
{
while(!M_KEY) display(minute,hour); //等待分调整键松开
second=0;minute++; //秒清零、分加1
if(minute==60) minute=0; //如果分等于60,分变0
}
/***************************************
函 数 名:hou_tiao
功 能:时调整
说 明:
入口参数:无
返 回 值:无
***************************************/
void hou_tiao()
{
while(!H_KEY) display(minute,hour) ; //等待时调整键松开
second=0;hour++; //秒清零,时加1
if(hour==24) hour=0; //如果时等于24,时变0
}
/***************************************
函 数 名:delay
功 能:延时函数
说 明:
入口参数:t:延时时间长短
返 回 值:无
***************************************/
void alarm_tiao()
{
flag=1;
while(flag)
{
if(!H_KEY)
{
while(!H_KEY) display(m,h) ;
h++;
if(h==24) h=0;
}
if(!M_KEY)
{
while(!M_KEY) display(m,h);
m++;
if(m==60) m=0;
}
if(!KEY) flag=0;
display(m,h);
}
while(!KEY);
}
void delay(uchar t)
{
uchar i; //定义变量
for(;t>0;t--) //如果t大于0,t减1(外层循环)
for(i=124;i>0;i--); //i等于124,如果i大于0,i减1
}
/***************************************
函 数 名:timer0
功 能:定时器0中断函数
说 明:
入口参数:无
返 回 值:无
***************************************/
void timer0() interrupt 1 //定时器0(中断1)
{
uchar tim1,tim2; //定义临时变量
TL0=TL0+0XB0;TH0=0X3C; //重装定时器初值
tim1++; //每中断一次tim1加1
if(tim1==10) //中断10(0.5秒)
{
if(!flag)
{
SHAN=!SHAN; //闪烁标志取反
}
tim1=0;tim2++; //tim1清零,tim2加1
if(tim2==2) //到了1秒
{
tim2=0;second++; //tim2清零,秒加1
if(second==60) //如果秒到60
{
second=0;minute++; //秒变0,分加1
if(minute==60) //如果分到60
{
minute=0;hour++; //分变0,时加1
if(hour==24) hour=0; //如果时到24,时变0
}
}
}
}
}
/***************************************
program end 程序结束
***************************************/
|