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

📄 2402and1307.c

📁 调试通过了的基于89S51的串口芯片1307和24C02的程序
💻 C
字号:
#include<reg51.h>
#include <intrins.h>
/*-------------------------------------*/
//LCD数据控制口定义
/*-------------------------------------*/
#define LCD_DATA P0         //LCD的数据口
sbit LCD_BUSY=LCD_DATA^7;    //LCD忙型号位
sbit LCD_RS=P1^4;            //LCD积存器选择
sbit LCD_RW=P1^3;            //LCD读写控制
sbit LCD_EN=P1^2;            //LCD使能信号
/*-------------------------------------*/
#define LCD_GO_HOME                 0X02      //光标复位,光标返回到地址00H

//输入方式设置
#define LCD_AC_AUTO_INCREASEMENT    0X06      //数据读写操作后,AC自动增一
#define LCD_AC_AUTO_DECREASEMENT    0x04      //                      减一
#define LCD_MOVE_ENABLE             0X05      //数据读写操作后,画面平移
#define LCD_MOVE_DISABLE            0X04      //                    不动

//设置显示,光标及闪烁开关
#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        0XO8      //光标不闪烁

//光标,画面移动,不影响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_SIGLE_LINE      0X30      //一行显示

void LCD_write_data(unsigned char);
void LCD_inital(void);
void LCD_set_position(unsigned char);
void LCD_printc(unsigned char);
void LCD_prints(unsigned char *);

//========================================================================
//延时程序
void TimeDelay(int Time)
{
	int i;
	while(Time > 0)
	{
		for(i = 0;i < 800;i++)
		{
			_nop_();
		}
		Time --;
	}
}

/*------------------------------------------*/
void LCD_check_busy(void)
{
  while(1)
     {
       LCD_EN=0;
       LCD_RS=0;
       LCD_RW=1;
       LCD_DATA=0XFF;
       LCD_EN=1;
       if(!LCD_BUSY)break;
     }
   LCD_EN=0;
}
/*----------可以不要--------------------------------*/
void LCD_cls(void)
{
  LCD_check_busy();
  LCD_RS=0;
  LCD_RW=0;
  LCD_DATA=1;
  LCD_EN=1;
  LCD_EN=0;
}
/*------------------------------------------*/
void LCD_write_instruction(unsigned char LCD_instruction)
{
  LCD_check_busy();
  LCD_RS=0;
  LCD_RW=0;
  LCD_EN=1;
  LCD_DATA=LCD_instruction;
  
  LCD_EN=0;
}
/*------------------------------------------*/
void LCD_write_data(unsigned char LCD_data)
{
  LCD_check_busy();
  LCD_RS=1;
  LCD_RW=0;
  LCD_EN=1;
  LCD_DATA=LCD_data;
  
  LCD_EN=0;
}
/*------------------------------------------*/
void LCD_set_position(unsigned char x)
{
  LCD_write_instruction(0x80+x);
}
/*------------------------------------------*/
void LCD_go_home(void)
{
  LCD_write_instruction(LCD_GO_HOME);
}
/*------------------------------------------*/
void LCD_printc (unsigned char LCD_data)
{
  LCD_write_data(LCD_data);
}
/*------------------------------------------*/
void LCD_prints (unsigned char *lcd_string)
{
  unsigned char i=0;
  while(lcd_string[i]!=0x00)
     {
       LCD_write_data(lcd_string[i]);
       i++;
     }
}
/*------------------------------------------*/

/***************************I2C开始*****************************************************************/
#define    Wait1us        _nop_();
#define    Wait2us        {_nop_();_nop_();}
#define    Wait4us        {Wait2us;Wait2us;}
#define    Wait8us        {Wait4us;Wait4us;}
#define    Wait10us    {Wait8us;Wait2us;}

#define    WRITE2402    0xA0
#define    READ2402    0xA1
#define    WRITEDS1307    0xD0
#define    READDS1307    0xD1
  sbit SDA=P1^7;      // Serial-Data Input    pin 5 
  sbit SCL=P1^6;     // 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);
void I2C_write_byte(unsigned char);//I2C bus write byte function 
unsigned char I2C_read_byte(void);//I2C bus read byte function
/***********************************************************************/
void Write(unsigned char,unsigned char,unsigned char);//write information to I2C
unsigned char Read(unsigned char,unsigned char,unsigned char);//read information from I2C
void Read_RTC(unsigned char,unsigned char,unsigned char *,unsigned char *);//read RTC 
void Set_RTC(unsigned char,unsigned char,unsigned char *,unsigned char *);//set RTC 
/***********************************************************************/
code unsigned char set_1307_code[7]={0x02,0x03,0x17,0x03,0x9,0x04,0x08};//初始化秒,分,时,星期,日,月,年
code unsigned char DS1307_address[7]={0x00,0x01,0x02,0x03,0x04,0x05,0x06};//寄存器地址
code unsigned char *days[7]={"Mon","Tue","Wen","Thu","Fri","Sat","Sun"};
unsigned char read_1307_code[7];
unsigned char read_1307_code1[14];
/***********************************************************************/
code unsigned char set_2402_code[7]={0x02,0x02,0x03,0x05,0x7,0x08,0x08};//存入的数据
code unsigned char AT2402_address[7]={0x00,0x01,0x02,0x03,0x04,0x05,0x06};//存储器地址
unsigned char read_2402_code[7];


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

void I2C_send_ack(void)
{
  SDA=0;
  SCL=1;
  Wait4us;
  SCL=0;
  SDA=1;
}

void I2C_send_noack(void)
{
 SDA=1;
 SCL=1;
 Wait4us;
 SCL=0;
}
/***********************************************************************/
void 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;//2改为5
            SCL=1;
            Wait4us;
            SCL=0;
        }
            Wait4us;
            SDA=1; //发送完8bit,释放总线准备接收应答位
            //Wait4us;
            I2C_send_ack();
 }
/***********************************************************************/
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); 
}
/***********************************************************************/
/******************************** I2C PART START  ****************/
void Write(unsigned char WRITE,unsigned char add,unsigned char dat)
{
  I2C_start();
  I2C_write_byte(WRITE);//写器件地址
  I2C_write_byte(add);
  I2C_write_byte(dat);
  I2C_stop();
}
  
/***********************************************************************/
unsigned char Read(unsigned char WRITE,unsigned char add,unsigned char READ)
{
  
  unsigned char dat;
  I2C_start();
  I2C_write_byte(WRITE);
  I2C_write_byte(add);
  I2C_start();
  I2C_write_byte(READ);
  dat=I2C_read_byte(); 
  I2C_send_noack();
  I2C_stop();        
  return (dat);
}
/****************************读AT2402/DS1307的寄存器或地址内容*******************************************/
void Read_RTC(unsigned char WRITE,unsigned char READ,unsigned char *address,unsigned char *i2c_data)
{
 unsigned char i,*p;
 p=address;
 for(i=0;i<7;i++)
  {
   i2c_data[i]=Read(WRITE,*p,READ);
   p++;
  }

}
/***************************AT2402/DS1307的初始化********************************************/
void Set_RTC(unsigned char WRITE,unsigned char num,unsigned char *address,unsigned char *i2c_code)
{
 unsigned char i,*p;
 p=address;
 for(i=0;i<num;i++)
 {
  Write(WRITE,*p,i2c_code[i]);
  p++; 
  TimeDelay(1);
 }
}  
/****************************LCD初始化*******************************************/
void LCD_inital(void)
{
  LCD_write_instruction(LCD_AC_AUTO_INCREASEMENT|LCD_MOVE_DISABLE);
  LCD_write_instruction(LCD_DISPLAY_ON|LCD_CURSOR_OFF);
  LCD_write_instruction(LCD_DISPLAY_DOUBLE_LINE);
  LCD_cls();
}
/*------------------------------------------*/
void main()
{ 
  unsigned char i,j;
  LCD_inital();
  Set_RTC(WRITEDS1307,7,DS1307_address,set_1307_code);
  Set_RTC(WRITE2402,7,AT2402_address,set_2402_code);
  TimeDelay(10);

  while(1)
  {
  Read_RTC(WRITEDS1307,READDS1307,DS1307_address,read_1307_code);
  j=0;
  for(i=0;i<7;i++)
     {  
	   read_1307_code1[i+j]=(read_1307_code[i]>>4)+ 0x30;
	   read_1307_code1[i+j+1]=(read_1307_code[i]&0x0f)+ 0x30;
	   j++;
     }

  LCD_set_position(1);
  LCD_prints("2");
  LCD_set_position(2);
  LCD_prints("0");
  LCD_set_position(3);
  LCD_printc(read_1307_code1[12]);
  LCD_set_position(4);
  LCD_printc(read_1307_code1[13]);
  LCD_set_position(5);
  LCD_prints("-");

  LCD_set_position(6);
  LCD_printc(read_1307_code1[10]);
  LCD_set_position(7);
  LCD_printc(read_1307_code1[11]);
  LCD_set_position(8);
  LCD_prints("-");

  LCD_set_position(9);
  LCD_printc(read_1307_code1[8]);
  LCD_set_position(10);
  LCD_printc(read_1307_code1[9]);

  LCD_set_position(12);
  LCD_prints(days[read_1307_code[3]]);

  LCD_set_position(0x40);
  LCD_printc(read_1307_code1[4]);
  LCD_set_position(0x41);
  LCD_printc(read_1307_code1[5]);
  LCD_set_position(0x42);
  LCD_prints(":");

  LCD_set_position(0x43);
  LCD_printc(read_1307_code1[2]);
  LCD_set_position(0x44);
  LCD_printc(read_1307_code1[3]);
  LCD_set_position(0x45);
  LCD_prints(":");

  LCD_set_position(0x46);
  LCD_printc(read_1307_code1[0]);
  LCD_set_position(0x47);
  LCD_printc(read_1307_code1[1]);
  
  Read_RTC(WRITE2402,READ2402,AT2402_address,read_2402_code);
  for(i=0;i<7;i++)
     {  
	   read_2402_code[i]=read_2402_code[i] + 0x30;
     }


  LCD_set_position(0x49);
  LCD_prints(read_2402_code);

  TimeDelay(100);
  }
   
}

⌨️ 快捷键说明

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