中级会员
 
- 积分
- 212
- 金钱
- 212
- 注册时间
- 2015-10-4
- 在线时间
- 35 小时
|
1金钱
本帖最后由 ql1000 于 2016-9-23 12:05 编辑
请哪位师傅指导一下,我的程序在直插芯片DS1302正常运行,在贴片只能读,不能写!
//DS1302地址定义
#define ds1302_sec_add 0x80 //秒数据地址
#define ds1302_min_add 0x82 //分数据地址
#define ds1302_hr_add 0x84 //时数据地址
#define ds1302_date_add 0x86 //日数据地址
#define ds1302_month_add 0x88 //月数据地址
#define ds1302_day_add 0x8a //星期数据地址
#define ds1302_year_add 0x8c //年数据地址
#define ds1302_control_add 0x8e //控制数据地址
#define ds1302_charger_add 0x90 //充电功能
#define ds1302_clkburst_add 0xbe
/*
#define WRITE_SECOND 0x80
#define WRITE_MINUTE 0x82
#define WRITE_HOUR 0x84
#define READ_SECOND 0x81
#define READ_MINUTE 0x83
#define READ_HOUR 0x85
#define WRITE_PROTECT 0x8E
*/
//初始时间定义
uchar time_buf[8];// = {0x20,0x10,0x09,0x14,0x23,0x59,0x50,0x02};//初始时间2010年6月1号23点59分55秒 星期二
uchar hour,minute;
uchar readtime[14];//当前时间
uchar sec_buf=0; //秒缓存
uchar sec_flag=0; //秒标志位
//功能:延时1毫秒
void Delay_xms(uint x)
{
uint i,j;
for(i=0;i<x;i++)
for(j=0;j<112;j++);
}
void u1(uchar a)
{ uchar i;i=a;
for( ;i>0;i--);
}
//DS1302初始化函数
void ds1302_init(void)
{
DS1302_CE_L; //RST脚置低
DS1302_CLK_L; //SCK脚置低
}
//向DS1302写入一字节数据
void ds1302_write_byte(uchar addr, uchar d)
{
uchar i;
DS1302_CE_H; //启动DS1302总线
//写入目标地址:addr
addr = addr & 0xfe; //最低位置零,寄存器0位为0时写,为1时读
for (i = 0; i < 8; i ++) {
if (addr & 0x01) {
DS1302_IO_H;
}
else {
DS1302_IO_L;
}
DS1302_CLK_H; u1(1); //产生时钟
DS1302_CLK_L; u1(1);
addr = addr >> 1;
}
//写入数据:d
for (i = 0; i < 8; i ++) {
if (d & 0x01) {
DS1302_IO_H;
}
else {
DS1302_IO_L;
}
DS1302_CLK_H; u1(1); //产生时钟
DS1302_CLK_L; u1(1);
d = d >> 1;
}
DS1302_CE_L; u1(200); //停止DS1302总线
}
//从DS1302读出一字节数据
uchar ds1302_read_byte(uchar addr)
{ uchar i,temp;
DS1302_CE_H; //启动DS1302总线
addr = addr | 0x01; ////写入目标地址:addr最低位置高,寄存器0位为0时写,为1时读
for (i = 0; i < 8; i ++)
{
if (addr & 0x01) { DS1302_IO_H; }
else { DS1302_IO_L; }
DS1302_CLK_H; //产生时钟
DS1302_CLK_L;
addr = addr >> 1;
}
//输出数据:temp
DS1302_IO_in;
for (i = 0; i < 8; i ++)
{
temp = temp >> 1;
if (DS1302_IO) { temp |= 0x80; }
else { temp &= 0x7F; }
DS1302_CLK_H; //产生时钟
DS1302_CLK_L;
}
DS1302_IO_out;
DS1302_CE_L; //停止DS1302总线
return temp;
}
//向DS1302写入时钟数据
void ds1302_write_time(void)
{
ds1302_write_byte(ds1302_control_add,0x00); //关闭写保护
//ds1302_write_byte(ds1302_sec_add,0x80); //暂停时钟
//ds1302_write_byte(ds1302_charger_add,0xa9); //涓流充电
//ds1302_write_byte(ds1302_year_add, time_buf[1]); //年
//ds1302_write_byte(ds1302_month_add,time_buf[2]);//月
//ds1302_write_byte(ds1302_date_add, time_buf[3]); //日
ds1302_write_byte(ds1302_hr_add, time_buf[4]); //时
ds1302_write_byte(ds1302_min_add, time_buf[5]); //分
//ds1302_write_byte(ds1302_sec_add, time_buf[6]); //秒
//ds1302_write_byte(ds1302_day_add, time_buf[7]); //周
//WriteSet1302(0x90,0xa5); //打开充电功能 选择2K电阻充电方式
ds1302_write_byte(ds1302_control_add,0x80); //打开写保护
}
void time_reset(void)
{time_buf[0]=0x20; time_buf[1]=0x10; time_buf[2]=0x09; time_buf[3]=0x14;
time_buf[4]=0x23; time_buf[5]=0x59; time_buf[6]=0x50; time_buf[7]=0x02;
ds1302_write_time();
}
//从DS1302读出时钟数据
void ds1302_read_time(void)
{
//time_buf[1]=ds1302_read_byte (ds1302_year_add); //年
//time_buf[2]=ds1302_read_byte (ds1302_month_add); //月
//time_buf[3]=ds1302_read_byte (ds1302_date_add); //日
time_buf[4]=ds1302_read_byte (ds1302_hr_add); //时
time_buf[5]=ds1302_read_byte (ds1302_min_add); //分
//time_buf[6]=(ds1302_read_byte(ds1302_sec_add))&0x7f;//秒,屏蔽秒的第7位,避免超出59
//time_buf[7]= ds1302_read_byte (ds1302_day_add); //周
//minute=((time_buf[5]&0x70)>>4)*10 + (time_buf[5]&0x0F);
}
void ds1302(void)
{
ds1302_read_time(); //读取时间
readtime[0]=(time_buf[0]>>4); //分离出年千位
readtime[1]=(time_buf[0]&0x0F); //分离出年百位
readtime[2]=(time_buf[1]>>4); //分离出年十位
readtime[3]=(time_buf[1]&0x0F); //分离出年个位
readtime[4]=(time_buf[2]>>4); //分离出月十位
readtime[5]=(time_buf[2]&0x0F); //分离出月个位
readtime[6]=(time_buf[3]>>4); //分离出日十位
readtime[7]=(time_buf[3]&0x0F); //分离出日个位
readtime[8]=(time_buf[4]>>4); //分离出小时十位
readtime[9]=(time_buf[4]&0x0F); //分离出小时个位
readtime[10]=(time_buf[5]>>4); //分离出分钟十位
readtime[11]=(time_buf[5]&0x0F); //分离出分钟个位
readtime[12]=(time_buf[6]>>4); //分离出秒钟十位
readtime[13]=(time_buf[6]&0x0F); //分离出秒钟个位
}
|
|