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

📄 新建 text file (2).txt

📁 一个完整的项目代码!太阳能控制器完整的代码程序
💻 TXT
字号:
/*#asm
.equ __ds1302_port=0x18
.equ __ds1302_sclk=2  //7
.equ __ds1302_io=1    //6  SCL 1
.equ __ds1302_rst=0   //5  SDA 0
#endasm
*/ 

#asm
   .equ __i2c_port=0x18;PORTB
   .equ __sda_bit=0
   .equ __scl_bit=1
#endasm
#include <i2c.h> 

#include <all.c>
uchar shuju[15]={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6,0,0x76,0x8e,0x02,0x6e};//对应的数码管显示内码
uchar xianshi[]={0xff,0,0,0,0,0,0,0}; 
int time[]= {0,27,10,25,2,1,8};              //时间数据  
/*------------------------------------------------------1302程序---------------------------------------------------*/
unsigned char turnbcd(unsigned char bcd)      
{ 
      unsigned char n_n;
      n_n=(bcd&0xf0)/16*10+(bcd&0x0f);
      return(n_n); 
} 
/**********************
    十进制转BCD码  
***********************/
unsigned char turnsjz(unsigned char dd)	  
{	
      unsigned char b_c;
      b_c=(dd/10)*16+(dd-(dd/10)*10); 
      return(b_c); 
}
void send(uchar i)
 { 
    uchar j;
    for(j=0;j<8;j++)
    {     
         SCP=0;
         if(i&0x01) {SI=1;} else  {SI = 0;} 
         i=i>>1;
         SCP=1;		 
    }
 }
void send_xianshi(void)
{
  uchar i;
  SCP=0;LCP=0;SCP=1;
  for(i=1;i<9;i++)
  { 
    send(xianshi[i]);
  }
  delay_ms(10); 
  SCP=1;LCP=1;SI=1;SCP=0; 
} 
void shuzi(uchar i,uchar ii)
{
  xianshi[i]=shuju[ii];
}
void chushihua(void)
{ 
  PORTA=0X00;DDRA=0XFF;
  PORTB=0X00;DDRB=0XFF;
  WDTCR =0x18;//
  WDTCR =0x10;
  i2c_init();
}
unsigned char read(unsigned char address)
 {
unsigned char data;

i2c_start();
i2c_write(0X65);
delay_ms(1);
i2c_write(address);
i2c_start();
i2c_write(0X65 | 1);
data=i2c_read(1);
i2c_stop();
return data;
}
/* 向EEPROM 写一个字节 */
void eeprom_write(unsigned char address, unsigned char data) {
i2c_start();
i2c_write(0x64);
i2c_write(address);
i2c_write(data);
i2c_stop();
/* 10 延时等待写操作完成 */
delay_ms(10);
}


#define true  1
#define false 0
/********SD2400函数名********/
void I2CWait(void);
bit  I2CStart(void);
void I2CStop(void);
void I2CAck(void);
void I2CNoAck(void);
bit  I2CWaitAck(void);
void I2CSendByte(uchar demand);
uchar I2CReceiveByte(void);
void I2CReadDate(void);
void I2CWriteStatus(void);
void Delay(uint nn);
void I2CWriteDate(void);
void WriteTimeOn(void);
void WriteTimeOff(void);


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


/********开启SD2400的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;
}


/********关闭SD2400的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;
}


/************MCU向SD2400发送一个字节*************/
void I2CSendByte(uchar demand) //数据从高位到低位//
{
	uchar i=8;                       
	                                 
	
		while(i--)
		{
			SCL=0;
			_nop_();
			SDA=(bit)(demand&0x80);
			demand<<=1;
			I2CWait();
			SCL=1;
			I2CWait();
		}
		SCL=0;
}


/*********MCU从SD2400读入一字节*********/
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|=0x01;
		}
	}
	SCL=0;
	return ddata;
}


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

/******写SD2400实时数据寄存器******/
void I2CWriteDate(void)
{		

        WriteTimeOn();

	I2CStart();
	I2CSendByte(0x64);      
	I2CWaitAck();   
        I2CSendByte(0x00);//设置写起始地址      
	I2CWaitAck();	
	I2CSendByte(0x01);// second     
	I2CWaitAck();	
	I2CSendByte(0x01);//minute      
	I2CWaitAck();	
	I2CSendByte(0x88);//hour ,二十四小时制     
	I2CWaitAck();	
	I2CSendByte(0x01);//week      
	I2CWaitAck();	
	I2CSendByte(0x01);//day      
	I2CWaitAck();	
	I2CSendByte(0x07);//month      
	I2CWaitAck();	
	I2CSendByte(0x07);//year      
	I2CWaitAck();	
	I2CStop();

	I2CStart();
	I2CSendByte(0x64);      
	I2CWaitAck();   
        I2CSendByte(0x12);//设置写起始地址      
	I2CWaitAck();		
        I2CSendByte(0x00);//清零数字调整寄存器      
	I2CWaitAck();        
	I2CStop();  
	
	WriteTimeOff();      
}

/******写SD2400允许程序******/
void WriteTimeOn(void)
{		
	I2CStart();
	I2CSendByte(0x64);      
	I2CWaitAck();   
        I2CSendByte(0x10);//设置写地址10H      
	I2CWaitAck();	
	I2CSendByte(0x80);//置WRTC1=1      
	I2CWaitAck();
	I2CStop(); 
	
	I2CStart();
	I2CSendByte(0x64);      
	I2CWaitAck();   
        I2CSendByte(0x0F);//设置写地址0FH      
	I2CWaitAck();	
	I2CSendByte(0x84);//置WRTC2,WRTC3=1      
	I2CWaitAck();
	I2CStop(); 
	
}


/******写SD2400禁止程序******/
void WriteTimeOff(void)
{		
	
	I2CStart();
	I2CSendByte(0x64);      
	I2CWaitAck();   
        I2CSendByte(0x0F);//设置写地址0FH      
	I2CWaitAck();	
	I2CSendByte(0x0) ;//置WRTC2,WRTC3=0      
	I2CWaitAck();

	I2CSendByte(0x0) ;//置WRTC1=0(10H地址)      
	I2CWaitAck();
	I2CStop(); 
}








void main(void)
{ 
  unsigned char i; 
  chushihua();
  //eeprom_write(0x00,0x01);
  while(1)
  {
    {  
    delay_ms(10);
     LED1=~LED1;
    i=99;
     shuzi(1,i%100/10); 
     shuzi(2,i%10); 
     send_xianshi();  
     i=read(0x00);
     delay_ms(1000);
    }
  }
} 

⌨️ 快捷键说明

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