找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于stm32f103c8t6、ds1302的电子时钟电路+程序设计

  [复制链接]
跳转到指定楼层
楼主

这是电路图,用了3个595驱动两个4位共阴数码管,按键、蜂鸣器、指示灯都忘记画了

#define DS1302_SCK_PIN        GPIO_Pin_7        //ds1302sck
#define DS1302_IO_PIN         GPIO_Pin_6    //ds1302io
#define DS1302_CE_PIN         GPIO_Pin_5   //ce
#define KEY1                  GPIO_Pin_15 //按键
#define KEY2                  GPIO_Pin_14
#define KEY3                  GPIO_Pin_13
#define KEY4                  GPIO_Pin_12
#define DEEP                  GPIO_Pin_11//蜂鸣器
#define LIGHT                 GPIO_Pin_8//指示灯

这些是代码里引脚的IO定义


做好的效果,还有些BUG,需要完善


功能有显示时间 时分秒 年月日 周
修改时间(星期是通过算法算出来的)
闹钟

单片机源程序如下:
  1. #include "stm32f10x.h" //STM32头文件
  2. #include "sys.h"
  3. #include "delay.h"
  4. #include "usart.h"
  5. #include "flash.h"

  6. #define FLASH_START_ADDR  0x0801f000          //写入的起始地址
  7. //READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};//读取时间的命令地址,已经通过读写操作来直接实现这些地址
  8. //WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};//写时间的命令地址
  9. my_time TIME = {0};  //显示时间的结构体
  10. u8  smgduan[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
  11. u8 nz[2]={8,20};
  12. u8 b=0,c=0x00,d=0x00;
  13. u8 k1=0,k4=0,w=4,num=0;
  14. u8 key1,key4;
  15. u16 j,i,a;
  16. //---DS1302时钟初始化2016年5月7日星期六12点00分00秒。---////---DS1302时钟初始化2016年5月7日星期六12点00分00秒。---//
  17. u8 init_time[] = {0,0X18,0x20,0x25,0x11,0x07,0x18}; //初始化时间:秒 分 时 日 月 周 年
  18. u8 write[]= {0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};//写秒void display_real_time(void);
  19. u8 setime[7];
  20. u8 timedata[8];
  21. u8 weixian[8]={0x10,0x20,0x40,0x80,0x01,0x02,0x04,0x08};


  22. static void ds1302_gpio_init(void);
  23. static void ds1302_writebyte(u8 byte_1);//写一个字节; byte是保留字,不能作为变量
  24. static void ds1302_writedata(u8 addr,u8 data_);//给某地址写数据,data是c51内部的关键字,表示将变量定义在数据存储区,故此处用data_;
  25. static u8 ds1302_readbyte(void);//读一个字节
  26. static u8 ds1302_readdata(u8 addr);//读取某寄存器数据;
  27. static void DS1302_delay_us(u16 time);  //简单延时1us
  28. void changetime(void);//改变显示内容
  29. char switchkey1(void);//判断KEY1按下的时间
  30. char switchkey4(void);//判断KEY4按下的时间
  31. void shiftout(u8 num);//595函数
  32. void putOut(char a,char b,char c);//595函数2
  33. void setimeput1(char w);//日期显示
  34. void setimeput(char w);//SETMODE 显示
  35. void setimes(void);//设置时间函数
  36. void clok(void); //闹钟
  37. void nzs(u8 a);//闹钟开关
  38. void fs(char w);



  39. int main()
  40. {
  41. ds1302_gpio_init();

  42. //USART1_Init(115200);
  43. //DS1302_Init();
  44. while(1)
  45. {
  46. //while(!GPIO_ReadInputDataBit(DS1302_PORT,KEY1));
  47. //while(!GPIO_ReadInputDataBit(DS1302_PORT,KEY4));
  48. key1=0;
  49. key4=0;
  50. d=0xff;
  51. c=0xff;


  52. a=FLASH_R(FLASH_START_ADDR);//从指定页的地址读FLASH
  53. b=a&1;
  54. key1=switchkey1();
  55. key4=switchkey4();


  56. display_real_time();
  57. setimeput1(4);
  58. if(key1>=99)
  59. setimes();
  60. if(key1>10&&key1<50)
  61. changetime();
  62. if(key4<90&&key4>=30)
  63. clok();
  64. if(GPIO_ReadInputDataBit(DS1302_PORT,KEY2)==0)
  65.     {delay_ms(20);
  66.     if( GPIO_ReadInputDataBit(DS1302_PORT,KEY2)==0)
  67.     b=!b;
  68.    while(!GPIO_ReadInputDataBit(DS1302_PORT,KEY2));
  69.    a=nz[0]*1000+nz[1]*10+b;
  70. delay_ms(10);
  71. FLASH_W(FLASH_START_ADDR,a);
  72.     }
  73. nzs(b&1);
  74. GPIO_WriteBit(GPIOA,LIGHT,(BitAction)(b));
  75. }
  76. }



  77. void feng()
  78. {
  79. GPIO_WriteBit(DS1302_PORT,DEEP,(BitAction)(0));
  80. delay_ms(100);
  81. GPIO_WriteBit(DS1302_PORT,DEEP,(BitAction)(1));
  82. delay_ms(20);
  83. }

  84. void nzs(u8 b)
  85. {
  86. if(b==1)
  87. {
  88. nz[0]=a/1000;
  89. nz[1]=(a-(nz[0]*1000))/10;
  90. if(setime[4]==nz[0]&&setime[5]==nz[1])
  91. {
  92. while(setime[4]==nz[0]&&setime[5]==nz[1]&&GPIO_ReadInputDataBit(DS1302_PORT,KEY2))
  93. {
  94. feng();
  95. display_real_time();
  96. setimeput1(4);
  97. }
  98. }
  99. else
  100. GPIO_WriteBit(DS1302_PORT,DEEP,(BitAction)(1));
  101. }
  102. else
  103. GPIO_WriteBit(DS1302_PORT,DEEP,(BitAction)(1));
  104. }
  105. char switchkey1(void)//判断按键1按下的时间
  106.    {
  107.   if(GPIO_ReadInputDataBit(DS1302_PORT,KEY1)==0)
  108.     delay_ms(10);
  109.         if(GPIO_ReadInputDataBit(DS1302_PORT,KEY1)==0)
  110.           {
  111.           k1=0;
  112.           while(!GPIO_ReadInputDataBit(DS1302_PORT,KEY1)&&k1<150)
  113.         {
  114.             delay_ms(10);
  115.          k1++;
  116.         }
  117.           }
  118.    return k1;
  119.    }

  120. char switchkey4(void)//判断按键4按下的时间
  121.    {
  122.   if( GPIO_ReadInputDataBit(DS1302_PORT,KEY4)==0)
  123.     delay_ms(10);
  124.         if( GPIO_ReadInputDataBit(DS1302_PORT,KEY4)==0)
  125.           {
  126.           k4=0;
  127.           while(!GPIO_ReadInputDataBit(DS1302_PORT,KEY4)&&k4<150)
  128.         {
  129.             delay_ms(10);
  130.          k4++;
  131.         }
  132.           }
  133.    return k4;
  134.    }


  135. void changetime(void)//按键1改变显示内容
  136. {        num=0;
  137. i=0;
  138.      while((c&0x10))
  139.     {         
  140.       setimeput1(0);
  141.          delay_ms(1);
  142.       if(GPIO_ReadInputDataBit(DS1302_PORT,KEY1)==0)
  143.         {        delay_ms(10);
  144.            if(GPIO_ReadInputDataBit(DS1302_PORT,KEY1)==0)
  145.              while(GPIO_ReadInputDataBit(DS1302_PORT,KEY1)==0&&num<42)
  146.                 {
  147.                  delay_ms(25);
  148.                  num++;
  149.                 }
  150.            }
  151.            if(num>40||i>4000)
  152.            break;
  153.            if(num<10&&num>2)
  154.                  {   c=1;
  155.               while(c&0x01)
  156.                {
  157.                         for(j=0;j<60;j++)
  158.                         {
  159.                         GPIO_WriteBit(GPIOA,GPIO_Pin_3,(BitAction)(0));
  160.                shiftout(smgduan[TIME.week]);
  161.                   shiftout(~0x04);
  162.                shiftout(0);
  163.                   GPIO_WriteBit(GPIOA,GPIO_Pin_3,(BitAction)(1));
  164.                   delay_us(20);
  165.                         GPIO_WriteBit(GPIOA,GPIO_Pin_3,(BitAction)(0));
  166.                shiftout(255);
  167.                   shiftout(255);
  168.                shiftout(255);
  169.                   GPIO_WriteBit(GPIOA,GPIO_Pin_3,(BitAction)(1));
  170.                   delay_us(30);
  171.                         }
  172.                  delay_ms(1);
  173.                           i++;
  174.                 if(!GPIO_ReadInputDataBit(DS1302_PORT,KEY1))
  175.                      {        
  176.                              delay_ms(10);
  177.                             if(!GPIO_ReadInputDataBit(DS1302_PORT,KEY1))
  178.                          {
  179.                          while(GPIO_ReadInputDataBit(DS1302_PORT,KEY1)==0&&num<42)
  180.                        {
  181.                         delay_ms(25);
  182.                          num++;
  183.                         }
  184.                            c=0x00;
  185.                           }
  186.                         
  187.                            }
  188.                           if(num>40||i>4000)
  189.                     break;
  190.                          }           
  191.              }   
  192.           }         
  193. }



  194. void setimeput(char w)        //SET MODE 时间显示
  195. {
  196. //for(i=0;i<5;i+=2)
  197. //  {
  198. //   timedata[i]=setime[w]/10;
  199. //   timedata[i+1]=setime[w]%10;
  200. //   w++;
  201. //  }
  202. fs(w);
  203.       for(i=0;i<2;i++)
  204.          {
  205.         for(i=0;i<4;i++)
  206.          {
  207.           putOut(0,~weixian[i],timedata[i]);
  208.           delay_us(50);
  209.           }
  210.                  for(i=4;i<8;i++)
  211.            {
  212.             putOut(timedata[i],~weixian[i],0);
  213.             delay_us(50);
  214.            }
  215.         }

  216.           }

  217.                 //0x10,0x20,0x40,0x80,0x01,0x02,0x04,0x08
  218. void fs(char w)
  219. {
  220. timedata[0]=setime[w]/10;
  221. timedata[1]=setime[w]%10;
  222. timedata[2]=10;
  223. w++;
  224. timedata[3]=setime[w]/10;
  225. timedata[4]=setime[w]%10;
  226. timedata[5]=10;
  227. w++;
  228. timedata[6]=setime[w]/10;
  229. timedata[7]=setime[w]%10;
  230. }  

  231.                
  232.                

  233. void setimeput1(char w) //时间显示函数
  234. {
  235. //for(i=0;i<5;i+=2)
  236. //  {
  237. //   timedata[i]=setime[w]/10;
  238. //   timedata[i+1]=setime[w]%10;
  239. //   w++;
  240. //  }
  241. fs(w);
  242.   for(j=0;j<10;j++)
  243.     {
  244.       for(i=0;i<2;i++)
  245.          {
  246.         for(i=0;i<4;i++)
  247.          {
  248.           putOut(0,~weixian[i],timedata[i]);
  249.           delay_us(100);
  250.           }
  251.                  for(i=4;i<8;i++)
  252.            {
  253.             putOut(timedata[i],~weixian[i],0);
  254.             delay_us(100);
  255.            }

  256.                 }
  257.   }
  258. }


  259. void putOut(char a,char b,char c) //595函数
  260. {
  261.         GPIO_WriteBit(GPIOA,GPIO_Pin_3,(BitAction)(0));
  262.      shiftout(255);
  263.         shiftout(255);
  264.      shiftout(255);
  265.         GPIO_WriteBit(GPIOA,GPIO_Pin_3,(BitAction)(1));
  266.                 delay_us(1);
  267.         GPIO_WriteBit(GPIOA,GPIO_Pin_3,(BitAction)(0));
  268.      shiftout(smgduan[a]);
  269.         shiftout(b);
  270.      shiftout(smgduan[c]);
  271.         GPIO_WriteBit(GPIOA,GPIO_Pin_3,(BitAction)(1));
  272.         delay_us(50);


  273. }


  274. void setimes(void)//设置时间函数
  275. {
  276. u8 s2=0,week;
  277. num=0;
  278. i=0;
  279. while(d&0x10)
  280. {
  281. i++;
  282. setimeput(w);
  283. delay_us(500);
  284. if(GPIO_ReadInputDataBit(DS1302_PORT,KEY1)==0)
  285.   {
  286.         delay_ms(10);
  287. if(GPIO_ReadInputDataBit(DS1302_PORT,KEY1)==0)
  288. {
  289.   if(s2<2)
  290.    {
  291.     init_time[0]=(setime[6]/10)*16+setime[6]%10;
  292.     init_time[1]=(setime[5]/10)*16+setime[5]%10;
  293.     init_time[2]=(setime[4]/10)*16+setime[4]%10;
  294.     num=0;
  295.     w=0;
  296.     }
  297.   if(s2>1&&s2<4)
  298.    {
  299.     init_time[3]=(setime[2]/10)*16+setime[2]%10;
  300.     init_time[4]=(setime[1]/10)*16+setime[1]%10;
  301.     init_time[6]=(setime[0]/10)*16+setime[0]%10;
  302.     DS1302_Init();
  303.     delay_ms(10);
  304.     setime[3]=0;
  305.     if (setime[1]==1||setime[1]== 2)
  306.     {   
  307.         setime[1]+=12;
  308.         setime[0]-=1;
  309.     }   
  310.     setime[3]=(setime[2] + 1 + 2 * setime[1] + 3 * (setime[1] + 1) / 5
  311.     + setime[0] + setime[0] / 4 - setime[0] / 100 + setime[0]/ 400) % 7;
  312.     week=setime[3]%10;
  313.     if(setime[3]%10==0)
  314.         week=7;
  315.     init_time[5]=week;
  316.        DS1302_Init();
  317.        delay_ms(10);
  318.       d=~d;
  319.     }
  320. s2++;
  321. if(s2>4)
  322. {
  323. d=0x00;
  324. break;
  325. }
  326.          }
  327. if(s2>4)
  328. break;
  329. if(i>8000)
  330. break;

  331.         }


  332. if(!GPIO_ReadInputDataBit(DS1302_PORT,KEY4))
  333.     {delay_ms(10);
  334.     if(!GPIO_ReadInputDataBit(DS1302_PORT,KEY4))
  335. {
  336.   num++;
  337.   if(num>2)
  338.   num=0;
  339.    while(!GPIO_ReadInputDataBit(DS1302_PORT,KEY4));
  340. }
  341. }         
  342. if(!GPIO_ReadInputDataBit(DS1302_PORT,KEY2))
  343.     {delay_ms(15);
  344.     if(!GPIO_ReadInputDataBit(DS1302_PORT,KEY2))
  345.             {
  346.          setime[w+num]=setime[w+num]+1;
  347.       if(setime[4]>23||setime[w+num]>59)
  348.            setime[w+num]=0;
  349.            while(!GPIO_ReadInputDataBit(DS1302_PORT,KEY2));
  350.      }
  351.         }
  352. if(!GPIO_ReadInputDataBit(DS1302_PORT,KEY3))
  353.     {delay_ms(15);
  354.     if(!GPIO_ReadInputDataBit(DS1302_PORT,KEY3))
  355.             {
  356.           if(w+num==4&&setime[4]==0)
  357.          setime[0]=23;
  358.          if(setime[w+num]==0&&w+num!=4)
  359.          setime[w+num]=59;
  360.         
  361.          setime[w+num]=setime[w+num]-1;
  362.          while(!GPIO_ReadInputDataBit(DS1302_PORT,KEY3));
  363.          }
  364.          }        
  365. if(s2>2)
  366. break;
  367. }
  368. while(!GPIO_ReadInputDataBit(DS1302_PORT,KEY1));
  369. }


  370. void clok(void)
  371. {
  372. nz[0]=a/1000;
  373. nz[1]=(a-(nz[0]*1000))/10;
  374. num=0;
  375. while(b&0x1)
  376. {
  377. w=0;
  378. timedata[0]=nz[w]/10;
  379. timedata[1]=nz[w]%10;
  380. timedata[2]=10;
  381. w++;
  382. timedata[3]=nz[w]/10;
  383. timedata[4]=nz[w]%10;
  384. for(i=0;i<4;i++)
  385. {
  386. putOut(timedata[4],~weixian[4],0);
  387.             delay_us(30);
  388. for(i=0;i<4;i++)
  389.          {
  390.           putOut(0,~weixian[i],timedata[i]);
  391.           delay_us(50);
  392.           }
  393.                   
  394. }
  395. if(!GPIO_ReadInputDataBit(DS1302_PORT,KEY2))
  396.     {delay_ms(15);
  397.     if(!GPIO_ReadInputDataBit(DS1302_PORT,KEY2))
  398.             {
  399.          nz[num]=nz[num]+1;
  400.       if(nz[0]>23)
  401.            nz[0]=0;
  402.         if(nz[num]>59)
  403.           nz[num]=0;
  404.            while(!GPIO_ReadInputDataBit(DS1302_PORT,KEY2));
  405.      }
  406.         }
  407. if(!GPIO_ReadInputDataBit(DS1302_PORT,KEY3))
  408.     {delay_ms(15);
  409.     if(!GPIO_ReadInputDataBit(DS1302_PORT,KEY3))
  410.             {
  411.          if(num==0&&nz[0]==0)
  412.          nz[0]=23;
  413.          if(nz[num]==0&&num!=0)
  414.          nz[num]=59;
  415.          
  416.          nz[num]=nz[num]-1;
  417.          while(!GPIO_ReadInputDataBit(DS1302_PORT,KEY3));
  418.          }
  419.          }

  420. if(!GPIO_ReadInputDataBit(DS1302_PORT,KEY1))
  421. {
  422. delay_ms(15);
  423. if(!GPIO_ReadInputDataBit(DS1302_PORT,KEY1))
  424. {
  425. num++;
  426. if(num>1)
  427. num=0;
  428. while(!GPIO_ReadInputDataBit(DS1302_PORT,KEY1));
  429. }
  430. }
  431. if(!GPIO_ReadInputDataBit(DS1302_PORT,KEY4))
  432. {
  433. delay_ms(15);
  434. if(!GPIO_ReadInputDataBit(DS1302_PORT,KEY4))
  435. {
  436. b=!b;
  437. a=nz[0]*1000+nz[1]*10+b;
  438. delay_ms(10);
  439. FLASH_W(FLASH_START_ADDR,a); //从指定页的地址写入FLASH

  440. }
  441. }
  442. delay_us(500);
  443. }
  444. }





























  445. //基本IO设置
  446. static void ds1302_gpio_init(void)
  447. {
  448.     GPIO_InitTypeDef GPIO_InitStruct;  
  449.    
  450.     //开启GPIOD的时钟  
  451.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE);  
  452.    
  453.     //设置GPIO的基本参数  
  454.     GPIO_InitStruct.GPIO_Pin = DS1302_SCK_PIN | DS1302_CE_PIN|KEY1|KEY2|KEY3|KEY4;  
  455.     GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;    //这两个普通端口设为推挽输出  
  456.     GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;    //输出速度50MHz  
  457.     GPIO_Init(DS1302_PORT, &GPIO_InitStruct);  

  458.      //设置GPIO的基本参数  
  459.     GPIO_InitStruct.GPIO_Pin = KEY1|KEY2|KEY3|KEY4 ;  
  460.     GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;    //输入   
  461.     GPIO_Init(DS1302_PORT, &GPIO_InitStruct);  


  462.     GPIO_InitStruct.GPIO_Pin = DS1302_IO_PIN|DEEP;         //这里最好设成开漏,当然也可以普通推挽,但是需要后面一直切换输入输出模式
  463.     GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_OD;     //开漏输出,需要接上拉,不需要切换输入输出了。
  464.     GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;    //输出速度50MHz  
  465.     GPIO_Init(DS1302_PORT, &GPIO_InitStruct);


  466.     GPIO_InitStruct.GPIO_Pin =GPIO_Pin_3|GPIO_Pin_2|GPIO_Pin_5|LIGHT; //选择端口号(0~15或all)                       
  467.     GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; //选择IO接口工作方式      
  468.     GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //设置IO接口速度(2/10/50MHz)   
  469.     GPIO_Init(GPIOA, &GPIO_InitStruct);

  470. }

  471. //写一个字节
  472. //数据和地址都是从最低位开始传输的
  473. static void ds1302_writebyte(u8 byte_1)
  474. {
  475.     u8 i = 0;
  476.     u8 t = 0x01;
  477.    
  478.     for(i = 0;i<8;i++)
  479.     {
  480.         if((byte_1 & t) != 0)     //之前的问题出在这里,32的位带操作不能赋值0和1之外的值。
  481.         {
  482.             DS1302_DATOUT = 1;
  483.         }
  484.         else
  485.         {
  486.             DS1302_DATOUT = 0;
  487.         }
  488.         
  489.         DS1302_delay_us(2);
  490.         DS1302_SCK = 1;  //上升沿写入
  491.         DS1302_delay_us(2);
  492.         DS1302_SCK = 0;
  493.         DS1302_delay_us(2);
  494.         
  495.         t<<= 1;
  496.     }
  497.     DS1302_DATOUT = 1;      //释放IO,后面读取的话会准确很多
  498.     DS1302_delay_us(2);     //因为如果写完之后IO被置了低电平,开漏输出模式下读取的时候会有影响,最好先拉高,再读取
  499. }

  500. //地址写数据
  501. static void ds1302_writedata(u8 addr,u8 data_)
  502. {   
  503.     DS1302_CE = 0;        DS1302_delay_us(2);   
  504.     DS1302_SCK = 0;        DS1302_delay_us(2);   
  505.     DS1302_CE = 1;        DS1302_delay_us(2);    //使能片选信号
  506.    
  507.     ds1302_writebyte(addr);    //方便后面写入,转化之后是地址寄存器的值,
  508.     ds1302_writebyte(data_);
  509.     DS1302_CE = 0;        DS1302_delay_us(2);//传送数据结束,失能片选
  510.     DS1302_SCK = 0;     DS1302_delay_us(2);//拉低,准备下一次写数据
  511. }

  512. //读取一个字节,上升沿读取
  513. static u8 ds1302_readbyte(void)
  514. {
  515.     u8 i = 0;
  516.     u8 data_ = 0;
  517.    
  518. //因为上面已经把端口设置为开漏,电路外部接了山拉电阻,可以不切换输入输出模式,直接使用。
  519.     //    DS1302_DAT_INPUT();  
  520.    
  521.     DS1302_SCK = 0;
  522.     DS1302_delay_us(3);
  523.     for(i=0;i<7;i++)   //这里发现设为8的话输出数据不对,很乱
  524.     {
  525.         if((DS1302_DATIN) == 1)
  526.         {
  527.             data_ = data_ | 0x80;    //低位在前,逐位读取,刚开始不对,估计是这个的问题
  528.         }
  529.         data_>>= 1;
  530.         DS1302_delay_us(3);
  531.         
  532.         DS1302_SCK = 1;
  533.         DS1302_delay_us(3);
  534.         DS1302_SCK = 0;
  535.         DS1302_delay_us(3);
  536.     }
  537.      return (data_);
  538. }

  539. //读取寄存器的值
  540. static u8 ds1302_readdata(u8 addr)
  541. {
  542.     u8 data_ = 0;

  543.     DS1302_CE = 0;        DS1302_delay_us(2);
  544.     DS1302_SCK = 0;        DS1302_delay_us(2);
  545.     DS1302_CE = 1;        DS1302_delay_us(2);   //读写操作时CE必须为高,切在SCK为低时改变
  546.    
  547.     ds1302_writebyte((addr<<1)|0x81);   //写入读时间的命令
  548.     data_ = ds1302_readbyte();
  549.    
  550.     DS1302_SCK = 1;      DS1302_delay_us(2);
  551.     DS1302_CE = 0;        DS1302_delay_us(2);
  552.     DS1302_DATOUT = 0;  DS1302_delay_us(3);  //这里很多人说需要拉低,但是我发现去掉这个也可以显示啊,不过为了保险,还是加上。
  553.     DS1302_DATOUT = 1;  DS1302_delay_us(2);
  554.    
  555.     return data_;
  556. }

  557. void DS1302_Init(void)
  558. {
  559.      u8 i = 0;
  560. ……………………

  561. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
电子时钟.7z (184.72 KB, 下载次数: 675)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏13 分享淘帖 顶2 踩
回复

使用道具 举报

沙发
ID:164618 发表于 2019-4-3 18:45 | 只看该作者
可以的 很6  谢谢老哥
回复

使用道具 举报

板凳
ID:110736 发表于 2019-4-12 23:16 | 只看该作者
谢谢分享,正需要
回复

使用道具 举报

地板
ID:419070 发表于 2019-4-21 03:26 | 只看该作者
刚好需要就看到了,不过老哥你代码写得也太乱了吧,都挤到main里面干嘛
回复

使用道具 举报

5#
ID:516789 发表于 2019-4-25 22:10 | 只看该作者
楼主你好,请问你的程序是用什么编程软件才可以打开的?
用VS2015可以吗?
回复

使用道具 举报

6#
ID:527900 发表于 2019-5-5 19:17 | 只看该作者
感谢分享刚好急需
回复

使用道具 举报

7#
ID:389567 发表于 2019-5-14 10:50 | 只看该作者
谢谢 谢谢
回复

使用道具 举报

8#
ID:572212 发表于 2019-6-25 23:12 | 只看该作者
好人一生平安
回复

使用道具 举报

9#
ID:436241 发表于 2019-7-25 20:33 | 只看该作者
KAng_online 发表于 2019-4-21 03:26
刚好需要就看到了,不过老哥你代码写得也太乱了吧,都挤到main里面干嘛

那时候我还年轻
回复

使用道具 举报

10#
ID:540100 发表于 2019-7-27 01:02 | 只看该作者
stm32f103c8t6最小系统板已经搭建RTC外围元件,本来加个纽扣电池就能实现,为啥还扩展1302呢??
回复

使用道具 举报

11#
ID:535582 发表于 2019-7-31 21:56 | 只看该作者
可以可以
回复

使用道具 举报

12#
ID:610291 发表于 2019-9-11 09:15 | 只看该作者

可以可以
回复

使用道具 举报

13#
ID:613749 发表于 2019-9-19 19:26 | 只看该作者
谢谢分享      
回复

使用道具 举报

14#
ID:647639 发表于 2019-12-5 13:16 | 只看该作者
谢谢老哥
回复

使用道具 举报

15#
ID:671793 发表于 2019-12-23 21:50 | 只看该作者
电路图为什么没有
回复

使用道具 举报

16#
ID:671793 发表于 2019-12-29 17:00 | 只看该作者
这个怎么进行软件仿真模拟
回复

使用道具 举报

17#
ID:694252 发表于 2020-3-10 21:33 | 只看该作者
proteus  打不开啊

回复

使用道具 举报

18#
ID:669679 发表于 2020-5-15 16:43 | 只看该作者
这个有电路图吗?
回复

使用道具 举报

19#
ID:669679 发表于 2020-5-15 16:44 | 只看该作者
急需这样的设计   想学习一下
回复

使用道具 举报

20#
ID:725379 发表于 2020-5-18 00:42 | 只看该作者
学习了,谢谢
回复

使用道具 举报

21#
ID:754532 发表于 2020-5-18 10:08 | 只看该作者
可以的,仁兄,谢谢啦
回复

使用道具 举报

22#
ID:789581 发表于 2020-6-25 16:43 | 只看该作者
谢谢分享,正需要
回复

使用道具 举报

23#
ID:447020 发表于 2020-12-14 20:45 | 只看该作者
学习了学习了。不过没模块化的代码,看哭了
回复

使用道具 举报

24#
ID:224006 发表于 2021-3-1 14:31 | 只看该作者
这个有电路和PCB图吗?
回复

使用道具 举报

25#
ID:886968 发表于 2021-3-7 22:31 | 只看该作者
请问楼主,这个纽扣电池,我能不能换成充电宝的5V接3.3V稳压供给?
回复

使用道具 举报

26#
ID:886968 发表于 2021-3-20 14:34 | 只看该作者
楼主,请问一下,您附件里面的电路图怎么是json的,得用什么软件打开呢?
回复

使用道具 举报

27#
ID:886968 发表于 2021-3-21 14:44 | 只看该作者
winwor 发表于 2019-7-27 01:02
stm32f103c8t6最小系统板已经搭建RTC外围元件,本来加个纽扣电池就能实现,为啥还扩展1302呢??

您好,估计楼主也是不会调用芯片的时钟函数,所以才需要外接时钟
回复

使用道具 举报

28#
ID:422924 发表于 2021-4-24 10:55 | 只看该作者
做DIY小玩意要用,就找到了楼主这里,超级感谢
回复

使用道具 举报

29#
ID:422924 发表于 2021-4-24 11:02 | 只看该作者
KL泡泡调 发表于 2021-3-7 22:31
请问楼主,这个纽扣电池,我能不能换成充电宝的5V接3.3V稳压供给?

但是这不就失去纽扣电池的意义了嘛,  加纽扣电池不就是为了掉电后时钟不掉电吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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