|
各位大神,誰有調(diào)試成功的M41T81程序 ,我的怎么讀不出來值呢?沒有返回值,M41T81初始化程序死機(jī)
程序如下:(其它程序略)
/////////////////////////////////////M41T81初始化程序//////////////////////////////////////////////////////
//---------- RTC M41T81S-------------
Rtc_Write_Nbyte(0xD0, 0x00, time_wr_buf,8 ); // 寫入時(shí)間日期
Rtc_Write_1byte(0xD0, 0x01, 0x00); //
Rtc_Write_1byte(0xD0, 0x0c, 0x00); // 清除HT位,當(dāng)?shù)綦姲l(fā)生時(shí),允許更新當(dāng)前時(shí)鐘
//-------------------//讀取M41T81時(shí)間-----------
Rtc_Read_Nbyte(0xD1,0x00); //讀取M41T81時(shí)間
/////////////////////////////////////////////////////////////////////////////////////////
/*-----------------------------------
MCU:STC12LE5A60S2 @22.1184M晶振【原程序】【改成STC12C5608AD,11.0592晶振,延時(shí)也縮小一半,其它未變動(dòng)】
RTC:M41T81S
外部中斷0(P3.2)啟動(dòng)按鍵腳
----------------------------------------*/
/*
#include "STC12C5410AD.H " //
#include "INTRINS.H "
//#include "stc12c5a60s2.h"
#include<intrins.h>
*/
#ifndef _M41T81RTC_H
#define _M41T81RTC_H
sbit RTC_SDA = P1^7; //時(shí)鐘芯片 SDA控制
sbit RTC_SCL = P1^6; //時(shí)鐘芯片 SCL控制
/*=====年月日周時(shí)分秒 0.1秒=====
time_wr_buf[7]=year,time_wr_buf[6]=month,time_wr_buf[5]=day,time_wr_buf[4]=week,
time_wr_buf[3]=hour,time_wr_buf[2]=minute,time_wr_buf[1]=second,time_wr_buf[0]=tenth
*/
unsigned char time_wr_buf[8] = { 20,00,10,20,2,21,9,21 }; // 時(shí)鐘初始值2021年9月21日,星期二,20點(diǎn)10分00秒20分秒
unsigned char time_rd_buf[8] = { 0x00,0x00,0x00,0x00,0x00,0x00,0X00,0x00}; //
unsigned char F_Flag=0; //數(shù)據(jù)應(yīng)答標(biāo)志
// #define BUF_LENTH 128 //定義串口接收緩沖長(zhǎng)度
// unsigned char uart0_wr; //寫指針
// unsigned char uart0_rd; //讀指針
// unsigned char xdata RX0_Buffer[BUF_LENTH]; //接收緩沖
// bit B_TI;
/*=====函數(shù)定義=====*/
//void Uart0_init(void); //串口初始化
void DelayNus(unsigned int delay1us); //us級(jí)延時(shí)
void Delay1ms(unsigned int mDelay1); //ms級(jí)延時(shí)
//void SendByte(unsigned char dat); //串口發(fā)送單個(gè)數(shù)據(jù)
//====時(shí)鐘芯片相關(guān)操作函數(shù)=============
void Start(void);
void Stop(void);
void Ack(void);
void Nack(void);
void Check_Ack(void);
void Write_Bit0(void);
void Write_Bit1(void);
void Write_Byte(unsigned char Data);
unsigned char Read_Byte(void);
unsigned int HEX2BCD(unsigned int hex_data);
unsigned char BCD2HEX(unsigned char bcd_data);
void Rtc_Read_Nbyte(unsigned char Slave,unsigned char Address);
//void Rtc_Read_Nbyte(unsigned char Slave,unsigned char Address,unsigned char *Array,unsigned char n);
void Rtc_Write_1byte(unsigned char Slave,unsigned char Address,unsigned char Data);
void Rtc_Write_Nbyte(unsigned char Slave,unsigned char Address,unsigned char *Array,unsigned char Number);
//============================================================================
//================== 延時(shí)函數(shù) us級(jí)別延時(shí)函數(shù),不準(zhǔn)==============================
/*
22.1184MHz晶振下實(shí)測(cè):
DelayNus(1)時(shí):2.4us DelayNus(2)時(shí):3.2us DelayNus(3)時(shí):3.8us DelayNus(4)時(shí):4.5us
DelayNus(5)時(shí):5.3us DelayNus(6)時(shí):6.0us DelayNus(7)時(shí):6.7us DelayNus(8)時(shí):7.4us */
//----------------------------
void DelayNus(unsigned int delay1us)
{
while(delay1us--);
}
//============================================================================
//============================================================================
void Delay1ms(unsigned int mDelay1) //1ms延時(shí),22.1184M晶振
{
unsigned int mDelay2;
for(;mDelay1>0;mDelay1--)
{
for(mDelay2=0;mDelay2<2000;mDelay2++) {;;}
}
}
//============================================================================
//============================================================================
/************************************************************
* 函數(shù)名稱:void Start(void)
* 功 能:IIC總線開始信號(hào)
* 入口參數(shù):無
* 出口參數(shù):無
************************************************************/
void Start(void)
{
RTC_SDA=1; /*發(fā)送起始條件的數(shù)據(jù)信號(hào)*/
DelayNus(1);
RTC_SCL=1;
DelayNus(5); /*起始條件建立時(shí)間大于4.7us,延時(shí)*/
RTC_SDA=0; /*發(fā)送起始信號(hào)*/
DelayNus(5); /* 起始條件鎖定時(shí)間大于4μs*/
RTC_SCL=0; /*鉗住I2C總線,準(zhǔn)備發(fā)送或接收數(shù)據(jù) */
DelayNus(1);
}
//=====================================================================================
/************************************************************
* 函數(shù)名稱:void Stop(void)
* 功 能:IIC總線停止信號(hào)
* 入口參數(shù):無
* 出口參數(shù):無
************************************************************/
void Stop(void)
{
RTC_SDA=0; /*發(fā)送結(jié)束條件的數(shù)據(jù)信號(hào)*/
DelayNus(1);
RTC_SCL=1;
DelayNus(5);
RTC_SDA=1; /*發(fā)送I2C總線結(jié)束信號(hào)*/
DelayNus(1);
}
//=======================================================================================
/************************************************************
* 函數(shù)名稱:void Ack(void)
* 功 能:主器件為接收方,從器件為發(fā)送方時(shí),從器件等待主器件的應(yīng)答信號(hào)(單片機(jī)發(fā)送應(yīng)答信號(hào))
* 入口參數(shù):無
* 出口參數(shù):無
************************************************************/
void Ack(void)
{
RTC_SDA=0; //數(shù)據(jù)線保持低,時(shí)鐘線發(fā)生一次從高低的跳變,發(fā)送一個(gè)應(yīng)答信號(hào)
DelayNus(3);
RTC_SCL=1;
DelayNus(5); //>4us
RTC_SCL=0;
DelayNus(3);
}
//============================================================================================
/************************************************************
* 函數(shù)名稱:void Nack(void)
* 功 能:主器件為接收方,從器件為發(fā)送方時(shí),非應(yīng)答信號(hào)(單片機(jī)發(fā)送非應(yīng)答信號(hào))
* 入口參數(shù):無
* 出口參數(shù):無
************************************************************/
void Nack(void)
{
RTC_SDA=1; //數(shù)據(jù)線保持低,時(shí)鐘線發(fā)生一次從高低的跳變,沒有應(yīng)答
DelayNus(3);
RTC_SCL=1;
DelayNus(5); //>4us
RTC_SCL=0;
DelayNus(2);
}
//==========================================================================================
/************************************************************
* 函數(shù)名稱:void Check_Ack(void)
* 功 能:IIC器件應(yīng)答信號(hào)檢查
* 入口參數(shù):無
* 出口參數(shù):無 111111
************************************************************/
void Check_Ack(void)
{
F_Flag=0;
RTC_SDA=0;
RTC_SCL=1;
DelayNus(3);
if(RTC_SDA==0)
{
RTC_SCL=0;
DelayNus(3);
}
else
{
F_Flag=1;
RTC_SCL=0;
DelayNus(3);
}
RTC_SDA=1;
}
//============================================================================================
/************************************************************
* 函數(shù)名稱:void Write_Bit0(void)
* 功 能:向IIC總線寫0
* 入口參數(shù):無
* 出口參數(shù):無
************************************************************/
void Write_Bit0(void)
{
RTC_SDA=0;
DelayNus(1);
RTC_SCL=1;
DelayNus(5);
RTC_SCL=0;
DelayNus(2);
}
//============================================================================================
/************************************************************
* 函數(shù)名稱:void Write_Bit1(void)
* 功 能:向IIC總線寫1
* 入口參數(shù):無
* 出口參數(shù):無
************************************************************/
void Write_Bit1(void)
{
RTC_SDA=1;
DelayNus(1);
RTC_SCL=1;
DelayNus(5);
RTC_SCL=0;
DelayNus(2);
}
//==============================================================================================
/************************************************************
* 函數(shù)名稱:void Write_Byte(unsigned char Data)
* 功 能:IIC寫一個(gè)字節(jié)子程序
* 入口參數(shù):uchar Data
* 出口參數(shù):無
************************************************************/
void Write_Byte(unsigned char Data)
{
unsigned char i;
for(i=0;i<8;i++)
{
if((Data&0x80)>0) Write_Bit1();
else Write_Bit0();
Data=Data<<1;
}
}
//==============================================================================================
/************************************************************
* 函數(shù)名稱:uchar Read_Byte(void)
* 功 能:從IIC總線讀一字節(jié)數(shù)據(jù)
* 入口參數(shù):無
* 出口參數(shù):無 111111
************************************************************/
unsigned char Read_Byte(void)
{
unsigned char nn=0xff;
unsigned char j;
RTC_SDA = 1; /*置數(shù)據(jù)線為輸入方式*/
for(j=0;j<8;j++)
{
RTC_SCL = 0;
DelayNus(10);
if(RTC_SDA==0)
{
nn<<=1;
nn=(nn&0xfe);
RTC_SCL=0;
DelayNus(5);
}
else
{
nn<<=1;
nn=(nn|0x01);
RTC_SCL=0;
DelayNus(5);
}
}
RTC_SCL=0;
DelayNus(1);
return(nn);
}
//===============================================================================================
/************************************************************
* 函數(shù)名稱:uint HEX2BCD(unsigned int hex_data)
* 功 能:HEX轉(zhuǎn)為BCD子程序
* 入口參數(shù):uint hex_data
* 出口參數(shù):bcd_data
************************************************************/
unsigned int HEX2BCD(unsigned int hex_data)
{
unsigned int bcd_data,temp;
temp = hex_data%100;
bcd_data = ((unsigned int)hex_data)/100<<8;
bcd_data = bcd_data|temp/10<<4;
bcd_data = bcd_data|temp%10;
return(bcd_data);
}
//=================================================================================================
/************************************************************
* 函數(shù)名稱:uchar BCD2HEX(unsigned char bcd_data)
* 功 能:BCD轉(zhuǎn)為HEX子程序
* 入口參數(shù):uchar bcd_data
* 出口參數(shù):uchar hex_data
************************************************************/
unsigned char BCD2HEX(unsigned char bcd_data)
{
unsigned char hex_data;
hex_data = ((bcd_data>>4)*10+(bcd_data & 0x0f));
return(hex_data);
}
//=================================================================================================
/************************************************************
* 函數(shù)名稱:void Rtc_Read_Nbyte(unsigned char Slave,unsigned char Address,unsigned char *Array,unsigned char n)
* 功 能:RTC讀N個(gè)字節(jié)子程序
* 入口參數(shù):Slave(IIC器件地址),Address(起始地址),Array(讀數(shù)據(jù)存放的數(shù)組),Number(讀取的字節(jié)數(shù))
* 出口參數(shù):無
************************************************************/
void Rtc_Read_Nbyte(unsigned char Slave,unsigned char Address) //unsigned char *Array,unsigned char n
{
unsigned char data0=0, i=0;
do{ Start(); Write_Byte(Slave); Check_Ack(); } while(F_Flag==1);
do{ Write_Byte(Address);Check_Ack(); } while(F_Flag==1);
do{ Start(); Write_Byte(Slave+1);Check_Ack(); } while(F_Flag==1);
time_rd_buf[0] = Read_Byte(); Ack(); //讀RTC 0.1秒
time_rd_buf[1] = Read_Byte(); Ack(); //讀RTC 秒
time_rd_buf[2] = Read_Byte(); Ack(); //讀RTC 分
time_rd_buf[3] = Read_Byte(); Ack(); //讀RTC 時(shí)
time_rd_buf[4] = Read_Byte(); Ack(); //讀RTC 星期
time_rd_buf[5] = Read_Byte(); Ack(); //讀RTC 日
time_rd_buf[6] = Read_Byte(); Ack(); //讀RTC 月
time_rd_buf[7] = Read_Byte(); Ack(); //讀RTC 年
/*
for(i=0;i<n;i++)
{
data0 = Read_Byte(); //從IIC總線讀一字節(jié)數(shù)據(jù)
Ack(); //應(yīng)答信號(hào)
Array = BCD2HEX(data0);
time_rd_buf[n] = Array;
}
*/
Nack(); // 非應(yīng)答信號(hào)
Stop();
}
//=================================================================================================
/************************************************************
* 函數(shù)名稱:void Rtc_Write_1byte()
* 功 能:RTC寫一字節(jié)數(shù)據(jù)
* 入口參數(shù):uchar Slave,unsigned char Address,unsigned char Data
* 出口參數(shù):無
************************************************************/
void Rtc_Write_1byte(unsigned char Slave,unsigned char Address,unsigned char Data)
{
do{Start();Write_Byte(Slave); Check_Ack(); } while(F_Flag==1);
do{ Write_Byte(Address); Check_Ack(); } while(F_Flag==1);
do{ Write_Byte(Data); Check_Ack(); } while(F_Flag==1); //檢查應(yīng)答位
Stop();
}
//=======================================================================================================
/************************************************************
* 函數(shù)名稱:void Rtc_Write_Nbyte(unsigned char Slave,unsigned char Address,unsigned char *Array,unsigned char Number)
* 功 能:RTC寫N個(gè)字節(jié)子程序
* 入口參數(shù):uchar Slave,unsigned char Address,unsigned char *Array,unsigned char Number
* 出口參數(shù):無
************************************************************/
void Rtc_Write_Nbyte(unsigned char Slave,unsigned char Address,unsigned char *Array,unsigned char Number)
{
unsigned char i;
do{Start();Write_Byte(Slave); Check_Ack(); } while(F_Flag==1) ; //開始->寫IIC器件地址->檢查應(yīng)答位
do{ Write_Byte(Address); Check_Ack(); } while(F_Flag==1) ; //送起始地址->檢查應(yīng)答位
for(i=0;i<Number;i++) //寫Number個(gè)數(shù)據(jù)
{
do{Write_Byte(HEX2BCD(*Array)); Check_Ack();} while(F_Flag==1);
Array++;
}
Stop();
}
#endif
|
|