找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6478|回复: 5
打印 上一主题 下一主题
收起左侧

求助ds1302电子时钟程序困扰

[复制链接]
跳转到指定楼层
楼主
ID:33455 发表于 2011-11-21 13:14 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

自己弄了个四位共阴数码管显示电子时钟带按键带闹铃 现在想另加个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               程序结束 
***************************************/ 
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

6#
ID:41214 发表于 2012-6-2 01:13 | 只看该作者
 说错了 我设定的是10秒  但 就是这个时间的问题    感觉是switch语句的问题
回复

使用道具 举报

5#
ID:41214 发表于 2012-6-2 01:12 | 只看该作者
嗯 了解 手册我有  就是一个逻辑错误 找不出来  显示时钟 日历都很正常  就是交替显示 时间不是我设定的10秒
回复

使用道具 举报

地板
ID:33975 发表于 2012-2-1 21:23 | 只看该作者
找个ds1302的数据手册,按照时序图一步步写就是,很简单的
回复

使用道具 举报

板凳
ID:33455 发表于 2011-11-21 15:25 | 只看该作者

嘿嘿 我不会写不知道怎么弄 谢谢

回复

使用道具 举报

沙发
ID:27916 发表于 2011-11-21 13:28 | 只看该作者

做一个1302的读写函数,上电 后就从1302里读出时间来,放到LED上显示,有按键调准时间的时候就对1302写一次新的时间进去

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表