找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2707|回复: 1
收起左侧

1602 DS1302按键调时 闹钟程序

[复制链接]
ID:223983 发表于 2017-8-2 07:59 | 显示全部楼层 |阅读模式

所有资料51hei提供下载:
1602 DS1302按键调时 闹钟.zip (53.36 KB, 下载次数: 43)


单片机源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int

  5. sbit clock=P2^1;           // 闹钟
  6. sbit ds=P2^0;           // 18b20

  7. bit flag1;
  8. uint temp;

  9. sbit SCK=P1^7;
  10. sbit SDA=P1^6;  
  11. sbit RST=P1^5;// DS1302复位
  12. sbit set=P3^4;//定义按键端口
  13. sbit s1=P3^5;                    
  14. sbit s2=P3^6;
  15. sbit s3=P3^7;


  16. sbit RS=P1^0;//RS为数据/指令选择1/0
  17. sbit RW=P1^1;//读写
  18. sbit E=P1^2;//E为使能信号
  19. bit flag;//是否读取时间的标志位
  20. uchar setn=0;//复位键、增加键、减少键按下次数
  21. uchar code time0[]="20  -  -        ";
  22. uchar code time1[]="   :  :  ";
  23. uchar code time2[]=" Noise    :  :  ";
  24. uchar code time3[]=" Noise  Power:  ";

  25. uchar l_tmpdate[7];//秒分时日月周年// 可随时更改
  26. uchar code write_add[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; //秒分时日月周年 写的寄存器地址
  27. uchar code read_add[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d}; //秒分时日月周年 读的寄存器地址
  28. uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //共阴数码管 0-9加'-'熄灭表


  29. void delay(uint z)
  30. {
  31. while(--z);
  32. }
  33. void write_com(uchar com)//液晶写命令函数
  34. {
  35. RS=0;//写命令使能
  36. RW=0;//写
  37. delay(100);
  38. E=0;
  39. P0=com;
  40. E=1;
  41. delay(10);
  42. E=0;
  43. }
  44. void write_data(uchar dat)//液晶写数据函数
  45. {
  46. RS=1;//写数据使能
  47. RW=0;
  48. delay(10);
  49. E=0;
  50. P0=dat;
  51. E=1;
  52. delay(10);
  53. E=0;
  54. }
  55. void init()//液晶初始化
  56. {

  57. uchar num;
  58. E=0;
  59. write_com(0x38);//显示模式设置
  60. write_com(0x38);
  61. write_com(0x38);
  62. write_com(0x08);//显示关闭
  63. write_com(0x01);//显示清屏
  64. write_com(0x06);//光标移动设置整屏不移动
  65. write_com(0x0c);//屏幕开、光标不闪(0)不显示(0)
  66. write_com(0x80);
  67. for(num=0;num<16;num++)
  68.   {
  69.    write_data(time0[num]);
  70.    delay(5);
  71.   }
  72. write_com(0x80+0x40);
  73. for(num=0;num<9;num++)
  74.   {
  75.    write_data(time1[num]);
  76.    delay(5);
  77.   }
  78. }

  79. void delay1(uint t)
  80. {
  81.         while(t--);
  82. }

  83. void ds_reset()
  84. {
  85.         ds=1;
  86.         delay1(5);
  87.         ds=0;
  88.         delay1(80);
  89.         ds=1;
  90.         delay1(14);
  91.         if(ds==0)
  92.                 flag1=1;
  93.         else
  94.                 flag1=0;
  95.                 delay1(20);
  96. }

  97. bit ds_read_bit()
  98. {
  99.         bit dat;
  100.         ds=0;
  101.         _nop_();
  102.         _nop_();
  103.         ds=1;
  104.         _nop_();
  105.         dat=ds;
  106.         delay1(10);
  107.         return dat;
  108. }

  109. uchar ds_read_byte()
  110. {
  111.         uchar i,j,k;
  112.         for(i=0;i<8;i++)
  113.         {
  114.                 j=ds_read_bit();
  115.                 k=(j<<7)|(k>>1);
  116.         }
  117.         return k;
  118. }

  119. void ds_write_byte(uchar dat)
  120. {
  121.         uchar i;
  122.         for(i=0;i<8;i++)
  123.         {
  124.                 ds=0;
  125.                 _nop_();
  126.                 ds=dat&0x01;
  127.                 delay1(6);
  128.                 ds=1;
  129.                 dat=dat>>1;
  130.         }
  131.         delay(6);
  132. }

  133. uint read_temperature()
  134. {
  135.         uchar a,b;
  136.         ds_reset();
  137.         ds_write_byte(0xcc);
  138.         ds_write_byte(0xbe);
  139.         a=ds_read_byte();
  140.         b=ds_read_byte();
  141.         temp=b;
  142.         temp=temp<<8;
  143.         temp=temp|a;
  144.         temp=temp*0.0625*10+0.5;
  145.         return temp;
  146. }

  147. void display_18b20()
  148. {
  149.         write_com(0x80+0x40+11);
  150.         write_data(temp/100+0x30);
  151.         write_com(0x80+0x40+12);
  152.         write_data((temp%100)/10+0x30);
  153.         write_com(0x80+0x40+13);
  154.         write_data('.');
  155.         write_com(0x80+0x40+14);
  156.         write_data((temp%100)%10+0x30);
  157.         write_com(0x80+0x40+15);
  158.         write_data('C');
  159. }



  160. void Write_Ds1302_Byte(uchar temp) //写一个字节
  161. {
  162. uchar i;
  163. for (i=0;i<8;i++)    //循环8次写入数据
  164.   {
  165. SCK=0;
  166.     SDA=temp&0x01;   //每次传输低字节
  167.     temp>>=1;    //右移一位
  168.     SCK=1;
  169.    }
  170. }   


  171. void Write_Ds1302(uchar add,uchar dat )//向寄存器写数据     
  172. {
  173.   RST=0;
  174. _nop_();
  175.   SCK=0;
  176. _nop_();
  177.   RST=1;//启动
  178.     _nop_();   
  179.   Write_Ds1302_Byte(add); //发送地址
  180.   Write_Ds1302_Byte(dat); //发送数据
  181.   RST=0;    //恢复
  182. }
  183. uchar Read_Ds1302_Byte()//读一个字节
  184. {
  185. uchar i,temp=0x00;
  186. for (i=0;i<8;i++)   //循环8次 读取数据
  187.   {  
  188.    if(SDA)
  189.    temp|=0x80;   //每次传输低字节
  190.   SCK=0;
  191.   temp>>=1;   //右移一位
  192.    SCK=1;
  193. }
  194. return(temp);
  195. }
  196. uchar Read_Ds1302(uchar address )//从寄存器读数据
  197. {
  198.   uchar date;
  199.   RST=0;
  200. _nop_();
  201. SCK=0;
  202. _nop_();
  203.   RST=1;
  204. _nop_();
  205.   Write_Ds1302_Byte(address);
  206. date=Read_Ds1302_Byte();
  207.   RST=0;
  208. _nop_();  //以下为DS1302复位的稳定时间
  209.   RST=0;
  210. SCK=0;
  211. _nop_();
  212. SCK=1;
  213. _nop_();
  214. SDA=0;
  215. _nop_();
  216. SDA=1;
  217. _nop_();
  218. return (date);
  219. }


  220. void Read_RTC(void)  //读取日历
  221. {
  222. uchar i,*p;
  223. p=read_add;   //读的地址传递
  224. for(i=0;i<7;i++) //分7次读取 秒分时日月周年
  225. {
  226.   l_tmpdate[i]=Read_Ds1302(*p);
  227.   p++;
  228. }
  229. }


  230. void Set_RTC(void)  //设定日历
  231. {
  232. uchar i,*p,tmp;
  233. for(i=0;i<7;i++)
  234. {           //BCD处理,将十六进制转换成十进制
  235.   tmp=l_tmpdate[i]/10;
  236.   l_tmpdate[i]=l_tmpdate[i]%10;
  237.   l_tmpdate[i]=l_tmpdate[i]+tmp*16;
  238. }
  239.   Write_Ds1302(0x8E,0X00);//关闭写保护
  240. p=write_add;//传要写的寄存器地址
  241.   for(i=0;i<7;i++)  //7次写入秒分时日月周年
  242.   {
  243.    Write_Ds1302(*p,l_tmpdate[i]);
  244.     p++;  
  245.   }
  246.   Write_Ds1302(0x8E,0x80);//打开写保护
  247. }
  248. void write_lcd()
  249. {
  250. static uchar i,temp[2];
  251. switch(i)
  252. {
  253.   case 0: write_com(0x80+0x40+0x07);break;//秒
  254.   case 1: write_com(0x80+0x40+4);break;//分
  255.   case 2: write_com(0x80+0x40+1);break;//时
  256.   case 3: write_com(0x80+0x08);break;//日
  257.   case 4: write_com(0x80+5);break;//月
  258.   case 5: write_com(0x80+0x0e);break;//星期
  259.   case 6: write_com(0x80+2);break;//年
  260. }
  261. temp[0]=l_tmpdate[i]/16;//数据的转换
  262. temp[1]=l_tmpdate[i]&0x0f;
  263. write_data(0x30+temp[0]);
  264. write_data(0x30+temp[1]);
  265. i++;
  266. if(i==7)
  267.   i=0;
  268. }
  269. uchar change(uchar x)//十进制转换成十六进制
  270. {
  271. uchar tep,y;
  272. y=x;
  273. tep=y/16;
  274. y=y%16;
  275. y=y+tep*10;
  276. return y;
  277. }
  278. void keyscan()
  279. {

  280. uchar tem[2],tp,Flag;//存储要更改的时间数据
  281. if(set==0)
  282. {
  283.   flag=1;//时间停止
  284.   delay(500);//去键盘按下抖动
  285.   if(set==0)
  286.   {
  287.    delay(500);
  288.    while(!set);
  289.    delay(500);//去键盘抬起时抖动
  290.    while(!set);
  291.    delay(500);
  292.    setn++;
  293.    if(setn==1)
  294.    {
  295.       write_com(0x80+0x40+8);//将光标移动到秒个位
  296.     write_com(0x0f);//显示光标并且闪烁
  297.    
  298.    }
  299.    if(setn==2)
  300.    {
  301.       write_com(0x80+0x40+5);//将光标移动到分个位
  302.     write_com(0x0f);//显示光标并且闪烁
  303.    }
  304.    if(setn==3)
  305.    {
  306.    
  307.       write_com(0x80+0x40+2);//将光标移动到时个位
  308.     write_com(0x0f);//显示光标并且闪烁
  309.    }
  310.    if(setn==4)
  311.    {
  312.    write_com(0x80+15);                  //        将光标移动到星期
  313.    write_com(0x0f);
  314.    }
  315.    if(setn==5)
  316.    {
  317.    write_com(0x80+9);                  //        将光标移动到日
  318.    write_com(0x0f);
  319.    }
  320.    if(setn==6)
  321.    {
  322.    write_com(0x80+6);                   //        将光标移动到月
  323.    write_com(0x0f);
  324.    }
  325.    if(setn==7)
  326.    {
  327.    write_com(0x80+3);                          //        将光标移动到年
  328.    write_com(0x0f);
  329.    }
  330.    if(setn==8)
  331.    {
  332.     setn=0;
  333.     Write_Ds1302(0x8E,0X00);//关闭写保护
  334.     Write_Ds1302(write_add[0],l_tmpdate[0]);
  335.     Write_Ds1302(0x8E,0x80);//打开写保护
  336.     flag=0;//时钟正常运行
  337.     write_com(0x0c);//光标停止闪烁
  338.    }
  339.   }
  340.   
  341. }
  342. if(setn!=0)//更改时间
  343. {
  344.   if(s1==0)//增加时间
  345.   {
  346.    delay(5000);
  347.    if(s1==0)
  348.    {
  349.    
  350.     while(!s1);
  351.     delay(5000);//去键盘抬起时抖动
  352.     while(!s1);
  353.     if(setn==1)
  354.     {
  355.      l_tmpdate[0]=change(l_tmpdate[0]);
  356.      l_tmpdate[0]++;
  357.      if(l_tmpdate[0]>=60)
  358.       l_tmpdate[0]=0;
  359.      {  
  360.       tp=l_tmpdate[0]/10;
  361.       l_tmpdate[0]=l_tmpdate[0]%10;
  362.       l_tmpdate[0]=l_tmpdate[0]+tp*16;
  363.       Write_Ds1302(0x8E,0X00);//关闭写保护
  364.       Write_Ds1302(write_add[0],l_tmpdate[0]);
  365.       Write_Ds1302(0x8E,0x80);//打开写保护
  366.      }
  367.      write_com(0x80+0x40+7);                                           //秒
  368.      tem[0]=l_tmpdate[0]/16;//数据的转换
  369.      tem[1]=l_tmpdate[0]&0x0f;
  370.      write_data(0x30+tem[0]);
  371.      write_data(0x30+tem[1]);
  372.      write_com(0x80+0x40+8);
  373.      Flag=1;
  374.     }
  375.     if(setn==2)
  376.     { l_tmpdate[1]=change(l_tmpdate[1]);
  377.      l_tmpdate[1]++;
  378.      if(l_tmpdate[1]==60)
  379.       l_tmpdate[1]=0;
  380.      {  
  381.       tp=l_tmpdate[1]/10;
  382.       l_tmpdate[1]=l_tmpdate[1]%10;
  383.       l_tmpdate[1]=l_tmpdate[1]+tp*16;
  384.       Write_Ds1302(0x8E,0X00);//关闭写保护
  385.       Write_Ds1302(write_add[1],l_tmpdate[1]);
  386.       Write_Ds1302(0x8E,0x80);//打开写保护
  387.      }
  388.      write_com(0x80+0x40+4);                                        //分
  389.      tem[0]=l_tmpdate[1]/16;//数据的转换
  390.      tem[1]=l_tmpdate[1]&0x0f;
  391.      write_data(0x30+tem[0]);
  392.      write_data(0x30+tem[1]);
  393.      write_com(0x80+0x40+5);
  394.     }
  395.     if(setn==3)
  396.     { l_tmpdate[2]=change(l_tmpdate[2]);
  397.      l_tmpdate[2]++;
  398.      if(l_tmpdate[2]>=24)
  399.       l_tmpdate[2]=0;
  400.      {  
  401.       tp=l_tmpdate[2]/10;
  402.       l_tmpdate[2]=l_tmpdate[2]%10;
  403.       l_tmpdate[2]=l_tmpdate[2]+tp*16;
  404.       Write_Ds1302(0x8E,0X00);//关闭写保护
  405.       Write_Ds1302(write_add[2],l_tmpdate[2]);
  406.       Write_Ds1302(0x8E,0x80);//打开写保护
  407.      }
  408.      write_com(0x80+0x40+1);                                                //时
  409.      tem[0]=l_tmpdate[2]/16;//数据的转换
  410.      tem[1]=l_tmpdate[2]&0x0f;
  411.      write_data(0x30+tem[0]);
  412.      write_data(0x30+tem[1]);
  413.      write_com(0x80+0x40+2);      
  414.     }
  415.     if(setn==4)
  416.     {
  417.      l_tmpdate[5]=change(l_tmpdate[5]);
  418.      l_tmpdate[5]++;
  419.      if(l_tmpdate[5]==8)
  420.       l_tmpdate[5]=1;
  421.      {  
  422.       tp=l_tmpdate[5]/10;
  423.       l_tmpdate[5]=l_tmpdate[5]%10;
  424.       l_tmpdate[5]=l_tmpdate[5]+tp*16;
  425.       Write_Ds1302(0x8E,0X00);//关闭写保护
  426.       Write_Ds1302(write_add[5],l_tmpdate[5]);
  427.       Write_Ds1302(0x8E,0x80);//打开写保护
  428.      }
  429.      write_com(0x80+14);                                                   //星期
  430.      tem[0]=l_tmpdate[5]/16;//数据的转换
  431.      tem[1]=l_tmpdate[5]&0x0f;
  432.      write_data(0x30+tem[0]);
  433.      write_data(0x30+tem[1]);
  434.      write_com(0x80+15);
  435.     }
  436.    
  437.     if(setn==5)
  438.     {
  439.      l_tmpdate[3]=change(l_tmpdate[3]);
  440.      l_tmpdate[3]++;
  441.      if(l_tmpdate[3]==32)
  442.       l_tmpdate[3]=0;
  443.      {  
  444.       tp=l_tmpdate[3]/10;
  445.       l_tmpdate[3]=l_tmpdate[3]%10;
  446.       l_tmpdate[3]=l_tmpdate[3]+tp*16;
  447.       Write_Ds1302(0x8E,0X00);//关闭写保护
  448.       Write_Ds1302(write_add[3],l_tmpdate[3]);
  449.       Write_Ds1302(0x8E,0x80);//打开写保护
  450.      }
  451.      write_com(0x80+8);                                                //日
  452.      tem[0]=l_tmpdate[3]/16;//数据的转换
  453.      tem[1]=l_tmpdate[3]&0x0f;
  454.      write_data(0x30+tem[0]);
  455.      write_data(0x30+tem[1]);
  456.      write_com(0x80+9);
  457.     }
  458.     if(setn==6)
  459.     {
  460.      l_tmpdate[4]=change(l_tmpdate[4]);
  461.      l_tmpdate[4]++;
  462.      if(l_tmpdate[4]==13)
  463.       l_tmpdate[4]=0;
  464.      write_com(0x80+5);                                           //月
  465.      {  
  466.       tp=l_tmpdate[4]/10;
  467.       l_tmpdate[4]=l_tmpdate[4]%10;
  468.       l_tmpdate[4]=l_tmpdate[4]+tp*16;                         
  469.       Write_Ds1302(0x8E,0X00);//关闭写保护
  470.       Write_Ds1302(write_add[4],l_tmpdate[4]);
  471.       Write_Ds1302(0x8E,0x80);//打开写保护
  472.      }
  473.      tem[0]=l_tmpdate[4]/16;//数据的转换
  474.      tem[1]=l_tmpdate[4]&0x0f;
  475.      write_data(0x30+tem[0]);
  476.      write_data(0x30+tem[1]);
  477.      write_com(0x80+6);
  478.     }
  479.     if(setn==7)
  480.     {
  481.      l_tmpdate[6]=change(l_tmpdate[6]);
  482.      l_tmpdate[6]++;
  483.      if(l_tmpdate[6]==100)
  484.       l_tmpdate[6]=0;
  485.      write_com(0x80+2);                                          //年
  486.      {  
  487.       tp=l_tmpdate[6]/10;
  488.       l_tmpdate[6]=l_tmpdate[6]%10;
  489.       l_tmpdate[6]=l_tmpdate[6]+tp*16;
  490.       Write_Ds1302(0x8E,0X00);//关闭写保护
  491.       Write_Ds1302(write_add[6],l_tmpdate[6]);
  492.       Write_Ds1302(0x8E,0x80);//打开写保护
  493.      }
  494.      tem[0]=l_tmpdate[6]/16;//数据的转换
  495.      tem[1]=l_tmpdate[6]&0x0f;
  496.      write_data(0x30+tem[0]);
  497.      write_data(0x30+tem[1]);
  498.      write_com(0x80+3);
  499.     }
  500.    }         
  501.   }
  502.   if(s2==0)//减少时间
  503.   {
  504.    delay(5000);
  505.    if(s2==0)
  506.    {
  507.     while(!s2);
  508.     delay(5000);//去键盘抬起时抖动
  509.     while(!s2);
  510.     if(setn==1)
  511.     {
  512.      l_tmpdate[0]=change(l_tmpdate[0]);
  513.      if(l_tmpdate[0]!=0)
  514.       l_tmpdate[0]--;
  515.      if(l_tmpdate[0]==0)
  516.       l_tmpdate[0]=59;
  517.      {  
  518.       tp=l_tmpdate[0]/10;
  519.       l_tmpdate[0]=l_tmpdate[0]%10;
  520.       l_tmpdate[0]=l_tmpdate[0]+tp*16;
  521.       Write_Ds1302(0x8E,0X00);//关闭写保护
  522.       Write_Ds1302(write_add[0],l_tmpdate[0]);
  523.       Write_Ds1302(0x8E,0x80);//打开写保护
  524.      }
  525.      write_com(0x80+0x40+7);                                 //日
  526.      tem[0]=l_tmpdate[0]/16;//数据的转换
  527.      tem[1]=l_tmpdate[0]&0x0f;
  528.      write_data(0x30+tem[0]);
  529.      write_data(0x30+tem[1]);
  530.      write_com(0x80+0x40+8);
  531.     }
  532.     if(setn==2)
  533.     {
  534.      l_tmpdate[1]=change(l_tmpdate[1]);
  535.      if(l_tmpdate[1]!=0)
  536.       l_tmpdate[1]--;
  537.      if(l_tmpdate[1]==0)
  538.        l_tmpdate[1]=59;
  539.      {  
  540.       tp=l_tmpdate[1]/10;
  541.       l_tmpdate[1]=l_tmpdate[1]%10;
  542.       l_tmpdate[1]=l_tmpdate[1]+tp*16;
  543.       Write_Ds1302(0x8E,0X00);//关闭写保护
  544.       Write_Ds1302(write_add[1],l_tmpdate[1]);
  545.       Write_Ds1302(0x8E,0x80);//打开写保护
  546.      }
  547.      write_com(0x80+0x40+4);                                        //月
  548.      tem[0]=l_tmpdate[1]/16;//数据的转换
  549.      tem[1]=l_tmpdate[1]&0x0f;
  550.      write_data(0x30+tem[0]);
  551.      write_data(0x30+tem[1]);
  552.      write_com(0x80+0x40+5);
  553.     }
  554.     if(setn==3)
  555.     { l_tmpdate[2]=change(l_tmpdate[2]);
  556.      if(l_tmpdate[2]!=0)
  557.       l_tmpdate[2]--;
  558.      if(l_tmpdate[2]==0)
  559.       l_tmpdate[2]=23;
  560.      {  
  561.       tp=l_tmpdate[2]/10;
  562.       l_tmpdate[2]=l_tmpdate[2]%10;
  563.       l_tmpdate[2]=l_tmpdate[2]+tp*16;
  564.       Write_Ds1302(0x8E,0X00);//关闭写保护
  565.       Write_Ds1302(write_add[2],l_tmpdate[2]);
  566.       Write_Ds1302(0x8E,0x80);//打开写保护
  567.      }
  568.      write_com(0x80+0x40+1);                                          //年
  569.      tem[0]=l_tmpdate[2]/16;//数据的转换
  570.      tem[1]=l_tmpdate[2]&0x0f;
  571.      write_data(0x30+tem[0]);
  572.      write_data(0x30+tem[1]);
  573.      write_com(0x80+0x40+2);      
  574.     }
  575.     if(setn==4)
  576.     {
  577.      l_tmpdate[5]=change(l_tmpdate[5]);
  578.      if(l_tmpdate[5]!=0)
  579.       l_tmpdate[5]--;
  580.      if(l_tmpdate[5]==0)
  581.       l_tmpdate[5]=7;
  582.      {  
  583.       tp=l_tmpdate[5]/10;
  584.       l_tmpdate[5]=l_tmpdate[5]%10;
  585.       l_tmpdate[5]=l_tmpdate[5]+tp*16;
  586.       Write_Ds1302(0x8E,0X00);//关闭写保护
  587.       Write_Ds1302(write_add[5],l_tmpdate[5]);
  588.       Write_Ds1302(0x8E,0x80);//打开写保护
  589.      }
  590.      write_com(0x80+14);                                                //星期
  591.      tem[0]=l_tmpdate[5]/16;//数据的转换
  592.      tem[1]=l_tmpdate[5]&0x0f;
  593.      write_data(0x30+tem[0]);
  594.      write_data(0x30+tem[1]);
  595.      write_com(0x80+15);
  596.     }
  597.     if(setn==5)
  598.     {
  599.      l_tmpdate[3]=change(l_tmpdate[3]);
  600.      if(l_tmpdate[3]!=0)
  601.       l_tmpdate[3]--;
  602.      if(l_tmpdate[3]==0)
  603.       l_tmpdate[3]=31;
  604.      {  
  605.       tp=l_tmpdate[3]/10;
  606.       l_tmpdate[3]=l_tmpdate[3]%10;
  607.       l_tmpdate[3]=l_tmpdate[3]+tp*16;
  608.       Write_Ds1302(0x8E,0X00);//关闭写保护
  609.       Write_Ds1302(write_add[3],l_tmpdate[3]);
  610.       Write_Ds1302(0x8E,0x80);//打开写保护
  611.      }
  612.      write_com(0x80+8);                                           //日
  613.      tem[0]=l_tmpdate[3]/16;//数据的转换
  614.      tem[1]=l_tmpdate[3]&0x0f;
  615.      write_data(0x30+tem[0]);
  616.      write_data(0x30+tem[1]);
  617.      write_com(0x80+9);
  618.     }
  619.     if(setn==6)
  620.     {
  621.      l_tmpdate[4]=change(l_tmpdate[4]);
  622.      if(l_tmpdate[4]!=0)
  623.       l_tmpdate[4]--;
  624.      if(l_tmpdate[4]==0)
  625.       l_tmpdate[4]=12;
  626.      write_com(0x80+5);                                         //月
  627.      {  
  628.       tp=l_tmpdate[4]/10;
  629.       l_tmpdate[4]=l_tmpdate[4]%10;
  630.       l_tmpdate[4]=l_tmpdate[4]+tp*16;
  631.       Write_Ds1302(0x8E,0X00);//关闭写保护
  632.       Write_Ds1302(write_add[4],l_tmpdate[4]);
  633.       Write_Ds1302(0x8E,0x80);//打开写保护
  634.      }
  635.      tem[0]=l_tmpdate[4]/16;//数据的转换     
  636.      tem[1]=l_tmpdate[4]&0x0f;
  637.      write_data(0x30+tem[0]);
  638.      write_data(0x30+tem[1]);
  639.      write_com(0x80+6);
  640.     }
  641.     if(setn==7)
  642.     {
  643.      l_tmpdate[6]=change(l_tmpdate[6]);
  644.      if(l_tmpdate[6]!=0)
  645.       l_tmpdate[6]--;
  646.      if(l_tmpdate[6]==0)
  647.       l_tmpdate[6]=99;
  648.      write_com(0x80+2);                           //年
  649.      {  
  650.       tp=l_tmpdate[6]/10;
  651.       l_tmpdate[6]=l_tmpdate[6]%10;
  652.       l_tmpdate[6]=l_tmpdate[6]+tp*16;
  653.       Write_Ds1302(0x8E,0X00);//关闭写保护
  654.       Write_Ds1302(write_add[6],l_tmpdate[6]);
  655. ……………………

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



回复

使用道具 举报

ID:142878 发表于 2017-9-4 11:25 | 显示全部楼层
有没有原理仿真图啊
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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