找回密码
 立即注册

QQ登录

只需一步,快速开始

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

ds1302时间读写的仿真和单片机源码

[复制链接]
ID:319611 发表于 2018-6-2 21:57 | 显示全部楼层 |阅读模式
7段式数码管显示时间,ds1302芯片,89c51单片机,protues+keil-c仿真电路加源程序,比较简单,属于校内课程实验,

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png 0.png

单片机源程序如下:
  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. uchar dot,time1[8],flash;
  4. unsigned int tt;
  5. uchar flag=0;
  6. code seven_tab[15]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x37,0x5c,0x77,0x73};//0--9,-,N,o,A,p
  7. sbit rtc_clk=P3^6;
  8. sbit rtc_data=P3^4;
  9. sbit rtc_rst=P3^5;
  10. sbit p2_2=P2^2;
  11. sbit p2_3=P2^3;
  12. sbit p2_4=P2^4;
  13. sbit p3_0=P3^2;
  14. sbit p2_7=P3^3;
  15. sbit p2_6=P2^6;

  16. sbit a0=ACC^0;
  17. sbit a7=ACC^7;

  18. void write_rtc(uchar date)           //写一字节
  19. {
  20.         uchar i;
  21.         ACC=date;
  22.         for(i=8;i>0;i--)
  23.                 {
  24.                         rtc_data=a0;
  25.                         rtc_clk=1;
  26.                         rtc_clk=0;
  27.                         ACC=ACC>>1;       
  28.                 }
  29. }
  30. uchar read_rtc()                //读一字节
  31. {
  32.         uchar i;
  33.         for(i=8;i>0;i--)
  34.                 {
  35.                         ACC=ACC>>1;
  36.                         a7=rtc_data;
  37.                         rtc_clk=1;
  38.                         rtc_clk=0;               
  39.                 }
  40.         return(ACC);       
  41. }
  42. void write1302(uchar address,uchar date)                   //写1302数据
  43. {
  44.         rtc_rst = 0;
  45.         rtc_clk = 0;
  46.         rtc_rst = 1;
  47.         write_rtc(address);
  48.         write_rtc(date);
  49.         rtc_clk = 1;
  50.         rtc_rst = 0;
  51. }
  52. uchar read1302(uchar address)//读1302数据
  53. {
  54.         uchar temp;
  55.         rtc_rst = 0;
  56.         rtc_clk = 0;
  57.         rtc_rst = 1;
  58.         write_rtc(address);
  59.         temp=read_rtc();
  60.         rtc_clk = 1;
  61.         rtc_rst = 0;
  62.         return(temp);
  63. }
  64. void init1302()                //1302初始化
  65. {
  66.         write1302(0x8e,0x00);        //写操作
  67.         write1302(0x80,0x21);        //写秒
  68.         write1302(0x82,0x50);        //写分
  69.         write1302(0x84,0x14);        //写时
  70.         write1302(0x88,0x05);        //写月
  71.         write1302(0x86,0x22);        //写日
  72.         write1302(0x8a,0x02);        //写星期
  73.         write1302(0x8c,0x18);        //写年
  74.         write1302(0x8e,0x80);        //写保护
  75. }
  76. void get_time()        //获取1302的时间数据(时、分、秒),存入time1数组中
  77. {
  78.         uchar d;
  79.         d = read1302(0x81);
  80.         time1[0] = d & 0x0f;
  81.         time1[1] = (d >> 4) & 0x0f;       
  82.         d = read1302(0x83);
  83.         time1[3] = d & 0x0f;
  84.         time1[4] = (d >> 4) & 0x0f;       
  85.         d = read1302(0x85);
  86.         time1[6] = d & 0x0f;
  87.         time1[7] = (d >>4 ) & 0x0f;
  88.         time1[2]=time1[5]=10;               
  89. }
  90. void get_date()                                   //获取1302的日期数据(日月年),存入time1数组中
  91. {        uchar d;
  92.         d = read1302(0x87);
  93.         time1[0] = d & 0x0f;
  94.         time1[1] = (d >> 4) & 0x0f;       
  95.         d = read1302(0x89);
  96.         time1[3] = d & 0x0f;
  97.         time1[4] = (d >> 4) & 0x0f;       
  98.         d = read1302(0x8d);
  99.         time1[6] = d & 0x0f;
  100.         time1[7] = (d >>4 ) & 0x0f;
  101.         time1[2]=time1[5]=10;
  102. }
  103. void get_week()                                         //获取1302的星期数据,存入time1数组中
  104. {        uchar d;
  105.         d = read1302(0x8b);
  106.         time1[3] = d & 0x0f;
  107.         time1[4] =10;       
  108.         time1[1]=10;
  109.         time1[6]=12;
  110.         time1[7]=11;
  111.         d = read1302(0x85);
  112.         if(((((d >>4 ) & 0x0f)==1)&(d & 0x0f)>=2)||((((d >>4 ) & 0x0f)==2)))
  113.         {
  114.                 time1[0]=14;
  115.         }
  116.         else
  117.                 time1[0]=13;

  118.         time1[2]=time1[5]=10;
  119. }

  120. void set_min()                                           //设置分钟显示  ---分钟---
  121. {
  122.         uchar d;
  123.         d = read1302(0x83);
  124.         time1[3] = d & 0x0f;
  125.         time1[4] = (d >> 4) & 0x0f;
  126.         d = read1302(0x85);
  127.         time1[6] = d & 0x0f;
  128.         time1[7] = (d >>4 ) & 0x0f;       
  129.         time1[0]=time1[1]=time1[2]=time1[5]=10;

  130. }
  131. void set_hour()                                           //设置时钟显示  时钟------
  132. {
  133.         uchar d;
  134.         d = read1302(0x85);
  135.         time1[6] = d & 0x0f;
  136.         time1[7] = (d >>4 ) & 0x0f;       
  137.         time1[0]=time1[1]=time1[2]=time1[5]=time1[3]=time1[4]=10;

  138. }
  139. void set_day()                                           //设置日期显示  ------日期
  140. {
  141.         uchar d;
  142.         d = read1302(0x87);
  143.         time1[0] = d & 0x0f;
  144.         time1[1] = (d >> 4) & 0x0f;       
  145.         d = read1302(0x89);
  146.         time1[3] = d & 0x0f;
  147.         time1[4] = (d >> 4) & 0x0f;       
  148.         d = read1302(0x8d);
  149.         time1[6] = d & 0x0f;
  150.         time1[7] = (d >>4 ) & 0x0f;
  151.         time1[2]=time1[5]=10;
  152. }
  153. void set_month()                                   //设置月份显示  ---月份---
  154. {
  155.         uchar d;
  156.         d = read1302(0x89);
  157.         time1[3] = d & 0x0f;
  158.         time1[4] = (d >> 4) & 0x0f;
  159.         d = read1302(0x8d);
  160.         time1[6] = d & 0x0f;
  161.         time1[7] = (d >>4 ) & 0x0f;       
  162.         time1[2]=time1[5]=time1[0]=time1[1]=10;
  163. }
  164. void set_year()                                                //设置年份显示  年份------
  165. {
  166.         uchar d;
  167.         d = read1302(0x8d);
  168.         time1[6] = d & 0x0f;
  169.         time1[7] = (d >>4 ) & 0x0f;       
  170.         time1[3]=time1[4]=time1[2]=time1[5]=time1[0]=time1[1]=10;
  171. }
  172. void set_week()                                                 //设置星期显示  No--星期---
  173. {
  174.         uchar d;
  175.         d = read1302(0x8b);
  176.         time1[3] = d & 0x0f;       
  177.         time1[6]=time1[4]=time1[2]=time1[5]=time1[0]=time1[1]=time1[7]=10;
  178. }

  179. /*void time0() interrupt 1                                                                           //使用T0定时器刷新数码管显示,刷新间隔为2ms
  180. {
  181.         uchar i;
  182.         TR0=0;
  183.         TH0 = (65536 - 2000) / 256;       
  184.         TL0 = (65536 - 2000) % 256;
  185.         TR0 = 1;
  186.         switch(i)         //位选,选择点亮的数码管,
  187.                 {
  188.                         case(7):        p2_2=0; p2_3=0; p2_4=0; break;//显示第0位
  189.                         case(6):        p2_2=1; p2_3=0; p2_4=0; break;//显示第1位
  190.                         case(5):        p2_2=0; p2_3=1; p2_4=0; break;//显示第2位
  191.                         case(4):        p2_2=1; p2_3=1; p2_4=0; break;//显示第3位
  192.                         case(3):        p2_2=0; p2_3=0; p2_4=1; break;//显示第4位
  193.                         case(2):        p2_2=1; p2_3=0; p2_4=1; break;//显示第5位
  194.                         case(1):        p2_2=0; p2_3=1; p2_4=1; break;//显示第6位
  195.                         case(0):        p2_2=1; p2_3=1; p2_4=1; break;//显示第7位       
  196.                 }
  197.         P1=seven_tab[time1[i]];
  198.         i++;
  199.         if(i==8)
  200.                 i=0;                       
  201. }
  202. void init_timer0()                        //初始化T0定时器
  203. {
  204.         TMOD = 0x01;
  205.         TH0 = (65536-2000) / 256;       
  206.         TL0 = (65536-2000) % 256;
  207.         TR0 = 1;
  208.         ET0 = 1;
  209.         EA  = 1;
  210. }*/
  211. void start() interrupt 0        //按下切屏键,切换时间,日期,星期;按下调节键,在调节分时日月年星期间切换
  212. {
  213.           

  214.         flag++;
  215.         if(flag>2)
  216.         {
  217.                 flag=0;
  218.         }
  219.        
  220. }

  221. void sart() interrupt 2
  222. {
  223.                  
  224.                 if(flag<3)
  225.                         flag=3;
  226.                 else
  227.                 {
  228.                         flag++;
  229.                         if(flag>8)
  230.                                 flag=3;
  231.                 }
  232.        
  233. }
  234. void delay(uchar t)                                                                  //延时函数
  235. {
  236.         uchar j=0;
  237.         for(;t>0;t--)
  238.                 for(j=0;j<125;j++);
  239. }
  240. void main()
  241. {
  242.     uchar n,i,d,t;
  243.         /*init_timer0();*/
  244.         init1302();
  245.         IT0=1;
  246.         EX0=1;
  247.         EA=1;
  248.         IT1=1;
  249.         EX1=0;
  250.         while(1)
  251.         {

  252.        
  253.                 switch(flag)
  254.                 {
  255.                         case 0:get_time();                //调用子函数,把存入数组time的数据给显示出来
  256.                                    break;

  257.                         case 1:get_date();                //调用子函数,把存入数组date的数据给显示出来
  258.                                    break;
  259.                         case 2:get_week();                //调用子函数,把存入数组week的数据给显示出来
  260.                                    break;
  261.                         case 3:set_min();                                                                                                        //调整分
  262.                                         if(p2_6==0)
  263.                                         {
  264.                                                 delay(1000);
  265.                                                 if(p2_6==0)
  266.                                                 {
  267.                                                         n= read1302(0x83);
  268.                                                         d = n & 0x0f;
  269.                                                         t = (n >> 4) & 0x0f;
  270.                                                         d++;
  271.                                                         if(d>9)
  272.                                                         {
  273.                                                                 d=0;
  274.                                                                 t++;
  275.                                                                 if(t>5)
  276.                                                                 {
  277.                                                                         t=0;
  278.                                                                 }
  279.                                                         }
  280.                                                         n=(0x0f&d)|(0xf0&(t<<4));
  281.                                                         write1302(0x82,n);
  282.                                                         delay(1000);
  283.                                                 }
  284.                                                 }
  285.                                                 break;                                                                                                         
  286.                                 case 4:set_hour();                                                                                                 //调整时
  287.                                         if(p2_6==0)
  288.                                         {
  289.                                                 delay(1000);
  290.                                                 if(p2_6==0)
  291.                                                 {
  292.                                                         n= read1302(0x85);
  293.                                                         d = n & 0x0f;
  294.                                                         t = (n >> 4) & 0x0f;
  295.                                                         d++;
  296.                                                         if(t==2)
  297.                                                         {
  298.                                                                 if(d>3)
  299.                                                                 {
  300.                                                                         d=0;
  301.                                                                         t=0;
  302.                                                                 }
  303.                                                         }
  304.                                                         if(d>9)
  305.                                                         {
  306.                                                                 d=0;
  307.                                                                 t++;
  308.                                                         }
  309.                                                
  310.                                                         n=(0x0f&d)|(0xf0&(t<<4));
  311.                                                         write1302(0x84,n);
  312.                                                         delay(1000);
  313.                                                 }
  314.                                         }
  315.                                         break;                                                                                                                       
  316.                                 case 5:set_day();                                                                                                        //调整日
  317.                                         if(p2_6==0)
  318.                                         {
  319.                                                 delay(1000);
  320.                                                 if(p2_6==0)
  321.                                                 {
  322.                                                         n= read1302(0x87);
  323.                                                         d = n & 0x0f;
  324.                                                         t = (n >> 4) & 0x0f;
  325.                                                         d++;
  326.                                                         if(t==3)
  327.                                                         {
  328.                                                                 if(d>1)
  329.                                                                 {
  330.                                                                         d=1;
  331.                                                                         t=0;
  332.                                                                 }
  333.                                                         }
  334.                                                         if(d>9)
  335.                                                         {
  336.                                                                 d=0;
  337.                                                                 t++;
  338.                                                         }
  339.                                                
  340.                                                         n=(0x0f&d)|(0xf0&(t<<4));
  341.                                                         write1302(0x86,n);
  342.                                                         delay(1000);
  343.                                                 }
  344.                                         }
  345.                                         break;
  346.                                 case 6:set_month();                                                                                                        //调整月
  347.                                         if(p2_6==0)
  348.                                         {
  349.                                                 delay(1000);
  350.                                                 if(p2_6==0)
  351.                                                 {
  352.                                                         n= read1302(0x89);
  353.                                                         d = n & 0x0f;
  354.                                                         t = (n >> 4) & 0x0f;
  355.                                                         d++;
  356.                                                         if(t==1)
  357.                                                         {
  358.                                                                 if(d>2)
  359.                                                                 {
  360.                                                                         d=1;
  361.                                                                         t=0;
  362.                                                                 }
  363.                                                         }
  364.                                                         if(d>9)
  365.                                                         {
  366.                                                                 d=0;
  367.                                                                 t++;
  368.                                                         }
  369.                                                
  370.                                                         n=(0x0f&d)|(0xf0&(t<<4));
  371.                                                         write1302(0x88,n);
  372.                                                         delay(1000);
  373.                                                 }
  374.                                         }
  375.                                         break;
  376.                                 case 7:set_year();                                                                                                        //调整年
  377.                                         if(p2_6==0)
  378.                                         {
  379.                                                 delay(1000);
  380.                                                 if(p2_6==0)
  381.                                                 {
  382.                                                         n= read1302(0x8d);
  383.                                                         d = n & 0x0f;
  384.                                                         t = (n >> 4) & 0x0f;
  385.                                                         d++;
  386.                                                         if(d>9)
  387.                                                         {
  388.                                                                 d=0;
  389.                                                                 t++;
  390.                                                                 if(t>9)
  391.                                                                 {
  392.                                                                         t=0;
  393.                                                                 }
  394.                                                         }
  395.                                                
  396.                                                         n=(0x0f&d)|(0xf0&(t<<4));
  397.                                                         write1302(0x8c,n);
  398.                                                         delay(1000);
  399.                                                 }
  400.                                         }
  401.                                         break;
  402.                                 case 8:set_week();                                                                                                        //调整星期
  403.                                         if(p2_6==0)
  404.                                         {
  405.                                                 delay(1000);
  406.                                                 if(p2_6==0)
  407.                                                 {
  408.                                                         n= read1302(0x8b);
  409.                                                         d = n & 0x0f;
  410.                                                         d++;
  411.                                                         if(d>7)
  412.                                                         {
  413.                                                                 d=1;
  414.                                                         }
  415.                                                
  416.                                                         n=0x0f&d;
  417.                                                         write1302(0x8a,n);
  418.                                                         delay(1000);
  419.                                                 }
  420.                                         }
  421.                                         break;

  422.                 }
  423.                 for(i=0;i<8;i++)
  424.                         {
  425.                         switch(i)         //位选,选择点亮的数码管,
  426.                         {
  427.                                 case(7):        p2_2=0; p2_3=0; p2_4=0; break;//显示第0位
  428.                                 case(6):        p2_2=1; p2_3=0; p2_4=0; break;//显示第1位
  429.                                 case(5):        p2_2=0; p2_3=1; p2_4=0; break;//显示第2位
  430.                                 case(4):        p2_2=1; p2_3=1; p2_4=0; break;//显示第3位
  431.                                 case(3):        p2_2=0; p2_3=0; p2_4=1; break;//显示第4位
  432.                                 case(2):        p2_2=1; p2_3=0; p2_4=1; break;//显示第5位
  433.                                 case(1):        p2_2=0; p2_3=1; p2_4=1; break;//显示第6位
  434.                                 case(0):        p2_2=1; p2_3=1; p2_4=1; break;//显示第7位       
  435.                         }
  436.                         P1=seven_tab[time1[i]];
  437.                         delay(2);
  438.                         }
  439.                 }

  440.                
  441. }
复制代码
0.jpg
所有资料51hei提供下载:
ds1302.rar (69.94 KB, 下载次数: 45)
回复

使用道具 举报

ID:481061 发表于 2020-4-28 11:08 | 显示全部楼层
显示时间和日期是错误的呀
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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