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

📄 main.c

📁 51单片机C语言常用模块与综合系统设计实例精讲
💻 C
字号:
#include <absacc.h>
#include <intrins.h>
#include <./Atmel/at89x51.h>

//定义常量
#define true  1
#define false 0

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

//函数声名
void I2CWait(void);
bit  I2CStart(void);
void I2CStop(void);
void I2CSendAck(void);
void I2CSendNoAck(void);
bit  I2CWaitAck(void);

void I2CSendByte(unsigned char demand,bit order);
unsigned char I2CReceiveByte(void);

void I2CWriteStatus(void);
void I2CWriteTime(void);
void I2CReadDate(void);
void Delay(unsigned int nn);

/*******************************************************
功能:主函数
描述:初始化、实时时间校准、读入时间、显示
参数:无
返回:无
********************************************************/
main()
{
	P3=0xFF; 
	I2CWriteStatus();//设置为24小时制
	I2CWriteTime();//对实时时间进行校准,一般情况下不需要
        while(1)
	{
 		 I2CReadDate();
		 //此处添加显示程序,可参考5、6、7章
         Delay(250);
         Delay(250);
    }

}

/*******************************************************
功能:I2CWait
描述:I2C延时
参数:无
返回:无
********************************************************/
void I2CWait(void)
{	
	_nop_();_nop_();_nop_();_nop_();
}


/*******************************************************
功能:I2CStart
描述:开启SD2000的I2C总线
参数:无
返回:位变量I2CStart,1=I2C总线可用,0=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;
}

/*******************************************************
功能:I2CStop
描述:关闭SD2000的I2C总线
参数:无
返回:无
********************************************************/
void I2CStop(void)
{
	SDA=0;
	SCL=0;
	I2CWait();
	SCL=1;
	I2CWait();
	SDA=1;
}

/*******************************************************
功能:I2CSendAck
描述:发送 ACK
参数:无
返回:无
********************************************************/
void I2CSendAck(void)
{	
	SDA=0;
	SCL=0;
	I2CWait();
	SCL=1;
	I2CWait();
	SCL=0;
}

/*******************************************************
功能:I2CSendNoAck
描述:发送NO ACK
参数:无
返回:无
********************************************************/
void I2CSendNoAck(void)
{	
	SDA=1;
	SCL=0;
	I2CWait();
	SCL=1;
	I2CWait();
	SCL=0;
}

/*******************************************************
功能:I2CWaitAck
描述:读取ACK信号
参数:无
返回:位变量I2CWaitAck,返回为:1=有ACK,0=无ACK
********************************************************/
bit I2CWaitAck(void)  
{
	unsigned char errtime=255;
	SCL=0;
	SDA=1;
	I2CWait();
	SCL=1;
	I2CWait();
	while(SDA)
	{
		errtime--;
		if(!errtime)
		SCL=0;
		return false;
	}
	SCL=0;
	return true;
}

/*******************************************************
功能:I2CSendByte
描述:向SD2000发送一个字节
参数:待发送字节demand,发送顺序指示order
      order=1,从HI-->LO发送8bit数据
      order=0,从LO-->HI发送8bit数据
返回:无
********************************************************/
void I2CSendByte(unsigned char demand,bit order)
{
	unsigned char i=8;                       
	                                
	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;
	}
}

/*******************************************************
功能:I2CReceiveByte
描述:从SD2000读入一字节
参数:无
返回:读取的字节I2CReceiveByte
********************************************************/
unsigned char I2CReceiveByte(void)
{
	unsigned char i=8;
	unsigned char 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;
}

/*******************************************************
功能:I2CReadDate
描述:读SD2000实时数据寄存器,将结果写入date数组
参数:无
返回:无
********************************************************/
void I2CReadDate(void)
{
	unsigned char n;
	I2CStart();
	I2CSendByte(0x65,1);       //从年开始读取数据
	I2CWaitAck();
	for(n=0;n<7;n++)
	{
		date[n]=I2CReceiveByte();
		if (n!=6)         //最后一个数据不应答
		{
			I2CSendAck();
		}
	}
	I2CSendNoAck();
	I2CStop();
}

/*******************************************************
功能:I2CWriteStatus
描述:写SD2000状态寄存器命令,设置为24小时制
参数:无
返回:无
********************************************************/
void I2CWriteStatus(void)
{		
	I2CStart();
	I2CSendByte(0x62,1);      //发送SD2000状态寄存器命令,
	I2CWaitAck();   
	I2CSendByte(0x40,0);      //24小时制,关所有中断
	I2CWaitAck();
	I2CStop();        
}

/*******************************************************
功能:I2CWriteTime
描述:写SD2000时间寄存器命令
参数:无
返回:无
********************************************************/
void I2CWriteTime(void)
{		
        
	unsigned char n;
	    date[0]=0x06;//year
        date[1]=0x08;//month
        date[2]=0x01;//day
        date[3]=0x02;//week
        date[4]=0x13;//hour
        date[5]=0x14;//minute
        date[6]=0x50;//second	
	I2CStart();
	I2CSendByte(0x64,1);      //发送SD2000写时间寄存器命令,
	I2CWaitAck();   
        for(n=0;n<7;n++)
	    {
		I2CSendByte(date[n],0);
		I2CWaitAck();
	    }
	I2CStop();
	      
}

/*******************************************************
功能:Delay
描述:延时子程序
参数:延时长度nn
返回:无
********************************************************/
void Delay(unsigned int nn)
{
   while(nn--);
   }



⌨️ 快捷键说明

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