📄 power.c
字号:
/** 功放测试板,一块板12个端口,每次测试6个端口,每个端口分别测试幅度,失真度2项
* 幅度实际测试为转换后的DC, 失真度为虑波(1Khz,400hz)后的纹波,测试板用2个端口
* 一个测试DC,一个测试纹波,用于sts1177 700w
* 程序长度不能超过 4700 ( 0x1200 ) 电子世界2008.1:usb_ic: pdiusbd12, proteus仿真软件,液晶RT12865M:128*64
*
*/
// use ic : 74ls373 --533 74ls138 -- 256 74ls245 -- 445
//DB SB XR ROM(LARGE) ,DB SB OE ,DB SB XR ROM(LARGE) ,RS(256)
#include <reg51.h>
#include <absacc.h>
#include <At24c32.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define Key_Star 0x10 /* 定义启动键扫描的键值 */
#define Key_Cont 0x20 /* 定义下一步键的键值 */
#define Key_Auto 0x40 /* 定义是否自动键的键值 */
#define Key_ExtContro 0x80 /* 定义外部控制启动测试键的键值 */
//#define Key_StarOrExtContro 0x80
#define Inbuf_232_Len 14 /* 定义接收PC数据的缓冲区的长度 */
#define Ch 48 /* 定义标准字符的启始号 */
#define NewLine 10 /* 定义标准字符的换行符号,发送一行结束符号,pc程序认为是一行发送完毕 */
#define port_A 0xfffc /* 定义8255的各个端口的访问地址 */
#define port_B 0xfffd
#define port_C 0xfffe
#define port_Control 0xffff
#define U10_8255 0xf9 /* 定义接AD574的8255的片选 */
#define U11_8255 0xf8 /* 定义接输入输出控制的8255的片选 */
#define beep_NG 0 /* 定义NG报警 */
#define beep_PASS 1 /* 定义PASS报警 */
#define open_green_led 4 /* 定义点亮绿灯操作 */
#define open_red_led 8 /* 定义点亮红灯操作 */
#define open_all_led 12 /* 定义点亮红绿灯操作 */
#define close_all_led 0 /* 定义关闭红绿灯操作 */
#define dot 0 /* 定义小数点LED灯亮操作 0 */
#define minus 128 /* 定义负号和小数点LED灯亮操作 8 */
#define Begin 'B'
#define Test 'T'
//sbit SDA = P2^0; /* 定义24c32的SDA(5脚)接89c52的21脚 */
//sbit SCL = P2^1; /* 定义24c32的SCL(6脚)接89c52的22脚 */
/* 常数变量,按顺序保存测试各端口的继电器的控制时2803(U19)输出的脚位信号 */
uchar code Control[14] = { 0xff,0xfe,0xfd,0xfc, 0xfb,0xfa,0xf9, 0xf7,0xf6,0xf5,0xf4, 0xf3,0xf2,0xf1 };
uchar inbuf_232[Inbuf_232_Len]={ '0','0','0','0','0','0','0','0','0','0','0','0','0','0'}; /* 定义接收PC数据的缓冲区 */
uchar led_char;
uchar block_char;
uchar boolDC_AC = 0; /* 测试DC或AC */
sbit audio_out = P1^3;
sbit led_1 = P1^5; /* 十位数显示片选 */
sbit led_2 = P1^4; /* 个位数显示片选 */
sbit led_3 = P3^5; /* 十分位显示片选 */
sbit led_4 = P3^4; /* 百分位显示片选 */
sbit led_0 = P1^6; /* 负号/小数点显示片选 */
sbit led_opt = P1^7; /* 加减位数显示片选 */
sbit shift = P3^3; /* 设置数据 移位 */
sbit setup = P3^2; /* 设置字段 */
sbit up = P2^2; /* 数值加 */
sbit down = P2^3; /* 数值减 */
long ad574_value ; /* 保存从 AD574 转换后的数据 */
long LimitUp , LimitDown , delay_time ; /* 保存从24C32 读出的数据 */
void press_led( uchar led );
long adc(); /* 还回 ad574 输出的十进制结果 */
void sendlong_to_pc232( long num ); /* 发送数值到pc */
void sendchar_to_pc232(uchar ch); /* 发送单个字符到PC, 以 10 结尾表示发送完毕,新的一行 */
void sendChunnel( uchar Chunnel ); /* 发送当前测试的端口号 */
void init_serial232comm(); /* 初始化c51的各寄存器 */
void save_set_to_At24c32(); /* 接收pc的设置数据保存到 AT24C32 */
uint read_574( uchar port ); /* 读 AD574 的结果 */
bit scan_key( bit Key_state, uchar Key ); /* 按钮扫描 */
void beep(uchar pass_ng); /* 提示音输出 */
uchar dec_to_hex ( uchar dec) { return dec + ( dec / 10 ) * 6; } /* 10进制 转为 16 进制 */
void display( uchar display_data ); /* 显示数据 */
void send_set_to_pc(); /* 将 ic: At24c32 的设置数据发送到pc*/
void write(uchar ic_8255cs, uchar port, uchar out_data); /* 显示数据 */
void change_chunnel(uchar chunnel); /* 通过IC 2803 切换外输入的六个通道 */
void enact(); /*设置*/
void led_display( long led_disp, uchar led_bit, uchar bit_opt); /* LED显示测试电压数据/设置数据 */
void main()
{
/* 设置参数:直流电压 (V), 允许范围±(V), 纹波 (~V), 每步开始前延时,1000=1秒,必须是100的倍数, 自动(1)/手动(0) */
uchar i = 1, in_control = 0xff; /* i 为测试的端口号,IN_CONTROL 为继电器控制变量 */
bit flg_Ng = 0;
/* 保存 ok,ng 的值,以控制提示音 */
uchar Chunnel = 0;
led_display( 0 , 9 , 0 ) ;
P1 = 0xff ;
P2 = 0xff ;
P3 = 0xff ;
/* 初始化89C52的各寄存器 */
init_serial232comm();
/* 设置 U11_8255 A口 为输出,B口 为输出,C口 为输出*/
write( U11_8255, port_Control,0x80);
/* 设置接ad574的8255: A口 为输入,B口 为输入,PC0 - PC3口 为输入,PC4 - PC7口 为输出 */
write( U10_8255, port_Control,0x93);
/* 清零 */
if( shift == 0 & setup == 1 )
{
delay( 3000 ms );
if( shift == 0 & setup == 0 )
{
char i = 1 , j = 0 ;
press_led( open_all_led );
for( i = 1 ; i < 27 ; i ++ )
{
display( i );
for( j = 0 ; j < 8 ; j ++ )
{
write_24c32_long( i * 7 + j , 0 );
}
}
while( 1 )
{
delay( 500 ms );
press_led( open_all_led );
delay( 500ms );
press_led(close_all_led );
if( setup == 0 & setup == 0 ){ enact();}
}
}
}
/*设置*/
if( shift == 1 & setup == 0 ){ enact();}
while ( scan_key(1,Key_Star) );
i = 1;
change_chunnel( 0 ); /* 2803端口号 无输出 */
while ( 1 )
{
while(1)
{
inbuf_232[0] == '0';
boolDC_AC = read_24c32_long ( i * 7);
if(boolDC_AC == 0) { break; }
display( i );
if(boolDC_AC == 1)
{
/* 开始测量DC */
// Chunnel = read_24c32_long ( i * 7 + 4); /* 读测试的2803端口号 */
// change_chunnel( Chunnel ); /* 控制继电器转换2803 ic */
Chunnel = read_24c32_long ( i * 7 + 3); /* 读测试的端口号 */
in_control = Control[(Chunnel-1)/2]; /* 控制继电器转换变量 */
if( Chunnel % 2 == 0 )
{
in_control &= 0x7f; /* 测偶数端口 */
}
LimitUp = read_24c32_long(i * 7 + 1); /* 读DC设定值的上限 */
LimitDown = read_24c32_long(i * 7 + 2); /* 读DC设定值的下限 */
/* 如果设置值大于8V 则转换继电器 ,衰减 8 倍 */
if( LimitUp > 80000 | LimitDown < -80000)
{
if(Chunnel % 2 == 1){ in_control &= 0xef ;} /* RL17, 2803^14 */
else{ in_control &= 0xdf ;} /* 偶数RL16, 2803^15 */
}
/* 转换继电器,开始测量DC */
write( U11_8255, port_A, 0xff - in_control );
/* 从24C32 读延时值到变量 */
delay_time = read_24c32_long(i * 7 + 5);
if ( delay_time > 0 )
{
delay( (delay_time) ms);
}
/* 如果自动开关置位,则需手动按键并等待按键复位*/
if ( scan_key(0,Key_Auto) )
{
while ( scan_key(1,Key_Cont) )
{
ad574_value = adc();
if( LimitUp > 80000 | LimitDown < -80000 )
{
ad574_value = ad574_value * 8;
}
led_display( ad574_value , 9 , 0 );
}
}
/* 读自动,手动设置 */
Chunnel = read_24c32_long(i * 7 + 6);
if ( Chunnel == 0x0000 )
{
/* 如果等于0,则手动,等于1则自动,不需等待按键 */
while ( scan_key(1,Key_Cont) )
{
ad574_value = adc();
if( LimitUp > 80000 | LimitDown < -80000 )
{
ad574_value = ad574_value * 8;
}
led_display( ad574_value , 9 , 0 );
}
}
/* 取得 AD574 测的值 */
ad574_value = adc();
if( LimitUp > 80000 | LimitDown < -80000)
{
/* 因衰减了8倍,故乘回来 */
ad574_value = ad574_value * 8;
}
/* ad574_value 与设定值比较 ,unit : V */
if ( ad574_value > LimitUp | ad574_value < LimitDown )
{
flg_Ng = 1;
}
#define DC_Vol 'D'
#define SPLIT '_'
sendchar_to_pc232(DC_Vol );
sendChunnel(i); /* 发送已测试完的步数 */
sendchar_to_pc232(SPLIT );
sendChunnel(flg_Ng); /* 发送PASS,NG的信息 */
sendchar_to_pc232(SPLIT );
sendlong_to_pc232 ( ad574_value ); /* 发送到pc去保存 */
sendchar_to_pc232(NewLine); /* 定义标准字符的换行符号一行发送完毕 */
sendchar_to_pc232(NewLine); /* 定义标准字符的换行符号一行发送完毕 */
}
if(boolDC_AC == 2)
{
/* 开始测量AC */
//Chunnel = read_24c32_long ( i * 7 + 4); /* 读测试的2803端口号 */
//change_chunnel( Chunnel );
Chunnel = read_24c32_long ( i * 7 + 3); /* 读测试的端口号 */
in_control = Control[(Chunnel-1)/2]; /* 控制继电器转换变量 */
if( Chunnel % 2 == 0 )
{
in_control &= 0x7f; /* 测偶数端口 */
}
write( U11_8255, port_A, 0xff - ( in_control &= 0xbf )); /* 转换继电器,改测纹波 */
LimitUp = read_24c32_long(i * 7 + 1);
LimitDown = read_24c32_long(i * 7 + 2);
delay_time = read_24c32_long(i * 7 + 5); /* 从24C32 读延时值到变量 */
if ( delay_time > 0 )
{
delay( (delay_time) ms); /* 延时 delay_time ms */
}
delay( 10 ms);
/* 如果自动开关置位,则需手动按键并等待按键复位*/
if ( scan_key(0,Key_Auto) )
{
while ( scan_key(1,Key_Cont) )
{
ad574_value = adc();
ad574_value = ad574_value / 80;
ad574_value = ad574_value * 10000;
led_display( ad574_value , 9 , 0 );
}
}
/* 如果等于0,则手动等待按键,等于1则自动,不需等待按键 */
Chunnel = read_24c32_long(i * 7 + 6);
if ( Chunnel == 0x0000 )
{
while ( scan_key(1,Key_Cont) )
{
ad574_value = adc();
ad574_value = ad574_value / 80;
ad574_value = ad574_value * 10000;
led_display( ad574_value , 9 , 0 );
}
}
/* 测得纹波值 */
ad574_value = adc();
/* 纹波 输入 1 kHz,500mv 输出 4.00v ,输入 1 kHz,250mv 输出 2.00v*/
/* 把测得的值, 如 4.00v 转换成纹波实际值 500mv ,unit : mV */
ad574_value = ad574_value / 80;
ad574_value = ad574_value * 10000;
/* 比较纹波 */
if ( ad574_value > LimitUp | ad574_value < LimitDown )
{
flg_Ng = 1;
}
#define AC_Vol 'A'
sendchar_to_pc232(AC_Vol );
sendChunnel(i); /* 发送已测试完的步数 */
sendchar_to_pc232(SPLIT );
sendChunnel(flg_Ng); /* 发送PASS,NG的信息 */
sendchar_to_pc232(SPLIT );
sendlong_to_pc232 ( ad574_value ); /* 发送到pc去保存 */
sendchar_to_pc232(NewLine); /* 定义标准字符的换行符号一行发送完毕 */
sendchar_to_pc232(NewLine); /* 定义标准字符的换行符号一行发送完毕 */
}
/* 测试完每一步后(直流,交流), 显示 NG,PASS */
if ( flg_Ng )
{
press_led( open_red_led );
beep( beep_NG );
flg_Ng = 0;
led_display( 0 , 9 , 0 );
}
else
{
press_led( open_green_led );
}
i ++; /* 测试完的步数 */
}
i = 1; /* 准备测试下块板 */
change_chunnel( 0 );
beep( beep_PASS ); /* 提示测试完一块板,嘟嘟声 */
beep( beep_PASS );
led_display( 0 , 9 , 0 );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -