马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
DS1302 接线图
Vcc2 CLK I/O /RST
| | | |
-------------------
| 8 7 6 5 |
| DS1302 |
| |
| 1 2 3 4 |
-------------------
| | | |
VCC1 GND
1 脚接+5V 2,3脚32768HZ晶振 4脚接地 5脚接S51的P02 6脚接S51的P01 7接S51的P00
8脚接后备电源,可以接老计算机主板上的3.6V电池,也可以通过二级管隔离接一个大容量电解电容
电压在2.5V以上即可维持
595连级输出数据,138行驱动 P1_0为时钟模式转换键、P2_1为时钟加键、P1_2为时钟减键、P2_3为时钟复位键。在对时钟调整时未对调整
项做闪烁处理*/
#include <AT89x51.H>
#define uchar unsigned char
#define uint unsigned int
uchar code timer[12][16]={ /*0~9字符*/
/*-- 文字: 0 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0xFF,0xFF,0xFF,0xE7,0xDB,0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,0xDB,0xE7,0xFF,0xFF,
/*-- 文字: 1 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0xFF,0xFF,0xFF,0xF7,0xF1,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0xC1,0xFF,0xFF,
/*-- 文字: 2 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0xFF,0xFF,0xFF,0xC3,0xBD,0xBD,0xBD,0xDF,0xDF,0xEF,0xF7,0xFB,0xBD,0x81,0xFF,0xFF,
/*-- 文字: 3 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0xFF,0xFF,0xFF,0xC3,0xBD,0xBD,0xDF,0xE7,0xDF,0xBF,0xBF,0xBD,0xDD,0xE3,0xFF,0xFF,
/*-- 文字: 4 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0xFF,0xFF,0xFF,0xDF,0xCF,0xD7,0xDB,0xDB,0xDD,0xDD,0x81,0xDF,0xDF,0x87,0xFF,0xFF,
/*-- 文字: 5 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0xFF,0xFF,0xFF,0x81,0xFD,0xFD,0xFD,0xE5,0xD9,0xBF,0xBF,0xBD,0xDD,0xE3,0xFF,0xFF,
/*-- 文字: 6 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0xFF,0xFF,0xFF,0xC7,0xDB,0xFD,0xFD,0xE5,0xD9,0xBD,0xBD,0xBD,0xDB,0xE7,0xFF,0xFF,
/*-- 文字: 7 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0xFF,0xFF,0xFF,0x81,0xDD,0xDD,0xEF,0xEF,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0xFF,0xFF,
/*-- 文字: 8 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0xFF,0xFF,0xFF,0xC3,0xBD,0xBD,0xBD,0xDB,0xE7,0xDB,0xBD,0xBD,0xBD,0xC3,0xFF,0xFF,
/*-- 文字: 9 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0xFF,0xFF,0xFF,0xE7,0xDB,0xBD,0xBD,0xBD,0x9B,0xA7,0xBF,0xBF,0xDB,0xE3,0xFF,0xFF,
/*-- 文字: : --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0xFF,0xFF,0xFF,0xFF,0xFF,0xE7,0xE7,0xFF,0xFF,0xFF,0xE7,0xE7,0xFF,0xFF,0xFF,0xFF,
/*黑屏字符*/
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
};
uchar code hanzi[4][128]={ /*汉字字模*/
/*-- 文字: 武 --*/
/*-- 宋体48; 此字体下对应的点阵为:宽x高=64x64 --*/
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xBF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0x3F,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xF0,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF0,0x3F,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0x08,0x3F,0xBF,0xFF,0xFF,0xFF,0xFF,0xF8,0x1C,0x3F,0x1F,0xFF,0xFF,0xFF,
0xFF,0xE0,0x7C,0x3E,0x0F,0xFF,0xFF,0xFF,0xFF,0xC0,0xFC,0x3C,0x00,0x00,0x01,0xFF,
0xFF,0x81,0xFC,0x38,0x00,0x00,0x03,0xFF,0xFF,0x03,0xFC,0x3F,0xFF,0xFF,0xE7,0xFF,
0xFF,0x07,0xFC,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0x07,0xFC,0x3F,0xFF,0xFF,0xFF,0xFF,
0xFF,0x87,0xFC,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0x8F,0xFC,0x3F,0xFF,0xFF,0xFF,0xFF,
0xFE,0xDF,0xFC,0x3F,0xFF,0xFF,0xFF,0xFF,0xFC,0x7F,0xFC,0x3F,0xFF,0xFF,0xFF,0xFF,
0xF8,0x3F,0xFC,0x3F,0xFF,0xFF,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x07,
0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xFF,0x1F,
0xFF,0xFF,0xFC,0x3F,0xFF,0xDF,0xFF,0xFF,0xFF,0xFF,0xFC,0x3F,0xFF,0x1F,0xFF,0xFF,
0xFF,0xFF,0xFC,0x3F,0xFC,0x1F,0xFF,0xFF,0xFF,0xFF,0xFC,0x3F,0xF8,0x1F,0xFF,0xFF,
0xFF,0xFF,0xF8,0x3F,0xFC,0x1F,0xFF,0xFF,0xFF,0xFF,0xF8,0x3F,0xFE,0x1F,0xFF,0xFF,
0xFF,0xFF,0xF8,0x3F,0xFE,0x1F,0xFF,0xFF,0xFF,0xFF,0xF8,0x7F,0xFE,0x1F,0xFF,0xFF,
0xFF,0xFF,0xF8,0x7F,0xFE,0x1F,0xF9,0xFF,0xFF,0xFF,0xF8,0x7F,0xFE,0x1F,0xE1,0xFF,
0xFF,0xFF,0xF8,0x7F,0xFE,0x1F,0x81,0xFF,0xFF,0xFF,0xF8,0x79,0xFE,0x1F,0x81,0xFF,
0xFF,0xFF,0xF8,0x70,0xFE,0x1F,0xC1,0xFF,0xFF,0xFF,0xF0,0x60,0x7E,0x1F,0xE1,0xFF,
0xFF,0xFF,0xF0,0xC0,0x00,0x1F,0xE1,0xFF,0xFF,0xFF,0xF0,0xC0,0x00,0x1F,0xE1,0xFF,
0xFF,0xFF,0xF0,0xFF,0xFE,0x1F,0xE1,0xFF,0xFF,0xFF,0xE0,0xFF,0xFE,0x1F,0xE1,0xFF,
0xFF,0xFF,0xE0,0xFF,0xFE,0x1F,0xE1,0xFF,0xFF,0xFF,0xE1,0xFF,0xFE,0x1F,0xE1,0xFF,
0xF7,0xFF,0xE1,0xFF,0xFE,0x1F,0xE1,0xFF,0xE3,0xFF,0xC1,0xFF,0xFE,0x1F,0xE1,0xFF,
0xF3,0xFF,0xC1,0xFF,0xFE,0x1F,0xE1,0xFF,0xF3,0xFF,0x83,0xFF,0xFE,0x1F,0xE1,0xFF,
0xF3,0xFF,0x83,0xFF,0xFE,0x1F,0xE1,0xFF,0xF1,0xFF,0x07,0xFF,0xFE,0x1F,0xE1,0xFF,
0xF1,0xFF,0x07,0xFF,0xFE,0x1F,0xE1,0xFF,0xF1,0xFE,0x0F,0x03,0xFE,0x1F,0xE1,0xFF,
0xF1,0xFC,0x0F,0xC0,0x3E,0x1F,0xE1,0xFF,0xF1,0xF8,0x1F,0xF8,0x00,0x1F,0xE1,0xFF,
0xF0,0xF0,0x1F,0xFF,0x80,0x1F,0xE1,0xFF,0xF0,0xE0,0x3F,0xFF,0xF0,0x00,0xE1,0xFF,
0xF0,0x00,0x7F,0xFF,0xFF,0x00,0x01,0xFF,0xF0,0x00,0xFF,0xFF,0xFF,0xE0,0x00,0x1F,
0xF0,0x01,0xFF,0xFF,0xFF,0xFC,0x00,0x03,0xF0,0x03,0xFF,0xFF,0xFF,0xFF,0xC0,0x07,
0xF0,0x07,0xFF,0xFF,0xFF,0xFF,0xF8,0x0F,0xF0,0x1F,0xFF,0xFF,0xFF,0xFF,0xFE,0x1F,
0xE0,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,0xF1,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
};
uchar code sw[16]={0x60,0x62,0x64,0x66,0x68,0x6a,0x6c,0x6e,
0x70,0x72,0x74,0x76,0x78,0x7a,0x7c,0x7e}; /*16行段码*/
void xs_out(); /*输出显示*/
void out_rxd(unsigned char *d); /*串口发送一行*/
/******************************************/
sbit resget=P1^3; //时钟复位
sbit key_moda=P1^0; //模式转换
sbit key_up=P1^1; //时钟加
sbit key_Down=P1^2; //时钟减
sbit T_CLK=P1^7; //DS1302引脚连接
sbit T_IO =P1^6;
sbit T_RST=P1^5;
sbit ACC0=ACC^0; //1bit数据存储位
sbit ACC7=ACC^7;
uchar inittime[7]={0x00,0x10,0x22,0x13,0x01,0x05,0x06}; //初始化后设置为:06年1月12日星期4 21点0分0秒
uchar i,e,yid,zimuo,id,miao,fen,shi,nian,yue,ri,xinqi; //时间变量
void RTInputByte(uchar); /* 输入 1Byte */
uchar RTOutputByte(void); /* 输出 1Byte */
void W1302(uchar, uchar); // 向DS1302写入一个字节
uchar R1302(uchar); // 从DS1302读出一个字节
void Set1302(uchar *); // 写DS1302时间
void du1302(); // 读时间
void DelayMs(void); // 延时
void id_case1_key(); // 加减选取
void Set(uchar,uchar ); // 变量调整
/*主函数*/
void main()
{
yid=0;
zimuo=0;
SCON=0; //初始化串口为工作方式0(同步通信方式,TxD输出同步脉冲)
while(1) //重复循环显示
{
if(resget==0)
{DelayMs();
if(resget==0)
Set1302(inittime); //初始化
W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
W1302(0x90,0xa5); //打开充电二级管 一个二级管串联一个2K电阻
}
if (key_moda==0) // 设置和选择项目键
{DelayMs();
if(key_moda==0)
{
id++;if(id==8) id=0;
while(key_moda==0){ xs_out();}
}
}
id_case1_key();
du1302(); //读取 秒 分 时 日 月 星期 年
xs_out(); /******调用显示****/
}
}
/************************************************/
void xs_out() //串行输出显示
{
unsigned char x,h;
P2=0x7f;
for(h=0;h<16;h++)
{
for(x=0;x<4;x++)
{ out_rxd(&hanzi[x][7+h*8]);
out_rxd(&hanzi[x][6+h*8]);
out_rxd(&hanzi[x][5+h*8]);
out_rxd(&hanzi[x][4+h*8]);
out_rxd(&hanzi[x][3+h*8]);
out_rxd(&hanzi[x][2+h*8]);
out_rxd(&hanzi[x][1+h*8]);
out_rxd(&hanzi[x][0+h*8]);
}
/*****************************************************************/
P2_7=1; //锁存为高,595锁存信号
P2=sw[h]; //输出行信号
DelayMs(); //延时,等待一段时间,让这列显示的内容在人眼内产生“视觉暂留”现象/
}
}
/*******************************************************/
void out_rxd(unsigned char *d) /*从串口发送数据*/
{
SBUF=*d;
while(TI==0); //等待发送完毕
TI=0;
}
/********************************ds1302时间调整*****************/
void id_case1_key()
{
if (key_up==0) //增加
{
DelayMs();
if(key_up==0)
{
while(key_up==0)
{xs_out();}
Set(id,0);
}
}
if (key_Down==0) //减少
{
DelayMs();
if(key_Down==0)
{
while(key_Down==0)
{xs_out();}
Set(id,1);
}
}
}
//根据选择调整相应项目
void Set(uchar sel,uchar sel_1)
{
uchar address,item;
uchar max,mini;
if(sel==0) {address=0x80; max=0;mini=0;} //秒
if(sel==1) {address=0x82; max=59;mini=0;} //分钟
if(sel==2) {address=0x84; max=23;mini=0;} //小时
if(sel==3) {address=0x8a; max=7; mini=1;} //星期
if(sel==4) {address=0x86; max=31;mini=1;} //日
if(sel==5) {address=0x88; max=12;mini=1;} //月
if(sel==6) {address=0x8c; max=99;mini=0;} //年
item=R1302(address+1)/16*10+R1302(address+1)%16;
if (sel_1==0) item++; else item--;
if(item>max) item=mini;
if(item<mini) item=max;
W1302(0x8e,0x00);
W1302(address,item/10*16+item%10);
W1302(0x8e,0x80);
}
/**************************延时***********************/
void DelayMs(void)
{
uchar TempCyc;
for(TempCyc=150;TempCyc>1;TempCyc--)
{;}
}
//********DS1302读写程序***************//
/********************************************************************
函 数 名:RTInputByte()
功 能:实时时钟写入一字节
说 明:往DS1302写入1Byte数据 (内部函数)
入口参数:d 写入的数据
返 回 值:无
***********************************************************************/
void RTInputByte(uchar d)
{
uchar h;
ACC = d;
for(h=8; h>0; h--)
{
T_IO = ACC0; /*相当于汇编中的 RRC */
T_CLK = 1;
T_CLK = 0;
ACC = ACC >> 1;
}
}
/********************************************************************
函 数 名:RTOutputByte()
功 能:实时时钟读取一字节
说 明:从DS1302读取1Byte数据 (内部函数)
入口参数:无
返 回 值:ACC
设 计:zhaojunjie 日 期:2002-03-19
修 改: 日 期:
***********************************************************************/
uchar RTOutputByte(void)
{
uchar h;
for(h=8; h>0; h--)
{
ACC = ACC >>1; /*相当于汇编中的 RRC */
ACC7 = T_IO;
T_CLK = 1;
T_CLK = 0;
}
return(ACC);
}
/********************************************************************
函 数 名:W1302()
功 能:往DS1302写入数据
说 明:先写地址,后写命令/数据 (内部函数)
调 用:RTInputByte() , RTOutputByte()
入口参数:ucAddr: DS1302地址, ucData: 要写的数据
返 回 值:无
***********************************************************************/
void W1302(uchar ucAddr, uchar ucDa)
{
T_RST = 0;
T_CLK = 0;
T_RST = 1;
RTInputByte(ucAddr); /* 地址,命令 */
RTInputByte(ucDa); /* 写1Byte数据*/
T_CLK = 1;
T_RST = 0;
}
/********************************************************************
函 数 名:R1302()
功 能:读取DS1302某地址的数据
说 明:先写地址,后读命令/数据 (内部函数)
调 用:RTInputByte() , RTOutputByte()
入口参数:ucAddr: DS1302地址
返 回 值:ucData :读取的数据
***********************************************************************/
uchar R1302(uchar ucAddr)
{
uchar ucData;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
RTInputByte(ucAddr); /* 地址,命令 */
ucData = RTOutputByte(); /* 读1Byte数据 */
T_CLK = 1;
T_RST = 0;
return(ucData);
}
/********************************************************************
函 数 名:Set1302()
功 能:设置初始时间
说 明:先写地址,后读命令/数据(寄存器多字节方式)
调 用:W1302()
入口参数:pClock: 设置时钟数据地址 格式为: 秒 分 时 日 月 星期 年
7Byte (BCD码)1B 1B 1B 1B 1B 1B 1B
返 回 值:无
***********************************************************************/
void Set1302(uchar *pClock)
{
uchar h;
uchar ucAddr = 0x80;
W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
for(h =7; h>0; h--)
{
W1302(ucAddr,*pClock); /* 秒 分 时 日 月 星期 年 */
pClock++;
ucAddr +=2;
}
W1302(0x8e,0x80); /* 控制命令,WP=1,写保护?*/
}
/******************读取DS1302中的时间****************/
void du1302()
{
miao=R1302(0x81); //对取 秒 分 时 日 月 星期 年
fen=R1302(0x83);
shi=R1302(0x85);
ri=R1302(0x87);
yue=R1302(0x89);
xinqi=R1302(0x8b);
nian=R1302(0x8d);
} |