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

📄 power.c

📁 26 路电压自动测试 电脑显示保存测试数据
💻 C
📖 第 1 页 / 共 3 页
字号:
/**  功放测试板,一块板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 + -