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

📄 dth.bak

📁 用PIC12F576做的C语言的电热服的控制程序
💻 BAK
字号:
#include  <pic.h>
#define	XTAL_FREQ	4MHZ
#include  "delay.c"
#include  <delay.h>


#define  delay_ms  DelayMs
#define  delay_us  DelayUs
#define  key       GPIO3
#define  blue_led  GPIO2
#define  green_led GPIO4
#define  red_led   GPIO5
//#define  set_low_value  0x4c    //20-1.04-b0-130-4c
//#define  set_mid_value  0x3c    //28-.821-f0-3c
//#define  set_high_value 0x2e    //35-.642-bb-2e
//**
//#define  set_low_value  0x41    //25-51.5k-0x105-41
//#define  set_mid_value  0x2e    //35
//#define  set_high_value 0x20    //45-21.8k-0x81-20
//**
#define  set_low_value  0x36    //30-40.7k-0xda-0x36
#define  set_mid_value  0x27    //40-26.6k-0x9a-0x26
#define  set_high_value 0x1c    //50-17.7k-0x6c-0x1b

#define  pwm_out   GPIO1


static unsigned char time,state,have_key,key_open;
static unsigned char temperature,temp_data,pwm;

/*  
   void	delayus(unsigned int xx) {
               
	   unsigned char j,k;
	      	
		if(xx>0xfe){
		         k=xx/10;
		           for(j=0;j<10;j++)delay_us(k);
		         
		            }
		     else delay_us(xx);		   
			  };
*/        

static void interrupt gpie(void){
         INTCON=0;  
         GPIF=0;
         if(TMR1IF==1)time++;
         TMR1IF=0;   //PIR1:0
         INTCON=0xc0;
         }


void ad_init(void){
      ADCON0=0x01;     //
      ANSEL=0x11;        //AD CLOCK FOCS/8   AN0 SELECE AD CONVER REF:VDD
      ADON=1;         //AD Module on
      }
      
unsigned char ad_read(unsigned char channel){
          channel&=0x03;
          ADCON0&=0xc3;
          ADCON0|=(channel<<2);
          GODONE=1;
          while(GODONE)continue;
          return(ADRESH);
          }  


void sleep_sub(void){ 
               blue_led=1;green_led=1;red_led=1;   
               ADON=0;
               INTCON=0x88;  //GIE=1;GPIE=1;
	       IOCB=0x08;    //GP3 CHANGE INTERRUPT
	       OPTION = 0x8f;	// WDT prescaled by 1 - about 17 ms
               CLRWDT();	       
	       asm("sleep");  
	       CLRWDT();       
              // asm("nop");     //jump main
               //CLRWDT();
               OPTION = 0x88;	// WDT prescaled by 1 - about 17 ms
               asm("goto $");
               asm("nop");
               INTCON=0xc0;
               CMCON=0x07;
              
               }
               
void led(void){
        blue_led=1;green_led=1;red_led=1;
        if(state==1)blue_led=0;
        if(state==2)green_led=0;
        if(state==3)red_led=0;  
        }     
void key_function(void){
                have_key=0;
                key_open=0;
                if(key!=0)return;
                led();
                TMR1L=0;
                TMR1H=0;
                time=0;
                GIE=1;
                TMR1ON=1;
                for(;;){
                    CLRWDT();
                    if(time>4)sleep_sub();
                    if(key!=0)break;
                    }
                TMR1L=0;
                TMR1H=0;
                time=0;
           while(1){
           	CLRWDT();
                for(;;){
                    CLRWDT();
                    if(key==0){
                           delay_ms(10);
                           if(key==0){have_key=1;break;}
                           }
                    if(time>8){
                           blue_led=1;
                           green_led=1;
                           red_led=1;
                           TMR1L=0;
                           TMR1H=200;
                           time=0;
                           return;
                           }
                    }
                TMR1L=0;
                TMR1H=0;
                time=0;    
                state++;
                if(state>3)state=1;
                led();
                if(state==1)temperature=set_low_value;
                if(state==2)temperature=set_mid_value;
                if(state==3)temperature=set_high_value;
                for(;;){
                    CLRWDT();
                    if(key!=0)break;
                    if(time>4)sleep_sub();
                    }
                }
  }
//////////////////////////////////////  
void pwm_function(void){
            unsigned int pwm_high,pwm_low,h,l;
            TMR1L=0;
            TMR1H=200;       //about 100 ms check a time
            time=0;
            GIE=1;
            TMR1ON=1;
            h=2*pwm*10/10;
            l=2*(100-pwm)*10/10;
            for(;;){
                CLRWDT();
                pwm_high=h;
                pwm_out=1;
                if(time>0)break;
                while(pwm_high--);
               //delayus(pwm_high);
                pwm_low=l;
                pwm_out=0;
                while(pwm_low--);
                //delayus(pwm_low);
                
                key_function();
                }           
            }  

//////////////////////main////////////////////////

main(){
        unsigned char i,temp;
       i=0;
       temp_data=0;
       GPIO=0x34;
       CMCON=0x07;
       TRISIO=0b00001001;
                         //as  pic16f676
       asm("movlw 0x01");
       asm("movwf 0x91");
       ANSEL=0x11;       // same pic12f675 ANSEL=0X11;
         	      
        OPTION = 0x0D;	// WDT prescaled by 64 - about 1200 ms
        GPIO=0x34;    0b00110100;   //led of
        TRIS2=1;	/////////////
        WPU2=1;
        ad_init();
        PEIE=0x01;   //enable  INTCON:6
        T1CON=0x30;   //timer1  1:8  
        PIE1=0x01;  //enable timer1 intterupt TMR1IE;
        TMR1ON=0;   //T1CON:0   TMR1 STOP
        //WPU0=1; //gpio0  weak pull-up enable  
        
        
        i=0;
        i=0;
        CLRWDT();    
  	if((GPIO2==0)&&(key==0)){
			pwm_out=1;
			delay_ms(200);
  			temp_data=ad_read(0);
  			if((temp_data>0x3a)&&(temp_data<0x40)){GPIO4=0;GPIO5=0;};
test: 			CLRWDT(); 
  			if(GPIO2==0)goto test;						
			pwm_out=0;
  			}
	TRIS2=0;	//////////
	GPIO=0x34;    0b00110100;   //led of
  	GPPU=1;
  	
        if(key==1)sleep_sub();  //no key press       
        TMR1L=0;
        TMR1H=0;
        TMR1ON=1;    //START TMR1 ON 
        GIE=1;       //enable globe inttrupt 
        time=0;
       
        for(;;){
            CLRWDT();
            if((key!=0)&&(time<5))sleep_sub();
            if((key!=0)&&(time>4)){blue_led=0;break;}
            if(time>4)blue_led=0;
            }
        state=1;
//locate_convert:        
    for(;;){ 
        CLRWDT();
        TMR1L=0;
        TMR1H=0;
        time=0;
        GIE=1;
        TMR1ON=1;
        led();
        have_key=0;
        temp=0;
        for(;;){
            CLRWDT();
            if((key!=0)&&(time>8)){have_key=0;break;}
            if(key==0){
                   delay_ms(10);
                   if(key==0){have_key=1;temp=1;state++;break;}
}
            }
        if(state>3)state=1;
        if(have_key==1)led();    
        TMR1L=0;
        TMR1H=0;
        time=0;
        GIE=1;
        TMR1ON=1;
        key_open=0;               
        while(temp){
            CLRWDT();
            if(time>4)sleep_sub();
            if(key!=0){temp=0;key_open=1;};
            }    
       // if(key_open==1)goto locate_convert;
        if(key_open==0)break;
       }
        blue_led=1;green_led=1;red_led=1;
        if(state==1)temperature=set_low_value;
        if(state==2)temperature=set_mid_value;
        if(state==3)temperature=set_high_value;
        
        while(1){
            CLRWDT();
            temp_data=ad_read(0);
            if((temp_data>0xe0)||(temp_data<0x0f)){
					 if(state==1)pwm=1;
        				 if(state==2)pwm=1;
       					 if(state==3)pwm=1;
            				};
            
            if(temp_data>temperature)pwm++;
            if(temp_data<temperature)pwm--;
            if(pwm<1)pwm=1;
            if(pwm>100)pwm=100;
            pwm_function();
            }

}

⌨️ 快捷键说明

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