📄 222.c
字号:
/**************************************************************
名称:DS1302_TIME_LED
说明:向1302写入起始时间"2008.09.06","14:18:58",并在8位数码管上显示
(分两次显示,第1显示年月日,第2显示当前时间)
功能:熟练掌握对1302的读写操作。并用其计时
调用:
输入值:写入数据"2008.09.06","14:18:58"
返回值:
****************************************************************/
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
/*******************************************************************
分别定义控制,年,月,日,时,分,秒寄存器的写数据地址
*******************************************************************/
#define control_add 0x8e //写保护地址
#define year_add 0x8c
#define month_add 0x88
#define date_add 0x86
#define hour_add 0x84
#define min_add 0x82
#define second_add 0x80
/*****************************************************************
定义起始时间的数据"2008.09.06","14:18:58"
******************************************************************/
#define control_unprotect 0x00 //允许写数据
#define year_data 0x08 //"08"年
#define month_data 0x09 //"09"月
#define date_data 0x06 //"06"号
#define hour_data 0x14 //"14"点
#define min_data 0x58 //"58"分
#define second_data 0x58 //"58"秒,同时开始开启时钟
uchar data_1byte; //定义1字节数据
uchar data_1burst; //定义数据
uchar data_buffer1[20]; //定义读取到的年,月,日,时,分,秒数据缓冲区
uchar data_buffer2[14]={2,0,0}; //定义显示数据缓冲区
uint flag;
uchar addar; //定义地址
uchar month;
uchar display_buffer[8]; //定义显示数据缓冲区
uchar code duan_ma[]={0x03,0x9f,0x25,0x0d,0x99,
0x49,0x41,0x1f,0x01,0x09};
//段码,对应的数字0-9十个数
sbit DS1302_SCLK=P1^4; //实时时钟控制引脚
sbit DS1302_IO=P1^5; //数据输入、输出引脚
sbit DS1302_RST=P1^7;
sbit HC595_RCK=P3^2; //定义74HC595的移位脉冲端
sbit BIT7=ACC^7;
/**************************************************************
us级延时子程序
***************************************************************/
void delay_us(uchar i)
{
for(i=250;i>0;i--)
;
}
/**************************************************************
MS级延时子程序
***************************************************************/
void delay_ms(uchar i)
{
uchar j;
for(i;i>0;i--)
for(j=83;j>0;j--)
;
}
/************************************************************
名称: write_1302_1byte
说明: 发送1byte数据子程序
功能: 该指令完成对1302的地址或数据1byte的写操作
调用:
输入值:1byte数据
返回值:无
*************************************************************/
void write_1302_1byte(uchar j)
{
uint i;
for(i=8;i>0;i--)
{
if(j&0x01==0x01)
{DS1302_IO=1;} //从A的最低位开始依次发送
else
{DS1302_IO=0;}
DS1302_SCLK=1; //置写移位脉冲有效
DS1302_SCLK=0;
j=(j>>1);
}
}
/***********************************************************
名称: read_1302_1byte
说明: 读取1byte数据子程序
功能: 该指令完成对1302的地址或数据1byte的读操作
调用:
输入值:1byte数据
返回值:ACC
************************************************************/
read_1302_1byte(void)
{
uint i;
uchar temp;
for(i=0;i<8;++i)
{
temp=temp>>1; //把前一次读取的数据右移一位,下次读取的数据保存到第7位
if(DS1302_IO==1) //读取1byte的数据保持到temp中
{temp|=0x80;}
else
{temp&=0x7f;}
DS1302_SCLK=1; //置读移位脉冲有效
DS1302_SCLK=0;
}
return(temp);
}
/************************************************************
名称:write_1302
说明:先写地址,再写数据
功能:完成对1302的写操作
调用:write_1302_1byte()
输入值:地址,数据
返回值:无
************************************************************/
void write_1302(unsigned addar,unsigned data_1burst)
{
DS1302_RST=0;
delay_us(1);
DS1302_SCLK=0;
DS1302_RST=1;
write_1302_1byte(addar); //向1302发送将要写入数据的地址
write_1302_1byte(data_1burst); //向1302发送将要写入的数据
DS1302_RST=0;
}
/************************************************************
名称:read_1302
说明:先写地址,再读取数据
功能:完成对1302的数据读取操作
调用:read_1302_1byte()
输入值:地址
返回值:data_1burst
*************************************************************/
read_1302(char addar)
{
DS1302_RST=0;
delay_us(1);
DS1302_SCLK=0;
DS1302_RST=1;
write_1302_1byte(addar|0x01); //向1302发送将要读取数据的地址
data_buffer1[0]=read_1302_1byte(); //把从1302读取到的数据保存到数据缓冲区
DS1302_RST=0;
}
/************************************************************
名称:DS1302_Write_Time
说明:把设定的时间初值写入相应的寄存器中
功能:完成对1302的初始时间设定,并打开写保护
调用:write_1302()
输入值:"2008.09.06","14:18:58"
返回值:无
************************************************************/
DS1302_Write_Time()
{
read_1302(0x8e); //读取控制寄存器的当前状态
if(data_buffer1[0]!=0x80) //判断控制寄存器是否写保护
{ //没有写保护,则开始写数据
write_1302(control_add,0x00);
write_1302(year_add,year_data);
write_1302(month_add,month_data);
write_1302(date_add,date_data);
write_1302(hour_add,hour_data);
write_1302(min_add,min_data);
write_1302(second_add,second_data);
write_1302(control_add,0x80); //禁止写数据到1302,即开启写保护
}
}
/*************************************************************
名称:DS1302_Read_Time
说明:从1302中读取当前各寄存器的数据
功能:读取当前的时间,并把数据保存以便显示
调用:read_1302
输入值:各寄存器地址
返回值:data_buffer[20]
**************************************************************/
void DS1302_Read_Time()
{
uint i;
month=0x88;
read_1302 (year_add); //依次读取当前的年
data_buffer1[1]=data_buffer1[0];
for(i=2;i<7;i++)
{
read_1302 (month); //依次读取当前的月,日,时,分,秒
data_buffer1[i]=data_buffer1[0];
month=(month-2);
}
}
/******************************************************
名称: Data_processing
说明: 把从1302读取到的数据个,十位分离,以便显示
功能: 读取到的16进制转换成10进制
调用:
输入值
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -