#include <reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar year,month,day,hour,minute,second,week;//定义存放转换成十进制的数
uchar cunfang[13]; //存放转换成十进制后并分离出个,十位的数
uchar write_ds1302[]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};//存放写操作命令(地址)(秒,分,时,天,月,周,年)
uchar read_ds1302[]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};//存放读操作命令(地址)(秒,分,时,天,月,周,年)
uchar chushi[]={10,8,20,5,12,50,50};//设置初始化值
//年,月,日,周,时,分,秒
sbit SCLK=P1^6;//7 ds1302时钟脉冲引脚
sbit IO=P1^5; // 6 ds1302数据引脚
sbit CE=P1^7; // 5 ds1302复位及时钟控制引脚(所有的数据传输在CE置1时进行,CE为0时终止传输)
sbit rs=P3^6;//4, 数据/命令选择,H/L,写数据/写命令
sbit rw=P3^5;//5, 读/写选择, H/L,读/写
sbit en=P3^4;//6, 使能信号
uchar cunfang[13]; //存放转换成十进制后并分离出个,十位的数
uchar table[]=" - - - - W ";
/*************延时子程序***************/
void delay(uchar t)
{ uchar x,y;
for(x=t;x>0;x--)
for(y=100;y>0;y--);
}
/***********1602写时序********/
void wr_com(uchar com) //写命令
{ rs=0;
rw=0;
en=0;
P2=com;
delay(5);
en=1;
delay(5);
en=0;
}
void wr_date(uchar date)//写数据
{ rs=1;
rw=0;
en=0;
P2=date;
delay(5);
en=1;
delay(5);
en=0;
}
/*****************1602液晶初始化***************/
void lcd1602_init()
{ uchar nm;
//en=0;
wr_com(0x01);//清屏
wr_com(0x38);//开8位数据口
wr_com(0x0c);//开显示
wr_com(0x06);//写一个字符指针、光标加1
wr_com(0x80); //写第一行
for(nm=0;nm<15;nm++)
{ wr_date(table[nm]);
//delay(5);
}
}
/**********显示函数**************/
void display()
{ /* wr_com(0x80); //年
wr_date(cunfang[0]+0x30);
wr_date(cunfang[1]+0x30); */
wr_com(0x80); //月
wr_date(cunfang[2]+0x30);
wr_date(cunfang[3]+0x30);
wr_com(0x83); //日
wr_date(cunfang[4]+0x30);
wr_date(cunfang[5]+0x30);
wr_com(0x86); //时
wr_date(cunfang[6]+0x30);
wr_date(cunfang[7]+0x30);
wr_com(0x89); //分
wr_date(cunfang[8]+0x30);
wr_date(cunfang[9]+0x30);
wr_com(0x8C); //秒
wr_date(cunfang[10]+0x30);
wr_date(cunfang[11]+0x30);
wr_com(0x8F); //周
wr_date(cunfang[12]+0x30);
}
/*******************************************************************/
/**************DS1302时钟*****************/
void write(uchar temp) //写一位
{ uchar i;
for(i=0;i<8;i++)
{
SCLK=0;
IO=temp&0x01;
temp=temp>>1; //低电平时数据保持不变的,等待上升沿将数据写入
SCLK=1;
}
}
uchar read(void)//读一位
{ uchar i,dat;
dat=0x00;
for(i=0;i<8;i++)
{
SCLK=0;
dat=dat>>1;
if(IO)
dat=dat|0x80; //接收数据下降沿有效,高电平时数据保持不变的,等待下降沿将数据读出
SCLK=1;
}
return(dat);
}
void write_bytes(uchar address,uchar date)//写一字节
{
CE=0;
_nop_();
SCLK=0;
_nop_();
CE=1; //将其拉高,准备数据传输
_nop_();
write(address);//进行写操作之前要进行写命令(地址),以确定是写那个
write(date); //写数据
CE=0;
_nop_();
IO=1; //操作完毕,将其拉高,避免影响
SCLK=1; //
}
uchar read_bytes(uchar address)//读一字节
{ uchar dad;
CE=0;
_nop_();
SCLK=0;
_nop_();
CE=1; //将其拉高,准备数据传输
_nop_();
write(address); //进行读操作之前要进行写命令(地址),以确定是读那个
dad=read(); //读数据
CE=0;
_nop_();
SCLK=1; //操作完毕,将其拉高,避免影响
IO=1; //
return(dad);
}
void ds1302_init() //初始化ds1302,写入初值
{
write_bytes(0x8e,0x00); //设置不保护
write_bytes(write_ds1302[0],((chushi[6]/10)<<4|chushi[6]%10));//秒 //
write_bytes(write_ds1302[1],((chushi[5]/10)<<4|chushi[5]%10));//分 //
write_bytes(write_ds1302[2],((chushi[4]/10)<<4|chushi[4]%10));//时 //
write_bytes(write_ds1302[3],((chushi[2]/10)<<4|chushi[2]%10));//天 //
write_bytes(write_ds1302[4],((chushi[1]/10)<<4|chushi[1]%10));//月 //
write_bytes(write_ds1302[5],((chushi[3]/10)<<4|chushi[3]%10));//周 //
write_bytes(write_ds1302[6],((chushi[0]/10)<<4|chushi[0]%10));// 年 //
write_bytes(0x90,0xa5);//打开充电功能,选择2K电阻充电方式
write_bytes(0x8e,0x80);//写入保护,
}
void ds1302_read()
{
year=read_bytes(read_ds1302[6]); //年
month=read_bytes(read_ds1302[4]); // 月
day=read_bytes(read_ds1302[3]); // 天
hour=read_bytes(read_ds1302[2]); // 时
minute=read_bytes(read_ds1302[1]); // 分
second=read_bytes(read_ds1302[0]); // 秒
week=read_bytes(read_ds1302[5]); //周
year=((year&0xf0)>>4)*10+(year&0x0f); //将读回BCD码(非压缩BCD码0000 0000)整成十进制数
month=((month&0x10)>>4)*10+(month&0x0f);
day=((day&0x30)>>4)*10+(day&0x0f);
hour=((hour&0x30)>>4)*10+(hour&0x0f);
minute=((minute&0x70)>>4)*10+(minute&0x0f);
second=((second&0x70)>>4)*10+(second&0x0f);
week=(week&0x07);
cunfang[0]=year/10; //将每位(个位,十位)分开
cunfang[1]=year%10;
cunfang[2]=month/10;
cunfang[3]=month%10;
cunfang[4]=day/10;
cunfang[5]=day&10;
cunfang[6]=hour/10;
cunfang[7]=hour%10;
cunfang[8]=minute/10;
cunfang[9]=minute%10;
cunfang[10]=second/10;
cunfang[11]=second%10;
cunfang[12]=week;
}
void main()
{
lcd1602_init(); //初始化LCD
ds1302_init(); //初始化DS1302
while(1)
{
ds1302_read();//读DS1302
display(); // 显示
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
ds1302测试通过,仿真实物均通过
共13个文件
lst:2个
obj:2个
lnp:1个
5星 · 超过95%的资源 需积分: 10 12 下载量 164 浏览量
2011-11-07
21:31:38
上传
评论
收藏 31KB ZIP 举报
温馨提示
ds1302测试通过,仿真实物均通过.测试条件:89C51,STC12LE5A60S2
资源推荐
资源详情
资源评论
收起资源包目录
ds1302TEST.zip (13个子文件)
ds1302TEST
DS1302.lnp 45B
DS1302.C 6KB
DS1302.plg 1KB
STARTUP.LST 14KB
DS1302.hex 3KB
DS1302.uvopt 54KB
DS1302 12KB
DS1302.M51 14KB
DS1302.LST 11KB
DS1302.OBJ 13KB
STARTUP.A51 6KB
DS1302.uvproj 13KB
STARTUP.OBJ 749B
共 13 条
- 1
资源评论
- San_Jue2013-06-22正是我需要的,很棒。
- 倾2012-10-30对学基础的很有帮组!!
普通网友
- 粉丝: 0
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功