标题:
为什么这样单片机读出来的DS1302时间星期是0-7呀,这个怎么去调时间0,请大佬赐教
[打印本页]
作者:
123456789hyy
时间:
2021-5-2 10:20
标题:
为什么这样单片机读出来的DS1302时间星期是0-7呀,这个怎么去调时间0,请大佬赐教
#include "intrins.h"
#ifndef _DS1302_H_
#define _DS1302_H_
sbit clk = P2^2; //ds1302时钟线定义
sbit io = P2^1; //数据线
sbit rst = P2^0; //复位线
//秒 分 时 日 月 年 星期
uchar code write_add[]={0x80,0x82,0x84,0x86,0x88,0x8c,0x8a}; //写地址
uchar code read_add[] ={0x81,0x83,0x85,0x87,0x89,0x8d,0x8b}; //读地址
uchar code init_ds[] ={0x58,0x29,0x07,0x05,0x10,0x14,0x1};
extern uchar miao,fen,shi,ri,yue,week,nian;
extern uchar i;
void delaynus(unsigned char n)
{
unsigned char i;
for(i=0;i<n;i++);
}
//向1302写一个字节数据
void Write1302(unsigned char dat)
{
unsigned char i;
clk=0; //拉低CLK,为脉冲上升沿写入数据做准备
delaynus(2); //稍微等待,使硬件做好准备
for(i=0;i<8;i++) //连续写8个二进制数据
{
io=dat&0x01; //取出dat的第0位数据写入1302
delaynus(2); //稍微等待,使硬件做好准备
clk=1; //上升沿写入数据
delaynus(2); //稍微等待,使硬件做好准备
clk=0; //重新拉低SCLK,形成脉冲
dat>>=1; //将dat的各数据位右移1位,准备下入下一位数据位
}
}
/*************根据命令,向1302写一个数据到对应的地址里***************/
void write_ds1302(uchar add,uchar dat)
{
rst=0; //禁止数据传递
clk=0; //确保写数据前CLK被拉低
rst=1; //启动数据传输
delaynus(2); //稍微等待,为硬件做好准备
Write1302(add); //写入命令字
Write1302(dat); //写数据
clk=1; //将始终电平置于已知状态
rst=0; //禁止数据传递
}
/*****************************************************
从1302读一个字节数据
***************************************************/
unsigned char Read1302(void)
{
unsigned char i,dat;
delaynus(2); //稍微等待,为硬件做好准备
for(i=0;i<8;i++) //连续读8个二进制位数据
{
dat>>=1; //将dat的各数据位右移1位,因为先读出来的是字节的最低位
if(io==1) //如果读出来的是1
dat|=0x80; //将1取出,写在dat的最高位
clk=1; //将clk置于高电平,为下降沿读出
delaynus(2); //稍微等待
clk=0; //拉低clk,形成脉冲下降沿
delaynus(2); //稍微等待
}
return dat; //将读出来的数据返回
}
/*************根据命令,从1302对应的地址读一个数据出来***************/
uchar read_ds1302(uchar add)
{
unsigned char dat;
rst=0; //拉低RST
clk=0; //确保写数据前CLK被拉低
rst=1; //启动数据传输
Write1302(add); //写入命令字
dat=Read1302(); //读出数据
clk=1; //将时钟电平置于已知状态
rst=0; //禁止数据传递
return dat; //将读出的数据返回
}
/*************把要的时间 年月日 都读出来***************/
void read_time()
{
miao = read_ds1302(read_add[0]); //读秒
fen = read_ds1302(read_add[1]); //读分
shi = read_ds1302(read_add[2]); //读时
ri = read_ds1302(read_add[3]); //读日
yue = read_ds1302(read_add[4]); //读月
nian = read_ds1302(read_add[5]); //读年
week = read_ds1302(read_add[6]); //读星期
}
/*************把要写的时间 年月日 都写入ds1302里***************/
void write_time()
{
write_ds1302(0x8e,0x00); //关闭写保护
write_ds1302(write_add[0],miao); //写秒
write_ds1302(write_add[1],fen); //写分
write_ds1302(write_add[2],shi); //写时
write_ds1302(write_add[3],ri); //写日
write_ds1302(write_add[4],yue); //写月
write_ds1302(write_add[5],nian); //写年
write_ds1302(write_add[6],week); //写星期
write_ds1302(0x8e,0x80); //打开写保护
}
/*************把数据保存到ds1302 RAM中**0-31*************/
void write_ds1302ram(uchar add,uchar dat)
{
add <<= 1; //地址是从第二位开始的
add &= 0xfe; //把最低位清零 是写的命令
add |= 0xc0; //地址最高两位为 1
write_ds1302(0x8e,0x00);
write_ds1302(add,dat);
write_ds1302(0x8e,0x80);
}
/**********************设置ds1302时间函数**********************/
void set_ds1302time(uchar num,uchar *shi,uchar dat) //调时
{
if(num == 1)
{
*shi+=0x01;
if((*shi & 0x0f) >= 0x0a)
*shi = (*shi & 0xf0) + 0x10;
if(*shi >= dat)
*shi = 0;
}
else
{
if(*shi == 0x00)
*shi = dat;
if((*shi & 0x0f) == 0x00)
*shi = (*shi | 0x0a) - 0x10;
*shi -=0x01 ;
}
}
/*************把数据从ds1302 RAM读出来**0-31*************/
uchar read_ds1302ram(uchar add)
{
add <<= 1; //地址是从第二位开始的
add |= 0x01; //把最高位置1 是读命令
add |= 0xc0; //地址最高两位为 1
return(read_ds1302(add));
}
/*************初始化ds1302时间***************/
void init_ds1302()
{
uchar i;
rst = 0; //第一次读写数据时要把I O口拉低
clk = 0;
io = 0;
i = read_ds1302ram(30);
if(i != 3)
{
i = 3;
write_ds1302ram(30,i); //4050 4100 3080
write_ds1302(0x8e,0x00); //关闭写保护
for(i=0;i<7;i++)
write_ds1302(write_add[i],init_ds[i]); //把最高位值0 允许ds1302工作
write_ds1302(0x8e,0x80); //打开保护
}
read_time(); //读时间
if(miao >= 0x60)
{
write_ds1302(0x8e,0x00); //关闭写保护
write_ds1302(write_add[0],0x01); //把最高位值0 允许ds1302工作
write_ds1302(0x8e,0x80); //打开保护
}
}
#endif
复制代码
作者:
birdzhyli
时间:
2021-5-2 23:37
你有什么问题,想问什么?
看了你的初始化数组init_ds[i],周你初始化个0x14进去,你让1302怎么想?
各种芯片都有例程,研究一下不难
作者:
birdzhyli
时间:
2021-5-2 23:48
144./*************把数据从ds1302 RAM读出来**0-31*************/
145.uchar read_ds1302ram(uchar add)
146.{
147. add <<= 1; //地址是从第二位开始的
148. add |= 0x01; //把最高位置1 是读命令
149. add |= 0xc0; //地址最高两位为 1
150. return(read_ds1302(add));
151.}
这个函数我没有看出来怎么退出,无限嵌套?
作者:
123456789hyy
时间:
2021-5-3 16:16
birdzhyli 发表于 2021-5-2 23:37
你有什么问题,想问什么?
看了你的初始化数组init_ds,周你初始化个0x14进去,你让1302怎么想?
各种芯 ...
周是0x1呀,我的意思是显示屏显示的时候。周是显示0-7的数字,而正常的是1-7,这个问题怎么解决
作者:
啤酒瓶子老大
时间:
2021-5-4 16:25
周是用软件换算的。
建议你直接换一个例程。重新搬一下。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1