51单片机基础之DS1302

发布者:Tiger8最新更新时间:2022-10-11 来源: csdn关键字:51单片机  基础  DS1302 手机看文章 扫描二维码
随时随地手机看文章

代码:


main.c 文件

 

/*

DS1302时钟

*/

#include "smg.h"

#include "ds1302.h"

 

void main()

{

u8 time_buf[8]; //这个数组用来存储需要现实的内容

ds1302_init();//初始化DS1302

 

while(1)

{

ds1302_read_time();

//虽然不知道这个是干嘛的,但是知道怎么改。

time_buf[0]=gsmg_code[gDS1302_TIME[2]/16];

time_buf[1]=gsmg_code[gDS1302_TIME[2]&0x0f];

time_buf[2]=0x40; //显示一杠

time_buf[3]=gsmg_code[gDS1302_TIME[1]/16];

time_buf[4]=gsmg_code[gDS1302_TIME[1]&0x0f];

time_buf[5]=0x40; //显示一杠

time_buf[6]=gsmg_code[gDS1302_TIME[0]/16];

time_buf[7]=gsmg_code[gDS1302_TIME[0]&0x0f];

smg_display(time_buf,1); //数码管显示函数

}

}


#include "ds1302.h"

#include "intrins.h"

 

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

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

u8 gREAD_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d}; 

u8 gWRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};

 

//DS1302时钟初始化2021年5月20日星期四13点51分47秒

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

//在这里改起始日期

u8 gDS1302_TIME[7] = {0x11, 0x11, 0x11, 0x20, 0x04, 0x05, 0x21};

 

 

/*

* 函 数 名       : ds1302_write_byte

* 函数功能 : DS1302写单字节

* 输    入       : addr:地址/命令

   dat:数据

* 输    出    : 无

*/

void ds1302_write_byte(u8 addr,u8 dat)

{

u8 i=0;

DS1302_RST=0;

_nop_();

DS1302_CLK=0;//CLK低电平

_nop_();

DS1302_RST=1;//RST由低到高变化

_nop_();

 

for(i=0;i<8;i++)//循环8次,每次写1位,先写低位再写高位

{

DS1302_IO=addr&0x01;

addr>>=1;

DS1302_CLK=1;

_nop_();

DS1302_CLK=0;//CLK由低到高产生一个上升沿,从而写入数据

_nop_();

}

for(i=0;i<8;i++)//循环8次,每次写1位,先写低位再写高位

{

DS1302_IO=dat&0x01;

dat>>=1;

DS1302_CLK=1;

_nop_();

DS1302_CLK=0;

_nop_();

}

DS1302_RST=0;//RST拉低

_nop_();

}

 

/*

* 函 数 名       : ds1302_read_byte

* 函数功能 : DS1302读单字节

* 输    入       : addr:地址/命令

* 输    出    : 读取的数据

*/

u8 ds1302_read_byte(u8 addr)

{

u8 i=0;

u8 temp=0;

u8 value=0;

 

DS1302_RST=0;

_nop_();

DS1302_CLK=0;//CLK低电平

_nop_();

DS1302_RST=1;//RST由低到高变化

_nop_();

for(i=0;i<8;i++)//循环8次,每次写1位,先写低位再写高位

{

DS1302_IO=addr&0x01;

addr>>=1;

DS1302_CLK=1;

_nop_();

DS1302_CLK=0;//CLK由低到高产生一个上升沿,从而写入数据

_nop_();

}

for(i=0;i<8;i++)//循环8次,每次读1位,先读低位再读高位

{

temp=DS1302_IO;

value=(temp<<7)|(value>>1);//先将value右移1位,然后temp左移7位,最后或运算

DS1302_CLK=1;

_nop_();

DS1302_CLK=0;

_nop_();

}

DS1302_RST=0;//RST拉低

_nop_();

DS1302_CLK=1;//对于实物中,P3.4口没有外接上拉电阻的,此处代码需要添加,使数据口有一个上升沿脉冲。

_nop_();

DS1302_IO = 0;

_nop_();

DS1302_IO = 1;

_nop_();

return value;

}

 

/*

* 函 数 名       : ds1302_init

* 函数功能 : DS1302初始化时间

* 输    入       : 无

* 输    出    : 无

*/

void ds1302_init(void)

{

u8 i=0;

ds1302_write_byte(0x8E,0X00);

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

{

ds1302_write_byte(gWRITE_RTC_ADDR[i],gDS1302_TIME[i]);

}

ds1302_write_byte(0x8E,0X80);

}

 

/*

* 函 数 名       : ds1302_read_time

* 函数功能 : DS1302读取时间

* 输    入       : 无

* 输    出    : 无

*/

void ds1302_read_time(void)

{

u8 i=0;

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

{

gDS1302_TIME[i]=ds1302_read_byte(gREAD_RTC_ADDR[i]);

}

}


ds1302.h文件

 

#ifndef _ds1302_H

#define _ds1302_H

 

#include "smg.h"

 

//管脚定义

sbit DS1302_RST=P3^5;//复位管脚

sbit DS1302_CLK=P3^6;//时钟管脚

sbit DS1302_IO=P3^4;//数据管脚

 

//变量声明

extern u8 gDS1302_TIME[7];//存储时间

 

//函数声明

void ds1302_init(void);

void ds1302_read_time(void);

 

 

#endif


smg.c文件

 

#include "smg.h"

 

//共阴极数码管显示0~F的段码数据

u8 gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

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

* 函 数 名       : smg_display

* 函数功能 : 动态数码管显示

* 输    入       : dat:要显示的数据

   pos:从左开始第几个位置开始显示,范围1-8

* 输    出    : 无

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

void smg_display(u8 dat[],u8 pos)

{

u8 i=0;

u8 pos_temp=pos-1;

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

{

    switch(i)//位选

{

case 0: LSC=1;LSB=1;LSA=1;break;

case 1: LSC=1;LSB=1;LSA=0;break;

case 2: LSC=1;LSB=0;LSA=1;break;

case 3: LSC=1;LSB=0;LSA=0;break;

case 4: LSC=0;LSB=1;LSA=1;break;

case 5: LSC=0;LSB=1;LSA=0;break;

case 6: LSC=0;LSB=0;LSA=1;break;

case 7: LSC=0;LSB=0;LSA=0;break;

}

SMG_A_DP_PORT=dat[i-pos_temp];//传送段选数据

delay_10us(100);//延时一段时间,等待显示稳定

SMG_A_DP_PORT=0x00;//消音

}

}

//延时函数

void delay_10us(u16 ten_us)

{

while(ten_us--);

}


smg.h文件

 

#ifndef _smg_H

#define _smg_H

 

#include

 

typedef unsigned int u16; //对系统默认数据类型进行重定义

typedef unsigned char u8;

 

#define SMG_A_DP_PORT P0 //使用宏定义数码管段码口

 

//定义数码管位选信号控制脚

sbit LSA=P2^2;

sbit LSB=P2^3;

sbit LSC=P2^4;

 

extern u8 gsmg_code[17];

void smg_display(u8 dat[],u8 pos);

void delay_10us(u16 ten_us);

#endif

 


运行结果:


从十一时十一分十一秒开始的。

关键字:51单片机  基础  DS1302 引用地址:51单片机基础之DS1302

上一篇:51单片机基础之继电器
下一篇:51单片机基础之DHT11温湿度传感器

推荐阅读最新更新时间:2024-11-12 23:12

51单片机实现两片联级74HC595依次点亮且每次只能点亮一个
一、使用proteus绘制简单的电路图,用于后续仿真 二、编写程序 /******************************************************************************************************************** ---- @Project: LED-74HC595 ---- @File: main.c ---- @Edit: ZHQ ---- @Version: V1.0 ---- @CreationTime: 20200526 ---- @ModifiedTime: 20200526 ---- @Description: 第9个至
[单片机]
<font color='red'>51单片机</font>实现两片联级74HC595依次点亮且每次只能点亮一个
51单片机之lcd1602步进电机控制
#include reg51.h //51芯片管脚定义头文件 #include intrins.h //内部包含延时函数 _nop_(); #define uchar unsigned char #define uint unsigned int #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();}; char code SST516 _at_ 0x003b; uchar code FFW ={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9}; uchar code REV ={0xf9,0xf8,0xfc,0
[单片机]
MCS-51单片机指令系统“读-改-写”方式指令
51 单片机有四个 8 位的并行接口。由于内部结构的特点,并行接口在输出 0、1 的时候,能力是不一样的。输出 0 的时候,能力较强,但输出 1 的时候,能力就很差了,而 P0 口,则要外接上拉电阻才能输1。 单片机从端口读入数据的通道有两个,一个是从锁存器引入,一个是从输出引脚处引入,分别叫做“读锁存器”和“读引脚”。单片机在进行端口输出时,经常要参考其上一次的输出状态。 Example:使一个LED灯闪烁。编程序时需要从输出引脚读前一次的输出状态,然后将其求反输出。如果上次是输出“1”使LED点亮,这时候虽然端口上输出逻辑是“1”,但是由于LED的二极管作用将输出高电平拉至“0”电平(0.7V左右),通过引脚读进来就是
[单片机]
51单片机+ULN2003驱动5V减速步进电机程序
51单片机 步进电机 /******************************************************* ULN2003驱动5V减速步进电机程序 Target:STC89C52RC-40C Crystal:12MHz Author:战神单片机工作室 Platform:51&avr单片机最小系统板+ULN2003步进电机驱动套件 ******************************************************* 接线方式: IN1 ---- P00 IN2 ---- P01 IN3 ---- P02 IN4 ---- P03 + ---- +5V - ---- GN
[单片机]
浅谈硬件测试-基础
1.硬件测试基本知识 1.1什么是硬件测试? 定义:硬件测试就是对项目开发过程的产品硬件(结构、PCBA、关键部件等)进行差错检查,保证其质量的一种过程活动。硬件测试只是硬件产品质量控制的方式之一,质量管理包括一个质量目标ppm+三部曲(质量策划-质量控制-质量改进)。 1.2硬件产品质量保证系统 汽车电子-车机硬件开发保障系统 从汽车零部件(车机开发)质量保障系统,可以看到汽车零部件硬件质量是设计与生产出来的,测试只是检验保障手段方式之一。 1.3 硬件测试内容方向 硬件测试是具有试验性质的测量,即测量和试验的综合。而测试手段就是仪器仪表。测试的基本任务就是获取有用的信息,通过借助专门的仪器、设备,设计合理的实验方法
[测试测量]
浅谈硬件测试-<font color='red'>基础</font>篇
灵敏度和噪声-频谱分析基础
灵敏度 频谱分析仪的主要用途之一是搜索和测量低电平信号。这种测量的最终限制是频谱分析仪自身产生的噪声。这些由各种电路元件的随机电子运动产生的噪声经过分析仪多级增益的放大最后作为噪声信号出现在显示屏上。该噪声在频谱分析仪里通常称为显示平均噪声电平,或称 DANL。(显示平均噪声电平有时会和“灵敏度”混淆。虽然它们之间有关系,但是含义并不相同。灵敏度是在一定的信噪比(SNR)或比特误码率的情况下可测量到的最小信号电平。它是无线电接收机性能的一个通用指标。而频谱分析仪的指标总是以 DANL 给出。) DANL 中看到的噪声功率由热噪声和频谱分析仪的噪声系数组成。虽然使用一些技术可以测量略微低于 DANL 的信号,但是 DANL 始终限制
[测试测量]
灵敏度和噪声-频谱分析<font color='red'>基础</font>
51单片机读写AT24C02源代码(详细注释)
在P1口上接八个led灯,结果就显示在这八个灯上面。AT24C02的接线方式见程序的顶部的定义。以下是源代码: #include reg52.h //包含头文件 typedef unsigned char uchar; typedef unsigned int uint; #define write_c02 0xa0 #define read_c02 0xa1 sbit sda = P2^0; sbit scl = P2^1; void delay() { //delay:5us ;; } //i2c:init void i2c_init() { sda = 1; delay(); scl = 1; delay(); }
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved