|
![](static/image/common/ico_lz.png)
楼主 |
发表于 2012-8-1 14:52:35
|
显示全部楼层
BXAK 发表于 2012-8-1 08:37 ![](static/image/common/back.gif)
1、不使用浮点,将所有浮点运算化成整数运算
2、避免通用指针,如形参指针指向类型要明确,
高人, 我已经将你说的都优化完了, 将浮点计算全化为了长整型计算了,计算完后的结果也是用uint 保存的。 指针也改好了。 位移也改好了,Keil优化也是9级优化。 但还是1.09K 没有您说的700多字节啊,能再看看吗? 不过也太感谢你了, 最开始这个程序2.8K,现在1.09K 我已经感动了。
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define noACK 0 //继续传输数据,用于判断是否结束通讯
#define ACK 1 //结束数据传输;
#define MS_TEMP 0x03 //000 0001 1
#define MS_HUMI 0x05 //000 0010 1
sbit DATA = P1^7;
sbit SCK = P1^6;
enum {TEMP,HUMI};
//uchar code duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0x7f};
//uchar code wei[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
//uchar demp[8],i;
uint temp,humi;
/******** SHT10函数声明 ********/
void rest_SHT10();
char d_measure(uchar idata *p_value, uchar idata *p_checksum, uchar mode);
void count_SHT10(uint idata *p_humi ,uint idata *p_temp);
/********************************************************************
函 数 名:delay_ms()
功 能:延时
说 明:自定义t的值来决定延时时间
调 用:
入口参数:无
出口参数:无
***********************************************************************/
/*void delay_ms(uint t)
{
uint i, j;
for(i=t;i>0;i--)
for(j=114;j>0;j--);
}
/********************************************************************
函 数 名:start_SHT10()
功 能:启动
说 明:
调 用:
入口参数:无
出口参数:无
***********************************************************************/
void start_SHT10()
{
DATA=1; SCK=0;
_nop_();
SCK=1;
_nop_();
DATA=0;
_nop_();
SCK=0;
_nop_();_nop_();_nop_();
SCK=1;
_nop_();
DATA=1;
_nop_();
SCK=0;
}
/********************************************************************
函 数 名:rest_SHT10()
功 能:复位
说 明:当程序内部错误时,SHT10复位
调 用:
入口参数:无
出口参数:无
***********************************************************************/
void rest_SHT10()
{
uchar i;
DATA=1; SCK=0; //准备
for(i=9;i>0;i--) //DATA保持高,SCK时钟触发9次,发送启动传输,通迅即复位
{
SCK=1;
SCK=0;
}
start_SHT10(); //启动传输
}
/********************************************************************
函 数 名:write_byte()
功 能:写数据
说 明:将功能指令写入SHT10
调 用:
入口参数:uchar value
出口参数:error
***********************************************************************/
char write_byte(uchar value)
{
uchar i,error=0;
for (i=8;i>0;i--) //高位为1,循环右移
{
DATA=(bit)(value & 0x80); //和要发送的数相与,结果为发送的位
SCK=1;
value <<= 1;
_nop_();_nop_();_nop_(); //延时3us
SCK=0;
}
DATA=1; //释放数据线
SCK=1;
error=DATA; //检查应答信号,确认通讯正常
_nop_();_nop_();_nop_();
SCK=0;
DATA=1;
return error; //error=1 通讯错误
}
/********************************************************************
函 数 名:char read_byte()
功 能:读字节
说 明:读取SHT10测量数据
调 用:
入口参数: uchar ack
出口参数:val
***********************************************************************/
char read_byte(uchar ack)
{
unsigned char i,val=0;
DATA=1; //释放数据线
for(i=8;i>0;i--) //高位为1,循环右移
{
val <<= 1;
SCK=1;
if(DATA) val=(val|0x01); //读一位数据线的值
SCK=0;
}
DATA=!ack; //如果是校验,读取完后结束通讯;
SCK=1;
_nop_();_nop_();_nop_(); //延时3us
SCK=0;
_nop_();_nop_();_nop_();
DATA=1; //释放数据线
return val;
}
/********************************************************************
函 数 名:d_measure()
功 能:温湿度测量
说 明:
调 用:
入口参数:指针变量 *p_value *p_checksum 模式uchar mode
出口参数:error
***********************************************************************/
char d_measure(uchar idata *p_value, uchar idata *p_checksum, uchar mode)
{
uchar error=0;
uint i;
start_SHT10(); //启动传输
switch(mode) //选择发送命令
{
case TEMP : error=error+write_byte(MS_TEMP); break; //测量温度
case HUMI : error=error+write_byte(MS_HUMI); break; //测量湿度
default : break;
}
for (i=40000;i>0;i--) if(DATA==0) break; //等待测量结束
if(DATA) error=error+1; // 如果长时间数据线没有拉低,说明测量错误
*(p_value) =read_byte(ACK); //读第一个字节,高字节 (MSB)
*(p_value+1)=read_byte(ACK); //读第二个字节,低字节 (LSB)
*p_checksum =read_byte(noACK); //read CRC校验码
return error; // error=1 通讯错误
}
/********************************************************************
函 数 名:count_SHT10()
功 能:温湿度计算
说 明:
调 用:
入口参数:指针变量 *p_humi , *p_temp
出口参数:无
***********************************************************************/
void count_SHT10(uint idata *p_humi ,uint idata *p_temp)
{
uint rh=*p_humi; // rh: 12位 湿度
uint t=*p_temp; // t: 14位 温度
long rh_lin; // rh_lin: 湿度 linear值
long rh_true; // rh_true: 湿度 ture值
uint t_C; // t_C : 温度 ℃
t_C=t - 4000; //补偿温度
rh_lin=(28)*rh*rh + 405000*rh -40000000; //相对湿度非线性补偿
rh_true=(t_C*100000-250000000)*(10000+800*rh)+rh_lin*10000000; //相对湿度对于温度依赖性补偿
if(rh_true>100)rh_true=100; //湿度最大修正
if(rh_true<0.1)rh_true=0.1; //湿度最小修正
temp=t_C; //返回温度结果
humi=rh_true/100000; //返回湿度结果
}
void main()
{
uint humi_val,temp_val;
uchar error; //用于检验是否出现错误
uchar checksum; //CRC
while(1)
{
error=0; //初始化error=0,即没有错误
error+=d_measure((uchar*)&temp_val,&checksum,TEMP); //温度测量
error+=d_measure((uchar*)&humi_val,&checksum,HUMI); //湿度测量
if(error!=0)
{ rest_SHT10(); } //如果发生错误,系统复位
else
{
count_SHT10(&humi_val,&temp_val); //修正相对湿度及温度
}
/*demp[0]=temp%10;
demp[1]=temp%100/10;
demp[2]=temp%1000/100;
demp[3]=temp%10000/1000;
demp[4]=temp/10000;
demp[5]=10;
for(i=0;i<6;i++)
{
P2=wei;
P0=duan[demp];
delay_ms(1);
}*/
}
} |
|