ds1302.c
来自「用pic单片机做的一个温度计 实现实时时钟显示和存储」· C语言 代码 · 共 319 行
C
319 行
#include<p18f452.h>
#include"delays.h"
#define i_ocontrol TRISBbits.TRISB6 //定义数据控制(输入输出)
#define i_o PORTBbits.RB6 //定义ds0302的数据口
#define scl PORTBbits.RB5 //定义ds0302的时钟口
#define rst PORTBbits.RB7 //定义ds0302的复位口
char y;
char z;
char year; //年
char month; //月
char date; //日
char day; //星期
char hour; //小时
char minute; //分钟
char second; //秒
//******************************************
void inttial_ds1302(void)
{
PORTB&=0x1F ;
TRISB&=0x1F;
}
//****************************************************
void DS1302_Write(char reg,char date)
{
char i;
inttial_ds1302();
i_ocontrol=0;
Nop();
Nop();
scl=0;
Nop();
Nop();
i_o=0;
Nop();
Nop();
rst=0;
Nop();
Nop();
rst=1;
Nop();
Nop();
for (i=0;i<8; i++)
{
if(reg&0x01) i_o=1;
else i_o=0;
Nop();
Nop();
scl=1;
Nop();
Nop();
scl=0;
Nop();
Nop();
reg>>=1;
}
for (i=0;i<8; i++)
{
if(date&0x01) i_o=1;
else i_o=0;
Nop();
Nop();
scl=1;
Nop();
Nop();
scl=0;
Nop();
Nop();
date>>=1;
}
rst=0;
Nop();
Nop();
i_ocontrol=1;
Nop();
Nop();
}
//*******************************************************
char DS1302_Read(char reg)
{
char date;
char i;
inttial_ds1302();
reg+=1;
i_ocontrol=0;
Nop();
Nop();
scl=0;
Nop();
Nop();
i_o=0;
Nop();
Nop();
rst=0;
Nop();
Nop();
rst=1;
Nop();
Nop();
for (i=0;i<8; i++)
{
if(reg&0x01) i_o=1;
else i_o=0;
Nop();
Nop();
scl=1;
Nop();
Nop();
scl=0;
Nop();
Nop();
reg>>=1;
}
Nop();
Nop();
i_ocontrol=1;
for (i=0;i<8; i++)
{
date>>=1;
if(i_o) date|=0x80;
scl=1;
Nop();
Nop();
scl=0;
Nop();
Nop();
}
rst=0;
Nop();
Nop();
i_ocontrol=0;
return date;
}
//******************************************************
void ds1302_initial(char yeartp, char monthtp, char datetp,char daytp, char hourtp, char minutetp, char secondtp)
{
char temp;
char high;
char low;
DS1302_Write(0x8e,0x00);
DS1302_Write(0x80,0x80);
DS1302_Write(0x90,0xa9);
high = 0;
low = 0;
temp = 0;
high = yeartp/10;
low = yeartp%10;
temp = (high << 4 )+ low;
DS1302_Write(0x8c,temp); //年
high = 0;
low = 0;
temp = 0;
high = monthtp/10;
low = monthtp%10;
temp = (high << 4) + low;
DS1302_Write(0x88,temp); //月
high = 0;
low = 0;
temp = 0;
high = datetp/10;
low = datetp%10;
temp = (high << 4)+ low;
DS1302_Write(0x86,temp); //日
high = 0;
low = 0;
temp = 0;
high = daytp/10;
low = daytp%10;
temp = (high << 4)+ low;
DS1302_Write(0x8A,temp); //星期
high = 0;
low = 0;
temp = 0;
high = hourtp/10;
low = hourtp%10;
temp = (high << 4) + low;
DS1302_Write(0x84,temp); //时
high = 0;
low = 0;
temp = 0;
high = minutetp/10;
low = minutetp%10;
temp =( high << 4) + low;
DS1302_Write(0x82,temp); //分
high = 0;
low = 0;
temp = 0;
high = secondtp/10;
low = secondtp%10;
temp = (high << 4) + low;
DS1302_Write(0x80,temp); //秒
DS1302_Write(0x8e,0x80);//打开写保护
}
//****************************************
void read_time(void)
{
char data;
char high;
char low;
data =DS1302_Read(0x8c);//年
low = data&0x0f;
high = (data>>4);
year = high*10 + low;
data = DS1302_Read(0x88);//月
low = data&0x0f;
high = (data>>4);
month = high*10 + low;
data = DS1302_Read(0x86);//日
low = data&0x0f;
high = (data>>4);
date = high*10 + low;
data = DS1302_Read(0x8A);//星期
low = data&0x0f;
high = (data>>4);
day= high*10 + low;
data = DS1302_Read(0X84);//时
low = data&0x0f;
high = (data>>4);
hour = high*10 + low;
data = DS1302_Read(0X82);//分
low = data&0x0f;
high = (data>>4);
minute= high*10 + low;
data = DS1302_Read(0X80);//秒
low = data&0x0f;
high = (data>>4);
second= high*10 + low;
delays(100,100);
}
/*****************************************************************************
******函 数 名 称 : h_to_number()
******函 数 功 能 : 提取十六进制字符
******输 入 : 无
******输 出 : 无
******备注 :
******************************************************************************/
void h_to_number(char x)
{
char m;
m=x;
y=m/10+48;
z=m%10+48;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?