|
FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 06 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 07 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 08 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 09 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 10 FF 00 FF 00 FF 00 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 01 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 02 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 03 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 04 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 06 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 07 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 08 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 09 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 10 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 12 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 13 FF 00 FF 00 FF 00
/**************************************
--- STC MCU Limited -------------------
--- 宏晶科技 设计 2010-6-2 -----
--- Mobile: 13922805190 ---------------
--- Fax: 0755-82944243 ----------------
--- Tel: 0755-82948412 ----------------
--- Web: www.STCMCU.com ---------------
--- 演示STC 12TMCU控制DS1302 ----------
--- 工作频率: 12MHz -------------------
如果要在程序中使用或在文章中引用该程序
请在其中注明使用了宏晶科技的资料及程序
**************************************/
#include "REG51.H"
#include "INTRINS.H"
#include <stdio.h>
typedef unsigned char BYTE;
sbit SCLK = P2^5; //DS1302时钟口P1.0
sbit IO = P1^0; //DS1302数据口P1.1
sbit RST = P2^7; //DS1302片选口P1.2
#define FOSC 11059200L
#define BAUD 9600
void Delay(unsigned char n)
{
unsigned int x;
while (n--)
{
x = 5000;
while (x--);
}
}
void InitUart()
{
SCON = 0x5a; //8 bit data ,no parity bit
TMOD = 0x20; //T1 as 8-bit auto reload
TH1 = TL1 = -(FOSC/12/32/BAUD); //Set Uart baudrate
TR1 = 1; //T1 start running
}
void SendData(unsigned char dat)
{
while (!TI); //Wait for the previous data is sent
TI = 0; //Clear TI flag
SBUF = dat; //Send current data
}
unsigned char convert(unsigned char Value)
{
Value=(Value/16)*10+(Value%16); //把8421BCD码转为十进制
return Value;
}
//秒 分 时 日 月 星期 年
BYTE code init[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
BYTE data now[7];
void DS1302_Initial();
void DS1302_SetTime(BYTE *p);
void DS1302_GetTime(BYTE *p);
void main()
{
BYTE i;
DS1302_Initial(); //初始化DS1302
DS1302_SetTime(init); //设置初始时间
InitUart();
while (1)
{
DS1302_GetTime(now); //读取当前时间
// SendData(convert(now[0]));
for(i=0;i<7;i++)
{
SendData(now);
}
Delay(70);
// printf("\n");
}
}
/**************************************
从DS1302读1字节数据
**************************************/
BYTE DS1302_ReadByte()
{
BYTE i;
BYTE dat = 0;
for (i=0; i<8; i++) //8位计数器
{
SCLK = 0; //时钟线拉低
_nop_(); //延时等待
_nop_();
dat >>= 1; //数据右移一位
if (IO) dat |= 0x80; //读取数据
SCLK = 1; //时钟线拉高
_nop_(); //?óê±μè′y
_nop_();
}
return dat;
}
/**************************************
向DS1302写1字节数据
**************************************/
void DS1302_WriteByte(BYTE dat)
{
char i;
for (i=0; i<8; i++) //8位计数器
{
SCLK = 0; //时钟线拉低
_nop_(); //延时等待
_nop_();
dat >>= 1; //移出数据
IO = CY; //送出到端口
SCLK = 1; //时钟线拉高
_nop_(); //延时等待
_nop_();
}
}
/**************************************
读DS1302某地址的的数据
**************************************/
BYTE DS1302_ReadData(BYTE addr)
{
BYTE dat;
RST = 0;
_nop_(); //延时等待
_nop_();
SCLK = 0;
_nop_(); //延时等待
_nop_();
RST = 1;
_nop_(); //延时等待
_nop_();
DS1302_WriteByte(addr); //写地址
dat = DS1302_ReadByte(); //读数据
SCLK = 1;
RST = 0;
return dat;
}
/**************************************
往DS1302的某个地址写入数据
**************************************/
void DS1302_WriteData(BYTE addr, BYTE dat)
{
RST = 0;
_nop_(); //延时等待
_nop_();
SCLK = 0;
_nop_(); //延时等待
_nop_();
RST = 1;
_nop_(); //延时等待
_nop_();
DS1302_WriteByte(addr); //写地址
DS1302_WriteByte(dat); //写数据
SCLK = 1;
RST = 0;
}
/**************************************
写入初始时间
**************************************/
void DS1302_SetTime(BYTE *p)
{
BYTE addr = 0x80;
BYTE n = 7;
DS1302_WriteData(0x8e, 0x00); //允许写操作
while (n--)
{
DS1302_WriteData(addr, *p++);
addr += 2;
}
DS1302_WriteData(0x8e, 0x80); //写保护
}
/**************************************
读取当前时间
**************************************/
void DS1302_GetTime(BYTE *p)
{
BYTE addr = 0x81;
BYTE n = 7;
while (n--)
{
*p++ = DS1302_ReadData(addr);
addr += 2;
}
}
/**************************************
初始化DS1302
**************************************/
void DS1302_Initial()
{
RST = 0;
SCLK = 0;
DS1302_WriteData(0x8e, 0x00); //允许写操作
DS1302_WriteData(0x80, 0x00); //时钟启动
DS1302_WriteData(0x90, 0xa6); //一个二极管+4K电阻充电
DS1302_WriteData(0x8e, 0x80); //写保护
} |
|