找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 13456|回复: 31
收起左侧

ds3231时钟闹钟不工作

  [复制链接]
ID:86421 发表于 2015-10-13 18:48 | 显示全部楼层 |阅读模式
做了一个由ds3231、1602显示、51单片机的时钟,从这个网上一个高手那下载的程序。安装好后,时间显示、时间调整、各种设置都好用,但闹钟到时间不闹,请那位高手指点。在些感谢了!!!
回复

使用道具 举报

ID:1 发表于 2015-10-13 18:55 来自手机 | 显示全部楼层
把你的程序发出来看一下有什么问题
回复

使用道具 举报

ID:86421 发表于 2015-10-13 19:03 | 显示全部楼层
不好意思,那程序在电脑里,我还不会发。不过在这个论坛上有好多,我看了一下,都有一样的。http://www.51hei.com/bbs/dpj-32645-1.html
回复

使用道具 举报

ID:86421 发表于 2015-10-13 21:57 | 显示全部楼层
void main()
{
Delay5Ms();
Delay5Ms();
Timer0Init(); //开启定时器0中断
Timer1Init(); //开启定时器1中断
Alarm_Int0_Init(); //开启外部中断0
while(!F_500ms) ; //启动等待,等LCM讲入工作状态
   Beep(1); //开机提示音
Write_18B20();
    InitDS3231(); //初始化DS3231
   autoweek(); //开机自动星期转换
LCMInit(); //LCM初始化
while(1)
{
  if(F_100ms&&SetFlag==0)
  {
   Disp_Time();
   F_100ms=0;F_100ms_b=0;
  }
  if(Al_Flag==1 && aa==0) Beep(2);!!![这是MAIN。C程序的一部分,我不知道这个Al_Flag==1是什么地方来的,问题可能就在这个位置上]
  if(Al_Flag==1 && aa==1) Play_Music(MusicTwo,5);
  if((min-alarmmin)==2) Al_Flag=0; //闹铃响2分钟,停止闹铃
  Scan_Key();
  KeyProcess();
  if(Disp_b>=20) SetFlag=0;//10s没有按下按键,则返回时间显示
}

}

void Alarm_Int0() interrupt 0
{
Al_Flag=1; //闹铃标志位置位
alarmmin=min; //初始化闹铃时间
I2CWrite(DS3231_STATUS,0x00); //清DS3231内部闹钟标志位
//Beep2();
}
回复

使用道具 举报

ID:86421 发表于 2015-10-13 22:01 | 显示全部楼层
以下是DS3231.C的部分文件,不知道与上面的这个有什么关联
void InitDS3231()
{
        SCL=1;
        delayus(5);
        SDA=1;
        delayus(5);
        I2CWrite(DS3231_AL1DAY,0x81);        //A1M4置位,时分秒匹配时闹钟响应
        I2CWrite(DS3231_AL2DAY,0x81);        //A2M4置位,时分匹配时闹钟响应
        I2CWrite(DS3231_CONTROL,0x04);        //中断允许,闹钟1和2关闭
        I2CWrite(DS3231_STATUS,0x00);        //32KHZ输出禁止,闹钟标志位清零
        //SetTime(11,1,14,8,10,0);
}
回复

使用道具 举报

ID:86421 发表于 2015-10-21 16:46 | 显示全部楼层
经过不断的调试,闹铃二响了,可闹铃一还是不行,真不知道是什么原因,整的头疼。
回复

使用道具 举报

ID:79544 发表于 2015-10-22 08:50 | 显示全部楼层
应该没有调用闹铃2的函数,你再好好找找。我的都好用,就是红外不好用,也在折腾。
回复

使用道具 举报

ID:86421 发表于 2015-10-23 20:34 | 显示全部楼层
这个程序中没有红外控制。闹钟是两个的,但闹钟一现在还是不好用。
回复

使用道具 举报

ID:86421 发表于 2015-10-23 20:39 | 显示全部楼层
  1. #include "main.h"

  2. xdata uchar year,month,date,day,hour,min,sec,DTemp=0;
  3. xdata uchar al1_min,al1_hour,al1_day,al2_min,al2_hour,al2_day;
  4. bit ack;

  5. uchar BCD2HEX(uchar val)   //BCD转换为Byte
  6. {
  7. uchar i;
  8.     i= val&0x0f;
  9.     val >>= 4;
  10.     val &= 0x0f;
  11.     val *= 10;
  12.     i += val;
  13.    
  14.     return i;
  15. }

  16. uchar B_BCD(uchar val)//B码转换为BCD码
  17. {
  18. uchar i,j,k;

  19.   i=val/10;
  20.   j=val%10;
  21.   k=j+(i<<4);
  22.   return k;
  23. }

  24. void delayus(uchar i)
  25. {
  26.    while(--i) ;
  27. }
  28. /************************START***************************/
  29. void Start()
  30. {
  31.     SDA=1;                  //发送起始条件的数据信号
  32.     delayus(1);
  33.     SCL=1;
  34.     delayus(5);             //起始条件建立时间大于4.7us,延时
  35.    
  36.     SDA=0;                  //发送起始信号
  37.     delayus(5);             // 起始条件锁定时间大于4μs
  38.       
  39.     SCL=0;                  //钳住I2C总线,准备发送或接收数据
  40.     delayus(2);
  41. }
  42. /********************************************************/
  43. /************************STOP****************************/
  44. void Stop()
  45. {
  46.     SDA=0;                  //发送结束条件的数据信号
  47.     delayus(1);             //发送结束条件的时钟信号
  48.     SCL=1;                  //结束条件建立时间大于4us
  49.     delayus(5);
  50.    
  51.     SDA=1;                  //发送I2C总线结束信号
  52.     delayus(4);
  53. }
  54. /********************************************************/
  55. /*******************************************************************
  56.                   字节数据发送函数               
  57. 函数原型:     void   SendByte(uchar Dat);
  58. 功能:      将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
  59.            此状态位进行操作.(不应答或非应答都使ack=0)
  60.            ack=1        发送数据正常,
  61.            ack=0        被控器无应答或损坏。
  62. ********************************************************************/
  63. void SendByte(uchar Dat)
  64. {
  65. uchar BitCnt;
  66.    
  67.     for(BitCnt=0;BitCnt<8;BitCnt++)         //要传送的数据长度为8位
  68.     {
  69.         if((Dat<<BitCnt)&0x80)
  70.             SDA=1;                          //判断发送位
  71.         else
  72.             SDA=0;               
  73.           delayus(1);
  74.           SCL=1;                            //置时钟线为高,通知被控器开始接收数据位
  75.           delayus(5);                       //保证时钟高电平周期大于4μs   
  76.           SCL=0;
  77.     }
  78.    
  79.     delayus(2);
  80.     SDA=1;                                  //8位发送完后释放数据线,准备接收应答位
  81.     delayus(2);  
  82.     SCL=1;
  83.     delayus(3);
  84.     if(SDA==1)
  85.         ack=0;   
  86.     else
  87.         ack=1;                              //判断是否接收到应答信号
  88.     SCL=0;
  89.     delayus(2);
  90. }
  91. /********************************************************/
  92. /*******************************************************************
  93.                   字节数据接收函数               
  94. 函数原型:     uchar   RcvByte();
  95. 功能:      用来接收从器件传来的数据,并判断总线错误(不发应答信号),
  96.            发完后请用应答函数应答从机。  
  97. ********************************************************************/
  98. uchar RcvByte()
  99. {
  100. uchar retc;
  101. uchar BitCnt;

  102.    retc=0;
  103.    SDA=1;                           //置数据线为输入方式
  104.    for(BitCnt=0;BitCnt<8;BitCnt++)
  105.    {
  106.         delayus(1);  
  107.         SCL=0;                      //置时钟线为低,准备接收数据位
  108.       
  109.         delayus(5);                 //时钟低电平周期大于4.7μs
  110.       
  111.         SCL=1;                      //置时钟线为高使数据线上数据有效
  112.         delayus(3);
  113.         retc=retc<<1;
  114.         if(SDA==1)
  115.             retc=retc+1;            //读数据位,接收的数据位放入retc中
  116.         delayus(2);
  117.    }
  118.    SCL=0;
  119.    delayus(2);
  120.    return(retc);
  121. }
  122. /********************************************************************
  123.                       应答子函数
  124. 函数原型:   void I2CACK(bit a);
  125. 功能:       主控器进行应答信号(可以是应答或非应答信号,由位参数a决定)
  126. ********************************************************************/
  127. void I2CACK(bit a)
  128. {

  129.     if(a==0)
  130.         SDA=0;              //在此发出应答或非应答信号
  131.     else
  132.         SDA=1;
  133.     delayus(3);     
  134.     SCL=1;
  135.    
  136.     delayus(5);             //时钟低电平周期大于4μs
  137.    
  138.     SCL=0;                  //清时钟线,钳住I2C总线以便继续接收
  139.     delayus(2);   
  140. }
  141. /****************************************************/
  142. /***********将一个字节写入DS3231指定的地址***********/
  143. uchar I2CWrite(uchar addr,uchar bytedata)
  144. {
  145.         Start();
  146.     SendByte(ADDRTC);
  147.     if (ack == 0)
  148.         return 0;
  149.    
  150.     SendByte(addr);   
  151.     if (ack == 0)
  152.         return 0;
  153.    
  154.     SendByte(bytedata);
  155.     if (ack == 0)
  156.         return 0;
  157.    
  158.     Stop();
  159.     delayus(10);      
  160.     return 1;
  161. }
  162. /****************************************************/
  163. /************从DS3231当前地址读一个字节************/
  164. uchar I2CRead()
  165. {
  166. uchar read_data;

  167.     Start();
  168.     SendByte(ADDRTC+1);
  169.     if(ack==0)
  170.     {
  171.                 DisplayChar(11,1,'t');
  172.                 return(0);
  173.            }       
  174.     read_data = RcvByte();
  175.     I2CACK(1);
  176.     Stop();
  177.     return read_data;
  178. }

  179. /****************************************************/
  180. /************从DS3231指定地址读一个字节************/
  181. uchar I2CReadAdd(uchar addr)
  182. {
  183.     Start();
  184.     SendByte(ADDRTC);
  185.     if(ack==0)
  186.     {
  187.                 DisplayChar(12,1,'x');
  188.                 return(0);
  189.            }       
  190.     SendByte(addr);
  191.     if(ack==0)
  192.     {
  193.                 DisplayChar(13,1,'y');
  194.                 return(0);
  195.            }       
  196.     return(I2CRead());
  197. }
  198. /***************************************************/
  199. /*********************读取时间**********************/
  200. void Readtime()
  201. {
  202. uchar temp;
  203.   
  204.   temp=I2CReadAdd(DS3231_SEC);//秒
  205.   sec=BCD2HEX(temp);
  206.   temp=I2CReadAdd(DS3231_MIN);//分
  207.   min=BCD2HEX(temp);
  208.   temp=I2CReadAdd(DS3231_HOUR);  //时
  209.   //temp&=0x3F;
  210.   hour=BCD2HEX(temp);
  211.   day=I2CReadAdd(DS3231_DAY);//星期
  212.   temp=I2CReadAdd(DS3231_DATE);  //日
  213.   date=BCD2HEX(temp);
  214.   temp=I2CReadAdd(DS3231_MONTH); //月
  215.   month=BCD2HEX(temp);
  216.   temp=I2CReadAdd(DS3231_YEAR);  //年
  217.   year=BCD2HEX(temp);
  218.   Dtemp=I2CReadAdd(DS3231_TEMP_H);//温度
  219. }
  220. /***************************************************/
  221. /*******************读取闹铃时间********************/
  222. void ReadAlarm()
  223. {
  224. uchar temp;
  225.   
  226.   temp=I2CReadAdd(DS3231_AL1MIN);//分
  227.   al1_min=BCD2HEX(temp);
  228.   temp=I2CReadAdd(DS3231_AL1HOUR);  //时
  229.   al1_hour=BCD2HEX(temp);
  230.   temp=I2CReadAdd(DS3231_AL1DAY);  //星期or日
  231.   al1_day=BCD2HEX(temp);
  232.   temp=I2CReadAdd(DS3231_AL2MIN);//分
  233.   al2_min=BCD2HEX(temp);
  234.   temp=I2CReadAdd(DS3231_AL2HOUR);  //时
  235.   al2_hour=BCD2HEX(temp);
  236.   temp=I2CReadAdd(DS3231_AL2DAY);  //星期or日
  237.   al2_day=BCD2HEX(temp);
  238. }
  239. /***************************************************/
  240. /****************修改时间***************************/
  241. /*void SetTime(uchar yea,uchar mon,uchar da,uchar hou,uchar min,uchar sec)
  242. {
  243. uchar temp=0;
  244.   
  245.   temp=B_BCD(sec);
  246.   I2CWrite(0x00,temp);//修改秒
  247.   temp=B_BCD(min);
  248.   I2CWrite(0x01,temp);//修改分
  249.   temp=B_BCD(hou);
  250.   I2CWrite(0x02,temp);//修改时
  251.   temp=B_BCD(da);
  252.   I2CWrite(0x04,temp);//修改日
  253.   temp=B_BCD(mon);
  254.   I2CWrite(0x05,temp);//修改月
  255.   temp=B_BCD(yea);
  256.   I2CWrite(0x06,temp);//修改年
  257. }*/

  258. bit runnian()//闰年判断
  259. {
  260.         if((year%4==0&&year%100!=0)||(year%100==0&&year%400==0))
  261.         {
  262.                 return 1;
  263.         }
  264.         else
  265.         {
  266.                 return 0;
  267.         }


  268. }

  269. void autoweek()
  270. {
  271.         Readtime();
  272.         if( month == 1 || month == 2 )  
  273.     {
  274.         month += 12;
  275.         if( year> 0 )
  276.             year--;
  277.         else
  278.             year = 4;
  279.     }
  280.         day = (1+(( date + 2*month + 3*(month+1)/5 + year + year/4 ) %7));
  281.         I2CWrite(DS3231_DAY,day);
  282. }

  283. void InitDS3231()
  284. {
  285.         SCL=1;
  286.         delayus(5);
  287.         SDA=1;
  288.         delayus(5);
  289.         I2CWrite(DS3231_AL1DAY,0x81);        //A1M4置位,时分秒匹配时闹钟响应
  290.         I2CWrite(DS3231_AL2DAY,0x81);        //A2M4置位,时分匹配时闹钟响应
  291.         I2CWrite(DS3231_CONTROL,0x04);        //中断允许,闹钟1和2关闭
  292.         I2CWrite(DS3231_STATUS,0x00);        //32KHZ输出禁止,闹钟标志位清零
  293.         //SetTime(11,1,14,8,10,0);
  294. }

  295. /* -------- read temperature -------- */
  296. /*void    read_temp()
  297. {
  298. int     itemp;
  299. float   ftemp;

  300.         do
  301.         {
  302.                 itemp=I2CReadAdd(0x0e);
  303.         }       while(itemp & 0x20);            // wait until CNVT bit goes inactive

  304.         Start();
  305.         SendByte(ADDRTC);
  306.         SendByte(0x11);                 //address of temperature MSB
  307.         Start();
  308.         SendByte(ADDRTC + 1);           //send the device address for read
  309.         itemp = ( (int) RcvByte() << 5 );
  310.                 I2CACK(0);
  311.         itemp += ( RcvByte() >> 3);
  312.                 I2CACK(1);
  313.         Stop();
  314.         if(itemp & 0x1000) {itemp += 0xe000;}        //if sign bit set, make 16 bit 2's comp

  315.         ftemp = 0.03125 * (float) itemp;        // convert to degrees C
  316.         // ftemp = ftemp * 9 / 5 + 32;  // skip this if you don't want degrees F
  317.                 Dtemp  = (uchar) ftemp;
  318. }*/
复制代码
回复

使用道具 举报

ID:86421 发表于 2015-10-23 20:40 | 显示全部楼层
上面是DS3231。C程序
回复

使用道具 举报

ID:86421 发表于 2015-10-23 20:42 | 显示全部楼层
不知道是不是出在303、304行。真的整不出来了。哪位老师帮着看看。
回复

使用道具 举报

ID:86421 发表于 2015-10-23 20:57 | 显示全部楼层
东东做出来了,放在一个小盒子里,挺好玩的。但原程序上是用三个按键控制的(一个设置,一个上调,一个下调),做的时候直接焊在了线路板上,也不想引线了。不知道有没有高手能加一个红外的程序,可以用摇控控制。
回复

使用道具 举报

ID:93369 发表于 2015-10-23 21:37 | 显示全部楼层
做出了功能正常了吗,可以参考网上,做个定时器监控红外发送的数据,根据数据操作时钟修改,就相当于原来监控按键改监控红外
回复

使用道具 举报

ID:86421 发表于 2015-10-30 18:20 | 显示全部楼层
怎么没哪位高手帮忙说说闹钟一为什么不闹呀?其实这个程序我也是从这个网上下来的,原作者没试一下吗?
回复

使用道具 举报

ID:93926 发表于 2015-10-30 19:05 | 显示全部楼层
做出了功能正常了吗,可以参考网上,做个定时器监控红外发送的数据,根据数据操作时钟修改,就相当于原来监控按键改监控红外
回复

使用道具 举报

ID:86421 发表于 2015-12-23 20:31 | 显示全部楼层
这个是全部的程序。

ds32311602时钟.rar

125.63 KB, 下载次数: 303

DS3231、1602

回复

使用道具 举报

ID:98321 发表于 2015-12-24 15:34 | 显示全部楼层
表示也不会
回复

使用道具 举报

ID:135053 发表于 2016-7-27 18:46 | 显示全部楼层
1qaz2wsx77 发表于 2015-12-23 20:31
这个是全部的程序。

好人呀,终于找到全的程序了,谢谢!
回复

使用道具 举报

ID:136679 发表于 2016-8-13 15:40 | 显示全部楼层
好人呀   我也正在研究。
回复

使用道具 举报

ID:146910 发表于 2016-12-18 13:01 | 显示全部楼层
好人呀   我也正在研究。
回复

使用道具 举报

ID:146910 发表于 2016-12-18 22:49 | 显示全部楼层
仿制了一个,显示不正常,不知道什么原因。哪位老师帮看看。
50FABF5A4C94D08CE3A4CE9B1CF80EC0.jpg
回复

使用道具 举报

ID:108715 发表于 2017-2-3 19:49 | 显示全部楼层
我也弄了好久,就是闹钟1不响,求教高手哪里的原因
回复

使用道具 举报

ID:163384 发表于 2017-2-3 21:44 | 显示全部楼层
把闹铃1删了吧
回复

使用道具 举报

ID:1989 发表于 2017-12-8 22:39 来自手机 | 显示全部楼层
程序好复杂,还没看透
回复

使用道具 举报

ID:61840 发表于 2017-12-8 23:23 | 显示全部楼层
303和304两个地址是一样的,所以只能是一个响应的
回复

使用道具 举报

ID:61840 发表于 2017-12-8 23:25 | 显示全部楼层
        I2CWrite(DS3231_AL1DAY,0x81);        //A1M4置位,时分秒匹配时闹钟响应

     I2CWrite(DS3231_AL2DAY,0x81);        //A2M4置位,时分匹配时闹钟响应

都在0X81地址,虽然写了两个闹铃的数据,但闹铃2覆盖了闹铃1
回复

使用道具 举报

ID:268888 发表于 2017-12-30 15:45 | 显示全部楼层
看了你的代码你的按键设定部分,再打开闹铃2的时候把闹铃1关闭了,应该是写11才是12都开吧是不是^0x03是这样么?
回复

使用道具 举报

ID:98880 发表于 2018-6-6 22:36 | 显示全部楼层
你要注意他这个图纸上。ALARM脚是接在了DS3231的第3脚上的。这个脚是闹钟时间匹配了就输出低电平的,所以判断不是由单片机来完成的。是由DS3231完成的。你可能没有看到这点。要看原图纸才行。
回复

使用道具 举报

ID:346756 发表于 2018-6-7 10:37 | 显示全部楼层
注意看一下他的图纸是不是由单片机实现的
回复

使用道具 举报

ID:363038 发表于 2018-8-21 10:36 | 显示全部楼层
我也正在做这个
回复

使用道具 举报

ID:386381 发表于 2018-8-21 15:33 来自手机 | 显示全部楼层
是呀,我也遇到同样问题,希望高手们能解决,造福本坛。
回复

使用道具 举报

ID:809677 发表于 2020-7-30 15:50 | 显示全部楼层
ds3231两个闹铃能同时用吗?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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