搜索
bottom↓
回复: 49

求各路大神,能不能帮小弟将SHT10的程序缩小到1K以内

[复制链接]

出0入0汤圆

发表于 2012-7-30 10:47:53 | 显示全部楼层 |阅读模式
因为要用的单片机是STC11F01,只有1K的rom, 而且还要加上串口通讯程序,所以其实预留给SHT10的程序大小只有700字节以下,我老师用汇编写出来只用了800多字节,现在要我用C写,我将网上普遍通用的那个给优化了下,但结合通讯程序还是有2K,主要是51系的不支持浮点计算,但测量值修正补偿那块全是float啊。 哎。 求各路大神指点。

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2012-7-30 17:23:47 | 显示全部楼层
上代码!!!

出0入0汤圆

 楼主| 发表于 2012-7-31 08:51:05 | 显示全部楼层
#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 *p_value, uchar *p_checksum, uchar mode);
void count_SHT10(float *p_humi ,float *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=0x80;i>0;i>>=1)            //高位为1,循环右移
        {
                if (i&value) DATA=1;          //和要发送的数相与,结果为发送的位
            else DATA=0;                        
            SCK=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=0x80;i>0;i>>=1)             //高位为1,循环右移
        {
                SCK=1;                        
            if(DATA) val=(val|i);         //读一位数据线的值
            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 *p_value, uchar *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(float *p_humi ,float *p_temp)
{
        float rh=*p_humi;                       // rh:      12位 湿度
        float t=*p_temp;                             // t:       14位 温度
        float rh_lin;                     // rh_lin: 湿度 linear值
        float rh_true;                    // rh_true: 湿度 ture值
        float t_C;                        // t_C   : 温度 ℃

        t_C=t*0.01 - 40.0;                      //补偿温度
        rh_lin=(-0.0000028)*rh*rh + 0.0405*rh -4.0;               //相对湿度非线性补偿
        rh_true=(t_C-25)*(0.01+0.00008*rh)+rh_lin;   //相对湿度对于温度依赖性补偿
        if(rh_true>100)rh_true=100;           //湿度最大修正
        if(rh_true<0.1)rh_true=0.1;           //湿度最小修正

        *p_temp=t_C*10;                      //返回温度结果
        *p_humi=rh_true*10;                     //返回湿度结果
}

typedef union                                       //定义共用同类型
{        
        uint i;
        float f;
} value;


void main()
{
        value humi_val,temp_val;                //定义两个共同体,一个用于湿度,一个用于温度
        uchar error;                    //用于检验是否出现错误
        uchar checksum;                        //CRC                         
        while(1)
        {
                error=0;                                                 //初始化error=0,即没有错误
                error+=d_measure((uchar*)&temp_val.i,&checksum,TEMP); //温度测量
                error+=d_measure((uchar*)&humi_val.i,&checksum,HUMI); //湿度测量
            if(error!=0)
                { rest_SHT10(); }                                   //如果发生错误,系统复位
            else
            {
                        humi_val.f=humi_val.i;                   //转换为浮点数
                     temp_val.f=temp_val.i;                   //转换为浮点数
                     count_SHT10(&humi_val.f,&temp_val.f);           //修正相对湿度及温度
                           temp=temp_val.f;
                     humi=humi_val.f;
            }
                demp[0]=temp%10;
                   demp[1]=temp%100/10;
                   demp[2]=temp%1000/100;
                   demp[3]=temp/1000;
                   demp[4]=10;
                   demp[5]=10;
                   demp[6]=10;
                   demp[7]=10;
                   for(i=0;i<4;i++)
                   {       
                         P2=wei[i];
                        P0=duan[demp[i]];
                     delay_ms(1);
                   }               
        }
}

出0入0汤圆

 楼主| 发表于 2012-7-31 08:52:15 | 显示全部楼层
linucos 发表于 2012-7-30 17:23
上代码!!!

好了,你看

出0入0汤圆

 楼主| 发表于 2012-7-31 08:55:09 | 显示全部楼层
数码管显示部分可以忽略掉,现在用keil优化编译后是 1.6几K。 还得优化掉一K。

出0入0汤圆

发表于 2012-7-31 10:13:43 | 显示全部楼层
delay函数用while(i--)来写

出0入0汤圆

发表于 2012-7-31 11:23:13 | 显示全部楼层
希望渺茫,差距太大了,就算把浮点数去掉,也就省300多字节,距离你的目标还是很远。

出0入476汤圆

发表于 2012-7-31 11:25:53 | 显示全部楼层
换快CPU,多不了多少钱的。

出0入0汤圆

 楼主| 发表于 2012-7-31 11:43:50 | 显示全部楼层
6K6K 发表于 2012-7-31 11:23
希望渺茫,差距太大了,就算把浮点数去掉,也就省300多字节,距离你的目标还是很远。 ...

没,我省掉计算那一环(浮点计算)和数码管显示那一环   只剩下540多字节了,如果找到了好的计算方法,不采用浮点计算,然后再进行修改一下,还是能优化到600字节内的,主要是不知道怎么讲浮点计算优化好。

出0入0汤圆

 楼主| 发表于 2012-7-31 11:46:58 | 显示全部楼层
wy2000 发表于 2012-7-31 11:25
换快CPU,多不了多少钱的。

产品公司已经开发出来了,我老师只是让我重新用C写下程序而已。 我老师用汇编写只用了800字节不到(还是加了带CRC串口通讯程序后)   哎。。。

出0入0汤圆

 楼主| 发表于 2012-7-31 11:47:27 | 显示全部楼层
dapang1221 发表于 2012-7-31 10:13
delay函数用while(i--)来写

那个问题不到,到时候会去掉的。

出0入0汤圆

发表于 2012-7-31 11:52:14 | 显示全部楼层
试下用整数计算代替浮点啊,比如把涉及小数的部分先*10000000,到最后再除以10000000,那运算过程中用到的就全是整数了

出0入0汤圆

 楼主| 发表于 2012-7-31 11:59:33 | 显示全部楼层
mozz 发表于 2012-7-31 11:52
试下用整数计算代替浮点啊,比如把涉及小数的部分先*10000000,到最后再除以10000000,那运算过程中用到的 ...

那用就是long int了啊, long 和float 都是4字节吧?

出0入0汤圆

发表于 2012-7-31 12:02:15 | 显示全部楼层
yb5663349 发表于 2012-7-31 11:59
那用就是long int了啊, long 和float 都是4字节吧?

对啊,占用的RAM是一样的,但运算量会小一些,用的ROM就少了啊,

出0入0汤圆

 楼主| 发表于 2012-7-31 13:38:00 | 显示全部楼层
mozz 发表于 2012-7-31 12:02
对啊,占用的RAM是一样的,但运算量会小一些,用的ROM就少了啊,

那就不只 只*1000 0000 了。 你看湿度那里。

出0入0汤圆

 楼主| 发表于 2012-7-31 21:07:43 | 显示全部楼层
求大神啊。

出0入12汤圆

发表于 2012-7-31 21:13:30 | 显示全部楼层
这么大的JB硬是要塞进那么小的逼里面,真是
蛋疼

出0入0汤圆

 楼主| 发表于 2012-7-31 21:33:56 | 显示全部楼层
skynet 发表于 2012-7-31 21:13
这么大的JB硬是要塞进那么小的逼里面,真是
蛋疼

   好吧。 形容够贴切

出0入0汤圆

发表于 2012-8-1 08:37:37 | 显示全部楼层
1、不使用浮点,将所有浮点运算化成整数运算

2、避免通用指针,如形参指针指向类型要明确,
如:char d_measure(uchar *p_value, uchar *p_checksum, uchar mode)
改成:uchar d_measure(uchar idata *p_value, uchar idata *p_checksum, uchar mode)
3、转化值16位变量(uint)保存就够了

4、只要做到上面3点将省掉很多code,其它像
for (i=0x80;i>0;i>>=1)            //高位为1,循环右移
        {
                if (i&value) DATA=1;          //和要发送的数相与,结果为发送的位
            else DATA=0;                        
            SCK=1;                          
            _nop_();_nop_();_nop_();      //延时3us
            SCK=0;
        }

for(i=0x80;i>0;i>>=1)             //高位为1,循环右移
        {
                SCK=1;                        
            if(DATA) val=(val|i);         //读一位数据线的值
            SCK=0;      
        }


改成

        for (i=8; i; i--)
        {
                DA_SHT = (bit)(value & 0x80);  
                SCK_SHT = 1;
                value <<= 1;
                SCK_SHT = 0;
        }

        for (i=8; i; i--)  
        {
                val <<= 1;
                SCK_SHT = 1;  
                if (DA_SHT) val |= 0x01;
                SCK_SHT = 0;
        }


5、keil 优化级 选择 9

做到上面几点,SHT模块的代码长度可做到7百多

出0入0汤圆

发表于 2012-8-1 09:07:25 | 显示全部楼层
可否用查表代替浮点运算?我只会用汇编。

出0入0汤圆

 楼主| 发表于 2012-8-1 14:52:35 | 显示全部楼层
BXAK 发表于 2012-8-1 08:37
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);
                   }*/               
        }
}   

出0入0汤圆

 楼主| 发表于 2012-8-1 14:54:03 | 显示全部楼层
lhlmm 发表于 2012-8-1 09:07
可否用查表代替浮点运算?我只会用汇编。

求指教,我老师貌似就是用的查表,他汇编写这个才用了800字节不到(加上含CRC的串口通讯)。

出0入0汤圆

 楼主| 发表于 2012-8-1 15:30:57 | 显示全部楼层
又有新突破了,已经优化到了900字节。离目标只有300字节了

出0入0汤圆

 楼主| 发表于 2012-8-1 21:03:18 | 显示全部楼层
再次请论坛大神伸出援助之手。

出0入0汤圆

 楼主| 发表于 2012-8-2 11:09:34 | 显示全部楼层
继续顶。

出0入0汤圆

发表于 2012-8-2 14:24:06 | 显示全部楼层
        if(rh_true<0.1)rh_true=0.1;                    //湿度最小修正

这个地方漏改了吧???

出0入0汤圆

 楼主| 发表于 2012-8-2 14:30:20 | 显示全部楼层
6K6K 发表于 2012-8-2 14:24
if(rh_true

已经改好了, 现在是922字节。

出0入0汤圆

发表于 2012-8-2 14:53:19 | 显示全部楼层
代码量全在count_SHT10函数上了,其他地方真没什么优化余地了。

出0入0汤圆

 楼主| 发表于 2012-8-2 15:00:55 | 显示全部楼层
6K6K 发表于 2012-8-2 14:53
代码量全在count_SHT10函数上了,其他地方真没什么优化余地了。

对啊,我总觉得把浮点计算化成长整形计算不是上策,但我又找不到方法。

出0入0汤圆

 楼主| 发表于 2012-8-2 15:04:52 | 显示全部楼层
再次修改,  将湿度最大最小值的修正给省掉了。  现在是840字节

出0入0汤圆

发表于 2012-8-2 15:41:56 | 显示全部楼层
修正前的温度湿度有没有范围?
拿mathematica画个曲面图看看,取一些关键点,其他的线性插值?

出0入0汤圆

 楼主| 发表于 2012-8-2 16:00:55 | 显示全部楼层
6K6K 发表于 2012-8-2 15:41
修正前的温度湿度有没有范围?
拿mathematica画个曲面图看看,取一些关键点,其他的线性插值? ...

SHT10的官方说明书上说了范围。湿度是0到100度,温度是-40度到123.8度。
线性差值?  是讲它的精确度吗?
我这个count_SHT10() 不是修正温湿度的精确度啦,  是计算出温湿度来,公式都是官方给的。

出0入0汤圆

 楼主| 发表于 2012-8-2 16:04:41 | 显示全部楼层
6K6K 发表于 2012-8-2 15:41
修正前的温度湿度有没有范围?
拿mathematica画个曲面图看看,取一些关键点,其他的线性插值? ...

其实也算修正。

出0入0汤圆

发表于 2012-8-3 09:01:28 来自手机 | 显示全部楼层
一直在用STC12C5A60S2的路过 60K的ROM+1280B的RAM 想用都用不完啊

出0入0汤圆

发表于 2012-8-3 09:10:25 | 显示全部楼层
估计这个有点难度啊。好少啊。 就1K。ROM FLASH。

出0入0汤圆

 楼主| 发表于 2012-8-3 10:08:46 | 显示全部楼层
gaoyichuan000 发表于 2012-8-3 09:01
一直在用STC12C5A60S2的路过 60K的ROM+1280B的RAM 想用都用不完啊

商用得考虑成本的问题, 11F01只要2.5   

出0入0汤圆

发表于 2012-8-3 10:14:16 | 显示全部楼层
yb5663349 发表于 2012-8-3 10:08
商用得考虑成本的问题, 11F01只要2.5

2.5块,可以抓一大把8K FLASH的单片机了。唉,你看看我们坛子里的LGT,才1.99 还是SOP28封的,为啥

出0入0汤圆

发表于 2012-8-3 10:31:32 | 显示全部楼层
  既然需要上位机读数,完全可以把数据打给上位机,让上位机算去。
  1. t_C*10
复制代码
这种东西可以优化成 移位加法的形式      t_C《3+t_C

出0入0汤圆

 楼主| 发表于 2012-8-4 12:51:00 | 显示全部楼层
yirenonege 发表于 2012-8-3 10:31
既然需要上位机读数,完全可以把数据打给上位机,让上位机算去。这种东西可以优化成 移位加法 ...

那个移位那里,我已经在优化了,应该还会少点的。  至于上位机读书,因为这个SHT10只是产品的一个小模块,不单单只是给上位机的。所以还是得下位机自己算出来。

出0入0汤圆

 楼主| 发表于 2012-8-4 16:50:33 | 显示全部楼层
哎,高人快点出现吧, 我头都想炸了。

出0入0汤圆

发表于 2012-8-5 09:06:33 | 显示全部楼层
count_SHT10用汇编写?

出0入0汤圆

 楼主| 发表于 2012-8-5 09:33:59 | 显示全部楼层
linucos 发表于 2012-8-5 09:06
count_SHT10用汇编写?

这个我就不清楚了,没拿给我看。我这个程序是官方原版的,自己在进行优化。

出0入0汤圆

发表于 2012-8-5 18:27:14 | 显示全部楼层
6K6K 发表于 2012-8-2 15:41
修正前的温度湿度有没有范围?
拿mathematica画个曲面图看看,取一些关键点,其他的线性插值? ...

咋一看还以为是mathmatic呢

出200入657汤圆

发表于 2012-8-5 18:55:43 | 显示全部楼层
把乘法转换成加法: rh_lin=(28)*rh*rh + 405000*rh -40000000;    //相对湿度非线性补偿
自己编:rh*rh
突破口还是count_SHT10
先把这个函数全部转车整数加法和移位再说

出0入0汤圆

发表于 2012-8-5 19:05:46 | 显示全部楼层
改用DHT11传感器模块,省下到钱足够你玩stm32了

出0入0汤圆

发表于 2012-8-5 19:22:21 | 显示全部楼层
使用编译器的O3优化,和默认的优化级别比较一下,看看代码的长度变化

出0入0汤圆

发表于 2012-8-5 19:23:15 | 显示全部楼层
还有,实在不行换个编译器,对比一下,可以考虑SDCC,IAR的51编译器,其中前者还免费

出0入0汤圆

发表于 2012-8-20 11:06:58 | 显示全部楼层
sht10  到处飘着代码~~

出0入0汤圆

发表于 2012-8-20 11:27:24 | 显示全部楼层
SH88F2051 SOT-16封装1块6...2K内存

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-8-20 15:02:22 | 显示全部楼层
说实话,这种代码优化的活,不是人干的,之前遇到过一个,使死人了!!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 22:18

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表