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

📄 host.c

📁 智能数字电流表。双CPU工作
💻 C
📖 第 1 页 / 共 3 页
字号:
				I_Send(uSelIndex);
				break;
			case 0xD0:  //右键, 右翻片子
				uSelIndex ++;
			    if (uSelIndex > 4) 
			        uSelIndex = 1;
				TRG = 1;
				TRG = 0;
				I_Send('P');
				Delay(1, 5);
				I_Send(uSelIndex);
				break;
			case 0xB0:  //MENU,取消操作
				TRG = 1;  //静止显示
				TRG = 0;
				I_Send('A'); 
				Delay(1, 1000);
				TRG = 1;   //停止闪烁
				TRG = 0;   
				I_Send('N');   
                KeyFuncIndex = 17;    //跳到上一层
                KeyFuncPtr = KeyTab[KeyFuncIndex].CurrentOperate;
        		(*KeyFuncPtr)();  //执行
				return;
			case 0x70:     //回车,确认操作
				TRG = 1;   //闪烁显示
				TRG = 0;
				I_Send('A');
				Delay(50, 1000); 
				//计算数据并保存
				Param.PointPos = uSelIndex;
				changed = 1;
				TRG = 1;   //停止闪烁
				TRG = 0;   
				I_Send('N'); 
				KeyFuncIndex = 8;    //跳回到2XXXX
                KeyFuncPtr = KeyTab[KeyFuncIndex].CurrentOperate;
        		(*KeyFuncPtr)();  //执行
				return;
			default:
				break;
			}
		}
		rst_wdog();
	}
	return;
}

void ALRLX() reentrant      //显示报警下限
{
	uchar ALR_L[] = {0x38, 0xB6, 0xB6, 0xB6, 0xB6};
	GetParamsCode(ALR_L, 1, Param.wALR_L.w);
	Hints(ALR_L);   //显示
	return;
}

void ALRHX() reentrant      //显示报警上限
{
	uchar ALR_H[] = {0xB6, 0xB6, 0xB6, 0xB6, 0xB6};
	GetParamsCode(ALR_H, 1, Param.wALR_H.w);
	Hints(ALR_H);   //显示
	return;
}

void AL_L() reentrant        //报警下限输入
{
	Hints(AL_LHint);    //显示AL.L
	return;
}

void AL_H() reentrant        //报警上限输出 
{
	Hints(AL_HHint);    //显示AL.H
	return;
}

void SetAL_L() reentrant     //设置低报警值
{
	uchar uKey;
	word  Value;
	word  wALR_L = Param.wALR_L.w;
	ALRLX();
	uKey = GetKeyValue(&Value, wALR_L, 4);
	KeyResult(uKey, 22, 23, Value);
	return;
}

void SetAL_H() reentrant     //设置高报警值 
{
	uchar uKey;
	word  Value;
	word  wALR_H = Param.wALR_H.w;
	ALRHX();
	uKey = GetKeyValue(&Value, wALR_H, 4);
	KeyResult(uKey, 23, 22, Value);
	return;
}

void Address() reentrant     //提示地址输入
{
	Hints(AddrHint);
	return;
}

void Baud() reentrant        //提示波特率输入   
{
	Hints(bAudHint);
	return;
}

void SetAddress() reentrant  //设置地址
{
	uchar uKey;
	word  Value = 0;
	byte  bAddress = Param. bAddress;
	AddrX();      //显示当前值
	uKey = GetKeyValue(&Value, bAddress, 3);
	KeyResult(uKey, 18, 19, Value);
	return;
}

void SetBaud() reentrant     //设置波特率
{
	uchar KeyValue;
	BaudX();
	while (1)
	{
		KeyValue = P2 & 0xF0;   //去掉低4位
		if (KeyValue != 0xF0)
		{
			Delay(15, 500);
			KeyValue = P2 & 0xF0;
			switch (KeyValue)
			{
			case 0xE0:  //左键, 向上翻
				Param.BaudIndex ++;
				Param.BaudIndex = Param.BaudIndex % 4;
			    Hints(Bauds[Param.BaudIndex]);
				break;
			case 0xD0:  //右键, 向下翻
				Param.BaudIndex --;
				Param.BaudIndex = Param.BaudIndex % 4;
			    Hints(Bauds[Param.BaudIndex]);
				break;
			case 0xB0:  //MENU,取消操作
				TRG = 1;  //静止显示
				TRG = 0;
				I_Send('A'); 
				Delay(1, 1000);
				TRG = 1;   //停止闪烁
				TRG = 0;   
				I_Send('N');   
                KeyFuncIndex = 19;    //跳到上一层
                KeyFuncPtr = KeyTab[KeyFuncIndex].CurrentOperate;
        		(*KeyFuncPtr)();  //执行
				return;
			case 0x70:  //回车,确认操作
				TRG = 1;  //静止显示
				TRG = 0;
				I_Send('A');
				//保存波特率
				switch (Param.BaudIndex)
				{
				case 0:
					break;
				case 1:
					break;
				case 2:
					break;
				case 3:
					break;
				}
				changed = 1;
				Delay(50, 1000);
				TRG = 1;   //停止闪烁
				TRG = 0;   
				I_Send('N');  
				KeyFuncIndex = 18;    //跳到AH.L
                KeyFuncPtr = KeyTab[KeyFuncIndex].CurrentOperate;
        		(*KeyFuncPtr)();  //执行
				return;
			default:
				break;
			}
		}
		rst_wdog();
	}
	return;
}

void SetTimer(uchar uIndex)  //设置定时器的参数   
{ 
	if (uIndex == 0)
	{
		TH1 = 0xF0;      //定时器时间设置1200
		PCON = 0x00;
	}
	  
	if (uIndex == 1)
	{
		TH1 = 0xF8;      //定时器时间设置2400
		PCON = 0x00;
	}
	rst_wdog();
	if (uIndex == 2)
	{
		TH1 = 0xFC;      //定时器时间设置4800
		PCON = 0x00;
	}	
	
	if (uIndex == 3)
	{
		TH1 = 0xFE;      //定时器时间设置9600
		PCON = 0x00;
	}
	rst_wdog();
}

void SendData(uchar uNum)     //发送串行口数据
{
	uchar i, uSum;
	rst_wdog();
	uSum = 0;
	DE = 1;
	
	SBUF = Param.bAddress;  //从机地址发回
	while (TI != 1)
	       rst_wdog();
	TI = 0;   	
		
	for (i=0; i<uNum; i++)
	{
		SBUF = Tarray[i];
		uSum +=  Tarray[i];
		while (TI != 1)
			rst_wdog();
		TI = 0;
		rst_wdog();
	}
	SBUF = uSum;
	while (TI == 0)
		rst_wdog();
	TI = 0;
}

bit ReceiveData(uchar uNum) //接收串行口数据      
{
	uchar i;
	uchar uSum;
	DE = 0;
	while (1)
	{
		rst_wdog();
		uSum = 0;
		for (i=0; i<uNum; i++)
		{
			while (RI != 1)
				rst_wdog();
			RI = 0;
			Rarray[i] = SBUF;
			uSum += Rarray[i];
			rst_wdog();
		}
	    while (RI != 1)
	           rst_wdog(); 
	    RI = 0;
		if (SBUF == uSum)     //校验和相同
		{
			DE = 1;
			SBUF = 0x00; 
			while (TI == 0)
				rst_wdog();
			TI = 0;
			return 1;
		}
		else  //不同,要求重新接收
		{
			DE = 1;
			SBUF = 0xFF;
			while (TI == 0)
				rst_wdog();
			TI = 0;
			return 0;
		}
	}
}

void ssio(void) interrupt 4 
{
	uchar uCmd;
	RI = 0;
	ES = 0;         //关串行口中断
	//非本机地址,继续监听
	if (SBUF != Param.bAddress)
	{
		ES = 1;
		DE = 0;  //允许接收
		rst_wdog();
		return;
	}
	SM2 = 0;       //取消监听状态
	
	/* 
    DE = 1;
	SBUF = Param.bAddress;  //从机地址发回
	while (TI != 1)
	       rst_wdog();
	TI = 0;   	
	*/	
	DE = 0;
	while (RI != 1)
		rst_wdog();
	RI = 0; 
	uCmd = SBUF;    //接收命令
	
    //命令分析
    if (uCmd == 0x87)  //查询数据
    {
    	//准备数据
    	Tarray[0] = 'I';    //电流符号
    	Tarray[1] = Param.Current.b[0];  //电流值
    	Tarray[2] = Param.Current.b[1];
    	Tarray[3] = Param.PointPos;      //小数点
        Tarray[4] = '+';   //符号
        //发送数据
		SendData(5); 
	}
	else if (uCmd == 0x81)  //查询倍率
	{
		 //准备倍率
    	 Tarray[0] = Param.wInput.b[0];  //输入
    	 Tarray[1] = Param.wInput.b[1];
    	 Tarray[2] = Param.wOutput.b[0]; //输出
    	 Tarray[3] = Param.wOutput.b[1]; 
    	 Tarray[4] = Param.PointPos;     //小数点
    	 //发送倍率
		 SendData(5); 
	}
	else if (uCmd == 0x84)  //查询报警
	{
		
    	//准备报警值
    	Tarray[0] = Param.wALR_H.b[0];    //报警上限
    	Tarray[1] = Param.wALR_H.b[1];    
    	Tarray[2] = Param.wALR_L.b[0];    //报警下限
    	Tarray[3] = Param.wALR_L.b[1];
    	Tarray[4] = Param.bAlert;         //报警允许位
    	//发送报警值
		SendData(5);	
	} 
	else if (uCmd == 0x80)  //设置倍率
	{
		//接收倍率
		if (ReceiveData(5))
		{
		    Param.wInput.b[0]  = Rarray[0];
		    Param.wInput.b[1]  = Rarray[1];
		    Param.wOutput.b[0] = Rarray[2];
		    Param.wOutput.b[1] = Rarray[3];
		    Param.PointPos     = Rarray[4];
		    
	    	//WriteParams();
		    //保存输入值到地址8, 输出值到10;
	        wren_cmd();
	        page_write(Param.wInput.b[0], Param.wInput.b[1],
		    Param.wOutput.b[0], Param.wOutput.b[1], 8);
		    //保存小数点到地址18
		    wren_cmd();	
		    byte_write(Param.PointPos, 18);
		    
	    }
	}	
	else if (uCmd == 0x83)  //设置波特率
	{
		//接收波特率
		if (ReceiveData(1))
		{
		    Param.BaudIndex = Rarray[0];
		    SetTimer(Param.BaudIndex);
		    
		    //WriteParams();
		    
		    //保存波特率
		    wren_cmd();
		    byte_write(Param.BaudIndex, 17);
		    
	    }
    }
	else if (uCmd == 0x82)  //设置报警值
	{
		//接收报警值
		if (ReceiveData(5))
		{
			Param.wALR_H.b[0] = Rarray[0];
			Param.wALR_H.b[1] = Rarray[1];
			Param.wALR_L.b[0] = Rarray[2];
			Param.wALR_L.b[1] = Rarray[3];
			Param.bAlert      = Rarray[4];
			//WriteParams();
			//保存报警下限到地址12,报警上限到地址14;
			wren_cmd();
			page_write(Param.wALR_L.b[0], Param.wALR_L.b[1],
			Param.wALR_H.b[0], Param.wALR_H.b[1], 12);
			//保存报警标志位到地址16
			wren_cmd();
			byte_write(Param.bAlert, 16);
		}
	}
	else //出错处理
	{
		DE = 1;
		SBUF = 0x80; //命令非法,发状态
		while (TI != 1)
			rst_wdog();
		TI = 0;
	}
	SM2 = 1; 
	ES = 1;   //恢复监听
	DE = 0;   //允许接收
}

void main()
{	
	uchar i, j; 
	//P2 = INIT_STATE;
	wren_cmd();/*写使能子程序*/
    wrsr_cmd();/*复位时间位和数据保护位写入状态寄存器*/

    RST = 0;
    RST = 1;
    Delay(1, 10);
    RST = 0;
    Param.wZero.dw = 0; //零位
	Param.wOutput.w = 2000;
	Param.wInput.w  = 5;
	Param.wInCount.dw = 2045;   //2453
	Param.PointPos = 3;
	Param.bAlert = 1;
	Param.Password.w = 0;
	Param.BaudIndex = 2;
	Param.wALR_L.w = 200;    //报警下限
	Param.wALR_H.w = 1800;    //报警上限
	Param.bAddress = 65;  //地址
	JDQL = 1;
	JDQH = 1;
	
	//WriteParams();	
	for (i=0; i<=9; i++)
	{
		TRG = 1;
	    TRG = 0;
	    I_Send('T');
    	Delay(1, 5);
    	rst_wdog();
        for (j=0; j<5; j++)
    	{
	    	 I_Send(uLEDChar[i]);
	    	 rst_wdog();
	    }
	    Delay(15, 1000);
	    rst_wdog();
	}
	ReadParams();
	/*
	Display(Param.wZero.dw, Param.PointPos);
	Delay(15, 1000);
	Display(Param.wOutput.w, Param.PointPos);
	Delay(15, 1000);
	Display(Param.wInput.w, Param.PointPos);
	Delay(15, 1000);
	Display(Param.bAlert, Param.PointPos);
	Delay(15, 1000);
	Display(Param.wInCount.dw, Param.PointPos);
	Delay(15, 1000);
	Display(Param.wALR_L.w, Param.PointPos);
	Delay(15, 1000);
	Display(Param.wALR_H.w, Param.PointPos);
	Delay(15, 1000);
	Display(Param.bAddress, Param.PointPos);
	Delay(15, 1000);
	Display(Param.Password.w, Param.PointPos);
	Delay(15, 1000);
	Display(Param.BaudIndex, Param.PointPos);
	Delay(15, 1000);
	*/
	//设置波特率
	TMOD = 0x20;     //T1定义为模式2
	SetTimer(Param.BaudIndex);
	SCON = 0xF0;    //串行口方式3
	TR1 = 1;
	ES = 1;
	EA = 1;
	DE = 0;         //允许接收
	flag = 1;
	while (1)
	{
	    if (flag)
	    {
	    	uchar KeyValue;
	        DisplayCurrent();
			KeyValue = P2 & 0xF0;   //去掉低4位
			if (KeyValue == 0xB0)
			    flag = 0;
	    }
	    if (!flag)	
	        GetKeyInput();	
	    rst_wdog();    
	}
	return;
}

⌨️ 快捷键说明

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