📄 sd2200读写c51演示程序.txt
字号:
//实时时钟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 + -