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

📄 ds1307.c

📁 这是一个大模式下ucos51的移植结果,因为大部分可载的ucos51都是小模式下的
💻 C
字号:
#include <reg51.h>
#include <intrins.h>
/*********************************LCD定义部分********************************/
//输入方式设置
#define LCD_AC_AUTO_INCREMENT     0x06         //数据读、写操作后,AC自动增一
#define LCD_AC_AUTO_DECREASE      0x04         //数据读、写操作后,AC自动减一
#define LCD_MOVE_ENABLE           0x05         //数据读、写操作,画面平移
#define LCD_MOVE_DISENABLE        0x04         //数据读、写操作,画面不动
#define LCD_GO_HOME               0x02         //AC=0,光标、画面回HOME位
//设置显示、光标及闪烁开、关
#define LCD_DISPLAY_ON            0x0C         //显示开
#define LCD_DISPLAY_OFF           0x08         //显示关
#define LCD_CURSOR_ON             0x0A         //光标显示
#define LCD_CURSOR_OFF            0x08         //光标不显示
#define LCD_CURSOR_BLINK_ON       0x09         //光标闪烁
#define LCD_CURSOR_BLINK_OFF      0x08         //光标不闪烁
//光标、画面移动,不影响DDRAM
#define LCD_LEFT_MOVE             0x18         //LCD显示左移一位
#define LCD_RIGHT_MOVE            0x1C         //LCD显示右移一位
#define LCD_CURSOR_LEFT_MOVE      0x10         //光标左移一位
#define LCD_CURSOR_RIGHT_MOVE     0x14         //光标右移一位
//工作方式设置
#define LCD_DISPLAY_DOUBLE_LINE   0x38         //两行显示
#define LCD_DISPLAY_SINGLE_LINE   0x30         //单行显示
#define LCD_CLEAR_SCREEN  0X01   //清屏
/***********************LCD1602地址相关******************************/
#define LINE1_HEAD    0x80   // 第一行DDRAM起始地址 
#define LINE2_HEAD    0xc0   //  第二行DDRAM起始地址
#define LINE1         0      //第一行
#define LINE2         1      //第二行
#define LINE_LENGTH   16     //每行的最大字符长度
/***********************LCD1602接线引脚定义**************************
**********************可根据实际电路改变*******************************/
#define LCDIO     P2         //定义P2口与LCD1602的数据口相接
  sbit   LCD_RS=P1^4;         
  sbit   LCD_RW=P1^3;         
  sbit   LCD_EN=P1^2;
  sbit  LCD_BUSY=LCDIO^7;
 /**********************另外相关的定义*********************************/
 #define HIGH               1
 #define LOW                0   
 #define TURE               1
 #define  FALSE             0
 #define  uchar unsigned char
 #define  uint  unsigned int
 
 /*************************以下是函数的申明部分*************************/
 void LCD_init(void);                    //LCD1602初始化
 void LCD_send_command(uchar command);   //
 void LCD_send_data(uchar dat);
 void LCD_write_char(uchar x,uchar y,uchar dat);
 void LCD_write_string(uchar x,uchar y,char *Data);
 void delay_ms(uint n);
 void LCD_check_busy(void);
 /*********************结束***********************************************/
/***************************DS1307开始*****************************************************************/
#define    Wait1us        _nop_();
#define    Wait2us        {_nop_();_nop_();}
#define    Wait4us        {Wait2us;Wait2us;}
#define    Wait8us        {Wait4us;Wait4us;}
#define    Wait10us    {Wait8us;Wait2us;}
#define  WRITEDS1307    0xD0
#define     READDS1307    0xD1
#define  WRITE2402    0xa0
#define     READ2402    0xa1
  sbit SDA=P1^4;      //DS1307 Serial-Data Input    pin 5 
  sbit SCL=P1^3;     //DS1307 Serial-Clock Input    pin 6
/************************************************************/
void I2C_start(void);//I2C start function
void I2C_stop(void);//I2C stop function
//void I2C_send_ack(void);//I2C send responsion function 
void I2C_send_noack(void);
unsigned char I2C_write_byte(unsigned char IIC_data);//I2C bus write byte function 
unsigned char I2C_read_byte(void);//I2C bus read byte function
/***********************************************************************/
void Write1307(unsigned char add,unsigned char dat);//write information to ds1307
unsigned char Read1307(unsigned char add);//read information from ds1307
void Read_RTC(void);//read RTC 
void Set_RTC(void);//set RTC 
/***********************************************************************/
unsigned char set_rtc_code[7];
code unsigned char rtc_address[7]={0x00,0x01,0x02,0x03,0x04,0x05,0x06};
code unsigned char *day[7]={"Mon","Tue","Wen","Thu","Fri","Sat","Sun"};
unsigned char read_rtc_code[7];
/***********************************************************************/
void Initial(void);//system initize function
void Display(void);//RTC display function
/***********************************************************************/
/***********************************************************************/

/***********************************************************************/
/*void Initial(void)       
{ 
	Set_RTC();    
}*/
/***********************************************************************/
void I2C_start(void)
{
	SDA=1;
	SCL=1;
	Wait8us;
	SDA=0;
	Wait8us;
	SCL=0;
  
}
/***********************************************************************/
void I2C_stop(void)
{
	SDA=0;
	SCL=1;
	Wait8us;
	SDA=1;
	Wait4us;
	SCL=0;
}

void I2C_send_noack(void)
{
	SDA=1;
	SCL=1;
	Wait4us;
	SCL=0;
}
/***********************************************************************/
unsigned char I2C_write_byte(unsigned char IIC_data)
{
unsigned char i;
	for(i=0;i<8;i++)
	{
		SCL=0;
		if((IIC_data<<i) & 0x80)
			SDA=1;                   //判断发送位
		else 
			SDA=0;
			Wait2us;
			SCL=1;
			Wait4us;
			SCL=0;
	}
	Wait4us;
	SDA=1; //发送完8bit,释放总线准备接收应答位
	Wait2us;
	SCL=1;
	Wait4us; //sda上数据即是从应答位
	if (SDA==1)
	{
 		SCL=0; //不考虑从应答位 但要控制好时序
		return 1;
	}
	else
	{
 		SCL=0; //不考虑从应答位 但要控制好时序
		return 0;
	}
 }
/***********************************************************************/
unsigned char I2C_read_byte(void)
{
unsigned char i,dat;
	dat=0;
	SDA=1;
	for (i=0;i<8;i++)
	{
		dat=dat<<1;
		SCL=1;
		Wait2us;
		if(SDA==1)
		{
			dat++;
		}
     
		SCL=0;  
	}  
	return (dat); 
}
/***********************************************************************/
/******************************** DS1307 PART START  ****************/
void Write1307(unsigned char add,unsigned char dat)
{
	I2C_start();
	I2C_write_byte(WRITEDS1307);
	I2C_write_byte(add);
	I2C_write_byte(dat);
	I2C_stop();
}
  
/***********************************************************************/
unsigned char Read1307(unsigned char add)
{
  
unsigned char dat;
	I2C_start();
	I2C_write_byte(WRITEDS1307);
	I2C_write_byte(add);
	I2C_start();
	I2C_write_byte(READDS1307);
	dat=I2C_read_byte(); 
	I2C_send_noack();
	I2C_stop();        
	return (dat);
}
/****************************读DS1307的寄存器*******************************************/
void Read_RTC(void)
{
unsigned char i,*p;
	p=rtc_address;
	for(i=0;i<7;i++)
	{
		read_rtc_code[i]=Read1307(*p);
		p++;
	}
}
/***************************DS1307的初始化********************************************/
void Set_RTC(void)
{
unsigned char i;
//	p=rtc_address;
	Write1307(0,0x81);
	
	for(i=8;i>1;i--)
	{
		Write1307((i-2),set_rtc_code[i-2]);
	}
}  



void Write2402(unsigned char add,unsigned char dat)
{
	I2C_start();
	I2C_write_byte(WRITE2402);
	I2C_write_byte(add);
	I2C_write_byte(dat);
	I2C_stop();
}
  
/***********************************************************************/
unsigned char Read2402(unsigned char add)
{
  
unsigned char dat;
	I2C_start();
	I2C_write_byte(WRITE2402);
	I2C_write_byte(add);
	I2C_start();
	I2C_write_byte(READ2402);
	dat=I2C_read_byte(); 
	I2C_send_noack();
	I2C_stop();        
	return (dat);
}

⌨️ 快捷键说明

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