//停止信号
void i2cstop(void)
{ SCL_L; DELAY_us;
SDA_L; DELAY_us;
SCL_H; DELAY_us;
SDA_H;
}
uchar wt24c(uchar *p, uchar ad, uchar n)
{ uchar t=0;
i2cstart(); //发送起始信号
if(i2cwt(W_ADD_COM)) //发送写字节命令及器件地址
{
i2cwt(ad); //ad_dst的低位到器件
for(;n>0;n--) //发送要写入的数据
{ i2cwt(*p);
p++;
}
}
// else syserr=I2C_ERR; //写字节命令及器件地址错
i2cstop();
tms(6); //延时6ms
return(*p);
}
//从24cxx读出数据
//参数: *p_dst要读入数据的主机内存地址指针; ad_rsc要输出数据的i2c的地址(整形); num数据个数(整形)
//参数条件: ad_dst+(num-1)不能大于器件的最高地址; num必须>0;
void rd24c(uchar *p_dst, uchar ad_rsc, uchar num)
{
uchar t=0;
i2cstart(); //发送起始信号
if(i2cwt(W_ADD_COM)) //发送写字节命令及器件地址
{
i2cwt(ad_rsc); //ad_rsc的低位
i2cstart(); //再发送起始信号
i2cwt(R_ADD_COM); //发送SLA_R, 读命令字节及器件地址
for(;num>0;num--)
{ *p_dst=i2crd(); //从器件读出一个字节
p_dst++;
}
}
// else syserr=I2C_ERR; //写字节命令及器件地址错或对方无应答
i2cstop();
}
/***************************************************************************/
unsigned char Bin1toBcd(unsigned char Xbin1)
{
unsigned short xBCD=0;
do
{
//if(Xbin1>=100)
//{
// Xbin1-=100;
// xBCD+=0x100;
//}
//else
//{
if(Xbin1>=10)
{
Xbin1-=10;
xBCD+=0x10;
}
else
{
xBCD+=Xbin1;
break;
}
//}
}while(1);
return xBCD;
}
unsigned char test_temperature(void)
{
uchar tamp=0;
Ttmp=0;
RC_num=0;
do
{
P6CR&=0xfc;
Rp_TO_OUT;
Rm=0;
Rc=0;
Rp=0;
for(dly=0xa00;dly;dly--)
{
WDTC();
}
Rm_t=0;
P6CR|=0x02;
Rp_TO_IN;
Rm=1; //用基准电阻充电
while(1)
{
if(Rp)
{
break;
}
Rm_t++;
}
WDTC();
test_temp[RC_num]=Rm_t;
RC_num++;
}while(RC_num<6);
RC_num=0;
Rmin_p=0;
Rmax_p=5;
Rmin_t=test_temp[0];
Rmax_t=test_temp[5];
do
{
if(test_temp[RC_num+1]<Rmin_t)
{
Rmin_t=test_temp[RC_num+1];
Rmin_p=RC_num+1;
}
if(test_temp[4-RC_num]>Rmax_t)
{
Rmax_t=test_temp[4-RC_num];
Rmax_p=4-RC_num;
}
RC_num++;
}while(RC_num<5);
RC_num=0;
Rm_t=0;
do
{
if(RC_num!=Rmin_p)
{
if(RC_num!=Rmax_p)
{
Rm_t+=test_temp[RC_num];
}
}
RC_num++;
}while(RC_num<6);//去max,min,取平均值
Rm_t>>=2;
RC_num=0;
do
{
P6CR&=0xfc;
Rp_TO_OUT;
Rm=0;
Rc=0;
Rp=0;
for(dly=0xa00;dly;dly--)
{
WDTC();
}
Rc_t=0;
P6CR|=0x01;//用NTC充电
Rp_TO_IN;
Rc=1;
while(1)
{
if(Rp)
{
break;
}
Rc_t++;
}
WDTC();
test_temp[RC_num]=Rc_t;
RC_num++;
}while(RC_num<6);
RC_num=0;
Rmin_p=0;
Rmax_p=5;
Rmin_t=test_temp[0];
Rmax_t=test_temp[5];
do
{
if(test_temp[RC_num+1]<Rmin_t)
{
Rmin_t=test_temp[RC_num+1];
Rmin_p=RC_num+1;
}
if(test_temp[4-RC_num]>Rmax_t)
{
Rmax_t=test_temp[4-RC_num];
Rmax_p=4-RC_num;
}
RC_num++;
}while(RC_num<5);
RC_num=0;
Rc_t=0;
do
{
if(RC_num!=Rmin_p)
{
if(RC_num!=Rmax_p)
{
Rc_t+=test_temp[RC_num];
}
}
RC_num++;
}while(RC_num<6);//去max,min,取平均值
Rc_t>>=2;
Ttmp=(unsigned long)Rc_t*9950;
Ttmp=Ttmp/Rm_t;//求ntc值
if(Ttmp>=32960)
{
return 0;
}
if(Ttmp<=3588)
{
return 0x50;
}
RC_num=0;
Rm_t=Ttmp;
do
{
if(Rm_t>=table[RC_num+1])//查表微调
{
/*Rm_t-=table[RC_num+1];
Rc_t=table[RC_num]-table[RC_num+1];
Rm_t*=10;
Rm_t=Rm_t/Rc_t;
// RC_num++;*/
break;
}
RC_num++;
}while(RC_num<48);
tamp=Bin1toBcd(RC_num);
//Rc_t<<=4;
//Rm_t|=Rc_t;
P6CR&=0xfC;
PORT6&=0xfC;
return tamp;
}
void display(uchar v,uchar tamp_v,uchar set_tmp)
{
uchar real_dep,tmp1;
LCD_ADDR=6;
LCD_DB=0x08;
//风速+冷热
LCD_ADDR=0;
LCD_DB=tamp_v;
LCD_ADDR=23;
_asm
{
swap %tamp_v
}
LCD_DB=tamp_v;
//当时温度
real_dep=v;
v>>=4;
real_dep&=0x0f;
LCD_ADDR=4;
tmp1=lcd_ram[real_dep];
tmp1&=0xf7;
LCD_DB=tmp1;
LCD_ADDR=3;
_asm
{
swap %tmp1
}
LCD_DB=tmp1;
tmp1=v&0x0f;
LCD_ADDR=2;
tmp1=lcd_ram[tmp1];
LCD_DB=tmp1;
LCD_ADDR=1;
_asm
{
swap %tmp1
}
LCD_DB=tmp1;
//设置温度
real_dep=set_tmp;
set_tmp>>=4;
real_dep&=0x0f;
LCD_ADDR=10;
tmp1=lcd_ram[real_dep];
LCD_DB=tmp1;
LCD_ADDR=9;
_asm
{
swap %tmp1
上一篇:EMC单片机指令应用的误区与技巧