芯片型号: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;
}
}
}
}