📄 progm.c
字号:
#include "mdefine.h"
#include "IIC_Soft.h"
#include "Key_Dispose.h"
#include "Ziku.h"
#include "Lcd12864.h"
//#include "PCF8563.h"
#include "Ad2543.h"
//#include "Tlc5615.h"
#include "24c64.h"
const float code RB = 0.001 ;//标准电阻为100A/100mV,即1000uΩ
const float code VB = 20.000 ; //电流回路放大器的电阻R20=2.600K
float idata SHUAIJIAN = 1.00; //信号衰减倍数,此处不衰减
float idata DIANLIUXIAO = 1.000;//电流校正因子
float idata DIANZUXIAO3=1.000;//400uΩ以下修正,即VX=100时
float idata DIANZUXIAO2=1.000;//4000uΩ以下大于400uΩ修正,即VX=10时
float idata DIANZUXIAO1=1.000;//40000uΩ以下大于4000uΩ修正,即VX=1时
float idata xiao=1.000;//程序调用到的修正系数
uchar xiaozhen[20];//读入的系数值
uchar idata UiBuffer[8]={0,0,0,0,0,0,0,0};//电流电阻显示缓冲区,前4位电流
float idata VX = 1.0; //电压初始档位,放大倍数=1
ulong idata iZHENGSHU=0;
ulong idata iXIAOSHU=0; /*保存浮点数的整数和小数*/
uchar idata dian_bit=0;//结果共4位显示,小数点位置=0无小数点,=1小数点后1位,=2后两位,=3后三位
uchar mod_10000( uint* ulTmp) /*分离出万位数并返回,保留余下的部分*/
{
uint ult1;
ult1 = *ulTmp / 10000;
*ulTmp = *ulTmp % 10000;
return ult1;
}
uchar mod_1000( uint* ulTmp) /*分离出千位数并返回,保留余下的部分*/
{
uint ult1;
ult1 = *ulTmp / 1000;
*ulTmp = *ulTmp % 1000;
return ult1;
}
uchar mod_100( uint* ulTmp) /*分离出百位数并返回,保留余下的部分*/
{
uint ult1;
ult1 = *ulTmp / 100;
*ulTmp = *ulTmp % 100;
return ult1;
}
uchar mod_10( uint* ulTmp) /*分离出十位数并返回,保留余下的部分*/
{
uint ult1;
ult1 = *ulTmp / 10;
*ulTmp = *ulTmp % 10;
return ult1;
}
void div_u_shuzi(uint ucTmp) //分离电压数字
{
uint uctmp;
uctmp = ucTmp;
UiBuffer[0] = mod_1000(&uctmp);
UiBuffer[1] = mod_100(&uctmp);
UiBuffer[2] = mod_10(&uctmp);
UiBuffer[3] = uctmp;
}
void div_i_shuzi(uint ucTmp) //分离电流数字
{
uint uctmp;
uctmp = ucTmp;
UiBuffer[0] = mod_1000(&uctmp);
UiBuffer[1] = mod_100(&uctmp);
UiBuffer[2] = mod_10(&uctmp);
UiBuffer[3] = uctmp;
}
void Shipin_U_dispose() //处理电压读数 显示
{
uint uiDianya;
uiDianya = (uint)(Read2543(1) * 2.5/4096*1000);//读出的值放大10倍
uiDianya = (uint)(Read2543(1) * 2.5/4096*1000);
div_u_shuzi(uiDianya);
}
void Shipin_I_dispose() //处理电流读数 显示
{
uint uiDianliu;
uiDianliu = (uint)(Read2543(0) *2.5/4096*1000*10);//读出的值放大10倍
uiDianliu = (uint)(Read2543(0) *2.5/4096*1000*10);
div_i_shuzi(uiDianliu);
}
void diyiping()
{
df(0,28,13,0);
df(0,36,14,0);
df(0,44,16,0);
df(0,52,6,0);
df(0,60,1,0);
df(0,68,0,0);
df(0,76,4,0);
dh(0,84,4,0);
dh(3,8,5,0);
dh(3,24,6,0);
dh(3,40,7,0);
dh(3,56,8,0);
dh(3,72,9,0);
dh(3,88,10,0);
dh(3,104,11,0);
dh(6,8,12,0);
dh(6,24,13,0);
dh(6,40,14,0);
dh(6,56,15,0);
dh(6,72,16,0);
dh(6,88,17,0);
dh(6,104,18,0);
}
void dierping()
{
dh(0,0,9,0);
dh(0,16,10,0);
dh(0,32,17,0);
dh(0,48,20,0);
df(0,64,17,0);
xs12(2,40,0,0);
xs12(2,52,1,0);
xs12(2,64,1,0);
xs12(2,76,2,0);
dh(6,24,25,0);//请
dh(6,40,26,0);//按
dh(6,56,9,0);//测
dh(6,72,10,0);//试
dh(6,88,27,0);//键
}
void disanping()
{
dh(0,0,21,0);//显示正在测试中
dh(0,16,22,0);
dh(0,32,9,0);
dh(0,48,10,0);
dh(0,64,28,0);
dh(2,0,25,0);//请稍侯
dh(2,16,29,0);
dh(2,32,30,0);
dh(2,48,31,0);
dh(2,64,31,0);
dh(2,80,31,0);
dh(2,96,31,0);
dh(2,112,31,0);
}
void xsdianzu(uchar flag)//根据小数点的位置显示结果
{
df(flag,34,19,0);//R=xxx.xmΩ
df(flag,42,20,0);
df(flag,86,15,0);
dh(flag,94,19,0);
switch(dian_bit)
{
case 0:
df(flag,50,UiBuffer[4],0);
df(flag,58,UiBuffer[5],0);
df(flag,66,UiBuffer[6],0);
df(flag,74,UiBuffer[7],0);
break;
case 1:
df(flag,50,UiBuffer[4],0);
df(flag,58,UiBuffer[5],0);
df(flag,66,UiBuffer[6],0);
df(flag,74,21,0);
df(flag,78,UiBuffer[7],0);
break;
case 2:
df(flag,50,UiBuffer[4],0);
df(flag,58,UiBuffer[5],0);
df(flag,66,21,0);
df(flag,70,UiBuffer[6],0);
df(flag,78,UiBuffer[7],0);
break;
case 3:
df(flag,50,UiBuffer[4],0);
df(flag,58,21,0);
df(flag,62,UiBuffer[5],0);
df(flag,70,UiBuffer[6],0);
df(flag,78,UiBuffer[7],0);
break;
}
}
void showdianliu(uchar flag)//显示电流
{
df(flag,34,18,0);//I=xxx.xA
df(flag,42,20,0);
df(flag,50,UiBuffer[0],0);
df(flag,58,UiBuffer[1],0);
df(flag,66,UiBuffer[2],0);
df(flag,74,21,0);
df(flag,78,UiBuffer[3],0);
df(flag,86,10,0);
}
void ds_erro1()//显示接线错误,无电流
{
lcd_init();
dh(5,4,32,0);
dh(5,20,33,0);
dh(5,36,34,0);
dh(5,52,35,0);
dh(5,68,37,0);
dh(5,76,36,0);
dh(5,92,7,0);
dh(5,108,20,0);
}
void cedianliu()//测试电路回路,功能:用于故障判断
{
uint dd,ff;
float uiDianliu;
dd= Read2543(0);
/*A/D读出电流值除以放大倍数还原原信号,再除以标准电阻得出电流,这里
将A/D数单位0.00061035,放大10倍,是为了去掉小数点,精确到小数点后一位*/
ff=Read2543(0);
ff=Read2543(0);
uiDianliu = (float)(ff* 0.0122/(VB*RB)*DIANLIUXIAO);
//uiDianliu = (uint)( Read2543(0)* 0.0061035/(VB*RB));
if((uiDianliu<850)|(uiDianliu>2500))//电流小于85A,或大于250A,提示接线错误
{
ds_erro1();//若结果异常,显示故障
SELC = 1;
while(1);
}
else
{
div_i_shuzi(uiDianliu);//分离转化为BCD数
showdianliu(4); //显示电流值,行x=4
}
}
void ds_erro2()//仪器故障
{
lcd_init();
dh(2,16,11,0);
dh(2,32,38,0);
dh(2,48,39,0);
dh(2,64,40,0);
dh(2,80,41,0);
dh(2,96,37,0);
dh(5,4,25,0);
dh(5,20,42,0);
dh(5,36,43,0);
dh(5,52,44,0);
dh(5,68,45,0);
dh(5,84,46,0);
dh(5,100,47,0);
df(5,116,22,0);
}
void liangcheng()//选择电压回路的量程
{
uint dushu;
AV1=AV2=0;//放大倍数为1,最小倍数
dushu=Read2543(1);
dushu=Read2543(1);
if(dushu>3768)//大于2.3V,满量程2.5V
{
ds_erro2();//仪器故障
SELC=1;
while(1);
}
else
{
AV2=1;//放大10倍
delay1ms(200);
dushu=Read2543(1);
dushu=Read2543(1);
if(dushu>3276)//大于4V,满量程5V
{
AV2=0;
VX=1.0;
xiao=DIANZUXIAO1;//确定该档位的修正因子
return;
}
else
{
AV1=1;//放大100倍
delay1ms(200);
dushu=Read2543(1);
dushu=Read2543(1);
if(dushu>3276)//大于4V,满量程5V
{
AV1=0;
VX=10.0;
xiao=DIANZUXIAO2;//确定该档位的修正因子
return;
}
else
{
VX=100.0;
xiao=DIANZUXIAO3;//确定该档位的修正因子
return;
}
}
}
}
/*将浮点数分离成整数和小数,并将小数扩大一千倍*/
void div_zhengshu_xiaoshu(float fdshu)
{
float fx,fz,ftm;
ftm = fdshu;
fx=modf(ftm, &fz);
iZHENGSHU=(long)fz;
fx=fx*1000;
iXIAOSHU=(long)fx;
}
void showdianzu(float Rtemp)//浮点分离电阻值
{
float Result;
uint shu_zhen,shu_xiao;
Result=Rtemp;
/*将浮点数分离成整数和小数,并将小数扩大一千倍*/
div_zhengshu_xiaoshu(Result);
shu_zhen=iZHENGSHU;//整数
shu_xiao=iXIAOSHU;//小数点后三位被放大1000,成为整数
if(shu_zhen<10)//小于10,小数点后三位数
{
dian_bit=3;
UiBuffer[4] = shu_zhen;
UiBuffer[5] = mod_100(&shu_xiao);
UiBuffer[6] = mod_10(&shu_xiao);
UiBuffer[7] = shu_xiao;
}
else if(shu_zhen<100)//小于100,小数点后2位数
{
dian_bit=2;
UiBuffer[4] = mod_10(&shu_zhen);
UiBuffer[5] = shu_zhen;
UiBuffer[6] = mod_100(&shu_xiao);
UiBuffer[7] = mod_10(&shu_xiao);
}
else //大于100,小数点后1位数
{
if(shu_zhen>999)//大于1000,无小数点
{
dian_bit=0;
UiBuffer[4] = mod_1000(&shu_zhen);
UiBuffer[5] = mod_100(&shu_zhen);
UiBuffer[6] = mod_10(&shu_zhen);
UiBuffer[7] = shu_zhen;
}
else
{
dian_bit=1;
UiBuffer[4] = mod_100(&shu_zhen);
UiBuffer[5] = mod_10(&shu_zhen);
UiBuffer[6] = shu_zhen;
UiBuffer[7] = mod_100(&shu_xiao);
}
}
xsdianzu(6);//显示行x=6
}
//测试电阻
void ceshidianzu()
{
uchar ucmp=30;
uint ucItmp;
float fRx=0.0 , K=0.0,fv=0.0, fi=0.0,rtmp=0.0,ucceshi=0.0 ;
K = VB*RB/VX ;
ucceshi=30.0;
while(ucmp--)
{
ucItmp=Read2543(1);
ucItmp=Read2543(1);
fv= (float)ucItmp;
ucItmp=Read2543(0);
ucItmp=Read2543(0);
fi= (float)ucItmp ;
rtmp=fv/fi ; //电压回路电流回路比值
fRx = fRx + rtmp; //送数到结果缓冲区,共计30次的累加和
}
//结果=比值的平均值 * K * 衰减倍数 * 校正因子
fRx = fRx/ucceshi*K*SHUAIJIAN*DIANLIUXIAO*1000000.0*xiao ;
showdianzu(fRx);//浮点分离测试数据
}
//测试结果
void showceshijieguo()
{
lcd_init();
dh(0,0,9,0);
dh(0,16,10,0);
dh(0,32,23,0);
dh(0,48,24,0);
df(0,64,17,0);
showdianliu(3);
xsdianzu(5);
}
uchar idata ch1[8]={0xb2,0xe2,0xca,0xd4,0xbd,0xe1,0xb9,0xfb};//测试结果
//uchar idata ch2[5]={0xb5,0xe7,0xd7,0xe8,0x3a};//电阻
//uchar idata ch3[5]={0xb5,0xe7,0xc1,0xf7,0x3a};//电流
uchar idata ch4[5]={0xcf,0xb5,0xcd,0xb3,0x3a};//系统:
uchar idata daRTmpBuf[7] = {0,0,0,0,0,0xa9,0xab};//前5个字节为电阻4位数+1个小数点,后2个字节为mΩ
uchar idata daiTmpBuf[6] = {0,0,0,0x2e,0,0x41};//前5个字节为电流4位数(含小数点后一位),后1个字节为A
void daima() // 转换打印代码
{
uchar i;
for(i=0;i<3;i++) //电流数字转换打印内码
daiTmpBuf[i]=UiBuffer[i]|0x30;
daiTmpBuf[4]=UiBuffer[3]|0x30;
switch(dian_bit)
{
case 0:
daRTmpBuf[0]=UiBuffer[4]|0x30;
daRTmpBuf[1]=UiBuffer[5]|0x30;
daRTmpBuf[2]=UiBuffer[6]|0x30;
daRTmpBuf[3]=UiBuffer[7]|0x30;
daRTmpBuf[4]=0x20;
break;
case 1:
daRTmpBuf[0]=UiBuffer[4]|0x30;
daRTmpBuf[1]=UiBuffer[5]|0x30;
daRTmpBuf[2]=UiBuffer[6]|0x30;
daRTmpBuf[3]=0x2e;
daRTmpBuf[4]=UiBuffer[7]|0x30;
break;
case 2:
daRTmpBuf[0]=UiBuffer[4]|0x30;
daRTmpBuf[1]=UiBuffer[5]|0x30;
daRTmpBuf[2]=0x2e;
daRTmpBuf[3]=UiBuffer[6]|0x30;
daRTmpBuf[4]=UiBuffer[7]|0x30;
break;
case 3:
daRTmpBuf[0]=UiBuffer[4]|0x30;
daRTmpBuf[1]=0x2e;
daRTmpBuf[2]=UiBuffer[5]|0x30;
daRTmpBuf[3]=UiBuffer[6]|0x30;
daRTmpBuf[4]=UiBuffer[7]|0x30;
break;
}
}
/*************串口发送子函数***********/
sprint(unsigned char a)
{
while(BUSY);
SBUF=a;
while(!TI);
TI=0;
}
void dayin()
{
int i;
TH1 = 0xfd;//波特率9600
TL1 = 0xfd;
TMOD = 0x20 ;
SCON = 0x40;//串行口方式1,10位数据,1位起始,8位数据,1位停止
TR1= 1;
ES = 1;
TI = 0;
sprint(0x1b);sprint(0x40);//初始化打印机
sprint(0x1b);sprint(0x63);sprint(0x00);//反向打印
sprint(0x1b);sprint(0x6c);sprint(0x0);//设定左限,居中
sprint(0x1b);sprint(0x38);sprint(0x04);//选择汉字
//打印“测试结果”
sprint(0x1b);sprint(0x6c);sprint(0x03);//设定左限,居中
for(i=0;i<8;i++)
sprint(ch1[i]);
sprint(0x0d); //回车
sprint(0x1b);sprint(0x36);sprint(0x00);//选择字符集1
sprint(0x1b);sprint(0x6c);sprint(0x00);//设定左限,居左
for(i=0;i<16;i++)
sprint(0x2d);//打印“*********”
sprint(0x0d); //回车
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -