历史上的今天
今天是:2025年10月11日(星期六)
2022年10月11日 | 51单片机基础之DS1302
2022-10-11 来源:csdn
代码:
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单片机基础之继电器
史海拾趣
|
前几天做实验,想买个三极管,但是看到这参数,不知道什么意思,有谁能告诉我的,详细一点的,还有,那个功率,是不是说三极管本身会耗功率啊?谢谢! 型 号 耐压(V) 电流(A) 功率(W) 型 号 耐压(V) 电流(A) 功率(W) B857 70V 4A 40W BU2508A 150 ...… 查看全部问答> |
|
今天做了一个东东...使用了周立功的ZNE10T串口转以太网模块..(该模块有IP协议栈) 实现了局域网的控制.... 但能不能实现外网的控制呢?(就是在远程通过别的PC机利用以太网控制) 请高手指点.... 上位机该怎样写呢?… 查看全部问答> |
|
国内数字背投影显示墙市场已经经历了长达10年的高速增长。目前市场规模已攀升到40亿元人民币每年以上。而据预测,未来五年内该产业依然能保持年均30%以上的增长速率,并逐步实现市场规模化、品牌集中化。 数字背投影显示墙产品市场 ...… 查看全部问答> |
|
在LPC11U14没有出现之前用LPC1114设计的MP3开发板,在LPC11U14出现后感觉没有必要使用LPC1114,所以一直没有大样,现在秀秀图吧。。。。。。。。。。。。。。 & ...… 查看全部问答> |
|
设计考虑因素德州仪器高可靠性(HiRel)开发小组提供了许多不同的用于恶劣环境下的半导体产品。许多应用都要求电子器件能够在户外使用,工作在典型的工业温度范围内,甚至有时会超出了-55℃至+125℃的军用温度标准范围。这些应用都具有限定条件及封装 ...… 查看全部问答> |
|
1、Broadband, Low Error Vector Magnitude (EVM) Direct Conversion Transmitter Using LO Divide-by-2 Modulator (CN0311) 2、High Accuracy Multichannel Thermocouple Measurement Solution (CN0172) … 查看全部问答> |




