找回密码
 注册会员
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版

菜鸟入门,求助关于DS1302的程序

[复制链接]
admin 发表于 2012-9-2 08:31:33 | 显示全部楼层 |阅读模式

本文包含原理图、PCB、源代码、封装库、中英文PDF等资源

您需要 登录 才可以下载或查看,没有账号?注册会员

×
这个是我写的程序,由于对时序图不是很理解,导致三天了这个程序还是没用,请各位大虾帮帮俺
#include<reg52.h>
#define ds1302_second 0x80
#define ds1302_minute 0x82
#define ds1302_hour 0x84
#define ds1302_day 0x86
#define ds1302_week 0x8a
#define ds1302_month 0x88
#define ds1302_year 0x8c//时间寄存器
#define uchar unsigned char
#define uint unsigned int
sbit lcdwr=P2^5;
sbit lcdrs=P2^6;
sbit lcden=P2^7;
sbit sclk=P3^6; //时钟
sbit dio=P3^4; //数据
sbit ce= P3^5;// DS1302复位
sbit ACC_0=ACC^0;
sbit ACC_1=ACC^1;
sbit ACC_2=ACC^2;
sbit ACC_3=ACC^3;
sbit ACC_4=ACC^4;
sbit ACC_5=ACC^5;
sbit ACC_6=ACC^6;
sbit ACC_7=ACC^7;
void write1302(uchar ,uchar );
uchar code time1[]={" 2011/08/15 1 "};//15
uchar code time2[]={" : : 30.00C"};//16 ^_^从左至右为1,4,7
uint num,second,minute,hour;
void delay(uchar z)
{
uchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}

void write_com(uchar com)
{
lcdrs=0;
lcdwr=0;
P0=com;
lcden=0;
delay(5);
lcden=1;
delay(5);
lcden=0;
}

void write_date(uchar date)
{
lcdrs=1;
lcdwr=0;
P0=date;
lcden=0;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void lcdmov(uchar pos)
{ //设定显示位置
write_com(pos|0x80);
}

void write_time(uchar add,uchar date)
{
uchar shi,ge;
shi=date/10;
ge=date%10;
lcdmov(0x40+add);
write_date(0x30+shi);
write_date(0x30+ge);
}
void init()
{
lcden=0;
lcdwr=0;
lcdmov(0x00);
write_com(0x38);//8位数据接口2行显示
write_com(0x0e);//打开显示,光标闪烁
write_com(0x06);//画面不动,增加一
write_com(0x00);//清屏
for(num=0;num<15;num++)
{
write_date(time1[num]);
delay(20);
}
lcdmov(0x40);
for(num=0;num<16;num++)
{
write_date(time2[num]);
delay(20);
}
write_com(0x0c);//关闭光标显示
write1302(0x8e,0x00);//写保护,可以写投入数据
write1302(0x80,0x00); //写秒
write1302(0x82,0x43);//写分
write1302(0x84,0x15); //写时
write1302(0x86,0x17);//写day
write1302(0x88,0x7);//写月
write1302(0x8c,0x11);//写年
write1302(0x8e,0x80);//写保护,不能写入数据

}
//////////数据写入子程序
void write1302(uchar add,uchar date)
{
uchar i,temp;
ce=0;
sclk=0;
ce=1;
///////////发送地址
for(i=8;i>0;i--)
{
sclk=0;
temp=add;
dio=(bit)(temp&0x80);
add>>=1;
sclk=1;
}
//////发送数据
for(i=8;i>0;i--)
{
sclk=0;
temp=date;
dio=(bit)(date&0x80);
date>>=1;
sclk=1;
}
ce=0;
}
/////////////////数据读取子程序
char read1302(uchar add)
{
uchar i,temp;
ce=0;
sclk=0;
ce=1;
for(i=8;i>0;i--)
{
sclk=0;
temp=add;
dio=(bit)(temp&0x01);
add>>=1;
sclk=1;
}
for(i=8;i>0;i--)
{
ACC=dio;
sclk=1;
ACC>>=1;
sclk=0;
}
ce=0;
date1=ACC;
date2=date1/16;
date1=date1%16;
date1=date1+date2*10;
return(ACC);
}
void main()
{
init();
while(1);
{
second=read1302(0x81);
minute=read1302(0x83);
hour=read1302(0x85);
write_time(7,second);
write_time(4,minute);
write_time(1,hour);
}
}
这个程序中的ACC的定义不是很理解,也希望大家帮助解释一下。
*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-11-24 09:27 , Processed in 0.051607 second(s), 10 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表