找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4288|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

ds1302時間讀寫的仿真和單片機源碼

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:319611 發(fā)表于 2018-6-2 21:57 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
7段式數(shù)碼管顯示時間,ds1302芯片,89c51單片機,protues+keil-c仿真電路加源程序,比較簡單,屬于校內(nèi)課程實驗,

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機源程序如下:
  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)           //寫一字節(jié)
  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()                //讀一字節(jié)
  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數(shù)據(jù)
  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數(shù)據(jù)
  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的時間數(shù)據(jù)(時、分、秒),存入time1數(shù)組中
  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的日期數(shù)據(jù)(日月年),存入time1數(shù)組中
  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的星期數(shù)據(jù),存入time1數(shù)組中
  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()                                           //設(shè)置分鐘顯示  ---分鐘---
  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()                                           //設(shè)置時鐘顯示  時鐘------
  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()                                           //設(shè)置日期顯示  ------日期
  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()                                   //設(shè)置月份顯示  ---月份---
  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()                                                //設(shè)置年份顯示  年份------
  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()                                                 //設(shè)置星期顯示  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定時器刷新數(shù)碼管顯示,刷新間隔為2ms
  180. {
  181.         uchar i;
  182.         TR0=0;
  183.         TH0 = (65536 - 2000) / 256;       
  184.         TL0 = (65536 - 2000) % 256;
  185.         TR0 = 1;
  186.         switch(i)         //位選,選擇點亮的數(shù)碼管,
  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        //按下切屏鍵,切換時間,日期,星期;按下調(diào)節(jié)鍵,在調(diào)節(jié)分時日月年星期間切換
  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)                                                                  //延時函數(shù)
  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();                //調(diào)用子函數(shù),把存入數(shù)組time的數(shù)據(jù)給顯示出來
  256.                                    break;

  257.                         case 1:get_date();                //調(diào)用子函數(shù),把存入數(shù)組date的數(shù)據(jù)給顯示出來
  258.                                    break;
  259.                         case 2:get_week();                //調(diào)用子函數(shù),把存入數(shù)組week的數(shù)據(jù)給顯示出來
  260.                                    break;
  261.                         case 3:set_min();                                                                                                        //調(diào)整分
  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();                                                                                                 //調(diào)整時
  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();                                                                                                        //調(diào)整日
  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();                                                                                                        //調(diào)整月
  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();                                                                                                        //調(diào)整年
  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();                                                                                                        //調(diào)整星期
  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)         //位選,選擇點亮的數(shù)碼管,
  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. }
復(fù)制代碼

所有資料51hei提供下載:
ds1302.rar (69.94 KB, 下載次數(shù): 45)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:481061 發(fā)表于 2020-4-28 11:08 | 只看該作者
顯示時間和日期是錯誤的呀
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表