原创 WJ-V2.0实验板实验例程十:基于DS1302的电子时钟

2009-12-13 22:44 1436 2 2 分类: MCU/ 嵌入式

/*********** (C) COPYRIGHT 2009 http://www.wang1jin.com ************
* 文件名称: main.c
* 程序作者: wish_btn(QQ:1323266146 ,Email:wish_btn@qq.com)
* 程序版本: V1.0
* 编制日期: 12-13-2009
* 功能描述: DS1302时钟芯片测试
* 编译器:Keil C uVision4
* 芯片:STC89C52,11.0592M晶振
* 技术支持:http://www.wang1jin.com
*
* 提供原创51单片机、PROTEL99SE视频教程下载,欢迎大家前往论坛下载。
* 论坛地址: http://www.wang1jin.com/bbs/
******************** http://www.wang1jin.com **********************/


#include <REG52.H>


unsigned char code Inittime[7]={0x00,0x00,0x00,0x01,0x01,0x02,0x08}; //初始化后设置为:08年01月01日星期2 00点0分0秒
unsigned char LEDDATA[]={
0xC0,/*0*/
0xF9,/*1*/
0xA4,/*2*/
0xB0,/*3*/
0x99,/*4*/
0x92,/*5*/
0x82,/*6*/
0xF8,/*7*/
0x80,/*8*/
0x90,/*9*/
0x88,/*A*/
0x83,/*b*/
0xC6,/*C*/
0xA1,/*d*/
0x86,/*E*/
0x8E,/*F*/
};


/***************** DS1302引脚定义 ********************/
sbit DS1302_CLK=P3^4;
sbit DS1302_IO =P3^3;
sbit DS1302_RST=P3^5;
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;


void DisplayOneCharOnAddr(unsigned char Data,unsigned char Addr); //在指定的位置上显示一个数字
void DS1302_WriteOneChar(unsigned char d); //向DS1302中写入一个数据
unsigned char DS1302_ReadOneChar(void); //从DS1302读出一个数据
void DS1302_WriteOneCharOnAddr(unsigned char ucAddr, unsigned char ucDa); //在指定地址写入一个数据
unsigned char DS1302_ReadOneCharOnAddr(unsigned char ucAddr); //从指定一个位置读取一个数据
void DS1302_SetInit(unsigned char *pClock); //初始化时间
void Delay(unsigned int uiCount);


/******************* http://www.wang1jin.com **********************
* 函数名称: main
* 功能描述: main函数,程序入口
* 输入参数: 无
* 返回参数: 无
**********************************************************************/
void main(void)
{
DS1302_SetInit(Inittime);
while(1)
{
DisplayOneCharOnAddr(DS1302_ReadOneCharOnAddr(0x81)%16,4); //秒
DisplayOneCharOnAddr(DS1302_ReadOneCharOnAddr(0x81)/16,3);
DisplayOneCharOnAddr(DS1302_ReadOneCharOnAddr(0x83)%16,2); //分
DisplayOneCharOnAddr(DS1302_ReadOneCharOnAddr(0x83)/16,1);
}
}


/******************* http://www.wang1jin.com **********************
* 函数名称: DS1302_WriteOneChar
* 功能描述: 往DS1302写入1Byte数据
* 输入参数: d
* 返回参数: 无
**********************************************************************/
void DS1302_WriteOneChar(unsigned char d)
{
unsigned char i;
ACC = d;
DS1302_RST = 1;
for(i=8; i>0; i--)
{
DS1302_IO = ACC0; /*相当于汇编中的 RRC */
DS1302_CLK = 0;
DS1302_CLK = 1; //先写入最低位,上升沿写入
ACC = ACC >> 1;
}
}


/******************* http://www.wang1jin.com **********************
* 函数名称: DS1302_ReadOneChar
* 功能描述: 从DS1302读取1Byte数据
* 输入参数: 无
* 返回参数: ACC
**********************************************************************/
unsigned char DS1302_ReadOneChar(void)
{
unsigned char i;
DS1302_RST = 1;
for(i=8; i>0; i--)
{
ACC = ACC >>1; //相当于汇编中的 RRC
DS1302_IO = 1;
DS1302_CLK = 1;
DS1302_CLK = 0; //下降沿读取,先读最低位
ACC7 = DS1302_IO;
}
return(ACC);
}


/******************* http://www.wang1jin.com **********************
* 函数名称: DS1302_WriteOneCharOnAddr
* 功能描述: 往DS1302写入数据
* 输入参数: ucAddr , ucDa
* 返回参数: 无
**********************************************************************/
void DS1302_WriteOneCharOnAddr(unsigned char ucAddr, unsigned char ucDa)
{
DS1302_RST = 0;
DS1302_CLK = 0;
DS1302_RST = 1;
DS1302_WriteOneChar(ucAddr); /* 地址,命令 */
DS1302_WriteOneChar(ucDa); /* 写1Byte数据*/
DS1302_CLK = 1;
DS1302_RST = 0;
DS1302_IO = 0;
}


/******************* http://www.wang1jin.com **********************
* 函数名称: DS1302_ReadOneCharOnAddr
* 功能描述: 读取DS1302某地址的数据
* 输入参数: ucAddr
* 返回参数: ucData
**********************************************************************/
unsigned char DS1302_ReadOneCharOnAddr(unsigned char ucAddr)
{
unsigned char ucData;
DS1302_RST = 0;
DS1302_CLK = 0;
DS1302_RST = 1;
DS1302_WriteOneChar(ucAddr); /* 地址,命令 */
ucData = DS1302_ReadOneChar(); /* 读1Byte数据 */
DS1302_CLK = 1;
DS1302_RST = 0;
return(ucData);
}


/******************* http://www.wang1jin.com **********************
* 函数名称: DS1302_SetInit
* 功能描述: 设置初始时间
* 输入参数: *pClock
* 返回参数: 无
**********************************************************************/
void DS1302_SetInit(unsigned char *pClock)
{
unsigned char i;
unsigned char ucAddr = 0x80;
DS1302_WriteOneCharOnAddr(0x8e,0x00); /* 控制命令,WP=0,写操作*/
for(i =7; i>0; i--)
{
DS1302_WriteOneCharOnAddr(ucAddr,*pClock); /* 秒 分 时 日 月 星期 年 */
pClock++;
ucAddr +=2;
}
DS1302_WriteOneCharOnAddr(0x8e,0x80); /* 控制命令,WP=1,写保护*/
}



/******************* http://www.wang1jin.com **********************
* 函数名称: Delay
* 功能描述: 延时函数
* 输入参数: uiCount
* 返回参数: 无
**********************************************************************/
void Delay(unsigned int uiCount)
{
while(uiCount--);
}


/******************* http://www.wang1jin.com **********************
* 函数名称: DisplayOneCharOnAddr
* 功能描述: 在指定的位置上显示一个数字
* 输入参数: Data:指定显示的数据;Addr:指定的位置
* 返回参数: 无
**********************************************************************/
void DisplayOneCharOnAddr(unsigned char Data,unsigned char Addr)
{
switch (Addr)
{
case 1:
P1 = 0xFE;break;
case 2:
P1 = 0xFD;break;
case 3:
P1 = 0xFB;break;
case 4:
P1 = 0xF7;break;
default:
break;
}
P0 = LEDDATA[Data];
Delay(100);
}

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
2
关闭 站长推荐上一条 /3 下一条