#include<intrins.h>
#include<reg52.h>
#include<absacc.h>
#define uint unsigned int
#define uchar unsigned char
/*************************ds1302与at89s52引脚连接********************/
sbit T_RST=P3^5;
sbit T_CLK=P3^7;
sbit T_IO=P3^6;
sbit dula="P2"^6;
sbit wela="P2"^7;
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //0~~9段码
/******************DS1302:写入操作(上升沿)*********************/
void write_byte(unsigned char da)
{
unsigned char i;
ACC="da";
for(i=8;i>0;i--)
{
T_IO=ACC0;
T_CLK=0;
T_CLK=1;
ACC="ACC">>1;
}
}
/******************DS1302:读取操作(下降沿)*****************/
unsigned char read_byte(void)
{
unsigned char i;
for(i=0;i<8;i++)
{
ACC="ACC">>1;
T_CLK = 1;
T_CLK = 0;
ACC7 = T_IO;
}
return(ACC);
}
/******************DS1302:写入数据(先送地址,再写数据)***************************/
void write_1302(unsigned char addr,unsigned char da)
{
T_RST=0; //停止工作
T_CLK=0;
T_RST=1; //重新工作
write_byte(addr); //写入地址
write_byte(da);
T_RST=0;
T_CLK=1;
}
/******************DS1302:读取数据(先送地址,再读数据)**************************/
unsigned char read_1302(unsigned char addr)
{
unsigned char temp;
T_RST=0; //停止工作
T_CLK=0;
T_RST=1; //重新工作
write_byte(addr); //写入地址
temp="read"_byte();
T_RST=0;
T_CLK=1; //停止工作
return(temp);
}
/***********************延时程序=a*1ms**************************************/
void delay(unsigned char a)
{
unsigned char i;
while(a-- !=0)
{
for(i=0;i<125;i++);
}
}
void display(uchar *poi)
{
dula=0;
P0=table[*poi%16];
dula=1;
dula=0;
wela=0;
P0=0xdf;
wela=1;
wela=0;
delay(2);
dula=0;
P0=table[*poi/16];
dula=1;
dula=0;
wela=0;
P0=0xef;
wela=1;
wela=0;
delay(2);
poi++;
dula=0;
P0=table[*poi%16]|0x80;
dula=1;
dula=0;
wela=0;
P0=0xf7;
wela=1;
wela=0;
delay(2);
dula=0;
P0=table[*poi/16];
dula=1;
dula=0;
wela=0;
P0=0xfb;
wela=1;
wela=0;
delay(2);
poi++;
dula=0;
P0=table[*poi%16]|0x80;
dula=1;
dula=0;
wela=0;
P0=0xfd;
wela=1;
wela=0;
delay(2);
dula=0;
P0=table[*poi/16];
dula=1;
dula=0;
wela=0;
P0=0xfe;
wela=1;
wela=0;
delay(2);
}
/************************主程序**********************************************/
void main(void)
{
uchar clk_time[3]={0x00,0x00,0x12}; //秒,分,时寄存器初始值
uchar temp="0x80";
uchar i,j;
write_1302(0x8e,0x00); //WP=0 写操作
for(i=0;i<3;i++)
{
write_1302(temp,clk_time);
temp+=2;
}
write_1302(0x8e,0x80); //WP=1 写保护
while(1)
{
for(j=0;j<10;j++)
display(clk_time);
temp="0x81";
for(i=0;i<3;i++)
{
clk_time=read_1302(temp);
temp+=2;
}
}
}
文章评论(0条评论)
登录后参与讨论