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

📄 tools.c

📁 个人学习参考!禁止使用到产品上! 任何人不得公开发布!
💻 C
字号:
/*========================================*/
/*系统名称:DDSF-CECG-JiangSu             */
/*函数名称:辅助程序  		              */
/*程序编写:步爱军			              */
/*开始日期:2005-01-01			          */
/*完成日期:				              */
/*修改记录:  				              */
/*软件版本:DDSF-CECG-002                 */
/*版本说明:用户数据保存在外部            */
/*外部器件:LM75、AT24C02、HT1621、LPC932 */
/*          R8025、ADE7755                */
/*========================================*/

#include <REG932.h>
#include <Define.h>
#include <Stdio.h>
#include <Intrins.h>

///-----***-短延时-***-----//
void Delay(unsigned int count) reentrant
{
   unsigned int data i;
   unsigned char data j;
   for(i=0; i<count; i++)
   {
      for(j=0; j<5; j++)
      {
        ;
      }
   } 
}

///-----***-IIC-***-----///
unsigned char FgTimeout;
unsigned char IicByteRead(unsigned char device,unsigned char address)      //读取指定器件指定地址中的数据
{
	unsigned char data bytedata;								           //定义一个变量bytedata,用来存放数据
	IicStart();										                       //开始传送起始信号
	IicSentByte(device);								                   //传送一字节(slave)地址
	IicSentByte(address);								                   //传送一字节(address)地址
	IicStart();										                       //开始传送起始信号
	IicSentByte(device|0x01);							                   //传送读取信号
	bytedata=IicReceiveByte();							                   //从slave端读取一个数据并存入变量bytedata
	SendAcknowledge(1);									                   //Master端送出确认的信号等于1
	IicStop();										                           //传送停止信号
  	return bytedata;									                   //返回读出值bytedata给原调用程序
}
void IicMuchByteRead(unsigned char Device,unsigned char Address,unsigned char DataLend)               //读取指定器件指定地址中的数据
{
    unsigned char i;							                        //定义一个变量bytedata,用来存放数据	

	IicStart();										                    //开始传送起始信号
	IicSentByte(Device);								                //传送一字节(slave)地址
	IicSentByte(Address);								                //传送一字节(address)地址
	IicStart();										                    //开始传送起始信号
	IicSentByte(Device|0x01);							                //传送读取信号
    for(i=0;i<DataLend-1;i++)	
    {
        IIcBuf[i]=IicReceiveByte();
		SendAcknowledge(0);
    }							                                        //从slave端读取一个数据并存入变量bytedata								                   //Master端送出确认的信号等于1
	IIcBuf[i]=IicReceiveByte();
	SendAcknowledge(1);
	IicStop();									                        //传送停止信号

}
void IicByteWrite(unsigned char device,unsigned char address,unsigned char bytedata)//写数据到指定地址
{                                                                       //
	unsigned char i;                                                    //
	bit ack;                                                            //  

	FgTimeout=1;
	IicWP=0;                                                            //
	for(i=0;i<10;i++)		                                            //
	{                                                                   //
		IicStart();						                                //
		ack=IicSentByte(device);			                            //
		if(ack==1)							                            //
		{                                                               //
			IicStop();						                            //
			continue;						                            //
		}                                                               //
		ack=IicSentByte(address);				                        //
		if(ack==1)							                            //
		{                                                               //
			IicStop();							                        //
			continue;							                        //
		}                                                               //
		ack=IicSentByte(bytedata);				                        //
		if(ack==1)								                        //
		{                                                               //
			IicStop();						                            //
			continue;							                        //
		}                                                               //
		IicStop();							                            //
		FgTimeout=0;						                            //
		if(ack==0)							                            //
		break;                                                          //
	}    								                                //
	Delay(200);							                                //
	IicWP=1;

}
                                                                        //
unsigned char IicReceiveByte(void)										//从slave端读取一个数据*/
{
	unsigned char i;												    //*定义变量 i 和变量 bytedata */
	unsigned char bytedata=0;
	IicSDA=1;
	for(i=0;i<8;i++)												    //由于读的时一个字节的数据所以要循环8次*/
	{
		IicSCL=1;													    //先将SCL设定为1,并等待一定的时间*/
		IicWait();

		bytedata<<=1;												    //先将数据变量bytedata左移1位---*/
		if (IicSDA) bytedata |=0x01;									//此时如果SDA=“1”则将接受到的数据加(bit0=1)1---*/
																        //否则自动清楚为0*/
		IicSCL=0;													    //SCL恢复为0,并等待一定的时间*/
		IicWait();
	}
	return bytedata;												    //*返回调用程序*/
}

bit IicSentByte(unsigned char bytedata)							        //传送一个 Byte 数据到 slave */
{
	unsigned char i;												    //定义一个变量 i */
	bit ack;														    //定义一个变量 ack */
	for(i=0;i<8;i++)												    //循环8次*/
	{
		if(bytedata & 0x80)
		{												      	    //bytedata和0x80作AND逻辑运算等于0x80---*/
			IicSDA=1;
																    //即表示位7等于1则条件成立---*/
		}
		else
		{
			IicSDA=0;
																    //所以设定SDA=1,否则清除SDA=0*/
		}
		bytedata <<=1;												    //每传送1位,则须将待传送的数据左移1位,以便继续测试下1位*/
		IicWait();												    //延时等候*/

		IicSCL=1;
																    //SCL置位*/
		IicWait();												    //延时等候*/
		IicSCL=0;
																    //SCL清零*/
		IicWait();												    //延时等候---SCL作“1”---“0”的变化*/
	}
	IicSDA=1;															    //SDA置位*/
	IicWait();													    //延时等候*/
	IicSCL=1;																    //SCL置位*/
	IicWait();													    //延时等候---SDA先设定为1,SCL也设定为1,等待确认信号的出现*/
	ack=IicSDA;														    //读取确认信号*/
	IicSCL=0;
																    //将SCL恢复为0电平*/
	IicWait();													    //延时等候*/
	return ack;													    //返回确认信号到原调用程序*/
}
void IicStart(void)													    //起始信号*/
{
	IicSDA=1;														    //数据线等于1*/
	IicSCL=1;														    //时钟线等于1*/
	IicWait();													    //延时等候*/
	IicSDA=0;														    //数据线等于0*/
	IicWait();													    //延时等候*/
	IicSCL=0;														    //时钟线等于0*/
}
void IicStop(void)													    //停止信号*/
{
	IicSDA=0;														    //数据线清零*/
	IicWait();													    //延时等候*/
	IicSCL=1;														    //时钟线置位*/
	IicWait();													    //延时等候*/
	IicSDA=1;														    //数据线置位*/
}
void IicWait(void)													    //等候
{
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
}
void SendAcknowledge(bit ack)											    //应答信号*/
{
	IicSDA=ack;														    //发送应答信号ack*/
	//IicWait();
	IicSCL=1;														    //SCL作“1”到“0”的变化*/
	IicWait();
	IicSCL=0;
	//IicWait();
}
//-----***-1621-***-----//
void LcdStart(void)
{
    LcdCs=0;
    Delay(LcdDelay);
}

void LcdStop(void)
{
	LcdCs=1;
    Delay(LcdDelay);
}
void LcdSendId(unsigned char ID)
{
	unsigned char data i;

	for(i=3;i>0;i--)
	{
		LcdWr=0;
		Delay(LcdDelay);

		if((ID&0x80)==0x80)
		{
		  	LcdData=1;
		}
		else
		{
			LcdData=0;
		}
		LcdWr=1;
		Delay(LcdDelay);
		ID=ID<<1;
    }
}
void LcdSendAddress(unsigned char Address)
{
	unsigned char data i;
	
	for(i=6;i>0;i--)
	{
		LcdWr=0;
		Delay(LcdDelay);	  	
		if((Address&0x80)==0x80)
		{
		  	LcdData=1;
		}
		else
		{
	        LcdData=0;;
		}
		LcdWr=1;
		Delay(LcdDelay);		
		Address=Address<<1;
	}
}
void LcdSendByte(unsigned char Data)
{
	unsigned char data i,k;
	for(i=2;i>0;i--)
	{

		for(k=4;k>0;k--)
		{
			LcdWr=0;
			Delay(LcdDelay);
			if((Data&0x80)==0x80)
			{
		  		LcdData=1;
			}
			else
			{
				LcdData=0;
		    }
			LcdWr=1;
			Delay(LcdDelay);
			Data=Data<<1;
		}
	}
}
void LcdSendCommand(unsigned char Command)
{
	unsigned char data i;
    LcdStart();
	LcdSendId(0x80);
	for(i=0;i<9;i++)
	{
		LcdWr=0;
		Delay(LcdDelay);
		if((Command&0x80)==0x80)
		{
		  	LcdData=1;
		}
		else
		{
			LcdData=0;
		}
		LcdWr=1;
		Delay(LcdDelay);
		Command=Command<<1;
	}
	LcdStop();
}
//-----***-16近制数据转化为BCD-***-----//
unsigned char HexToBcd(unsigned char Bytedata)
{
	unsigned char ii,Byte;					/*定义减数i,被减数j,相减蚀锡k,余数h*/
	ii=0;
	while(Bytedata>=0x0a)
	{
		Bytedata=Bytedata-0x0a;
		ii=ii+1;
	}
    Byte=16*ii+Bytedata;
	return Byte;	
}
//-----***-BCD数据转化为16近制-***-----//
unsigned char BcdToHex(unsigned char Bytedata)
{
	unsigned char i,j,Byte;					/*定义减数i,被减数j,相减蚀锡k,余数h*/
	i=Bytedata & 0xf0;
	j=Bytedata & 0x0f;
	Byte=10*(i>>4)+j;
	return Byte;
}
//-----***-通过485发送一个字节-***-----//
void SeriesSentByte(unsigned char Byte)
{
    unsigned char idata i,j,k;
    k=Byte;	
	DIR=0;										    /*创建一个停止位*/
	for(i=0;i<8;i++)
    {
       if(k & 0x80)
       {												      	    //bytedata和0x80作AND逻辑运算等于0x80---*/
           	j++;
           	if(j==2)
            {
               j=0;
            }         																    //即表示位7等于1则条件成立---*/
       }
       k <<=1;	
    }								                    //禁止串口中断*/    
    if(j==0)
    {
        TB8=0;     
    }
    else
    {
        TB8=1;
    }
	SBUF=Byte;									/*发送数据*/
	while(TI!=1);									/*等待发送完毕*/
	TI=0;										/*发送中断标志清零*/
	DIR=1;
}
void ToDay(unsigned char Day)
{
    unsigned char data i;
    for(i=0x1f;i<Day;i++)
    {                                                               
        if(IIcByteStar==0)
        {
            IIcByteStar=0xc0;
        }
        IIcByteStar=IIcByteStar-16;
    }
}
void ClerBuf(void)
{
	unsigned char data i;
    //清除接收缓存	
	TimeSendFg=0;
	for(i=0;i<60;i++)
	{
		ComDataBuf[i]=0;
	}	
}
void ClerData(void)
{
	unsigned char i,j;
	//清除IIC
	EA=0;
	for(i=0;i<255;i++)
    {
       IicByteWrite(0xa0,i,0x00);           //
    }
    //编程初始密码:123456
    j=0x56;
	for(i=0;i<3;i++)
	{
		IicByteWrite(0xa0,0x4c+i,j);
		j=j-0x22;
	}
    //清零初始密码:123456
	j=0x56;
	for(i=0;i<3;i++)
	{
	    IicByteWrite(0xa0,0x50+i,j);
	    j=j-0x22;
	}
    //默认时段08:00---21:00峰段21:00---08:00谷段(分-时)
    IicByteWrite(0xa0,0x80,0x02);
    IicByteWrite(0xa0,0x82,0x08);
    IicByteWrite(0xa0,0x83,0x04);
    IicByteWrite(0xa0,0x85,0x21);
    //时段数目默认值:2
    IicByteWrite(0xa0,0xa5,2);
    //液晶显示时间设置默认值:10s
    IicByteWrite(0xa0,0x62,10);
    //清零次数2
    IicByteWrite(0xa0,0x6a,0x02);
    EA=1;
}
//-----***-数据提取-***-----//
void DataPickup(void)
{
    unsigned char idata i,j;
	EA=0;
    j=0x00;
    for(i=0;i<4;i++)
    {
        SumPulseData[i]=IicByteRead(0xa0,j);
        FengPulseData[i]=IicByteRead(0xa0,j+4);
        PingPulseData[i]=IicByteRead(0xa0,j+8);
        GuPulseData[i]=IicByteRead(0xa0,j+12);
        j++;
    }
	IicMuchByteRead(0xa0,0x34,3);
	for(i=0;i<3;i++)
	{
		ReverseTime[i]=IIcBuf[i];
	}
	LcdShowTime=IicByteRead(0xa0,0x62);
	LcdShowBit[1]=IicByteRead(0xa0,0x63);
	LcdShowBit[0]=IicByteRead(0xa0,0x64);	
	MataStData=IicByteRead(0xa0,0x65);	
	PulseData=IicByteRead(0xa0,0x70);
	EA=1;
}
//-----***-数据保存-***-----//
void DataSave(void)
{
    EA=0;

	EA=1;
}

⌨️ 快捷键说明

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