真正的熟练掌握单片机,实际操作是很重要的。多看程序,多分析,从别人规范的程序代码中学习技巧是很必要的。

硬件部分:

程序部分:

main.c文件

/**************************************************************************************

实现现象:下载程序后,数码管显示时钟数据

***************************************************************************************/

#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器

#include"ds1302.h"

typedef unsigned int u16;  //对数据类型进行声明定义

typedef unsigned char u8;

sbit LSA=P2^2;

sbit LSB=P2^3;

sbit LSC=P2^4;

char num=0;

u8 DisplayData[8];

u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

/*******************************************************************************

延时函数,i=1时,大约延时10us

*******************************************************************************/

void delay(u16 i)

{

while(i--);

}

/*******************************************************************************

时间读取处理转换函数

*******************************************************************************/

void datapros()

{

Ds1302ReadTime();

DisplayData[0] = smgduan[TIME[2]/16];//时

DisplayData[1] = smgduan[TIME[2]&0x0f];

DisplayData[2] = 0x40;

DisplayData[3] = smgduan[TIME[1]/16];//分

DisplayData[4] = smgduan[TIME[1]&0x0f];

DisplayData[5] = 0x40;

DisplayData[6] = smgduan[TIME[0]/16];//秒

DisplayData[7] = smgduan[TIME[0]&0x0f];

}

/*******************************************************************************

数码管显示函数

*******************************************************************************/

void DigDisplay()

{

u8 i;

for(i=0;i<8;i++)

{

switch(i) //位选,选择点亮的数码管,

{

case(0):

LSA=0;LSB=0;LSC=0; break;//显示第0位

case(1):

LSA=1;LSB=0;LSC=0; break;//显示第1位

case(2):

LSA=0;LSB=1;LSC=0; break;//显示第2位

case(3):

LSA=1;LSB=1;LSC=0; break;//显示第3位

case(4):

LSA=0;LSB=0;LSC=1; break;//显示第4位

case(5):

LSA=1;LSB=0;LSC=1; break;//显示第5位

case(6):

LSA=0;LSB=1;LSC=1; break;//显示第6位

case(7):

LSA=1;LSB=1;LSC=1; break;//显示第7位

}

P0=DisplayData[7-i];//发送数据

delay(100); //间隔一段时间扫描

P0=0x00;//消隐

}

}

/*******************************************************************************

主函数

*******************************************************************************/

void main()

{

Ds1302Init();

while(1)

{

datapros(); //数据处理函数

DigDisplay();//数码管显示函数

}

}

ds1302.c文件

#include"ds1302.h"

//---DS1302写入和读取时分秒的地址命令---//

//---秒分时日月周年 最低位读写位;-------//

uchar code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};

uchar code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};

//---DS1302时钟初始化2016年5月7日星期六12点00分00秒。---//

//---存储顺序是秒分时日月周年,存储格式是用BCD码---//

uchar TIME[7] = {0, 0, 0x12, 0x07, 0x05, 0x06, 0x16};

/*******************************************************************************

向DS1302命令(地址+数据)

*******************************************************************************/

void Ds1302Write(uchar addr, uchar dat)

{

uchar n;

RST = 0;

_nop_();

SCLK = 0;//先将SCLK置低电平。

_nop_();

RST = 1; //然后将RST(CE)置高电平。

_nop_();

for (n=0; n<8; n++)//开始传送八位地址命令

{

DSIO = addr & 0x01;//数据从低位开始传送

addr >>= 1;

SCLK = 1;//数据在上升沿时,DS1302读取数据

_nop_();

SCLK = 0;

_nop_();

}

for (n=0; n<8; n++)//写入8位数据

{

DSIO = dat & 0x01;

dat >>= 1;

SCLK = 1;//数据在上升沿时,DS1302读取数据

_nop_();

SCLK = 0;

_nop_();

}

RST = 0;//传送数据结束

_nop_();

}

/*******************************************************************************

读取一个地址的数据

*******************************************************************************/

uchar Ds1302Read(uchar addr)

{

uchar n,dat,dat1;

RST = 0;

_nop_();

SCLK = 0;//先将SCLK置低电平。

_nop_();

RST = 1;//然后将RST(CE)置高电平。

_nop_();

for(n=0; n<8; n++)//开始传送八位地址命令

{

DSIO = addr & 0x01;//数据从低位开始传送

addr >>= 1;

SCLK = 1;//数据在上升沿时,DS1302读取数据

_nop_();

SCLK = 0;//DS1302下降沿时,放置数据

_nop_();

}

_nop_();

for(n=0; n<8; n++)//读取8位数据

{

dat1 = DSIO;//从最低位开始接收

dat = (dat>>1) | (dat1<<7);

SCLK = 1;

_nop_();

SCLK = 0;//DS1302下降沿时,放置数据

_nop_();

}

RST = 0;

_nop_();//以下为DS1302复位的稳定时间,必须的。

SCLK = 1;

_nop_();

DSIO = 0;

_nop_();

DSIO = 1;

_nop_();

return dat;

}

/*******************************************************************************

初始化DS1302.

*******************************************************************************/

void Ds1302Init()

{

uchar n;

Ds1302Write(0x8E,0X00); //禁止写保护,就是关闭写保护功能

for (n=0; n<7; n++)//写入7个字节的时钟信号:分秒时日月周年

{

Ds1302Write(WRITE_RTC_ADDR[n],TIME[n]);

}

Ds1302Write(0x8E,0x80); //打开写保护功能

}

/*******************************************************************************

读取时钟信息

*******************************************************************************/

void Ds1302ReadTime()

{

uchar n;

for (n=0; n<7; n++)//读取7个字节的时钟信号:分秒时日月周年

{

TIME[n] = Ds1302Read(READ_RTC_ADDR[n]);

}

}

ds1302.h文件

#ifndef __DS1302_H_

#define __DS1302_H_

//---包含头文件---//

#include

#include

//---重定义关键词---//

#ifndef uchar

#define uchar unsigned char

#endif

#ifndef uint

#define uint unsigned int

#endif

//---定义ds1302使用的IO口---//

sbit DSIO=P3^4;

sbit RST=P3^5;

sbit SCLK=P3^6;

//---定义全局函数---//

void Ds1302Write(uchar addr, uchar dat);

uchar Ds1302Read(uchar addr);

void Ds1302Init();

void Ds1302ReadTime();

//---加入全局变量--//

extern uchar TIME[7];//加入全局变量

#endif

寻路机器人单片机程序示例_单片机精华程序代码示例:DS1302时钟程序相关推荐

  1. 单片机c语言程序流程图,ds1302时钟程序详解,ds1302程序流程图(C程序)

    ds1302时钟程序详解 DS1302 的控制字如图2所示.控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果为0,则表示存取日历时钟数据,为1表示存取RA ...

  2. 寻路机器人单片机程序示例_单片机典型案例开发(四)

    一.基于STC单片机的智能LED路灯控制器设计本文引用地址:http://www.eepw.com.cn/article/171408.htm 摘要:为了充分节约能源,提高路灯控制系统的智能化,介绍了 ...

  3. 寻路机器人单片机程序示例_单片机4*4键盘汇编语言控制示例 计算器 带proteus仿真及源程序...

    KEYBUF   EQU   40H   ;键号存放单元 ORG 0000H LJMP MAIN ORG 0030H MAIN:    MOV KEYBUF,#0    ;初始键号设位0,也可以为任意 ...

  4. 单片机加减法计算器_单片机简易加法计算器程序

    学到这里,我们已经掌握了一种显示设备和一种输入设备的使用,那么是不是可以来做点综合性的实验了.好吧,那我们就来做一个简易的加法计算器,用程序实现从板子上标有0-9数字的按键输入相应数字,该数字要实时显 ...

  5. 单片机加减法计算器_单片机加法计算器程序

    首先,本程序相对于之前的例程要复杂得多,需要完成的工作也多得多,所以我们把各个子功能都做成独立的函数,以使程序便于编写和维护.大家分析程序的时候就从主函数和中断函数入手,随着程序的流程进行就可以了.大 ...

  6. 单片机蓝牙烧录_单片机和蓝牙模块的完美结合

    是近年来发展迅速的短距离无线通信技术,可以用来替代数字设备间短距离的有线电缆连接.利用蓝牙技术构建数据采集无线传输模块,与传统的电线或红外方式传输测控数据相比,在测控领域应用篮牙技术的优点主要有: 1 ...

  7. java爬虫代码示例_那些让你代码思维和能力有较大的提升Java源码

    来源:www.cnblogs.com/jiagou/p/9270070.html 对于学习J2EE的框架有很大的帮助,代码里使用了各种设计模式.事件机制.Java8语法.代码量也很小,web服务使用N ...

  8. 微信公众号发送小程序卡片_微信公众号里怎么添加小程序-如何在微信[[公众号]]添加小程序卡片-微信关联小程序...

    参考官方Demo 1.进入公众号,选择「关联小程序」后,微信公众号运营者用手机扫码进行认证,并输入小程序的AppID即可. 2.腾讯地图+小程序appID:wx7643d5f831302ab0 3. ...

  9. 微信公众号发送小程序卡片_如何在微信 [[公众号]]添加小程序卡片

    参考官方Demo 进入公众号,选择「关联小程序」后,微信公众号运营者用手机扫码进行认证,并输入小程序的 AppID 即可. 腾讯地图+小程序appID:wx7643d5f831302ab0 在这里,可 ...

最新文章

  1. mysql录入foreigen错误_编译安装MySQL5.6失败的相关问题解决方案
  2. 【系统架构设计师】软考高级职称,来自订阅者真实反馈,从理论、实践、技巧让你掌握论文写作秘诀
  3. FAQ from CSDN
  4. 活字格企业Web应用生成器V3.0发布更新,支持插件管理和多人协作开发
  5. HTTP 权威指南 详解 (推荐阅读 )
  6. eclipse svn切换账号
  7. 2022最新淘宝天猫商品sku精准库存(sku库存200)
  8. 【英语:基础进阶_原著扩展阅读】J6.原著阅读实战训练
  9. [RK3399 Android7.1.2]新增wifibt模块:rtl8822cs驱动以及解决所遇问题
  10. Javascript 版万年历
  11. Intel服务器CPU背面信息,英特尔(Intel)服务器CPU全解析(图)
  12. 保障信息安全不违规,App应满足哪些法律规定
  13. 如何使用大华SDK工具查询和播放设备录像?
  14. 国产软件不背黑锅,4款强大又实用的电脑软件,用了舍不得卸载
  15. 小鸟云独享虚拟主机和共享虚拟主机区别对比
  16. oracle中那个日期怎么相减_oracle日期时间加减规则
  17. 干货 | 空压机安装指南
  18. nextpolish安装_NECAT: Nanopore数据的高效组装工具
  19. ESXi与物理交换机静态链路聚合配置过程中的小陷阱
  20. AI二次开发c#开发环境搭建

热门文章

  1. CodeGlance
  2. Object类、常用API
  3. Android基础——四大组件之Activity
  4. Qt IFW基本用法
  5. 华为故事,李一男,任正非
  6. LoRa 之一 旧版驱动(sx12xxDrivers-V2.1.0)移植及驱动架构详解
  7. 编译linux-2.6.29内核,报错解决方法
  8. C中memcpy使用注意事项
  9. 启明云端分享|乐鑫 ESP-NOW 无线通信方案主要特点、应用以及NOW一对一模式下通信速率
  10. 氨氮吹脱法脱与php有关系吗,吹脱法处理氨氮废水的原理及优缺点分析