8461|11

2770

帖子

0

TA的资源

裸片初长成(中级)

楼主
 

单片机程序空间不足救急 [复制链接]

芯片型号:HT48F10E,已经定死的
功能描述:负离子热吹风机,主要在温度控制.传感器是热敏电阻,构成RC震荡电路,测充放电时间,电源有2个规格,50HZ和60HZ.
ROM大小:1K(1024BYTE)
问题描述:程序还有少量没完成,但快超出ROM边界.(合泰的编译器效率比较低)
希望通过代码优化,改善算发,将公共代码做成子函数调用等来解决.或者按程序功能,改成汇编,以节约ROM空间,谢谢,下面系代码:源代码能编译通过.

/**************************************************************************************/
/*  Company:  midoriya co.,LTD(ShenZhen)                                              */
/*  Project   name: HI-6                                                              */
/*  author:   Andy                                                                    */
/*  Customer: Izmid                                                                   */
/*  Version:  1.0                                                                     */
/*  Work time: 2009-10-22                                                             */                                      
/*  Change record:                                                                    */
/**************************************************************************************/
#include
#define  uchar  unsigned char
#define  ulong  unsigned long
#define  setbit(x,y) (c |= y)
#define  resbit(x,y) (c &= ~y)
#define  STOP_MODE  1
#define  RUN_MODE   2
#define  WAIT_MODE  3
#define  TEST_MODE  4
#define  full_off   0
#define  half_on    1
#define  full_on    2
#define  LED_ON   _pb7=0;
#define  LED_OFF  _pb7=1;
#define  HEAT_ON  _pa7=1;
#define  HEAT_OFF _pa7=0;
#define  OUT10_H  _pc1=1;
#define  OUT10_L  _pc1=0;
#define  OUT11_H  _pc2=1;
#define  OUT11_L  _pc2=0;
#define  COM1_H   _pb3=1;
#define  COM1_L   _pb3=0;
#define  COM2_H   _pb2=1;
#define  COM2_L   _pb2=0;
#define  key_up    _pa5
#define  key_down  _pa4
#define  key_main  _pa6   
#define  zero_pos  _pb1
#define  heat_in   _pc0
#define  hz_50     229
#define  temp_low  0x10
const char LCDcom1_PA[10] = {0X0E,0X08,0X04,0X0C,0X0A,0X06,0X06,0X0C,0x0E,0x0E};   //LCD 7 SEG OF PA FOR COM1
const char LCDcom2[10] = {0X35,0X24,0X33,0X36,0X26,0X36,0X37,0X24,0x37,0x36};        //LCD 7 SEG FOR COM2 ,PB FOR HIGH 4 BIT,PA FOR LOW  4 BIT
const uchar time_50hz[11] = {149,119,98,82,71,63,57,52,48,45,43};
const uchar time_60hz[11] = { 89+10,64+10,46+10,33+10,23+10,17+10,11+10,7+10,4+10,2+10,0+10};       // time tab  for tempture measure
                              /************50hz*******************/  /*********60hz***************/                                             
  uchar ms10_counter;       //
  uchar work_mode;
  uchar main_sw ;
  //uchar flag;
  uchar up_sw;
  uchar down_sw;
  uchar measure_counter;
  uchar ms500_counter;
  uchar temp_counter;
  ulong updown_counter;
  uchar temp_set;
  uchar tp1;
  uchar tp2;
  uchar p1p2[10];
  uchar meas_counter;
  uchar averagetemp ;
  uchar frequency;
  uchar min;
  uchar sec;
  uchar lcdflash_flag;
  uchar lcdflash_counter;
  #pragma vector i10ms @0x08   /*2ms internal interrupt*/
  
    void  lcd_disp(  )              
     {   
         
          _pb &= 0xcf ;         
         if(ms10_counter&0x01)
           {
           _pb |= LCDcom2[averagetemp] &0xf0;
           _pa &= 0xf1;
           _pa |= LCDcom2[averagetemp] &0x0f;
           COM2_L
           COM1_H
           }
         else
          {
            _pb |=0x30;
            _pa &= 0xf1;
            _pa |= LCDcom1_PA[averagetemp];
            COM1_H
            COM2_L
          }
     }
      
  void i10ms( void )
    {   
         if(work_mode==RUN_MODE)
             {  
               if(ms10_counter&0x01)
                 {        
                   OUT10_H;                //turn P1
                if(averagetemp>temp_set+5)
                     {
                       HEAT_ON;
                     }
                else if(averagetemp                    {
                     HEAT_OFF;                     
                   }
                else
                   {
                     HEAT_OFF;
                   }
                }
                else
                  {                                
                    HEAT_OFF;
                  }                                         
               if(!(ms500_counter))           //1s
                  {
                   ms500_counter=100;
                   if(!(--sec))                  
                     {
                      sec=60;
                       if(--min)
                          {
                            HEAT_OFF;
                            COM1_H
                            COM2_H
                            work_mode=WAIT_MODE;
                            min=30;
                          }
                      }
                   }  
            if(up_sw  ==0xf8)
               {
                 if(temp_set<9)
                   {
                     temp_set =temp_set+1;
                   }
              }
            if(down_sw  ==0xf8)
              {
                if(temp_set)
                  {
                    temp_set=temp_set-1;
                  }
              }
           
         }
         
         
      else if(ms10_counter&0x01)
               {
                  if(work_mode==TEST_MODE)                    
                      {                        
                        if(--ms500_counter)   
                          {
                            lcdflash_flag=1;
                          }
                      }            
                              
                  else if(work_mode == STOP_MODE)
                          {                                    
                            if(!(key_up|key_down))      
                               {
                                 updown_counter--;
                               }
                             else
                                {
                                  updown_counter=0;            
                                }
                             }


                 main_sw <<=1;            
                 up_sw <<=1;              
                 down_sw <<=1;            
                 main_sw |=key_main;     
                 up_sw   |=key_up;      
                 down_sw |=key_down;   
             }   
       ms10_counter++;                                       
     }
         
     
void p1p2_measure(void )           //p1-p2 measure  
       {
     }
     
      
void freq_detect( void )
    {
       kkk:  if(!zero_pos)             //if low
               {
                 while(zero_pos);     //low,wait for high
                 _tmrc=0x10;          //when high,start count
                 while(zero_pos);     //when high ,wait for low
                 while(!zero_pos);    //when low, wait for high
                 frequency=_tmr;      //when high, stop count
               }
           else
             {
               while(zero_pos);      //when high,wait for low
               goto kkk;                 
             }
     }



  void main( void )
   {                                         
      uchar i;
      uchar temp_counter;  
      uchar maxtemp;
      uchar mintemp;
      _pac=0x70;             // I/O direct set
      _pbc=0x02;
      _pcc=0x01;
      _pa=0x00;
      _pb=0x8C;
      _pc=0x00;
      temp_set=0;
      temp_counter=10;
      _tmr = 0x00;  /* timer/event counter,up counter 255 then int. */
   _tmrc = 0x94;  /* D7-D6:TimerMode,TON:Enable,Timer Prescaler 1:16 */
   updown_counter=150;
   min=30;
      freq_detect( );   
      work_mode=RUN_MODE;
      if(frequency>hz_50)      //set to 60HZ
        {
         _tmr=48;
        }
       else
        {
         _tmr=0x06;            //set to  50HZ
        }
      _tmrc=0x93;             //timer frequency= 1/16 clock frequency
      _intc=0x05;             //open total int and timer int
      while(1)
         {
            switch(work_mode)
                 {
                   case STOP_MODE:
                  
                                 if(!updown_counter)                 //sw_up ,sw_down >3.0s                     
                                    {               
                                      work_mode=TEST_MODE;        // turn test mode  
                                      updown_counter=150;         //clear flag
                                      ms500_counter=50;
                                      temp_set=0;                                                                                                                       
                                    }                                                                              
                                if(main_sw & 0xff == 0Xf8)          // main_sw : H->L
                                   {                              //CLEAR FLAG                          
                                work_mode=WAIT_MODE;         //jump to run mode   
                                 LED_ON                                                                   //wait for release               
                                }
                               break;                                            
  
                                          
                 
         case WAIT_MODE :     
                        if( main_sw ==0xf8)               // main_sw =H-> L
                          {                        
                           work_mode=STOP_MODE;               //turn stop mode
                           LED_OFF;
                          }
                       if( up_sw ==0xf8)                   //zero_cross =H ->L  up_sw =H ->L
                         {                                      
                          work_mode=RUN_MODE;
                          temp_set=0;
                        }  
                        break;
                                 
       case  RUN_MODE :   
                       if(ms10_counter%2)     // measure for P2
                         {
                           while(!heat_in)
                               {              
                                  tp2=_tmr;
                                  if(tp2>150)
                                     {
                                       OUT11_L
                                       averagetemp=0;
                                       temp_counter=9;         
                                      }
                                  HEAT_OFF
                              }
                         }
                      else
                       {
                         while(!heat_in) ;     //measure for P1      
                         tp1=_tmr;   
                         OUT10_L         
                      }
                      p1p2[temp_counter]=95+(tp2-tp1);      //10ms ==95    1 stand for 40uS                                             
                      for(i=0;i<=10;i++)
                         {
                             if(frequency>hz_50)           //60HZ
                                {  
                                   if( p1p2[temp_counter] < time_60hz)
                                       {        
                                         p1p2[temp_counter]=i;
                                         break;
                                       }
                                    else                 //50HZ
                                       {  
                                         if(p1p2[temp_counter] )
                                           {        
                                             p1p2[temp_counter]=i;
                                             break;
                                           }                                                      
                                        }
                                 }
                           }
                    if(!(--temp_counter))
                      {  
                       temp_counter=9;                                                                              
                       maxtemp=p1p2[0];
                       mintemp=p1p2[0];
                       
                       for(i=0;i<10;i++)
                           {
                             if(maxtemp)
                                 {
                                   maxtemp=p1p2;
                                 }
                             if(mintemp>p1p2)                        
                                 {
                                   mintemp=p1p2;
                                 }
                           }
                                                                           
/*****************************************************************************************/
/*********************get average tempture not include the max and min tempture **********/
/*****************************************************************************************/
                         averagetemp=0;
                                                        
                            for(i=0;i<10;i++)
                                {                     
                                 averagetemp +=p1p2;
                                }
                          averagetemp=(averagetemp-maxtemp-mintemp)>>3;                                                                                                
                          }  
                      break;
                                                                          
        case TEST_MODE:
                                                                                         
                         if(ms500_counter==50)
                             {
                               if(++temp_set>9)
                                 {
                                    work_mode=STOP_MODE;
                                    temp_set=0;
                                 }
                                    
                             }
                          else  if(ms500_counter<50)
                              {
                                LED_ON
                                lcd_disp( );
                              }
                         else
                            {
                              LED_OFF
                              COM1_H
                              COM2_H
                            }
                        
                        if(main_sw ==0xf8 || up_sw  == 0xf8 || down_sw == 0xf8)
                            {  
                               work_mode=STOP_MODE;
                               HEAT_OFF;
                               LED_OFF;
                            }
                                   
                    }  
                     
                }                          
                  
                  
          }
此帖出自单片机论坛

最新回复

不知楼主解决了没有?怎么实现C语言调用汇编?  详情 回复 发表于 2016-4-19 11:41
点赞 关注
 

回复
举报

81

帖子

0

TA的资源

纯净的硅(中级)

沙发
 
这个简单,你编译出来是HEX文件的吧,那是十六进制文件,然后你有HEX转BIN文件就可以了,一般情况下,40K的HEX文件可以转成20多K的BIN文件
此帖出自单片机论坛
 
 

回复

196

帖子

0

TA的资源

五彩晶圆(中级)

板凳
 
还有一种方法,就是将C改为汇编,那样编译出来就小多了
此帖出自单片机论坛
 
 
 

回复

2770

帖子

0

TA的资源

裸片初长成(中级)

4
 

TO 1L

不是HEX文件,是MTP的哦,见下面 图片
此帖出自单片机论坛
 
 
 

回复

277

帖子

0

TA的资源

五彩晶圆(中级)

5
 
void freq_detect( void )
{
        unsigned char temp00;
        temp00=zero_pos;
        while (temp00==zero_pos);
        _tmrc=0x10;        
        while (temp00!=zero_pos);  
        while (temp00==zero_pos);
        frequency=_tmr;   
}
这里不知能不能精简一点。
此帖出自单片机论坛
 
 
 

回复

18

帖子

0

TA的资源

一粒金砂(中级)

6
 

精简精简了,不是太难的,就是花时间

不要什么都找人帮忙,还是要靠自己啊.
此帖出自单片机论坛
 
 
 

回复

1908

帖子

8

TA的资源

五彩晶圆(高级)

7
 

程序很专业

闂備礁鎼悮顐﹀磿閸愯鑰块柛娑欐綑鐎氬銇勯幒鍡椾壕缂備焦顨嗛敃銏犵暦濡ゅ懎惟闁宠桨绀佹慨銈夋煟閻橀亶妾烽柛鏂跨箻椤㈡瑩骞嬮敂鑺ユ珫閻庡厜鍋撻柛鎰劤濞堬拷闂備浇鐨崱鈺佹缂傚倸绋勯幏锟�闂備胶鎳撻悺銊╂偋閻愬搫鐒垫い鎺戯攻鐎氾拷婵犵數鍋涢ˇ顓㈠礉瀹€鍕埞闁跨噦鎷�
此帖出自单片机论坛
 
 
 

回复

1908

帖子

8

TA的资源

五彩晶圆(高级)

8
 

请问lz这个单片机里面有没有bit格式

闂備礁鎼悮顐﹀磿閸愯鑰块柛娑欐綑鐎氬銇勯幒鍡椾壕缂備焦顨嗛敃銏犵暦濡ゅ懎惟闁宠桨绀佹慨銈夋煟閻橀亶妾烽柛鏂跨箻椤㈡瑩骞嬮敂鑺ユ珫閻庡厜鍋撻柛鎰劤濞堬拷闂備浇鐨崱鈺佹缂傚倸绋勯幏锟�闂備胶鎳撻悺銊╂偋閻愬搫鐒垫い鎺戯攻鐎氾拷婵犵數鍋涢ˇ顓㈠礉瀹€鍕埞闁跨噦鎷�
此帖出自单片机论坛
 
 
 

回复

97

帖子

0

TA的资源

纯净的硅(初级)

9
 
闂備礁鎼悮顐﹀磿閸愯鑰块柛娑欐綑鐎氬銇勯幒鍡椾壕缂備焦顨嗛敃銏犵暦濡ゅ懎惟闁宠桨绀佹慨銈夋煟閻橀亶妾烽柛鏂跨箻椤㈡瑩骞嬮敂鑺ユ珫閻庡厜鍋撻柛鎰劤濞堬拷闂備浇鐨崱鈺佹缂傚倸绋勯幏锟�闂備胶鎳撻悺銊╂偋閻愬搫鐒垫い鎺戯攻鐎氾拷婵犵數鍋涢ˇ顓㈠礉瀹€鍕埞闁跨噦鎷�
此帖出自单片机论坛
 
 
 

回复

5

帖子

0

TA的资源

一粒金砂(中级)

10
 
闂備礁鎼悮顐﹀磿閸愯鑰块柛娑欐綑鐎氬銇勯幒鍡椾壕缂備焦顨嗛敃銏犵暦濡ゅ懎惟闁宠桨绀佹慨銈夋煟閻橀亶妾烽柛鏂跨箻椤㈡瑩骞嬮敂鑺ユ珫閻庡厜鍋撻柛鎰劤濞堬拷闂備浇鐨崱鈺佹缂傚倸绋勯幏锟�闂備胶鎳撻悺銊╂偋閻愬搫鐒垫い鎺戯攻鐎氾拷婵犵數鍋涢ˇ顓㈠礉瀹€鍕埞闁跨噦鎷�
此帖出自单片机论坛
 
 
 

回复

1249

帖子

0

TA的资源

裸片初长成(高级)

11
 
闂備礁鎼悮顐﹀磿閸愯鑰块柛娑欐綑鐎氬銇勯幒鍡椾壕缂備焦顨嗛敃銏犵暦濡ゅ懎惟闁宠桨绀佹慨銈夋煟閻橀亶妾烽柛鏂跨箻椤㈡瑩骞嬮敂鑺ユ珫閻庡厜鍋撻柛鎰劤濞堬拷闂備浇鐨崱鈺佹缂傚倸绋勯幏锟�闂備胶鎳撻悺銊╂偋閻愬搫鐒垫い鎺戯攻鐎氾拷婵犵數鍋涢ˇ顓㈠礉瀹€鍕埞闁跨噦鎷�
此帖出自单片机论坛
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

12
 
闂備礁鎼悮顐﹀磿閸愯鑰块柛娑欐綑鐎氬銇勯幒鍡椾壕缂備焦顨嗛敃銏犵暦濡ゅ懎惟闁宠桨绀佹慨銈夋煟閻橀亶妾烽柛鏂跨箻椤㈡瑩骞嬮敂鑺ユ珫閻庡厜鍋撻柛鎰劤濞堬拷闂備浇鐨崱鈺佹缂傚倸绋勯幏锟�闂備胶鎳撻悺銊╂偋閻愬搫鐒垫い鎺戯攻鐎氾拷婵犵數鍋涢ˇ顓㈠礉瀹€鍕埞闁跨噦鎷�
此帖出自单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条
电源解决方案和技术 | DigiKey 应用探索站
当月好物、电源技术资源、特色活动、DigiKey在线实用工具,干货多多~

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表