#include <reg52.h>
#include "Delay.h"
#include "19264ZK.h"
#include "19264.h"
#include "3231.h"
#include "SpendandMeleage.h"
//#define uchar unsigned char //宏定义无符号字符形数据类型进行声明定义 定义名称uchar 所占位数8位 范围0~255
//#define uint unsigned int //宏定义无符号整形数据类型进行声明定义 定义名称uint 所占位数16位 范围0~65535
/************************函数声明***********************************************/
void DelayM(uint);
//void ds_w(void);
uchar m,date,month,year,hour,minute,second;
void Conver_week(bit c,uchar year,uchar month,uchar day);
void displaytime(void)
{
year=read_random(DS3231_YEAR);//调用3231时钟数据中的年数据,从地址0x8d中
Disp_8x16(1,0,1,ZM_8x16[(year/10)]);
Disp_8x16(2,0,1,ZM_8x16[(year%10)]);
month=read_random(DS3231_MONTH);//调用3231时钟数据中的月数据,从地址0x05中
Disp_8x16(4,0,1,ZM_8x16[(month/10)]);
Disp_8x16(5,0,1,ZM_8x16[(month%10)]);
date=read_random(DS3231_DAY);//从3231芯片中读取日数据,从地址0x04中
Disp_8x16(7,0,1,ZM_8x16[(date/10)]);
Disp_8x16(8,0,1,ZM_8x16[(date%10)]);
hour =read_random(DS3231_HOUR); //从3231芯片中读取小时数据,从地址0x02中
Disp_8x16(1,1,0,ZM_8x16[(hour/10)]);
Disp_8x16(2,1,0,ZM_8x16[(hour%10)]); //小时个位
minute= read_random(DS3231_MINUTE); //从3231芯片中读取分钟数据,从地址0x01中
Disp_8x16(4,1,1,ZM_8x16[(minute/10)]); //分钟十位
Disp_8x16(5,1,1,ZM_8x16[(minute%10)]); //分钟个位
second =read_random(DS3231_SECOND); //从3231芯片中读取秒钟数据,从地址0x01中
Disp_8x16(7,1,1,ZM_8x16[(second/10)]); //秒钟十位
Disp_8x16(8,1,1,ZM_8x16[(second%10)]); //秒钟个位
}
/*主函数--------------------------------------------------------------------*/
void main()
{
Time0_Time1_init();//定时器0、计数器1初始化子程序
Init19264LCD(); //19264屏初始化LCD函数
while(1)
{
displayspeed();//速度显示
}
}
#ifndef __DS3231_h__
#define __DS3231_h__
#include <intrins.h> //加载头文件
sbit SCL=P1^7; //DS3231数据接口
sbit SDA=P1^6; //DS3231数据接口
#define DS3231_SECOND 0x00 //秒
#define DS3231_MINUTE 0x01 //分
#define DS3231_HOUR 0x02 //时
#define DS3231_WEEK 0x03 //星期
#define DS3231_DAY 0x04 //日
#define DS3231_MONTH 0x05 //月
#define DS3231_YEAR 0x06 //年
/********************************************************************************************************
** DS3231常数定义
********************************************************************************************************/
#define DS3231_WriteAddress 0xD0 //器件写地址
#define DS3231_ReadAddress 0xD1 //器件读地址
#define NACK 1
#define ACK 0
/********************************************************************************************************
********************************************************************************************************/
bit ack; //应答标志位
uchar BCD2HEX(uchar val)
{
return ((val>>4)*10)+(val&0x0f);
}
/*uchar HEX2BCD(uchar val)
{
return (((val%100)/10)<<4)|(val%10);
}
*/
void Delay5US() //@12.000MHz 延时5us
{
_nop_();
}
void Start_I2C()
{
SDA=1; //发送起始条件的数据信号
SCL=1;
Delay5US(); //起始条件建立时间大于4.7us,延时
SDA=0; //发送起始信号
Delay5US(); // 起始条件锁定时间大于4μs
SCL=0; //钳住I2C总线,准备发送或接收数据
}
void Stop_I2C()
{
SDA=0; //发送结束条件的数据信号
SCL=1; //结束条件建立时间大于4us
Delay5US();
SDA=1; //发送I2C总线结束信号
}
void SendByte(uchar c)
{
uchar BitCnt;
for(BitCnt=0;BitCnt<8;BitCnt++) //要传送的数据长度为8位
{
if((c<<BitCnt)&0x80)
SDA=1; //判断发送位
else
SDA=0;
SCL=1; //置时钟线为高,通知被控器开始接收数据位
Delay5US(); //保证时钟高电平周期大于4μs
SCL=0;
}
SDA=1; //8位发送完后释放数据线,准备接收应答位
SCL=1;
Delay5US();
if(SDA==1)
ack=0;
else
ack=1; //判断是否接收到应答信号
SCL=0;
Delay5US(); //延时
}
uchar RcvByte()
{
uchar retc;
uchar BitCnt;
retc=0;
SDA=1; //置数据线为输入方式
for(BitCnt=0;BitCnt<8;BitCnt++)
{
SCL=0; //置时钟线为低,准备接收数据位
Delay5US(); //时钟低电平周期大于4.7μs
SCL=1; //置时钟线为高使数据线上数据有效
Delay5US();
retc=retc<<1;
if(SDA==1)
retc=retc+1; //读数据位,接收的数据位放入retc中
Delay5US();
}
SCL=0;
return(retc);
}
void Ack_I2C(bit a)
{
SDA = a;
SCL=1;
Delay5US(); //时钟低电平周期大于4us
SCL=0; //清时钟线,钳住I2C总线以便继续接收
Delay5US();
}
uchar write_byte(uchar addr, uchar write_data)
{
Start_I2C();
SendByte(DS3231_WriteAddress);
if (ack == 0)
return 0;
SendByte(addr);
if (ack == 0)
return 0;
SendByte(write_data);
if (ack == 0)
return 0;
Stop_I2C();
Delay5US();
Delay5US();
return 1;
}
uchar read_current()
{
uchar read_data;
Start_I2C();
SendByte(DS3231_ReadAddress);
if(ack==0)
return(0);
read_data = RcvByte();
Ack_I2C(1);
Stop_I2C();
return read_data;
}
uchar read_random(uchar random_addr)
{
uchar Tmp;
Start_I2C();
SendByte(DS3231_WriteAddress);
if(ack==0)
return(0);
SendByte(random_addr);
if(ack==0)
return(0);
Tmp=read_current();
if(random_addr==DS3231_HOUR)
Tmp&=0x3f;
return(BCD2HEX(Tmp));//都转10进制输出
}
/*void ModifyTime(uchar address,uchar num)
{
uchar temp=0;
if(address>6 && address <0) return;
temp=HEX2BCD(num);
write_byte(address,temp);
}
*/
#endif |