找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4279|回復(fù): 5
收起左側(cè)

DS1307+兩個74HC573顯示8位數(shù)碼管沒鬼影采用定時器掃描,單片機時鐘程序

[復(fù)制鏈接]
ID:264021 發(fā)表于 2017-12-19 23:17 | 顯示全部樓層 |閱讀模式
下載下來直接用
0.jpg

單片機源程序如下:
  1. #ifndef __DS1307_H__
  2. #define __DS1307_H__
  3. #include <STC89C5xRC.h>
  4. #include "intrins.h"
  5. #define uchar unsigned char
  6. #define uint unsigned int
  7. sbit sda=P2^0;//;模擬I2C 數(shù)據(jù)傳送位
  8. sbit scl=P2^1;//;模擬I2C 時鐘控制狀態(tài)標志
  9. uchar Hours,Minutes,Seconds,Year,Month,Date,Weeks;

  10. uchar Decimal_to_BCD(uchar temp)//十進制轉(zhuǎn)換成BCD碼
  11. {
  12. uchar a,b,c;
  13.         a=temp;
  14.         b=0;
  15.         while(a>=10)
  16.                 {
  17.                         a=a-10;
  18.                         b=b+16;
  19.                         c=a+b;
  20.                         temp=c;
  21.                 }          
  22.         return temp;
  23. }
  24. uchar BCD_to_Decimal(uchar temp)//BCD碼轉(zhuǎn)換成十進制
  25. {
  26.         uchar a,b,c;
  27.         a=temp;
  28.         b=0;
  29.         while(a>=16)
  30.                 {
  31.                         a=a-16;
  32.                         b=b+10;
  33.                         c=a+b;
  34.                         temp=c;
  35.                 }          
  36.         return temp;
  37. }
  38. void delay_5us()//5us延時
  39. {
  40.         _nop_();
  41.         _nop_();
  42.         _nop_();
  43. }
  44. void star_1307()//開始
  45. {
  46.         sda=1;
  47.         delay_5us();//5us延時
  48.         scl=1;
  49.         delay_5us();//5us延時
  50.         sda=0;
  51.         delay_5us();//5us延時
  52. }
  53. void stop_1307()//停止
  54. {
  55.         sda=0;
  56.         delay_5us();//5us延時
  57.         scl=1;
  58.         delay_5us();//5us延時
  59.         sda=1;
  60.         delay_5us();//5us延時
  61. }
  62. void ack_1307()//應(yīng)答
  63. {
  64. uchar z=0;
  65.         while((sda==1)&&(z<50))z++;//條件判斷, sda=1,則沒有應(yīng)答。如果沒有應(yīng)答則延時:z<50,z++;后返回
  66.         scl=0;
  67.         delay_5us();//5us延時
  68. }
  69. void write_1307(uchar slave_write_address,uchar byte_address,uchar data_data)//寫一個數(shù)據(jù)
  70. {
  71. uchar temp,temp1,i,ii;
  72.         star_1307();                                //開始
  73.         for(ii=0;ii<3;ii++)//根據(jù) 24CXX文檔資料,和時序圖,按順序送:器件寫地址,字節(jié)地址,數(shù)據(jù)
  74.         {
  75.                 if(ii==0)
  76.                 {
  77.                         temp=slave_write_address;//送 器件寫地址
  78.                         temp1=slave_write_address;
  79.                 }
  80.                 else if(ii==1)
  81.                 {
  82.                         temp=byte_address;//送 字節(jié)地址
  83.                         temp1=byte_address;
  84.                 }
  85.                 else if(ii==2)
  86.                 {
  87.                         temp=data_data;//送 數(shù)據(jù)
  88.                         temp1=data_data;
  89.                 }
  90.                 for(i=0;i<8;i++)
  91.                 {
  92.                         scl=0;
  93.                         delay_5us();//5us延時
  94.                         temp=temp1;
  95.                         temp=temp&0x80;//相 與 后,把不相關(guān)的位清零
  96.                         if(temp==0x80)//根據(jù)前面 相 與 后,判斷 temp是否等于0x80,是則該位為 1                        
  97.                                 sda=1;
  98.                         else
  99.                                 sda=0;
  100.                        
  101.                         delay_5us();//5us延時
  102.                         scl=1;
  103.                         delay_5us();//5us延時
  104.                         scl=0;
  105.                         delay_5us();//5us延時
  106.                         temp1=temp1<<1;//向左移出1位
  107.                        
  108.                 }
  109.                 sda=1;
  110.                 delay_5us();//5us延時
  111.                 scl=1;
  112.                 delay_5us();//5us延時
  113.                 ack_1307();
  114.         }
  115.         stop_1307();//停止
  116. }
  117. uchar read_1307(uchar slave_write_address,uchar byte_address,uchar slave_read_address)//讀一個數(shù)據(jù)
  118. {
  119. uchar temp,temp1,i,ii,x,data_data;
  120.         star_1307();//開始
  121.         for(ii=0;ii<3;ii++)//根據(jù) 24CXX文檔資料,和時序圖,按順序送:器件寫地址,字節(jié)地址,器件讀地址
  122.         {
  123.                 if(ii==0)
  124.                         {
  125.                         temp=slave_write_address;//送 器件寫地址
  126.                         temp1=slave_write_address;
  127.                         }
  128.                 else if(ii==1)
  129.                         {
  130.                         temp=byte_address;//送 字節(jié)地址
  131.                         temp1=byte_address;
  132.                         }
  133.                 else if(ii==2)
  134.                         {
  135.                         star_1307();//開始
  136.                         temp=slave_read_address;//送 器件讀地址
  137.                         temp1=slave_read_address;
  138.                         }
  139.                 for(i=0;i<8;i++)//開始讀數(shù)據(jù)
  140.                         {
  141.                                 scl=0;
  142.                                 delay_5us();//5us延時
  143.                                 temp=temp1;
  144.                                 temp=temp&0x80;// 相 與 后,把不相關(guān)的位清零
  145.                                 if(temp==0x80)//根據(jù)前面 相 與 后,判斷 temp是否等于0x80,是則該位為 1
  146.                                
  147.                                 sda=1;
  148.                                 else
  149.                                 sda=0;
  150.                                
  151.                                 delay_5us();//5us延時
  152.                                 scl=1;
  153.                                 delay_5us();//5us延時
  154.                                 scl=0;
  155.                                 delay_5us();//5us延時
  156.                                 temp1=temp1<<1;//向左移出1位
  157.                         }
  158.                 sda=1;
  159.                 delay_5us();//5us延時
  160.                 scl=1;
  161.                 delay_5us();//5us延時
  162.                 ack_1307();//應(yīng)答
  163.         }
  164.         for(x=0;x<8;x++)
  165.         {
  166.                 data_data=data_data<<1;//向左移入1位
  167.                 sda=1;
  168.                 delay_5us();//5us延時
  169.                 scl=0;
  170.                 delay_5us();//5us延時
  171.                 scl=1;
  172.                 delay_5us();//5us延時
  173.                 if(sda==1)//判斷 數(shù)據(jù)線是否是高電平
  174.                 data_data|=0x01;//把讀到的數(shù)據(jù) 或 0X01
  175.         }
  176.         ack_1307();//應(yīng)答
  177.         stop_1307();//停止
  178.         return data_data;//返回讀到的數(shù)據(jù)
  179. }
  180. void init_1307()//初始化
  181. {
  182.         Hours=23;
  183.         Minutes=14;
  184.         Seconds=11;
  185.         Year=17;   
  186.         Month=11;
  187.         Date=24;
  188.         Weeks=5;       
  189.         Seconds=Decimal_to_BCD(Seconds);//十進制轉(zhuǎn)換成BCD碼
  190.         Minutes=Decimal_to_BCD(Minutes);//十進制轉(zhuǎn)換成BCD碼
  191.         Hours=Decimal_to_BCD(Hours);//十進制轉(zhuǎn)換成BCD碼
  192.         Date=Decimal_to_BCD(Date);//十進制轉(zhuǎn)換成BCD碼
  193.         Year=Decimal_to_BCD(Year);//十進制轉(zhuǎn)換成BCD碼
  194.         Month=Decimal_to_BCD(Month);//十進制轉(zhuǎn)換成BCD碼

  195.         write_1307(0xd0,0x00,Seconds);//寫入秒
  196. ……………………

  197. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
DS1307萬年歷程序.rar (30.02 KB, 下載次數(shù): 62)




回復(fù)

使用道具 舉報

ID:1 發(fā)表于 2017-12-20 00:22 | 顯示全部樓層
樓主能提供一下電路圖嗎?
回復(fù)

使用道具 舉報

ID:264021 發(fā)表于 2017-12-26 22:43 | 顯示全部樓層
這么簡單的程序一看就知道啦還要原理圖,你應(yīng)該先去玩流水燈
回復(fù)

使用道具 舉報

ID:210375 發(fā)表于 2018-3-18 11:18 | 顯示全部樓層
挺不錯的,點個贊
回復(fù)

使用道具 舉報

ID:457181 發(fā)表于 2020-5-6 10:22 | 顯示全部樓層
謝謝分享!。!
回復(fù)

使用道具 舉報

ID:748788 發(fā)表于 2020-8-17 08:34 | 顯示全部樓層
單片機學(xué)習(xí)習(xí) 發(fā)表于 2017-12-26 22:43
這么簡單的程序一看就知道啦還要原理圖,你應(yīng)該先去玩流水燈

樓主懟版主
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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