⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sd2200读写c51演示程序.txt

📁 实时时钟芯片2200系列C语言程序
💻 TXT
📖 第 1 页 / 共 4 页
字号:

//实时时钟SD2200读写C51演示程序
//本程序在王思焰,闫亨的程序基础上修改,在此一并致谢!
//              chendw@whwave.com.cn    2006/03/03
#pragma code
#include <reg51.h>
#include <intrins.h>
//*********变量及IO口定义*********
typedef unsigned char uchar;
typedef unsigned int uint;

sbit	SDA=P3^4;
sbit	SCL=P3^5;
uchar   data1,data2,data3,data4;
uchar   date[7];   //日期数组
                  /*date[0]=year,date[1]=month,date[2]=day,date[3]=week,
                    date[4]=hour,date[5]=minute,date[6]=second*/

#define true  1
#define false 0

/********SD2200函数名********/
void I2CWait(void);
bit  I2CStart(void);
void I2CStop(void);
void I2CAck(void);
void I2CNoAck(void);
bit  I2CWaitAck(void);
void I2CSendByte(uchar demand,bit order);
uchar I2CReceiveByte(void);
void I2CReadDate(void);
void I2CWriteStatus(void);
void Delay(uint nn);



/*********I2C延时***********/
void I2CWait(void)
{	
	_nop_();_nop_();_nop_();_nop_();
}


/********开启SD2200的I2C总线********/
bit I2CStart(void)
{
	SDA=1;
	SCL=1;
	I2CWait();
	if(!SDA)return false;//SDA线为低电平则总线忙,退出
	SDA=0;
	I2CWait();
	while(SDA)return false;//SDA线为高电平则总线出错,退出
	SCL=0;
	I2CWait();
	return true;
}


/********关闭SD2200的I2C总线*******/
void I2CStop(void)
{
	SDA=0;
	SCL=0;
	I2CWait();
	SCL=1;
	I2CWait();
	SDA=1;
}


/*********发送 ACK*********/
void I2CAck(void)
{	
	SDA=0;
	SCL=0;
	I2CWait();
	SCL=1;
	I2CWait();
	SCL=0;
}


/*********发送NO ACK*********/
void I2CNoAck(void)
{	
	SDA=1;
	SCL=0;
	I2CWait();
	SCL=1;
	I2CWait();
	SCL=0;
}


/*********读取ACK信号*********/
bit I2CWaitAck(void)  //返回为:1=有ACK,0=无ACK
{
	uchar errtime=255;
	SCL=0;
	SDA=1;
	I2CWait();
	SCL=1;
	I2CWait();
	while(SDA)
	{
		errtime--;
		if(!errtime)
		SCL=0;
		return false;
	}
	SCL=0;
	return true;
}


/************从SD2200发送一个字节*************/
void I2CSendByte(uchar demand,bit order) //order=1,H_L;order=0,L_H
{
	uchar i=8;                       //order=1,从HI-->LO发送8bit数据
	                                 //order=0,从LO-->HI发送8bit数据
	if(order)
	{
		while(i--)
		{
			SCL=0;
			_nop_();
			SDA=(bit)(demand&0x80);
			demand<<=1;
			I2CWait();
			SCL=1;
			I2CWait();
		}
		SCL=0;
	}
     else
	{
		while(i--)
		 {
			SCL=0;
			_nop_();
			SDA=(bit)(demand&0x01);
			demand>>=1;
			I2CWait();
			SCL=1;
			I2CWait();
		 }
		 SCL=0;
	}
}


/*********MCU从SD2200读入一字节*********/
uchar I2CReceiveByte(void)
{
	uchar i=8;
	uchar ddata=0;
	SDA=1;
	while(i--)
	{
		ddata>>=1;          //数据从低位开始读取
		SCL=0;
		I2CWait();
		SCL=1;
		I2CWait();	   //从低位开始 ddata|=SDA;ddata>>=1
		if(SDA)
		{
			ddata|=0x80;
		}
	}
	SCL=0;
	return ddata;
}


/******读SD2200实时数据寄存器******/
void I2CReadDate(void)
{
	uchar n;
	if(!I2CStart())return;
	I2CSendByte(0x65,1);//从年开始读取数据
	if(!I2CWaitAck()){I2CStop();return;}
	for(n=0;n<7;n++)
	{
		date[n]=I2CReceiveByte();
		if (n!=6)         //最后一个数据不应答
		{
			I2CAck();
		}
	}
	I2CNoAck();
	I2CStop();
}


/*写SD2200状态寄存器命令*/
void I2CWriteStatus(void)
{		
	if(!I2CStart())return;
	I2CSendByte(0x60,1);      //发送SD2200状态寄存器_1命令
	if(!I2CWaitAck()){I2CStop();return;}   
	I2CSendByte(0x03,0);      //IC进行复位初始化,24小时制
	I2CWaitAck();
	I2CStop();        
	I2CStart();
	I2CSendByte(0x62,1);      //发送SD2200状态寄存器_2命令
	I2CWaitAck();   
	I2CSendByte(0x00,0);      //清TEST位,禁止中断输出
	I2CWaitAck();
	I2CStop();        
}

/*写SD2200时间寄存器命令*/
void I2CWriteTime(void)
{		
        
	uchar n;
	date[0]=0x06;//year;2006/03/03/05/13/14/50
        date[1]=0x03;//month
        date[2]=0x03;//day
        date[3]=0x05;//week
        date[4]=0x13;//hour
        date[5]=0x14;//minute
        date[6]=0x50;//second	
	I2CStart();
	I2CSendByte(0x64,1);      //发送SD2200写时间寄存器命令,
	I2CWaitAck();   
        for(n=0;n<7;n++)
	    {
		I2CSendByte(date[n],0);
		I2CWaitAck();
	    }
	I2CStop();
	      
}

/*********延时子程序*********/
void Delay(uint nn)
{
   while(nn--);
   }


//////*****主程序*****//////
main()
{
	P3=0xFF;
	I2CWriteStatus();
	I2CWriteTime();
        while(1)
	{
 		 I2CReadDate();
	 _nop_();
	 Delay(250);
         Delay(250);
    }

}


;===============================================================================
;  SD2200系列SRAM/EEPROM功能测试程序
;     VER1。00
;    上电显示:"TS22U1.00"
;    本程序
;    程序功能如下:
;
;       注: 单片机是AT89C51,外晶振为12Mhz,在兴威帆公司的SD7218评估板上运行
;       Last update:2003/07/29
;       本程序仅供参考,如有问题请联系:陈工 0755-83246178,fax:83225561
;       13922865036   chendw@whwave.com.cn  http://www.whwave.com.cn
;===============================================================================
;define the general register
;LED寄存器
        DIG1    EQU     20H             ;LED第一位缓冲器
        DIG2    EQU     21H             ;
        DIG3    EQU     22H             ;
        DIG4    EQU     23H             ;
        DIG5    EQU     24H             ;
        DIG6    EQU     25H             ;
        DIG7    EQU     26H             ;
        DIG8    EQU     27H
        FLAG    EQU     28H             ;通用标志寄存器
                                        ;BIT0=1, ACK ERR
                                        ;BIT0=0 ,ACK OK

        YEAR    EQU     30H             ;年
        MONTH   EQU     31H             ;月
        DAY     EQU     32H             ;日
        WEEK    EQU     33H             ;星期
        HOUR    EQU     34H             ;小时
        MINUTE  EQU     35H             ;分钟
        SECOND  EQU     36H             ;秒
;单片机与实时时钟间通信寄存器
        TIMETEMP        EQU     2EH     ;时间数据缓存器
        TIMETX          EQU     43H     ;时间数据发送寄存器
        TIMERX          EQU     44H     ;时间数据接收寄存器
;单片机与IIC通信寄存器
        IICTEMP         EQU     2FH     ;IIC标志寄存器
        SLAVE_ADD       EQU     40H     ;SD7218地址寄存器
        DATAI1          EQU     41H
        DATAI2          EQU     42H
        TXBUF           EQU     47H     ;IIC数据发送寄存器
        RXBUF           EQU     48H     ;IIC数据接收寄存器
        KEYBUF          EQU     49H     ;键盘数据缓冲器
        READDATA        EQU     4FH
;温度数据寄存器
        TEMPHI 		EQU     50H     ;温度高字节
        TEMPLO  	EQU     51H     ;温度低字节
;SRAM寄存器
        SRAMADD_LO	EQU     52H     ;SRAM地址低8位
        SRAMADD_HI	EQU     53H     ;SRAM地址高8位
        SRAMDATA        EQU     54H     ;写入SRAM内的数据
        VERIFY_LO       EQU     55H     ;校验次数低八位
        VERIFY_HI       EQU     56H     ;校验次数高八位
        TYPE 		EQU     57H     ;SD2200型号寄存器
        EE_PAGE		EQU     58H
        TEMP            EQU     5CH     ;
;---------------------------------------------------------------------------
;define port bit
;各通信口位代号
        SDA     EQU     P3.1            ;IIC的SDA口线
        SCL     EQU     P3.2            ;IIC的SCL口线
        KEY     EQU     P3.0            ;键盘中断信号线
        T_SDA   EQU     P3.4            ;SD2200的SDA口线
        T_SCL   EQU     P3.5            ;SD2200的SCL口线
;===========================================================================
;			*** IIC命令定义 ***
;===========================================================================

	COMMAND_RESET				EQU	68H
	COMMAND_TEST	 			EQU	6AH
	COMMAND_SHIFT_LEFT	              	EQU	61H
	COMMAND_SHIFT_RIGHT	  	        EQU	62H
	COMMAND_SHIFT_ROUND_LEFT         	EQU	63H
	COMMAND_SHIFT_ROUND_RIGHT	        EQU	64H
	COMMAND_UPDATE_DISP_DECODE              EQU	40H
	COMMAND_UPDATE_DISP		        EQU	50H
	COMMAND_FLASH_CONTROL	         	EQU	78H
	COMMAND_HIDE_CONTROL		        EQU	79H
	COMMAND_SEGMENT_ON	  	        EQU	08H
	COMMAND_SEGMENT_OFF 	        	EQU	09H
	COMMAND_READ_KEY_VALUE	                EQU	10H
	COMMAND_RW_RAM_VALUE		        EQU	80H
        COMMAND_LED_HEXS_WR                     EQU     40H

;===========================================================================
;			*** 常数定义 ***
;===========================================================================
        SLAVE2_RD                               EQU     51H    ;sd7218 ver2.0
        SLAVE2_WR                               EQU     50H
;===========================================================================

        ORG     0000H                   ;RESET
        LJMP    START

;---------------------------------------------------------------------------

        ORG     0100H
START:
        CLR     A                       ;开始初始化各寄存器
        MOV     IE,A                    ;关中断
        MOV     SP,#60H                 ;定义堆栈
        CLR     FLAG                    ;清除标志位

        LCALL   INIT_LEDBUF             ;初始化LED数据缓冲器,"TS22U1.00"
	LCALL	LONGDELAY
	LCALL	LONGDELAY

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -