標(biāo)題: DS1307+兩個(gè)74HC573顯示8位數(shù)碼管沒鬼影采用定時(shí)器掃描,單片機(jī)時(shí)鐘程序 [打印本頁]

作者: 單片機(jī)學(xué)習(xí)習(xí)    時(shí)間: 2017-12-19 23:17
標(biāo)題: DS1307+兩個(gè)74HC573顯示8位數(shù)碼管沒鬼影采用定時(shí)器掃描,單片機(jī)時(shí)鐘程序
下載下來直接用


單片機(jī)源程序如下:
  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 時(shí)鐘控制狀態(tài)標(biāo)志
  9. uchar Hours,Minutes,Seconds,Year,Month,Date,Weeks;

  10. uchar Decimal_to_BCD(uchar temp)//十進(jìn)制轉(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)換成十進(jì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延時(shí)
  39. {
  40.         _nop_();
  41.         _nop_();
  42.         _nop_();
  43. }
  44. void star_1307()//開始
  45. {
  46.         sda=1;
  47.         delay_5us();//5us延時(shí)
  48.         scl=1;
  49.         delay_5us();//5us延時(shí)
  50.         sda=0;
  51.         delay_5us();//5us延時(shí)
  52. }
  53. void stop_1307()//停止
  54. {
  55.         sda=0;
  56.         delay_5us();//5us延時(shí)
  57.         scl=1;
  58.         delay_5us();//5us延時(shí)
  59.         sda=1;
  60.         delay_5us();//5us延時(shí)
  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)答則延時(shí):z<50,z++;后返回
  66.         scl=0;
  67.         delay_5us();//5us延時(shí)
  68. }
  69. void write_1307(uchar slave_write_address,uchar byte_address,uchar data_data)//寫一個(gè)數(shù)據(jù)
  70. {
  71. uchar temp,temp1,i,ii;
  72.         star_1307();                                //開始
  73.         for(ii=0;ii<3;ii++)//根據(jù) 24CXX文檔資料,和時(shí)序圖,按順序送:器件寫地址,字節(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延時(shí)
  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延時(shí)
  102.                         scl=1;
  103.                         delay_5us();//5us延時(shí)
  104.                         scl=0;
  105.                         delay_5us();//5us延時(shí)
  106.                         temp1=temp1<<1;//向左移出1位
  107.                        
  108.                 }
  109.                 sda=1;
  110.                 delay_5us();//5us延時(shí)
  111.                 scl=1;
  112.                 delay_5us();//5us延時(shí)
  113.                 ack_1307();
  114.         }
  115.         stop_1307();//停止
  116. }
  117. uchar read_1307(uchar slave_write_address,uchar byte_address,uchar slave_read_address)//讀一個(gè)數(shù)據(jù)
  118. {
  119. uchar temp,temp1,i,ii,x,data_data;
  120.         star_1307();//開始
  121.         for(ii=0;ii<3;ii++)//根據(jù) 24CXX文檔資料,和時(shí)序圖,按順序送:器件寫地址,字節(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延時(shí)
  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延時(shí)
  152.                                 scl=1;
  153.                                 delay_5us();//5us延時(shí)
  154.                                 scl=0;
  155.                                 delay_5us();//5us延時(shí)
  156.                                 temp1=temp1<<1;//向左移出1位
  157.                         }
  158.                 sda=1;
  159.                 delay_5us();//5us延時(shí)
  160.                 scl=1;
  161.                 delay_5us();//5us延時(shí)
  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延時(shí)
  169.                 scl=0;
  170.                 delay_5us();//5us延時(shí)
  171.                 scl=1;
  172.                 delay_5us();//5us延時(shí)
  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);//十進(jìn)制轉(zhuǎn)換成BCD碼
  190.         Minutes=Decimal_to_BCD(Minutes);//十進(jìn)制轉(zhuǎn)換成BCD碼
  191.         Hours=Decimal_to_BCD(Hours);//十進(jìn)制轉(zhuǎn)換成BCD碼
  192.         Date=Decimal_to_BCD(Date);//十進(jìn)制轉(zhuǎn)換成BCD碼
  193.         Year=Decimal_to_BCD(Year);//十進(jìn)制轉(zhuǎn)換成BCD碼
  194.         Month=Decimal_to_BCD(Month);//十進(jìn)制轉(zhuǎn)換成BCD碼

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

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

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





作者: admin    時(shí)間: 2017-12-20 00:22
樓主能提供一下電路圖嗎?
作者: 單片機(jī)學(xué)習(xí)習(xí)    時(shí)間: 2017-12-26 22:43
這么簡(jiǎn)單的程序一看就知道啦還要原理圖,你應(yīng)該先去玩流水燈
作者: 電子癡    時(shí)間: 2018-3-18 11:18
挺不錯(cuò)的,點(diǎn)個(gè)贊
作者: jeffphoon    時(shí)間: 2020-5-6 10:22
謝謝分享。。!
作者: wwh2382    時(shí)間: 2020-8-17 08:34
單片機(jī)學(xué)習(xí)習(xí) 發(fā)表于 2017-12-26 22:43
這么簡(jiǎn)單的程序一看就知道啦還要原理圖,你應(yīng)該先去玩流水燈

樓主懟版主




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1