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

📄 power.c

📁 26 路电压自动测试 电脑显示保存测试数据
💻 C
📖 第 1 页 / 共 3 页
字号:
		while ( scan_key(1,Key_Star) );

		//while( scan_key(0,Key_Star) & scan_key(0,Key_ExtContro) );   /*  需按启动键,或有外部控制信号继续测下块板  */
	}

}

/* 数模转换 */
long  adc()
{
	long  result_574 = 0;                                 /* 保存 ad574 输出的二进制数据  */
	long  dec_result = 0;                                 /* 保存十进制结果 */
	delay(20ms);
	write( U10_8255, port_C, 0x20 );                      /* ad574.CE = 1 ,ad574.R/~C = 0, 启动 574  转换  */

	do
	{
		result_574 = read_574( port_C );

	} while  ( result_574  & 0x00000001 );                  /* 等待 ad574 转换完毕,STATUS 为0  */

	write( U10_8255, port_C, 0x30 );                      /* ad574.CE = 1 ,ad574.R/~C = 1, 设置可读  */
	result_574 = read_574( port_A );                                  /* 读低 8 位  */
	result_574 = result_574 + ( read_574( port_B ) << 8 & 0x0f00 );   /* 读高 4 位  */

	/* 把 ad574 输出的二进制数据 result_574  转换成十进制, dec_result 保存十进制结果*/
	if ( result_574 < 0x0800 )
	{
                result_574 =  0x0800 - result_574 ;                /*  结果为负  */
		result_574 =  0 - result_574 ;
	}
	else
	{
			result_574 = result_574 - 0x0800 ;                   /* 结果为正, 减 -10v 基准,如 5.2888v 表示为 52888 */
	}
        dec_result =  result_574 * 487 ;                        /* ad574 分辨率 每格 4.88mv 以 -10v 为基准 */
        dec_result /= 10 ;
        return dec_result ;
}

/* 通过232口 传每次测的数据给PC  */
/*  max232的12脚接89C52的P3.0(RXD,10脚), max232的11脚接89C52的P3.1(TXD,11脚)   */
/*  ic232的13脚接pc232中(3)RXD,14接(2)TXD,地接5  // 48 - 57 : 0 - 9, 65 - 90 : A - Z */
void sendlong_to_pc232 ( long num )
{
	uchar i = 0, ch;
 	for ( i = 0 ; i < 8 ; i ++ )
	{
		ch = (num >>  ((7 - i) * 4) ) & 0x0f;

		if( ch < 10 )
		{
			ch = ch + 48;
		}
		else
		{
			ch = ch + 55;
		}
		sendchar_to_pc232( ch );
	}
}

/* 初始化 89c52 串口寄存器, ic232的13脚接pc232中(3),14接(2),地接5 */
void init_serial232comm()
{
        SCON = 0x50;      //SCON: serail mode 1, 8-bit UART, enable ucvr
        TMOD |= 0x20;     //TMOD: timer 1, mode 2, 8-bit reload
        PCON |= 0x80;     //SMOD=1;
                          //TH1 = 0xFA ;     //Baud:4800 fosc=11.0592MHz
        TH1 = 0xF3;       //Baud:4800 fosc=12MHz
        IE |= 0x90;       //Enable Serial Interrupt
        TR1 = 1;          //timer 1 run
}

/* 保存从 PC 传来的设置 到 ic: At24c32 */
void  save_set_to_At24c32()
{
	uchar i;
	uint addrees;
	long save_data;

	for( i = 0; i < 5; i ++) sendchar_to_pc232('E');
        sendchar_to_pc232(NewLine);

	while(1)
	{
		while ( (inbuf_232[Inbuf_232_Len - 1] != 'E') & (inbuf_232[0] != 'Z'));  /* 等待 单串结尾为E 全部结尾Z  */

		if (inbuf_232[0] == 'Z')
		{
			sendchar_to_pc232('E');                             /* 发生 E 到pc,表示收到 */
			sendchar_to_pc232(NewLine); 			    /* 定义标准字符的换行符号一行发送完毕 */
			break;
		}

		addrees = (inbuf_232[1]-Ch) * 100 + (inbuf_232[2]-Ch) * 10 + (inbuf_232[3]-Ch);        /* 解出地址码 */

		/* 解出数据码 */
		save_data =  ((long)(inbuf_232[5]-Ch)) * 10000000 + ((long)(inbuf_232[6]-Ch)) * 1000000 +
		             ((long)(inbuf_232[7]-Ch)) * 100000   + ((long)(inbuf_232[8]-Ch)) * 10000   +
		             ((long)(inbuf_232[9]-Ch)) * 1000     + ((long)(inbuf_232[10]-Ch))* 100     +
			     ((long)(inbuf_232[11]-Ch))* 10       + ((long)(inbuf_232[12]-Ch));

		if (inbuf_232[4] == '-')  save_data = 0 - save_data;     /* 解出+- 码 */

		write_24c32_long ( addrees ,save_data );            /* 保存到 24c32 */

                /* 保存与读出不一致则停止 */
                //if( save_data != read_24c32_long ( addrees ) ) break;

		inbuf_232[Inbuf_232_Len - 1] = '0';                 /* 置位 结尾符号 */
		sendchar_to_pc232('E');                             /* 发生 E 到pc,表示收到 */
		sendchar_to_pc232(NewLine); 			    /* 定义标准字符的换行符号一行发送完毕 */
	}
}

/* 读ad574各口数据 */
uint read_574( uchar port )
{
	uint  c51_in;
	P1 = U10_8255;     // CS
	delay(1ms);
	c51_in = XBYTE[ port ];
	delay(1ms);
	P1 = 0xff;
	return c51_in;
}

/* 串口中断,接收 电脑 传来的设置信息 */
void serial232_in () interrupt 4 using 3
{
	/* #define Inbuf_232_Len 14 ,定义接收PC数据的缓冲区的长度 */
	static uchar i  = 0;
	uchar ch;
	if (RI)
	{
	        RI = 0 ;
	        ch=SBUF;
	        if ( inbuf_232[0] == 'T' ) i = 0;
	        if (ch >  0x20 & ch < 0x7f)
		{
			inbuf_232[i] = ch;
			i++;
			if( inbuf_232[0] != 'A')  i = 0;
	        }

	        if ( i >= Inbuf_232_Len  )  i = 0;
	}
}

/* Key_state 为1时,等待按键复位,并检测与接收pc输入 */
bit  scan_key( bit Key_state, uchar Key )
{
        if ( (read_574( port_B ) & Key ) == 0 )
	{
		delay(8ms);
		if ( (read_574( port_B ) & Key ) == 0 )
		{
			if ( Key_state)
			{
				while(1)
				{
					if ( (read_574( port_B ) & Key ) != 0 )	break;
				}
			}
			return 0;
		}
	}

	if( inbuf_232[0] != '0' )
	{
		switch ( inbuf_232[0] )
		{
			case 'B':
                                /* 接收pc发来的'B'字符,开始接收设置数据  */
		                inbuf_232[0] = '0';
				press_led( open_all_led );
				save_set_to_At24c32();
				press_led( close_all_led );
				break;

			case 'S':
				/* 接收pc发来的'S'字符,开始接收设置数据  */
		                inbuf_232[0] = '0';
				send_set_to_pc();
				break;

			case 'T':
				/* 接收pc发来的'T'字符,发送T回应  */
		                inbuf_232[0] = '0';
				sendchar_to_pc232('T');
				sendchar_to_pc232(NewLine);
		}
		inbuf_232[0] = '0';
	}

	return 1;
}

/* 发出报警声音,并扫描按键 */
void  beep( uchar pass_or_ng)
{
	uchar i = 0;
	while(1)
	{
                ad574_value = adc();
                if( boolDC_AC == 1 )
                {
                        if( LimitUp > 80000 | LimitDown < -80000)
                        {
                                ad574_value = ad574_value * 8;
                        }
                }
		i = 0;
		while(i < 80 )
		{

                        audio_out = 1;
			delay( pass_or_ng + 2);
			audio_out = 0;
			delay( pass_or_ng + 2);
			i ++;
		}
                if( boolDC_AC == 2 )
                {
                        ad574_value = ad574_value / 80;
                        ad574_value = ad574_value * 10000;
                }
                led_display( ad574_value , 9 , 0 );
		if ( pass_or_ng == beep_PASS ) break;
		if ( !scan_key(0,Key_Cont) ) break;
	}
}

/* 通过IC 2803 切换 */
void  change_block(uchar block)
{
	block_char = block;
	write( U11_8255, port_B, block_char | led_char);
}

/* 通过IC 2803 切换外输入的六个通道 */
void  change_chunnel(uchar chunnel)
{
	change_block(0);
	delay( 100 ms);
	// 1,2,16,32,64,128
	if(chunnel <= 2)
	{
		change_block(chunnel);
	}
	else
	{
		chunnel = 1 << (chunnel + 1);
		change_block(chunnel);
	}
}

/* 发送单个字符到PC, 以 10 结尾表示发送完毕,新的一行 */
void  sendchar_to_pc232(uchar ch)
{
	delay( 1ms );
	SBUF= ch;
	delay( 1ms );
	while ( !TI );
	TI = 0;
}

/* 发送当前测试的端口号 */
void  sendChunnel( uchar Chunnel )
{
	if( Chunnel >= 20 )
	{
		sendchar_to_pc232('2');
	}
	else
	{
		if( Chunnel >= 10 )
		{
			sendchar_to_pc232('1');
		}
	}

	Chunnel = Chunnel % 10;
	sendchar_to_pc232( Chunnel + Ch);
}

/* 显示数据 */
void  write(uchar ic_8255cs, uchar port, uchar out_data)
{
	P1 = ic_8255cs;
	delay(5ms);
	XBYTE[ port ] = out_data;
	delay(5ms);
        P1 = 0xff;
}

/* 显示数据 */
void  display( uchar display_data )
{
	P1 = U11_8255;
	delay(5ms);
	XBYTE[ port_C ] = dec_to_hex(display_data);
	delay(5ms); P1 = 0xff;
}

/* 将 ic: At24c32 的设置数据发送到pc ,设置数据地址从 7 开始 */
//  00000007_00000001*00000008_00000000*00000009_00000000*0000000A_00000001*0000000B_00000000*0000000C_00000000*0000000D_00000001*
// _0000000E_00000001*0000000F_00000000*00000010_00000000*00000011_00000002*00000012_00000000*00000013_00000000*00000014_00000001*
// _00000015_00000001*00000016_00000000*00000017_00000000*00000018_00000003*00000019_00000000*0000001A_00000000*0000001B_00000001*
// _0000001C_00000001*0000001D_00000000*0000001E_00000000*0000001F_00000004*00000020_00000000*00000021_00000000*00000022_00000001*
// _00000023_00000001*00000024_00000000*00000025_00000000*00000026_00000005*00000027_00000000*00000028_00000000*00000029_00000001*
// _0000002A_00000001*0000002B_00000000*0000002C_00000000*0000002D_00000006*0000002E_00000000*0000002F_00000000*00000030_00000001*
// _00000031_00000001*00000032_00000000*00000033_00000000*00000034_00000007*00000035_00000000*00000036_00000000*00000037_00000001*
void  send_set_to_pc()
{
	uchar j;
	uchar i;
	uint addrees;
	ulong set_data;

	sendchar_to_pc232(' ');

	for( i = 1; ; i ++ )
	{
		for( j = 0; j < 7; j ++)
		{
			inbuf_232[0] = '0';

			addrees = i * 7 + j;

			set_data = read_24c32_long ( addrees );

			if( ( j == 0 ) && set_data == 0 )
	                {
                                /* 如果测试电压类型=0 则表示设置数据的结尾  */
				/* = 1: 测直流电压, = 2: 测交流纹波 */
	                        break;
	                }

			/* 发送 设置的地址  */
			sendlong_to_pc232( addrees );

			/* 地址 与 数据 间隔 '_' */
			sendchar_to_pc232('_');

⌨️ 快捷键说明

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