O91OS5RB`0LX@T)E8B01N_H.png (72.39 KB, 下載次數: 50)
下載附件
2022-4-17 19:02 上傳
#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 |