⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c.svn-base

📁 由MSP430F135做控制器的温度控制详细程序
💻 SVN-BASE
字号:

#include<msp430x13x.h> 
#include"..\inc\resources.h"
#include"..\inc\globalvar.h"
#include"..\inc\const_def.h"
#include"..\inc\flashfunc.h"
#include"..\inc\config.h"
#include"..\inc\disdata.h"
#include"..\inc\ledcomm.h"


extern unsigned int set_run( void );
extern unsigned int rpm_to_rcf(unsigned int rpm);
extern unsigned int hlp_init(void);
extern unsigned int send_comm\
	( unsigned int comm,unsigned int p1,unsigned int p2 );

unsigned int get_key( void );
// timer_A interrupt service routine
#pragma vector=TIMERA1_VECTOR
__interrupt void timer_a_isr (void)
{ 
	static unsigned char t;
	asm("ADD &0x012E,PC");	//Add offset to Jump table
	asm("RETI");		//TAIV@(0x012E)
	asm("RETI");
	asm("RETI");
	asm("RETI");
	asm("RETI");
      
	if( ++t > 9){   //250ms
		t = 0;
		if ( ++second > 3 ){    //1s
			second = 0;
			if( run_timer > 0 )
				run_timer--;
			if(rl_delay_time > 0 )
				rl_delay_time--;
		}
		int_state |= INT_TIMERA;	//set int flag
		LPM1_EXIT;	
	}
	
	//25ms
	if( systimer0 != 0 ) systimer0--;
	
	//for key
	if( systimer_key != 0 ){
		systimer_key--;
		if(( systimer_key == 18 )||( systimer_key == 20 )){
			
			KEY_OUT = KEY_SEG0;	
			if( KEY_IN != 0 ){
				key0 = KEY_IN;
			}else{
				KEY_OUT = KEY_SEG1;	
				if( KEY_IN != 0 ){
					key0 = 0x0100 | KEY_IN; 
				}else{
					KEY_OUT = KEY_SEG2;	
					if( KEY_IN != 0 )
						key0 = 0x0200 | KEY_IN; 
				}
			}
			KEY_OUT = 0x00;
			
			if( systimer_key == 20 )
				key1 = key0;
			else{
				if( key1 == key0 ){
					int_state |= INT_KEY;
					LPM1_EXIT;
				}
			}
		}
		if( systimer_key == 1 ){
			clr_P2intflg_();
			p2_int_en_();
		}
	}
	
}   

// timer_B interrupt service routine
#pragma vector=TIMERB1_VECTOR
__interrupt void timer_b_isr (void)
{ 	
	/*****************1S=32768hz******************
	*          rate measure
	*		32k * 60
	*	rpm = -------------
	*		    n
	*	n = (num[1] - num[0]) * 32k - num_cap[0] + num_cap[1]
	*	
	***********************************/
	/*******************1S=4mhz****************
	*          rate measure
	*		1M * 60
	*	rpm = -------------
	*		    n
	*	n = (num[1] - num[0]) * 50K - num_cap[0] + num_cap[1]
	*	
	***********************************/
	
	unsigned long i;
	
	switch( TBIV ){
		case 0x02:
			if( ++num0 > 1) num0 = 0 ;
			
			if(num0 == 0){
				num[0] = num_32k;
				num_cap[0] = TBCCR1;
			}
			if(num0 == 1){
				//close int
				TBCTL  &=  ~TBIE;
				TBCCTL1 &=  ~CCIE;
				
				num[1] = num_32k;
				num_cap[1] = TBCCR1;
				if(num[0] == num[1]){
				    smpl_rate = (unsigned long)(60*1000000) /\
					      	(unsigned long)\
						( num_cap[1] - num_cap[0]); 
				}else{
				  i = ((unsigned long)(num[1]-num[0])) * \
					     (unsigned long)50000 \
					      - (unsigned long)num_cap[0]\
					      + (unsigned long)num_cap[1];
				  smpl_rate = (unsigned long)(60*1000000)\
						    /i;
				}
				//open int
				TBCTL  |=  TBIE;
				TBCCTL1 |=  CCIE;
				
			}
				
		/**********************	
		if( ++num0 > 1) num0 = 0 ;

		if( num0 ==0  ){
			set_rl_(RL3,RL);
			rl_load_();	//refrigeration
		}
		
		if( num0 ==1 ){
		clr_rl_(RL3,RL);
		rl_load_();		//stop refrigeration
		}
		**************************/
			break;
		case 0x0e: 
			num_32k++;
			
			break;
		default:
			break;
	}
}


// UART0  interrupt service routine
#pragma vector=UART0TX_VECTOR
__interrupt void uart0_tx_isr (void)
{ 
	if( trn[txnumber] == 0xAA){
		rxnumber = 0;
		TX_state();
		rcv_pkg_ok = FALSE;
	}else{
		U0TXBUF = trn[ txnumber++ ];	//清中断标志
		if( trn[txnumber] == 0x55 )// 准备发送下一个
			txnumber = 0;
	}
}   

// UART0  interrupt service routine
#pragma vector=UART0RX_VECTOR
__interrupt void uart0_rx_isr (void)
{ 
	unsigned char i;
	
	i = U0RXBUF;     //清中断标志
	if(rxflag == 0){
		if( i == ':' ){
			rxflag = 0xaa;
	  		rcv[rxnumber++] = i;
		}
	}else{
		rcv[rxnumber++] = i;
		if( rxnumber > 49){
			rxnumber = 0;
			rxflag = 0;
		}
		if( i == 0x0a ){
			rcv_pkg_ok = TRUE;
			rxflag = 0;
		}
	}
}   




// ADC12 interrupt service routine

/*#pragma vector=ADC_VECTOR
__interrupt void adc12_isr (void)
{
	adc_data[adc_counter] = ADC12MEM0;

	if( adc_counter == 7){
		adc_counter = 0;
		ADC12IFG = 0;
	}else if( adc_counter == 6){
		ADC12CTL0 &= ~ENC;
		adc_counter++;
	}else{
		adc_counter++;
	}
}
*/


// Port 2 interrupt service routine
#pragma vector=PORT2_VECTOR
__interrupt void port_2_isr (void)
{ 
  	clr_P2intflg_();	        //清中断标志
	p2_int_ds_();	//禁止P2中断
	systimer_key = 25;
	//int_state |= INT_PORT2;		//set int flag
	//LPM1_EXIT;	// Clear CPUOFF+SCG1+SCG0 bit from 0(SR)
}   


//////receive data from the PC////////
void RX_comm(void)
{///state,setting,sensors' select/////


}
///////send data to the PC///////
void TX_stata(void)
{///include channel ,temperature,sensors,setting////


}
 
	
//////////////////////////////////////////////
void TEMP_COV( void )
{
         if( ( TEMP | 0x7f ) == 0x7f  )
         {
             TEMP_L = TEMP%10;//取个位  余数
             TEMP_H = TEMP/10;//取十位  模
          }
         if ( ( TEMP & 0x80 ) == 0x80 )
          {//////////负温度/////////
              TEMP_L = ( ~TEMP + 1 )%10;//取个位  余数
              TEMP_H = ( ~TEMP + 1 )/10;//取十位  模               
           }
}



void display( void )
{
	        
         if( dis_state == 0xff )
        {
            //////////////开机指示灯亮1s///////
            set_led_(P2_CON_WLED_SS,P2_CON);//外部搜索加热启动指示  SS=QWJ
            set_led_(P2_CON_WLED_GJ,P2_CON);//外部攻击加热启动指示  GJ=WG
            sysdelay( 50 );//延时1s后熄灭?????
            clr_led_(P2_CON_WLED_SS,P2_CON);
            clr_led_(P2_CON_WLED_GJ,P2_CON);
            dis_state == 0xaa;//判断是否为开机状态
          } else {
          ///传感器故障则灯闪烁//////////////
          ///??????????????????????????????????
            //led 温度显示//
            switch( TEMP_L )
            {
                 case 0:
                     LED_OUT_L = 0xc0;//个位
                 case 1:
                     LED_OUT_L = 0xf9;//个位
                 case 2:
                     LED_OUT_L = 0xa4;//个位
                 case 3:
                     LED_OUT_L = 0xb0;//个位
                 case 4:
                     LED_OUT_L = 0x89;//个位
                 case 5:
                     LED_OUT_L = 0x92;//个位
                 case 6:
                     LED_OUT_L = 0x82;//个位
                 case 7:
                     LED_OUT_L = 0xf8;//个位     
                 case 8:
                     LED_OUT_L = 0x80;//个位
                 case 9:
                     LED_OUT_L = 0x90;//个位 
                 break;
                 default:break;
            }
            switch( TEMP_H )
            {
                 case 0:
                     LED_OUT_H = 0xc0;//十位
                 case 1:
                     LED_OUT_H = 0xf9;//十位
                 case 2:
                     LED_OUT_H = 0xa4;//十位
                 case 3:
                     LED_OUT_H = 0xb0;//十位
                 case 4:
                     LED_OUT_H = 0x89;//十位
                 case 5:
                     LED_OUT_H = 0x92;//十位
                 case 6:
                     LED_OUT_H = 0x82;//十位
                 case 7:
                     LED_OUT_H = 0xf8;//十位    
                 case 8:
                     LED_OUT_H = 0x80;//十位
                 case 9:
                     LED_OUT_H = 0x90;//十位 
                 break;
                 default:break;
            }
            
            if( ( TEMP & 0x80 ) == 0x80  )   
                  set_led_(P2_CON_LED_N,P2_CON);//低于零度符号显示
            else  clr_led_(P2_CON_LED_N,P2_CON);

            
            
 //           LED_OUT_H = Hdis_( TEMP_H );//十位???????????
 //          LED_OUT_L = Hdis_( TEMP_L );//个位??????????
            //??????key??key????key????key???????????//////////
            if( key == KEY_SS )//搜索潜望镜加热指示灯控制
            {
                  set_led_(P2_CON_WLED_SS,P2_CON);
                  set_led_(P2_CON_LED_SS,P2_CON);
             }else { 
                  clr_led_(P2_CON_WLED_SS,P2_CON);
                  clr_led_(P2_CON_LED_SS,P2_CON);
                  }
            if( key == KEY_GJ )//攻击潜望镜机诶若指示灯控制  
            {
                  set_led_(P2_CON_WLED_GJ,P2_CON);
                  set_led_(P2_CON_LED_GJ,P2_CON);
            } else {
                  clr_led_(P2_CON_WLED_GJ,P2_CON);
                  clr_led_(P2_CON_LED_GJ,P2_CON);
                  }
         //////////加热保温灯的点亮Heat_flg????????Hold_flg???????
            if( Heat_flg == 1 ) set_con_(P3_CON_LED_HEAT,P3_CON);
            else   clr_con_(P3_CON_LED_HEAT,P3_CON);
         //????????????????????待机时保温灯闪烁???????????????????????????????
            if( Hold_flg == 1 ) set_con_(P3_CON_LED_HOLD,P3_CON);
            else   clr_con_(P3_CON_LED_HOLD,P3_CON);
          /////////////////   2只传感器的指示灯///sensor1_err///sensor1?/////////  
            if( ( sensor1_err == 0 ) || ( sensor1 == 1 ) )  set_con_(P3_CON_LED_WG1,P3_CON);
            else  clr_con_(P3_CON_LED_WG1,P3_CON);
            
            if( ( sensor2_err == 0 ) || ( sensor2 == 1 ) )  set_con_(P3_CON_LED_WG2,P3_CON);
            else  clr_con_(P3_CON_LED_WG2,P3_CON);
            
       
                 }
        
        
        
        
}

int get_temp( void )
{
	int t,t0,k,dt0;

	adc_dt_calculate();
	t = (int)adc_data[0];
	
	if( t > TEMP_D30 ){
		t0 = 40;
		k =  TEMP_K40;
		dt0 = TEMP_D40;
	}else if( t > TEMP_D10 ){
		t0 = 20;
		k =  TEMP_K20;
		dt0 = TEMP_D20;
	}else if( t > TEMP_DF10 ){
		t0 = 0;
		k =  TEMP_K0;
		dt0 = TEMP_D0;
	}else{
		t0 = -20;
		k =  TEMP_KF20;
		dt0 = TEMP_DF20;
	}
	t = (( t - dt0 ) * 16  )/ k + t0;
	return ( t );
}

void timer_a_routine( void )
{
	int t_new;
	static int t_old;
	static unsigned int t_num;
	
	if ((second & 1) == 0 ){
		display();
	}

	if ((second & 3) == 0 ){	//one per second
		//temprature control
		t_new = get_temp();
		
		if(( t_new > -50 ) && ( t_new < 100 )){
			if( t_old != t_new ){
				t_old = t_new;
				t_num = 0;
			}else{
				if( t_num++ > 2 ){
					txn = t_old;
					t_num = 0;
				}
			}
			// exec
			t_new = ref_temp;
			if( ysj_exec == YSJ_STOP){
				if( txn >= (t_new) ){
					rl_delay_time = 15;
					ysj_exec = YSJ_RUN_DL;	//refrigeration
				}
			}
			
			if( (t_new - 1) >= txn ){
				ysj_exec = YSJ_STOP;	//stop refrigeration
			}
			//close system
			if( txn >= 42 ){
				//if( send_comm( STOP,NONE_P,NONE_P ) == 0 )	
					//sysstate = SYS_RUN_DEC_SEG;
				
			}
		}
		// temprature Sampling start
		ADC12CTL0 |= ADC12SC + ENC;	
		
	}
	
	//run control									     	
	if( sysstate > SYS_RUN ){
		run_control();
	}

}



void varible_init( void )
{
	adc_counter = 0;
	
	//ysj_exec = YSJ_STOP;
	
	flash = 0;
        sensor1_err = 0;//传感器1正常
	sensor2_err = 0;//传感器2正常
        Heat_flg = 0;
        Hold_flg = 0;
	dis_state = 0xff;
	//sysstate_set = 0xff;
	//sysstate_run = 0xff;
	//rate_dis_st_old = 0xff;
} 



void main( void )
{
	
	msp430config();
	delay(0xfffe);
	delay(0xfffe);
	
	//key_init();
	varible_init();//
	//delay 2.5s
	sysdelay( 120 );
	
	while( systimer0 != 0);
	//check hlp
	//if( hlp_init() != 0 ){
		//WriteGRBL(ADDGRSCR0 + MAXCOL * 100 + 7, xttxgz);
		//while(1);
	//}

	while(1){
                display();
		///SAMPLE BIT
		if( (int_state & INT_TIMERA) == INT_TIMERA ){
 			timer_a_routine();
 			int_state &= ~INT_TIMERA; //clear int flag
 		}
 		//port2 interrrupt
		//if( (int_state & INT_PORT2) == INT_PORT2 ){
			//systimer_key = 16;
 			//int_state &= ~INT_PORT2; //clear int flag
 		//}

		//key
 		if( (int_state & INT_KEY) == INT_KEY ){
 			key_handle();
 			int_state &= ~INT_KEY; //clear int flag
 		}
		
		if((ysj_exec == YSJ_RUN_DL)&&(rl_delay_time == 0)){
			ysj_exec = YSJ_RUN;
		}
		if( int_state == 0 ){
			///////  YSJ  ////////
			if( ysj_exec == YSJ_RUN ){
				set_rl_(RL_PWR,RL);
			}else if( ysj_exec == YSJ_STOP ){
				clr_rl_(RL_PWR,RL);
			}
			LPM1;	//cpu idle
		}
	}
} 


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -