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

📄 function.c

📁 单片机的主控端
💻 C
📖 第 1 页 / 共 2 页
字号:
    {
        Tmp_Data[num]=ScanIic();
        SendACK();
    }
    Tmp_Data[num]=ScanIic();
    SendNotACK();
    EndIic;
}

UCHAR Read_I2c_byte(UCHAR AddressH,UCHAR AddressL)        
{
    UCHAR num;
    StartIic;
    Write_8bit(Iic_Write);
    Write_8bit(AddressH);
    Write_8bit(AddressL);  //write address to i2c; 
    StartIic;
    Write_8bit(Iic_Read);
    num=ScanIic();
    SendNotACK();
    EndIic;
	return num;
}

void Write_I2c_Page(UCHAR * Tmp_Data, UCHAR num_array)
{
    UCHAR num;
    StartIic;
    Write_8bit(Iic_Write);
    Write_8bit(AddressH);
    Write_8bit(AddressL);
    for(num=0;num<num_array;num++)
    {
        Write_8bit(Tmp_Data[num]);
    }
    EndIic;
    num=0;
    while(num<250){Wait_Nop;Wait_Nop;num++;}
}

void Write_I2c_byte(UCHAR AddressH,UCHAR AddressL,UCHAR data_to_write)
{
	UCHAR num;
    StartIic;
    Write_8bit(Iic_Write);
    Write_8bit(AddressH);
    Write_8bit(AddressL);
    Write_8bit(data_to_write);
    EndIic;
    num=0;
    while(num<250){Wait_Nop;Wait_Nop;num++;}
}


bit Write_8bit(UCHAR ch)
{
    UCHAR i;
    for(i=0;i<8;i++)
    {
        SDA=(bit)(ch&0x80);
        ch<<=1;
        SCL=1;
        Wait_Nop;
        SCL=0;
        Wait_Nop;
    }
    return(CheckACK());
}

UCHAR ScanIic(void)
{
    UCHAR i,j;/*IIC data*/
    SDA=1;
    j=0;
    for(i=0;i<8;i++)
    {
        SCL=1;
        j<<=1;/*这个指令已经有15个周期,所以无须再延时*/
        j|=SDA;/*Scan 0*/    /*Scan 1*/
        SCL=0;
    }
    return j;
}

bit CheckACK(void)
{
    SDA=1;
    SCL=1;
    Wait_Nop;
    if(SDA==1)return SDA;
    if(SDA==1)return SDA;
    if(SDA==1)return SDA;
    SCL=0;
}

void SendACK(void)
{
    SDA=0;
    SCL=1;
    Wait_Nop;
    SCL=0;
    SDA=1;
    
}

void SendNotACK(void)
{
    SDA=1;
    SCL=1;
    Wait_Nop;
    SCL=0;
    SDA=0;
}


void SetInit()
{
	SCON = 0xf0;
 	TR1  = 1;
	RI   = 0;
 	TI   = 0;
	EA   = 1;
}

void Prepare()                              
{
	UCHAR tmp,highByte,lowByte;
	Write_Display(welString);//welString[32] = "SEARCHING CELLS PLEASE WAIT...  ";
	Delay5s();
	QueryCell();
	tmp = cellInfo.length;               //acquire the number of cells
	cellInfo.point = (cellInfo.length == 0)?0:(cellInfo.length-1);     //point to the last cell
	LCDClr();
	LCDString(0,allNumber,16);				//allNumber[16] = "ALL :     CELLS ";
	highByte = (tmp/10) + 0x30;//change hex to ascii
	lowByte  = (tmp%10) + 0x30;
	LCDChar(6,highByte);
	LCDChar(7,lowByte);
	tmp = cellInfo.cellStack[cellInfo.point];
	highByte = (tmp/10 + 0x30);
	lowByte  = (tmp%10 + 0x30);
	LCDChar(16,highByte);		                      //最大基站号
	LCDChar(17,lowByte);
	Delay5s();
}

void QueryCell()       //query the cells and return the number of cells                
{
	UCHAR currentCell,highByte,lowByte,i,j;
	UCHAR AddressL=1;
	UCHAR AddressH=0;
	bit rightFlag;
	p = &QUERY;
	for(currentCell=1; currentCell<=CELLMAXNUM; currentCell++)//CELLMAXNUM 可以修改CELL组数
	{
		highByte = (currentCell/10) + 0x30;
 	    lowByte  = (currentCell%10) + 0x30;
		LCDChar(30,highByte);
        LCDChar(31,lowByte);                //display the querying cell
		for(i = 0;i<8;i++)
			UIData[i]=0;
		for(j=0;j<3;j++)
		{
			TB8 = 1;              //sign address flag
			SBUF = currentCell;   //send cell address
			while(!sendFlag);
			sendFlag = 0;
			SEND_RECEIVE = 0;     //receive status
			TR0 = 1;              //open the timer0,avoid no response
			while(!receiveFlag && !responseFlag);
			SEND_RECEIVE = 1;     //send status
			if(receiveFlag)
			{
				if((UIData[0]==0xaa)&&(UIData[1]==0xaa)&&(UIData[2]==0xaa)&&(UIData[3]==0xaa)&&(UIData[4]==0xaa)&&(UIData[5]==0xaa))
					{
						rightFlag = 1;
						Write_I2c_byte(0,AddressL,currentCell);//save the cell number;total 15cells can be stored;
						AddressL++;
					}
				else
 		    		rightFlag = 0;
			}
			else
				rightFlag = 0;
			receiveFlag = 0;
			responseFlag = 0;
			if(rightFlag)
			{
				cellInfo.cellStack[cellInfo.length++] = currentCell;
			    rightFlag = 0;
				break;
			}
		}
	}
}

void GatherDis()
{
	LCDClr();
	Write_Display(gatherProcess); //gatherProcess[32] = "CELLGATHERING PLEASE WAIT...";
}

void SendGather()
{
	UCHAR i;
	/*
	for(i = 0;i<16;i++)
		Delay5s();
		*/
	p = &GATHER;
	TB8 = 1;              //sign address flag
	SBUF = COMMON;        //send common address
	while(!sendFlag);
	sendFlag = 0;
	for(i = 0;i < 250;i ++)
		Delay(255);
}

void TransferDis()
{
	LCDClr();
	Write_Display(dataGetProcess); //dataGetProcess[32] = "DATA TRANSFERINGPLEASE   WAIT...";
	Delay5s();
}

void TransferIng()
{
    UCHAR cellPoint,highByte,lowByte,datatmp,i;
    receiveFlag = 0;
    responseFlag = 0;
    //在0x00地址保存接收数据组数
    if(cellInfo.length == 0)            //得到最大基站号
        {
            cellPoint = 0;
			Write_Display(Nocell);
			Delay5s();
        }
    else
        {
            cellPoint = cellInfo.length-1;
        }
    AddressL= 0;
    AddressH= 0;
    Write_I2c_Page(&groupCurrent, 1);//保存当前组数
    AddressL = (groupCurrent-1)*2+0x10;
    Write_I2c_Page(&cellInfo.length, 1);
    AddressL ++;
    Write_I2c_Page(&cellInfo.cellStack[cellPoint], 1);
    
	p = &TRANSFER;
	for(cellPoint = 0; cellPoint < cellInfo.length ; cellPoint ++)
	{
		for(i = 0;i<8;i++)
			UIData[i]=0;
			/*
		for(i = 0;i<2;i++)
			Delay5s();
			*/
//		Delay5s();
//		Delay5s();
//		Delay5s();

		TB8 = 1;              //sign address flag
		datatmp = cellInfo.cellStack[cellPoint];          //cell address
		SBUF = datatmp;       //send cell address
		while(!sendFlag);
		sendFlag = 0;
		SEND_RECEIVE = 0;     //receive status
		TR0 = 1;              //open the timer0,avoid no response
		while(!receiveFlag && !responseFlag);
		SEND_RECEIVE = 1;     //send status
		LCDClr();
		LCDString(0,allNumber,16);				//allNumber[16] = "ALL :     CELLS ";
		highByte = (cellInfo.length/10) + 0x30;
		lowByte  = (cellInfo.length%10) + 0x30;
		LCDChar(6,highByte);
		LCDChar(7,lowByte);
        if(receiveFlag)
        {
            highByte = (datatmp/10) + 0x30;
            lowByte  = (datatmp%10) + 0x30;
            LCDChar(16,highByte);	                     
            LCDChar(17,lowByte);                      //display the current cell number
	/*		
			//以下代码根据采集数据判断基站电池状态,并显示
			if((UIData[2]&0x30)!=0)
			{
				SOUND = 1;
			}			
			else
			{
				SOUND = 0;
			}

  */
/* change the gain according to the cell number

			switch(cellPoint)
			{
				case 3:
				{GAINU=1.0;
					break;}
				case 5:
				{GAINU=1.0;
					break;}
				case 7:
				{GAINU=1.0;
					break;}
				case 0x0b:
				{GAINU=1.0;
					break;}
				case 0x0d:
				{GAINU=1.0;
					break;}
				default:
				{GAINU=0.6575;
					break;}
			}
*/
            showFloat(cellPoint);	//显示当前测量结果
            Delay5s();		//延时,方便记录
    		Delay5s();
			Delay5s();
			Delay5s();


            SaveCellDataToEEPROM(groupCurrent,cellInfo.cellStack[cellPoint]);//保存数据
            Save_Display();  //????????
			showFloat(cellPoint);	//显示当前测量结果
        }
		//else
		//	cellPoint -- ;
		receiveFlag = 0;
		responseFlag = 0;
	}
}

void Save_Display()          //???????????????
{
	UCHAR highByte,lowByte,i;
	//save to the eeprom;
	for(i = 0;i < 8;i ++)
	{
		highByte = (UIData[i]/16) + 0x30;
		lowByte  = (UIData[i]%16) + 0x30;              
		if(highByte>'9')
			highByte = highByte - ':' + 'a';
		if(lowByte>'9')
			lowByte = lowByte - ':' + 'a';
		LCDChar(2*i+20,highByte);
		LCDChar(2*i+21,lowByte);
	}
}

void SaveCellDataToEEPROM(UCHAR group,UCHAR currentCell)
{
    //UIData
    UINT EEPaddr;  //e2prom里的实际地址
    EEPaddr = (group-1)*160+0xA0 + (currentCell-1)*8;  //计算改组内基站数据地址
    AddressL= (UCHAR)(EEPaddr&0x00ff);
    AddressH= (UCHAR)(EEPaddr>>8);
    Write_I2c_Page(UIData,8);
    
}


void Write_I2c_Page0(void)
{
    UCHAR num;
	UCHAR temp;
	UCHAR num1;
	UCHAR num2=0;
	UCHAR ADDRH;
	UCHAR ADDRL;
	UINT addr;
    for(num1=0;num1<64;num++)
	{
    	addr=num1*num2;
		ADDRL= (UCHAR)(addr&0x00ff);
    	ADDRH= (UCHAR)(addr>>8);
		StartIic;
    	Write_8bit(Iic_Write);
    	Write_8bit(ADDRH);
    	Write_8bit(ADDRL);
    	for(num=0;num<128;num++)
    	{
        	Write_8bit(0xff);
    	}
    	EndIic;
    	num=0;
    	while(num<250){Wait_Nop;Wait_Nop;num++;}
		
		temp = (addr%10) + 0x30;
	    LCDChar(31,temp);
		addr /= 10;

		temp = (addr%10) + 0x30;
	    LCDChar(30,temp);
		addr /= 10;

		temp = (addr%10) + 0x30;
	    LCDChar(29,temp);
		addr /= 10;

		temp = (addr%10) + 0x30;
	    LCDChar(28,temp);
		
		num2+=128;
    }
}

void Query_I2c_Page(void)
{
	UCHAR num;
	UCHAR pos;
	UCHAR temp;
	UCHAR GROUPP;
	UCHAR totalnum;
	NUM_GROUG_DISPLAY();//TOTAL    CELLS      GROUP DATA   ;
    totalnum=Read_I2c_byte(0,0x10);//HEX
	temp = (totalnum%10) + 0x30;
	LCDChar(6,temp);
	totalnum /= 10;
	temp = (totalnum%10) + 0x30;
    LCDChar(7,temp);
	GROUPP=Read_I2c_byte(0,0);//HEX
	temp = (GROUPP%10) + 0x30;
	LCDChar(12,temp);
	GROUPP /= 10;
	temp = (GROUPP%10) + 0x30;
    LCDChar(13,temp);
	Delay5s();
	Delay5s();
	EEPnum_Display();
	for (num=1;num<=totalnum;num++)
	{
		pos=16+3*(num-1);
		if(pos>30)
		pos=pos-15;
		GROUPP=Read_I2c_byte(0,num);
		temp = (GROUPP%10) + 0x30;
		LCDChar(pos,temp);
		GROUPP /= 10;
		temp = (GROUPP%10) + 0x30;
    	LCDChar(pos+1,temp);
		Delay5s();

		
	}
		EEPQ_Display();
}



	

⌨️ 快捷键说明

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