📄 2.1 main.c
字号:
#include <reg52.h>
//#include <string.h>
#include <intrins.h>
#include <stdio.h>
#define uint unsigned int
#define uchar unsigned char
//#include "VI2C_C51.h"
#include "ocm4x8c串.h"
#define Debugging 1
sbit Rf=P3^2;
sbit Cf=P3^3;
sbit BELL=P3^5;
sbit DAT=P1^0;
sbit CLK=P1^1;
sbit CS=P1^2;
sbit LDM_CS=P1^5;
sbit LCM_STD=P1^6;
sbit LDM_SCLK=P1^7;
sbit RA=P2^0;
sbit RB=P2^1;
sbit RC=P2^2;
sbit CA=P2^3;
sbit CB=P2^4;
sbit STEP=P0^1;
sbit AUTOSTEP=P0^2;
sbit Mouse1=P0^5;
sbit Mouse2=P0^6;
sbit Mouse3=P0^7;
sbit MD=P0^4;
bit TestModel;
uchar OKLED;
uchar NGLED;
#define OK 33
#define NG 44
uchar Test_timer;
uchar Test_OKNG;
uchar Test_012;
uchar Test_Order;
uchar STEP_check;
uchar cycle;
uchar BELL_temp;
uchar BELL_Flash;
#define BELL_timer 6
unsigned long RC_timer;
unsigned long RCr_timer;
#define FN 12
uint RCtemp[FN];
//LED显示
void LEDshow(void)
{
uchar i;
for(i=0;i<7;i++)
{
if((NGLED>>(6-i))&1) DAT=1;
else DAT=0;
delay (5);
CLK=1;
delay (5);
CLK=0;
delay (5);
}
for(i=0;i<7;i++)
{
if((OKLED>>(6-i))&1)DAT=1; /*判断发送位*/
else DAT=0;
delay (5);
CLK=1;
delay (5);
CLK=0;
delay (5);
}
CS=1;
delay (5);
CS=0;
}
//串口初始化
void init_serialcomm(void)
{
SCON = 0x50; //串口模式: 模式1 接收允许
TMOD |= 0x20; //定时器模式:定时器工作在模式2
PCON |= 0x80; //SMOD=1; 倍波特率
TH1 = 0xF3; //Baud:9600fosc=24MHz
// ES = 1; //串行中断允许
TI = 1;
TR1 = 1; //定时器1启动
/* SCON = 0x50; //串口方式1,允许接收
TMOD = 0x20; //定时器1定时方式2
TCON = 0x40; //设定时器1开始计数
TH1 = 0xE8; //11.0592MHz 1200波特率
TL1 = 0xE8;
TR1 = 1; //启动定时器 */
}
//初始化定时器
void init_timer(void)
{
TH0=0;
TL0=0;
TMOD|=0x01; //工作方式1 16位计数方式
ET0=1; //定时器0中断允许
// TR0=1; //定时器0启动
}
//定时器0中断
void timer0(void) interrupt 1 using 1
{
if(++Test_timer>30) //超时1秒
{
IE0=0;
IE1=0;
TF0=0;
EX0=0;
EX1=0;
TR0=0;
Test_OKNG=NG;
}
if(BELL_temp>0)
{
Test_timer=0;
if(--BELL_temp==0)
{
if(BELL_Flash>0)
{
BELL_Flash--;
BELL_temp=BELL_timer;
BELL=~BELL;
}
else
{
BELL=1;
TR0=0;
}
}
}
else BELL=1;
}
//初始外部中断
void init_int(void)
{
IT0=1; //外部中断0边沿触发
// EX0=1; //外部中断0允许中断
IT1=1;
// EX1=1;
}
//外部中断0
void int0(void) interrupt 0 using 2
{
uint temp;
temp=TH0;
temp=(temp<<8)+TL0;
TH0=0;
TL0=0;
cycle++;
if(cycle>=50)
{
RCtemp[cycle-50]=temp;
if(cycle==(FN+50-1))
{
TF0=0;
IE0=0;
TR0=0;
EX0=0;
cycle=0;
Test_OKNG=OK;
}
}
}
//外部中断1
void int1(void) interrupt 2 using 3
{
uint temp;
temp=TH0;
temp=(temp<<8)+TL0;
TH0=0;
TL0=0;
cycle++;
if(cycle>=50)
{
RCtemp[cycle-50]=temp;
if(cycle==(FN+50-1))
{
TF0=0;
IE1=0;
TR0=0;
EX1=0;
cycle=0;
Test_OKNG=OK;
}
}
}
void TEST_GO(void)
{
BELL=1;
BELL_Flash=0;
BELL_temp=0;
Test_timer=0;
Test_OKNG=0;
cycle=0;
IE0=0;
IE1=0;
TF0=0;
if(Test_Order<5) EX0=1;
else EX1=1;
TH0=0;
TL0=0;
TR0=1;
}
void BB(uchar i)
{
BELL=0;
TH0=0;
TL0=0;
TR0=1;
if(i==OK)
{
BELL_temp=BELL_timer*2;
}
else
{
BELL_temp=BELL_timer;
BELL_Flash=2;
}
}
uint Filtering(uint *RCi)
{
unsigned long temp;
uchar i,j;
for (j=0;j<FN-1;j++)
{
for (i=0;i<FN-j;i++)
{
if (RCi[i]>RCi[i+1])
{
temp=RCi[i];
RCi[i]=RCi[i+1];
RCi[i]=temp;
}
}
}
temp=0;
for(i=2;i<FN-2;i++) temp+=RCi[i];
return (uint)(temp>>3);
}
uint code RCmaxmin[6][2]= //上下限
{
{12672,8448}, //10560 +-20%
{12672,8448}, //
{12672,8448}, //
{12672,8448}, //
{700, 300}, //500 +-40%
{700, 300} //
};
#define Rr 10000
#define Cr 497
#define Cc 30
void TEST(uchar Order)
{
unsigned long temp;
uchar LCM_ASCII[16];
if(Test_OKNG==NG)
{
// P2=0xff;
Test_012=2;
NGLED&=~(1<<(Order-1));
Test_OKNG=0;
if(TestModel==0) BB(NG);
if(Order==6)
{
if(OKLED==0xc0)
{
OKLED&=~(1<<6);
if(TestModel==1) BB(OK);
}
else
{
NGLED&=~(1<<6);
if(TestModel==1) BB(NG);
}
}
LEDshow();
switch(Order)
{
case 1:
printf("R1:∞K NG\n");//测试
chn_disp3("R1:∞K NG\n",0x80);
break;
case 2:
printf("R2:∞K NG\n");//测试
chn_disp3("R2:∞K NG\n",0x90);
break;
case 3:
printf("R3:∞K NG\n");//测试
chn_disp3("R3:∞K NG\n",0x88);
break;
case 4:
printf("R4:∞K NG\n");//测试
chn_disp3("R4:∞K NG\n",0x98);
break;
case 5:
clrram();
printf("C5:0p NG\n");//测试
chn_disp3("C5:0p NG\n",0x80);
break;
case 6:
printf("C6:0p NG\n");//测试
chn_disp3("C6:0p NG\n",0x90);
printf("\n");
break;
}
}
if(Test_OKNG==OK)
{
// P2=0xff;
Test_OKNG=0;
switch(Test_012)
{
case 0:
RCr_timer=Filtering(RCtemp);
if(Order<5) P2=Order|0xf8;
else P2=((Order-4)<<3)|0xe7;
Test_012=1;
// RC_timer=Filtering(RCtemp);
// printf("%u,\n" ,RC_timer);//测试
// P2=0;
// Test_012=0;
TEST_GO();
break;
case 1:
Test_012=2;
RC_timer=Filtering(RCtemp);
if(Order<5) temp=RC_timer*Rr/RCr_timer;
else
{
temp=RC_timer*(Cr+Cc)/RCr_timer;
if(temp>Cc) temp-=Cc;
else temp=0;
}
if((RCmaxmin[Order-1][0]>=temp)&&(temp>=RCmaxmin[Order-1][1]))
{
OKLED&=~(1<<(Order-1));
if(TestModel==0) BB(OK); //BB
switch(Order)
{
case 1:
printf("R1:%uK OK\n",(uint)temp);//测试
sprintf(LCM_ASCII,"R1:%uK OK\n",(uint)temp);
chn_disp3(LCM_ASCII,0x80);
break;
case 2:
printf("R2:%uK OK\n",(uint)temp);//测试
sprintf(LCM_ASCII,"R2:%uK OK\n",(uint)temp);
chn_disp3(LCM_ASCII,0x90);
break;
case 3:
printf("R3:%uK OK\n",(uint)temp);//测试
sprintf(LCM_ASCII,"R3:%uK OK\n",(uint)temp);
chn_disp3(LCM_ASCII,0x88);
break;
case 4:
printf("R4:%uK OK\n",(uint)temp);//测试
sprintf(LCM_ASCII,"R4:%uK OK\n",(uint)temp);
chn_disp3(LCM_ASCII,0x98);
break;
case 5:
printf("C5:%up OK\n",(uint)temp);//测试
sprintf(LCM_ASCII,"C5:%up OK\n",(uint)temp);
chn_disp3(LCM_ASCII,0x80);
break;
case 6:
printf("C6:%up OK\n",(uint)temp);//测试
sprintf(LCM_ASCII,"C6:%up OK\n",(uint)temp);
chn_disp3(LCM_ASCII,0x90);
break;
}
}
else
{
NGLED&=~(1<<(Order-1));
if(TestModel==0) BB(NG); //BB
switch(Order)
{
case 1:
printf("R1:%uK NG\n",(uint)temp);//测试
sprintf(LCM_ASCII,"R1:%uK NG\n",(uint)temp);
chn_disp3(LCM_ASCII,0x80);
break;
case 2:
printf("R2:%uK NG\n",(uint)temp);//测试
sprintf(LCM_ASCII,"R2:%uK NG\n",(uint)temp);
chn_disp3(LCM_ASCII,0x90);
break;
case 3:
printf("R3:%uK NG\n",(uint)temp);//测试
sprintf(LCM_ASCII,"R3:%uK NG\n",(uint)temp);
chn_disp3(LCM_ASCII,0x88);
break;
case 4:
printf("R4:%uK NG\n",(uint)temp);//测试
sprintf(LCM_ASCII,"R4:%uK NG\n",(uint)temp);
chn_disp3(LCM_ASCII,0x98);
break;
case 5:
clrram();
printf("C5:%up NG\n",(uint)temp);//测试
sprintf(LCM_ASCII,"C5:%up NG\n",(uint)temp);
chn_disp3(LCM_ASCII,0x80);
break;
case 6:
printf("C6:%up NG\n",(uint)temp);//测试
sprintf(LCM_ASCII,"C6:%up NG\n",(uint)temp);
chn_disp3(LCM_ASCII,0x90);
break;
}
}
if(Order==6)
{
if(OKLED==0xc0)
{
OKLED&=~(1<<6);
if(TestModel==1) BB(OK); //BB
printf("OK\n",(uint)temp);//测试
chn_disp3(" OK \n",0x98);
}
else
{
NGLED&=~(1<<6);
if(TestModel==1) BB(NG); //BB
printf("NG\n",(uint)temp);//测试
chn_disp3(" NG \n",0x98);
}
printf("\n");
}
LEDshow();
break;
}
}
if(Test_012==2)
{
if(STEP==0)
{
if(STEP_check<0xff) STEP_check++;
}
else
{
if(Test_Order<6)
{
if((STEP_check>50)||(TestModel==1))
{
Test_012=0;
Test_Order++;
if(Test_Order<5) P2=0xf8;
else P2=0xe7;
if(Test_Order==5) clrram();
TEST_GO();
}
}
else
{
STEP_check=100; //测试
if(STEP_check>50)
{
Test_Order=0;
Test_012=0;
P2=0xff;
clrram();
chn_disp3(" STANDBY \n",0x80);
}
}
STEP_check=0;
}
}
}
void main(void)
{
uchar i,j;
init_serialcomm(); //初始化串口
init_timer();
init_int();
EA=1;
init_lcd();
chn_disp3(" 珠海晶研力信 \n",0x80);
chn_disp3(" 简易高压测试仪\n",0x90);
chn_disp3(" V2.1\n",0x98);
printf("珠海晶研力信自动化设备有限公司\n" );
printf("简易高压测试仪 V2.1\n\n" );
for(i=0;i<7;i++)
{
OKLED=NGLED=~(1<<i);
LEDshow();
BELL=0;
delay (0xffff);
OKLED=NGLED=0xff;
LEDshow();
BELL=1;
delay (0xffff);
}
for(j=0;j<250;j++)
{
if(MD==0)
{
if(++i==50)
{
P2=0;
while(1);
}
}
}
clrram();
chn_disp3(" STANDBY \n",0x80);
while(1)
{
switch(Test_Order)
{
case 0:
if(AUTOSTEP)TestModel=1; //自动
else TestModel=0; //单步
STEP_check=100; //测试
if(STEP==0)
{
if(STEP_check<0xff) STEP_check++;
}
else
{
if(STEP_check>50)
{
STEP_check=0;
P2=0xf8;
// P2=1;
Test_Order=1;
Test_012=0;
clrram();
TEST_GO();
}
STEP_check=0;
}
OKLED=0xff;
NGLED=0xff;
LEDshow();
break;
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
TEST(Test_Order);
break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -