找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3401|回复: 5
打印 上一主题 下一主题
收起左侧

DS1307+两个74HC573显示8位数码管没鬼影采用定时器扫描,单片机时钟程序

[复制链接]
跳转到指定楼层
楼主
下载下来直接用


单片机源程序如下:
  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 数据传送位
  8. sbit scl=P2^1;//;模拟I2C 时钟控制状态标志
  9. uchar Hours,Minutes,Seconds,Year,Month,Date,Weeks;

  10. uchar Decimal_to_BCD(uchar temp)//十进制转换成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码转换成十进制
  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()//应答
  63. {
  64. uchar z=0;
  65.         while((sda==1)&&(z<50))z++;//条件判断, sda=1,则没有应答。如果没有应答则延时: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)//写一个数据
  70. {
  71. uchar temp,temp1,i,ii;
  72.         star_1307();                                //开始
  73.         for(ii=0;ii<3;ii++)//根据 24CXX文档资料,和时序图,按顺序送:器件写地址,字节地址,数据
  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;//送 字节地址
  83.                         temp1=byte_address;
  84.                 }
  85.                 else if(ii==2)
  86.                 {
  87.                         temp=data_data;//送 数据
  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;//相 与 后,把不相关的位清零
  96.                         if(temp==0x80)//根据前面 相 与 后,判断 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)//读一个数据
  118. {
  119. uchar temp,temp1,i,ii,x,data_data;
  120.         star_1307();//开始
  121.         for(ii=0;ii<3;ii++)//根据 24CXX文档资料,和时序图,按顺序送:器件写地址,字节地址,器件读地址
  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;//送 字节地址
  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++)//开始读数据
  140.                         {
  141.                                 scl=0;
  142.                                 delay_5us();//5us延时
  143.                                 temp=temp1;
  144.                                 temp=temp&0x80;// 相 与 后,把不相关的位清零
  145.                                 if(temp==0x80)//根据前面 相 与 后,判断 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();//应答
  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)//判断 数据线是否是高电平
  174.                 data_data|=0x01;//把读到的数据 或 0X01
  175.         }
  176.         ack_1307();//应答
  177.         stop_1307();//停止
  178.         return data_data;//返回读到的数据
  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);//十进制转换成BCD码
  190.         Minutes=Decimal_to_BCD(Minutes);//十进制转换成BCD码
  191.         Hours=Decimal_to_BCD(Hours);//十进制转换成BCD码
  192.         Date=Decimal_to_BCD(Date);//十进制转换成BCD码
  193.         Year=Decimal_to_BCD(Year);//十进制转换成BCD码
  194.         Month=Decimal_to_BCD(Month);//十进制转换成BCD码

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

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

所有资料51hei提供下载:
DS1307万年历程序.rar (30.02 KB, 下载次数: 62)




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2017-12-20 00:22 | 只看该作者
楼主能提供一下电路图吗?
回复

使用道具 举报

板凳
ID:264021 发表于 2017-12-26 22:43 | 只看该作者
这么简单的程序一看就知道啦还要原理图,你应该先去玩流水灯
回复

使用道具 举报

地板
ID:210375 发表于 2018-3-18 11:18 | 只看该作者
挺不错的,点个赞
回复

使用道具 举报

5#
ID:457181 发表于 2020-5-6 10:22 | 只看该作者
谢谢分享!!!!
回复

使用道具 举报

6#
ID:748788 发表于 2020-8-17 08:34 | 只看该作者
单片机学习习 发表于 2017-12-26 22:43
这么简单的程序一看就知道啦还要原理图,你应该先去玩流水灯

楼主怼版主
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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