📄 自动校正.c
字号:
//deal voltage
//=================================================
void dealvoltage(void)
{ int i;
long maxnum=0;
long minnum=0xffff;
long pnum;
long maxconter=0;
long summax=0;
long minconter=0;
long summin=0;
while(!tranover);
for(i=0;i<ctime;i++)
{if(result1[i]>maxnum)
maxnum=result1[i];
if(result1[i]<minnum)
minnum=result1[i];
}
pnum=(maxnum+minnum)/2;
DAC0H = pnum>>4 ;
DAC0L=pnum<<4;
voltage = ( pnum* VREF0)>>12;
maxvoltage = (maxnum* VREF0)>>12;
minvoltage = (minnum* VREF0)>>12;
dashu() ;
tranover=0;
EA = 1;
}
//*************************************************
//仅有4位数的处理子程序,
//入口: flonum
//出口:dealresult[i],本例有4位小数unsigned char dealresult[5];
//------------------------------------------------
void dashu(void)
{
dealresult[0]=voltage/1000;
voltage=voltage%1000;
dealresult[1]=voltage/100;
voltage=voltage%100;
dealresult[2]=voltage/10;
maxresult[0]=maxvoltage/1000;
maxvoltage=maxvoltage%1000;
maxresult[1]=maxvoltage/100;
maxvoltage=maxvoltage%100;
maxresult[2]=maxvoltage/10;
minresult[0]= minvoltage/1000;
minvoltage= minvoltage%1000;
minresult[1]= minvoltage/100;
minvoltage= minvoltage%100;
minresult[2]=minvoltage/10;
}
//=============================================================================
//-----------------------------------------------------------------------------
void delay0_5ms(void) //延时5ms子程序
{int dtime=1136;
while(dtime--);
}
//=============================================================================
//-----------------------------------------------------------------------------
// 解码子程序××××××××××××××××××××××××××××××
//-----------------------------------------------------------------------------
//
void scan(void)
{ int i,j,displace,num1;
bit beginsign=0;
for(i=0;i<48;i++) //每隔0.5ms采集一次数据,共采集48个,
// 一般采得的每两位表示发送来的一位数据
{
outbit[i]=vout;
delay0_5ms();
}
for(i=0;i<48;i++) //逐个扫描
{
num1=0;
for(j=0;j<10;j++) //检测起始位
{
if(outbit[i+j]!=1) //检测起始位,
//否则 break
break;
num1++;
if(num1==9) //连续9个1,即认为开始
{beginsign=1; //开始标志位
if(outbit[i+9]==0) //在附近寻找隔离位0
displace=i+9; //得出隔离位在数组中偏移量
if(outbit[i+10]==0)
displace=i+10;
}
}
if(beginsign==1) //开始标志位1,调处查询
break;
}
if(beginsign==1)
{
if(outbit[displace]==outbit[displace+1]) //判断从隔离位开始,若连续两数都相同,则数据有效
if(outbit[displace+2]==outbit[displace+3])
if(outbit[displace+4]==outbit[displace+5])
if(outbit[displace+6]==outbit[displace+7])
if(outbit[displace+8]==outbit[displace+9])
if(outbit[displace+10]==outbit[displace+11])
if(outbit[displace+12]==outbit[displace+13])
{
led1=outbit[displace+2]; //读出数据
led2=outbit[displace+4];
led3=outbit[displace+6];
led4=outbit[displace+8];
led5=outbit[displace+10]; //奇偶校验位
readsign=1;
}
}
}
//=============================================================================
//-----------------------------------------------------------------------------
//odd,even 奇偶校验子程序(偶校验,即数据和校验位的1的个数为偶数)
even_odd(void)
{
uchar oddnum;
bit judgeoddsign=0;
oddnum=0;
if(led1==1)
oddnum++;
if(led2==1)
oddnum++;
if(led3==1)
oddnum++;
if(led4==1)
oddnum++;
if((oddnum==1)||(oddnum==3))
judgeoddsign=1;
if(judgeoddsign==led5)
return 1;
else return 0;
}
//=============================================================================
//-----------------------------------------------------------------------------
// display 液晶显示子程序
//-----------------------------------------------------------------------------
//
//
void display(void)
{
writeinstru(0x80); // 显示起始位置(80--A7)
dischar('v');
dischar('r');
dischar(tab4[dealresult[0]]);
dischar(0x2e);
dischar(tab4[dealresult[1]]);
dischar(tab4[dealresult[2]]);
dischar(0x20);
dischar('m');
dischar('x');
dischar(tab4[maxresult[0]]);
dischar(0x2e);
dischar(tab4[maxresult[1]]);
dischar(tab4[maxresult[2]]);
dischar(0x20);
dischar('m');
dischar('i');
dischar(tab4[minresult[0]]);
dischar(0x2e);
dischar(tab4[minresult[1]]);
dischar(tab4[minresult[2]]);
writeinstru(0xC6); //第二行显示
dischar(0x20);
dischar('R');
dischar('e');
dischar(':');
dischar(tab4[led4]); //显示所接受数据(4位)
dischar(tab4[led3]);
dischar(tab4[led2]);
dischar(tab4[led1]);
led11=~led4; // 接收的最高位
led22=~led3; // 接收的第二位
led33=~led2; // 接收的最三位
led44=~led1; // 接收的最四位
}
//------------------------------------------------------------------------------------------
//以下为液晶显示初始化控制
//---------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------//---------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------
void lcd_init(void) // initialize lcd
{
unsigned long xdata i;
for(i=1000;i>0;i--);
writeinstru(0X38);
for(i=200;i>0;i--);
writeinstru(0X38);
for(i=50;i>0;i--);
writeinstru(0X38);
writeinstru(0X38);
writeinstru(0X08); //显示OFF,
writeinstru(0X01); //清除显示
writeinstru(0X02); //光标归位
writeinstru(0X06); //输入模式
writeinstru(0X0c); //显示方式
}
//----------------------------------------------------------
//end
void writeinstru(uchar instru) //write 写指令,注意时序
{
uint xdata i;
for(i=0;i<3;i++);
RS=0;
WR=0;
dataport=instru;
for(i=0;i<5;i++);
WR=1;
RS=1;
for(i=0;i<20;i++);
}
//----------------------------------------------------------
readreg(void) //read bf acc读忙位和地址
{
uint xdata i;
uchar reg;
for(i=0;i<3;i++);
RS=0;
RD=0;
reg=dataport;
for(i=0;i<10;i++);
RD=1;
RS=1;
for(i=0;i<20;i++);
return reg;
}
//----------------------------------------------------------
//end
void dischar(uchar disch) //write 写显示数据
{
uint xdata i;
for(i=0;i<3;i++);
RS=1;
WR=0;
dataport=disch;
for(i=0;i<5;i++);
WR=1;
RS=0;
for(i=0;i<20;i++);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -