📄 子机.c
字号:
**********************************处理显示**********************************************
***************************************************************************************/
void xianshi()
{
if(cnt==0)
{
aa=wendu.word;
xianshiwd();
}
if(cnt==1) //显示时钟
{
sd595hc();
LIGHT1=1; //熄灭小灯
LIGHT2=1; //加上点显示
sendhc[2]=sendhc[2]&0xfd;
sd595(); //正常无点显示
}
if(cnt==2) //显示温度上限值
{
aa=shangx.word*10;
xianshiwd();
xhflag=1;
}
if(cnt==3) //显示温度下限值
{
aa=xiax.word*10;
xianshiwd();
xhflag=1;
}
}
/***************************************************************************************
*******************************************按键函数区*************************************
***************************************************************************************/
void anjian()
{
//检测状态按键
if(TA==0)
{
delay20ms();
while(TA==0);
delay20ms();
cnt++;
cnt7=25; //智能跳转计数
if(cnt==4) //两个状态
{
cnt=0;
xhflag=0;
}
xianshi();
}
}
/**************************************************************************************
===================================检测温度函数========================================
**************************************************************************************/
jiance()
{
uchar data i,j;
for(j=0;j<2;j++)
{
for(i=0;i<5;i++)
{
jzrref[i]=0;
jzvref[i]=0;
}
for(i=0;i<5;i++)
{
v=ad_pro(1);
anjian();
vrl=ad_pro(2);
anjian();
v1=vref.word;
rt1=rref.word; /*存储时扩大了100倍,这里还原*/
rt1=rt1/100;
r=rt1*(v-2*vrl)/(v1-v); /*计算出热电阻当前值*/
t=(r-100)/0.36; /*按照500度量程线形估计当前温度*/
do /*采用试差法,刚才的t做初始值*/
{
if(r<100) /*零度以下处理*/
{
v=0.00000000042735;
}
else /*零度以下处理*/
{
v=0;
}
rt1=100+t*(0.390802-0.00005802*t-v*(t-100)*t*t);
t=t+(r-rt1)/0.36;
anjian();
}
while(((r-rt1)>0.005)||(rt1-r)>0.005); /*计算余差小于0.005欧,试差法计算温度*/
jzvref[4]=jzvref[3];
jzvref[3]=jzvref[2];
jzvref[2]=jzvref[1];
jzvref[1]=jzvref[0];
jzvref[0]=t;
jzvref[0]=(jzvref[0]+jzvref[1]+jzvref[2]+jzvref[3]+jzvref[4])/(i+1);
t=jzvref[0];
}
}
wendu.word=10*t+0.5;
t=10*t+0.5;
return t;
}
/********************************首次上电初始化函数区***********************************
****************************************************************************************
***************************************************************************************/
void chushi()
{
write_word(3,0xaa,1); //写入标志字头
write_word(0,0,0); //时间是00:00:00
write_word(1,0,0);
write_word(2,0,0);
range_zero.word=0.1;
range_full.word=0;
rref.word=198984;
vref.word=519050;
shangx.word=450;
xiax.word=-50;
write_word(4,shangx.byte.hhi,1);
write_word(5,shangx.byte.hi,1);
write_word(6,shangx.byte.lo,1);
write_word(7,shangx.byte.llo,1); //1302的第4个到第7个RAM区存放上限
write_word(8,xiax.byte.hhi,1);
write_word(9,xiax.byte.hi,1);
write_word(10,xiax.byte.lo,1);
write_word(11,xiax.byte.llo,1); //1302的第8个到第11个RAM区存放下限
write_word(12,range_zero.byte.hhi,1);
write_word(13,range_zero.byte.hi,1);
write_word(14,range_zero.byte.lo,1);
write_word(15,range_zero.byte.llo,1); //1302的第12个到第15个RAM区存放零点误差
write_word(16,range_full.byte.hhi,1);
write_word(17,range_full.byte.hi,1);
write_word(18,range_full.byte.lo,1);
write_word(19,range_full.byte.llo,1); //1302的第16个到第19个RAM区存放满度误差
write_word(20,rref.byte.hhi,1); //1302的RAM区20-23放的是校准后的电阻
write_word(21,rref.byte.hi,1);
write_word(22,rref.byte.lo,1);
write_word(23,rref.byte.llo,1);
write_word(24,vref.byte.hhi,1); //1302的RAM区24-27放的是校准后的电压
write_word(25,vref.byte.hi,1);
write_word(26,vref.byte.lo,1);
write_word(27,vref.byte.llo,1);
}
/******************************非首次上电初始化函数区***********************************
****************************************************************************************
***************************************************************************************/
void chushi1()
{
dizhi=read_word(2,1);
shangx.byte.hhi=read_word(4,1); //把1302中存的上限值读出来
shangx.byte.hi=read_word(5,1);
shangx.byte.lo=read_word(6,1);
shangx.byte.llo=read_word(7,1);
xiax.byte.hhi=read_word(8,1); //把1302中存的下限值读出来
xiax.byte.hi=read_word(9,1);
xiax.byte.lo=read_word(10,1);
xiax.byte.llo=read_word(11,1);
range_zero.byte.hhi=read_word(12,1); //把1302中存的零点误差值读出来
range_zero.byte.hi=read_word(13,1);
range_zero.byte.lo=read_word(14,1);
range_zero.byte.llo=read_word(15,1);
range_full.byte.hhi=read_word(16,1); //把1302中存的满度误差值读出来
range_full.byte.hi=read_word(17,1);
range_full.byte.lo=read_word(18,1);
range_full.byte.llo=read_word(19,1);
rref.byte.hhi=read_word(20,1); //读出电阻基准值
rref.byte.hi=read_word(21,1);
rref.byte.lo=read_word(22,1);
rref.byte.llo=read_word(23,1);
vref.byte.hhi=read_word(24,1); //读出电压基准值
vref.byte.hi=read_word(25,1);
vref.byte.lo=read_word(26,1);
vref.byte.llo=read_word(27,1);
}
/****************************************主函数区***************************************
****************************************************************************************
***************************************************************************************/
main()
{
uchar data i,b;
for(i=0;i<=9;i++)
{ //硬件初始化延时
delay20ms();
}
SCON=0x50; //串口初始化方式1
TMOD=0x21; //定时器T1为方式2,T0方式1
TH1=0xfd; //定义9600波特率
TL1=0xfd;
TH0=15549/256; //中断初始化
TL0=15549;
TR1=1;
TR0=1;
RI=0;
ET0=1; //允许串口接收数据
EA=1; //CPU开中断
ES=1; //串口中断
LIGHT1=1;
LIGHT2=1;
fmq=1;
trx=0;
for(i=0;i<5;i++) //上电时保证两个灯和蜂鸣器工作
{
LIGHT1=0;
LIGHT2=1;
fmq=0;
delay20ms();
}
for(i=0;i<5;i++)
{
LIGHT1=1;
LIGHT2=0;
fmq=1;
delay20ms();
}
for(i=0;i<20;i++)
{
LIGHT1=1;
LIGHT2=1;
huanchong[1]=88;
huanchong[2]=88;
sd595hc();
sd595();
fmq=0;
delay20ms();
}
LIGHT1=1;
LIGHT2=1;
fmq=11;
ad_cs=0;
ad_reset=0; /*复位AD转换器*/
dealy(2000);
ad_reset=1;
ad_cs=0;
ad_write(0x20); /*写通讯寄存器,选择通道1,并建立下一个操作为写时钟寄存器*/
ad_write(0x04); /*写时钟寄存器,设时钟信号位于使用的主时钟信号(2.4576MHz)*/
ad_write(0x10); /*写通讯寄存器,选择通道1,并建立下一个操作为写设置寄存器*/
ad_write(0x5c); /*写设置寄存器,清除FSYNC,建立增益为8,信号为单极性条件,并*/
/*初始化被选通道自校准模式,不加缓冲器,被选通道的更新速率为50Hz*/
write_word(7,0,0); //允许读写标志打开2
//write_word(3,0,1);
//rref.word=198984;
//vref.word=519050;
b=read_word(3,1); //读第一次操作标志
if(b!=0xaa) //判断标志对不对
chushi(); //调用初始化函数
if(b==0xaa)
chushi1();
dizhi=read_word(2,1);
while(1)
{
/*******************************************************/
if(jsflag==0)
{
anjian();
dsz1302(); //读时钟
/******************************************************/
aa=jiance(); //温度取出来时都经过*10处理(为了好显示)
xianshi();
} //显示处理
/****************************************************************/
if(jsflag==1) /*校准小量程,然后必须校准大量程!!!*/
{
for(i=0;i<5;i++)
{
jzrref[i]=0;
jzvref[i]=0;
}
for(i=0;i<5;i++)
{
jsflag=3;
jzh_flag=1; /*设置基准标志,避免与运算程序公用变量*/
v1=ad_pro(1); /*Rvr1=100;校准电阻=100欧*/
v=ad_pro(1);
v1=(v1+v)/2;
vrl1=ad_pro(2); /*导线压降*/
r=ad_pro(2);
vrl1=(vrl1+r)/2;
rl=vrl1*Rvr1/(v1-2*vrl1);
jzrref[4]=jzrref[3];
jzrref[3]=jzrref[2];
jzrref[2]=jzrref[1];
jzrref[1]=jzrref[0];
jzrref[0]=rl;
jzrref[0]=(jzrref[0]+jzrref[1]+jzrref[2]+jzrref[3]+jzrref[4])/(i+1);
jzvref[4]=jzvref[3];
jzvref[3]=jzvref[2];
jzvref[2]=jzvref[1];
jzvref[1]=jzvref[0];
jzvref[0]=vrl1;
jzvref[0]=(jzvref[0]+jzvref[1]+jzvref[2]+jzvref[3]+jzvref[4])/(i+1);
vrl1=jzvref[0];
rl=jzrref[0];
}
jshc[0]=0x55;
jshc[1]=dizhi;
jshc[7]=(jshc[1]+jshc[2]+jshc[3]+jshc[4]+jshc[5]+jshc[6]);
send();
}
if(jsflag==2)
{
for(i=0;i<5;i++)
{
jzrref[i]=0;
jzvref[i]=0;
}
for(i=0;i<5;i++)
{
v2=ad_pro(1); /*Rvr2=250;校准电阻=250欧*/
v=ad_pro(1);
v2=(v2+v)/2;
vrl2=ad_pro(2);
r=ad_pro(2);
vrl2=(vrl2+r)/2;
r=(vrl1*(Rvr2+2*rl)*(Rvr1+2*rl)-rl*v2*(Rvr2+2*rl))/(rl*v2-vrl1*(Rvr2+2*rl));
v=v1*(r+Rvr1+2*rl)/(Rvr1+2*rl);
jzrref[4]=jzrref[3];
jzrref[3]=jzrref[2];
jzrref[2]=jzrref[1];
jzrref[1]=jzrref[0];
jzrref[0]=r;
jzrref[0]=(jzrref[0]+jzrref[1]+jzrref[2]+jzrref[3]+jzrref[4])/(i+1);
jzvref[4]=jzvref[3];
jzvref[3]=jzvref[2];
jzvref[2]=jzvref[1];
jzvref[1]=jzvref[0];
jzvref[0]=v;
jzvref[0]=(jzvref[0]+jzvref[1]+jzvref[2]+jzvref[3]+jzvref[4])/(i+1);
r=jzrref[0];
v=jzvref[0];
}
rref.word=100*r; /*考虑到小数因素扩大100倍存储*/
vref.word=v;
write_word(20,rref.byte.hhi,1); //1302的RAM区20-23放的是校准后的电阻
write_word(21,rref.byte.hi,1);
write_word(22,rref.byte.lo,1);
write_word(23,rref.byte.llo,1);
write_word(24,vref.byte.hhi,1); //1302的RAM区24-27放的是校准后的电压
write_word(25,vref.byte.hi,1);
write_word(26,vref.byte.lo,1);
write_word(27,vref.byte.llo,1);
ES=1;
jshc[0]=0x55;
jshc[1]=dizhi;
jshc[7]=(jshc[1]+jshc[2]+jshc[3]+jshc[4]+jshc[5]+jshc[6]);
send();
jsflag=0;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -