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

📄 dth.lst

📁 用PIC12F576做的C语言的电热服的控制程序
💻 LST
字号:
     1: #include  <pic.h>
     2: #define XTAL_FREQ       4MHZ  //pic12f675
     3: #include  "delay.c"
     4: #include  <delay.h>
     5: 
     6: 
     7: #define  delay_ms  DelayMs
     8: #define  delay_us  DelayUs
     9: #define  key       GPIO3
    10: #define  blue_led  GPIO2
    11: #define  green_led GPIO4
    12: #define  red_led   GPIO5
    13: //#define  set_low_value  0x4c    //20-1.04-b0-130-4c
    14: //#define  set_mid_value  0x3c    //28-.821-f0-3c
    15: //#define  set_high_value 0x2e    //35-.642-bb-2e
    16: /*次为按客户要求更改为35-45-55度 2007-2-28*/
    17: //#define  set_low_value  0x2d    //35-32.83k-0xb7-0x2d
    18: //#define  set_mid_value  0x20    //45-21.89k-0x82-0x20
    19: //#define  set_high_value 0x17    //55-14.94k-0x5c-0x17
    20: 
    21: //#define  set_low_value  0x36    //30-40.7k-0xda-0x36
    22: //#define  set_mid_value  0x27    //40-26.6k-0x9a-0x26
    23: //#define  set_high_value 0x1c    //50-17.7k-0x6c-0x1b
    24: 
    25: /*2008-5-12按客户要求更改为40-50-60度*/
    26: #define  set_low_value  0x27    //40-26.6k-0x9a-0x26
    27: #define  set_mid_value 0x1c    //50-17.7k-0x6c-0x1b
    28: #define  set_high_value  0x13    //60-12.4k-0x4e-0x13
    29: 
    30: #define  pwm_out   GPIO1
    31: 
    32: 
    33: static unsigned char time,state,have_key,key_open;
    34: static unsigned char temperature,temp_data,pwm;
    35: 
    36: /*  
    37:    void delayus(unsigned int xx) {
    38:                
    39:            unsigned char j,k;
    40:                 
    41:                 if(xx>0xfe){
    42:                          k=xx/10;
    43:                            for(j=0;j<10;j++)delay_us(k);
    44:                          
    45:                             }
    46:                      else delay_us(xx);            
    47:                           };
    48: */        
    49: 
    50: static void interrupt gpie(void){
    51:          INTCON=0;  
    52:          GPIF=0;
    53:          if(TMR1IF==1)time++;
    54:          TMR1IF=0;   //PIR1:0
    55:          INTCON=0xc0;
    56:          }
    57: 
    58: 
    59: void ad_init(void){
    60:       ADCON0=0x01;     //
    61:       ANSEL=0x11;        //AD CLOCK FOCS/8   AN0 SELECE AD CONVER REF:VDD
    62:       ADON=1;         //AD Module on
    63:       }
    64:       
    65: unsigned char ad_read(unsigned char channel){
    66:           channel&=0x03;
    67:           ADCON0&=0xc3;
    68:           ADCON0|=(channel<<2);
    69:           GODONE=1;
    70:           while(GODONE)continue;
    71:           return(ADRESH);
    72:           }  
    73: 
    74: 
    75: void sleep_sub(void){ 
    76:                blue_led=1;green_led=1;red_led=1;   
    77:                ADON=0;
    78:                INTCON=0x88;  //GIE=1;GPIE=1;
    79:                IOCB=0x08;    //GP3 CHANGE INTERRUPT
    80:                OPTION = 0x8f;   // WDT prescaled by 1 - about 17 ms
    81:                CLRWDT();               
    82:                asm("sleep");  
    83:                CLRWDT();       
    84:               // asm("nop");     //jump main
    85:                //CLRWDT();
    86:                OPTION = 0x88;   // WDT prescaled by 1 - about 17 ms
    87:                asm("goto $");
    88:                asm("nop");
    89:                INTCON=0xc0;
    90:                CMCON=0x07;
    91:               
    92:                }
    93:                
    94: void led(void){
    95:         blue_led=1;green_led=1;red_led=1;
    96:         if(state==1)blue_led=0;
    97:         if(state==2)green_led=0;
    98:         if(state==3)red_led=0;  
    99:         }     
   100: void key_function(void){
   101:                 have_key=0;
   102:                 key_open=0;
   103:                 if(key!=0)return;
   104:                 led();
   105:                 TMR1L=0;
   106:                 TMR1H=0;
   107:                 time=0;
   108:                 GIE=1;
   109:                 TMR1ON=1;
   110:                 for(;;){
   111:                     CLRWDT();
   112:                     if(time>4)sleep_sub();
   113:                     if(key!=0)break;
   114:                     }
   115:                 TMR1L=0;
   116:                 TMR1H=0;
   117:                 time=0;
   118:            while(1){
   119:                 CLRWDT();
   120:                 for(;;){
   121:                     CLRWDT();
   122:                     if(key==0){
   123:                            delay_ms(10);
   124:                            if(key==0){have_key=1;break;}
   125:                            }
   126:                     if(time>8){
   127:                            blue_led=1;
   128:                            green_led=1;
   129:                            red_led=1;
   130:                            TMR1L=0;
   131:                            TMR1H=200;
   132:                            time=0;
   133:                            return;
   134:                            }
   135:                     }
   136:                 TMR1L=0;
   137:                 TMR1H=0;
   138:                 time=0;    
   139:                 state++;
   140:                 if(state>3)state=1;
   141:                 if(state==0)state=1;
   142:                 led();
   143:                 if(state==1)temperature=set_low_value;
   144:                 if(state==2)temperature=set_mid_value;
   145:                 if(state==3)temperature=set_high_value;
   146:                 for(;;){
   147:                     CLRWDT();
   148:                     if(key!=0)break;
   149:                     if(time>4)sleep_sub();
   150:                     }
   151:                 }
   152:   }
   153: //////////////////////////////////////  
   154: void pwm_function(void){
   155:             unsigned int pwm_high,pwm_low,h,l;
   156:             TMR1L=0;
   157:             TMR1H=200;       //about 100 ms check a time
   158:             time=0;
   159:             GIE=1;
   160:             TMR1ON=1;
   161:             h=2*pwm*10/10;
   162:             l=2*(100-pwm)*10/10;
   163:             for(;;){
   164:                 CLRWDT();
   165:                 pwm_high=h;
   166:                 pwm_out=1;
   167:                 if(time>0)break;
   168:                 while(pwm_high--);
   169:                //delayus(pwm_high);
   170:                 pwm_low=l;
   171:                 pwm_out=0;
   172:                 while(pwm_low--);
   173:                 //delayus(pwm_low);
   174:                 
   175:                 key_function();
   176:                 }           
   177:             }  
   178: 
   179: //////////////////////main////////////////////////
   180: 
   181: main(){
   182:         unsigned char i,temp;
   183:        i=0;
   184:        temp_data=0;
   185:        GPIO=0x34;
   186:        CMCON=0x07;
   187:        TRISIO=0b00001001;
   188:                          //as  pic16f676
   189:        asm("movlw 0x01");
   190:        asm("movwf 0x91");
   191:        ANSEL=0x11;       // same pic12f675 ANSEL=0X11;
   192:                       
   193:         OPTION = 0x0D;  // WDT prescaled by 64 - about 1200 ms
   194:         GPIO=0x34;    0b00110100;   //led of
   195:         TRIS2=1;        /////////////
   196:         WPU2=1;
   197:         ad_init();
   198:         PEIE=0x01;   //enable  INTCON:6
   199:         T1CON=0x30;   //timer1  1:8  
   200:         PIE1=0x01;  //enable timer1 intterupt TMR1IE;
   201:         TMR1ON=0;   //T1CON:0   TMR1 STOP
   202:         //WPU0=1; //gpio0  weak pull-up enable  
   203:         
   204:         
   205:         i=0;
   206:         i=0;
   207:         CLRWDT();    
   208:         if((GPIO2==0)&&(key==0)){
   209:                         pwm_out=1;
   210:                         delay_ms(200);
   211:                         temp_data=ad_read(0);
   212:                         if((temp_data>0x3a)&&(temp_data<0x40)){GPIO4=0;GPIO5=0;};
   213: test:                   CLRWDT(); 
   214:                         if(GPIO2==0)goto test;                                          
   215:                         pwm_out=0;
   216:                         }
   217:         TRIS2=0;        //////////
   218:         GPIO=0x34;    0b00110100;   //led of
   219:         GPPU=1;
   220:         
   221:         if(key==1)sleep_sub();  //no key press       
   222:         TMR1L=0;
   223:         TMR1H=0;
   224:         TMR1ON=1;    //START TMR1 ON 
   225:         GIE=1;       //enable globe inttrupt 
   226:         time=0;
   227:        
   228:         for(;;){
   229:             CLRWDT();
   230:             if((key!=0)&&(time<5))sleep_sub();
   231:             if((key!=0)&&(time>4)){blue_led=0;break;}
   232:             if(time>4)blue_led=0;
   233:             }
   234:         state=1;
   235: //locate_convert:        
   236:     for(;;){ 
   237:         CLRWDT();
   238:         TMR1L=0;
   239:         TMR1H=0;
   240:         time=0;
   241:         GIE=1;
   242:         TMR1ON=1;
   243:         led();
   244:         have_key=0;
   245:         temp=0;
   246:         for(;;){
   247:             CLRWDT();
   248:             if((key!=0)&&(time>8)){have_key=0;break;}
   249:             if(key==0){
   250:                    delay_ms(10);
   251:                    if(key==0){have_key=1;temp=1;state++;break;}
   252: }
   253:             }
   254:         if(state>3)state=1;
   255:         if(state==0)state=1;
   256:         if(have_key==1)led();    
   257:         TMR1L=0;
   258:         TMR1H=0;
   259:         time=0;
   260:         GIE=1;
   261:         TMR1ON=1;
   262:         key_open=0;               
   263:         while(temp){
   264:             CLRWDT();
   265:             if(time>4)sleep_sub();
   266:             if(key!=0){temp=0;key_open=1;};
   267:             }    
   268:        // if(key_open==1)goto locate_convert;
   269:         if(key_open==0)break;
   270:        }
   271:         blue_led=1;green_led=1;red_led=1;
   272:         if(state==1)temperature=set_low_value;
   273:         if(state==2)temperature=set_mid_value;
   274:         if(state==3)temperature=set_high_value;
   275:         
   276:         while(1){
   277:             CLRWDT();
   278:             temp_data=ad_read(0);
   279:             if((temp_data>0xe0)||(temp_data<0x0f)){
   280:                                          if(state==1)pwm=1;
   281:                                          if(state==2)pwm=1;
   282:                                          if(state==3)pwm=1;
   283:                                         };
   284:             
   285:             if(temp_data>temperature)pwm++;
   286:             if(temp_data<temperature)pwm--;
   287:             if(pwm<1)pwm=1;
   288:             if(pwm>100)pwm=100;
   289:             pwm_function();
   290:             }
   291: 
   292: }
   293: 

⌨️ 快捷键说明

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