📄 power.c
字号:
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 + -