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

📄 qckz.c

📁 这是一个汽车防盗控制程序
💻 C
字号:

#include <mega8.h>
#include <delay.h>
#include <stdio.h>
#include <sleep.h>
#include <bcd.h>
#include <math.h>
#define TX_EN() {DDRD.5=1;PORTD.5=0;delay_ms(2000);PORTD.5=1;}//开油泵
#define LIGHT() {DDRD.4=1;PORTD.4=0;delay_ms(1000);PORTD.4=1;}//ID读取成功


#define DS1990_IPORT PIND  
#define DS1990_OPORT PORTD  
#define DS1990_DPORT DDRD
#define DS1990 3

eeprom unsigned char id_data[7]={1,2,3,4,5,6,7};
unsigned int time_number;
unsigned char flag,kz_flag,state_flag,CRC8,time_over;
//unsigned char sw_data[7];
unsigned char new_data[8];
unsigned char key_data; 
 
const unsigned char dscrc_table[] = {
        0, 94,188,226, 97, 63,221,131,194,156,126, 32,163,253, 31, 65,
      157,195, 33,127,252,162, 64, 30, 95,  1,227,189, 62, 96,130,220,
       35,125,159,193, 66, 28,254,160,225,191, 93,  3,128,222, 60, 98,
      190,224,  2, 92,223,129, 99, 61,124, 34,192,158, 29, 67,161,255,
       70, 24,250,164, 39,121,155,197,132,218, 56,102,229,187, 89,  7,
      219,133,103, 57,186,228,  6, 88, 25, 71,165,251,120, 38,196,154,
      101, 59,217,135,  4, 90,184,230,167,249, 27, 69,198,152,122, 36,
      248,166, 68, 26,153,199, 37,123, 58,100,134,216, 91,  5,231,185,
      140,210, 48,110,237,179, 81, 15, 78, 16,242,172, 47,113,147,205,
       17, 79,173,243,112, 46,204,146,211,141,111, 49,178,236, 14, 80,
      175,241, 19, 77,206,144,114, 44,109, 51,209,143, 12, 82,176,238,
       50,108,142,208, 83, 13,239,177,240,174, 76, 18,145,207, 45,115,
      202,148,118, 40,171,245, 23, 73,  8, 86,180,234,105, 55,213,139,
       87,  9,235,181, 54,104,138,212,149,203, 41,119,244,170, 72, 22,
      233,183, 85, 11,136,214, 52,106, 43,117,151,201, 74, 20,246,168,
      116, 42,200,150, 21, 75,169,247,182,232, 10, 84,215,137,107, 53};

unsigned char dowcrc(unsigned char x)
{
   CRC8 = dscrc_table[CRC8 ^ x];
   return CRC8;
} 
void twinkle(){              //示宽灯
 	DDRB.0=1;
 	PORTB.0=1;
 	delay_ms(300);
 	PORTB.0=0;
 	delay_ms(300);
 	PORTB.0=1;
 	delay_ms(300);
 	PORTB.0=0;
 } 
void bell(){                     //警号
	DDRB.2=1;
	PORTB.2=1;
	delay_ms(300);
	PORTB.2=0;
	delay_ms(300);
	PORTB.2=1;
	delay_ms(300);
	PORTB.2=0;
}        
  
void door_open(){//开门
	DDRD.7=1;
	PORTD.7=1;
	delay_ms(1000);
	PORTD.7=0;
}          
void door_close(){//关门
	DDRD.6=1;
	PORTD.6=1;
    delay_ms(1000);
	PORTD.6=0;
}          

unsigned char an(){               //学习按钮
 unsigned an_data;
 an_data=0;
 DDRD.1=0;
 if(PIND.1==0)an_data=1;
 return(an_data);
}   
unsigned char acc_test(){         //ACC电压检测
 unsigned char acc_data;
 acc_data=0;
 DDRC.5=0;
 if(PINC.5==1){
  delay_ms(20);
  if(PINC.5==1)acc_data=1;
 }
 return(acc_data);
} 

unsigned char door_test(){
	unsigned char door_data;
	door_data=0;
 	DDRC.4=0;
 	if(PINC.4==0){
  		delay_ms(20);
  		if(PINC.4==0)door_data=1;
 	}
 	return(door_data);
} 
interrupt[2]void ext_int0(){
 key_data=0;
 delay_ms(5);
 DDRC&=~0x0f; 
 key_data=PINC&0x0f;
 if(key_data==0x08){
 	door_open();
    TCNT0=0xe0;
    TCCR0=0X03;
    TIMSK=1; //开定时
 	state_flag=2;
 }
 else if(key_data==0x04){  
    door_close();
 	state_flag=1;
 } 
}

interrupt[10] void timer(){
 time_number++;
 if(time_number>10000){
  TIMSK=0;                                                              
  time_over=1;
  time_number=0;
 }
 TCNT0=0xe0;
}   
 //DS1990 
 void w_init(){ 
 unsigned char i;
 flag=0; 
 DS1990_OPORT.DS1990=1;
 DS1990_DPORT.DS1990=1; 
 delay_us(2);
 DS1990_OPORT.DS1990=0; 
 delay_us(700);
 DS1990_DPORT.DS1990=0;
 delay_us(65); 
 for(i=0;i<250;i++){
 	if((DS1990_IPORT.DS1990)==0){
   		flag=1;
   		delay_us(500);
   		break;
    }
  }
 }
 
unsigned char w_read(){
 unsigned char type,i; 
 for(i=0;i<8;i++){
  DS1990_DPORT.DS1990=1;
  DS1990_OPORT.DS1990=1; 
  delay_us(2);         
  DS1990_OPORT.DS1990=0;
  delay_us(2); 
  DS1990_DPORT.DS1990=0;
  DS1990_OPORT.DS1990=1;   
  delay_us(2);
  type=(type>>1);
  if((DS1990_IPORT.DS1990)==1)type=(type|0x80);
  delay_us(65);
 } 
 return(type);
}

void read(){
 unsigned char i;
 for(i=0;i<8;i++){
   new_data[i]=w_read();
 }
}

void w_write(unsigned char word){
 unsigned char i;   
 for(i=0;i<8;i++){
  DS1990_DPORT.DS1990=1; 
  DS1990_OPORT.DS1990=1;
  delay_us(2);
  DS1990_OPORT.DS1990=0; 
  delay_us(2);       
  if ((word&0x01)==0)delay_us(75);            
  else{
   DS1990_OPORT.DS1990=1;
   delay_us(75);
  }
  DS1990_DPORT.DS1990=0;
  delay_us(2);
  word=(word>>1);
 }
}

read_id(){
  unsigned char i;
  unsigned char temp;
  flag=0;
  w_init(); 
  if(flag==1){ 
  	flag=0;
  	w_write(0x33);
  	read();
  	CRC8=0;
  	for(i=0;i<7;i++)dowcrc(new_data[i]);
  	if(new_data[7]==CRC8){
  	    flag=1;
  	    kz_flag=0;
  	    for(i=0;i<7;i++){
  	     temp=id_data[i]; 
  	     delay_ms(1);
  	     if(temp!=new_data[i]){
  	     	i=0;
  	     	break;
  	     }
   	    } 
     if(i==7)kz_flag=1;
  	}
  }  
}

 void init(){
    unsigned char i;
 	SREG=0x00;                   //关全部中断  
 	MCUCR=0x0f; 
    ADCSRA&=0x7f;                //降低功耗关ADC
    ACSR|=0x80;
  
 	key_data=0;
    flag=0;
 	flag=an();
 	if(flag==1){
 	    flag=0;
 	    read_id();
 	    if(flag==1){
 	        flag=0;
 	    	for(i=0;i<7;i++){
 	    		id_data[i]=new_data[i];
 	    		delay_ms(2);
 	    	}
 	    }	
 	}
 	GICR=0x40;                  //开INIT0
    SREG=0x80;                   //开全局中断
    kz_flag=0;
 
}

void main(){
unsigned int j;
    init();
  /*  while(1){
        if(state_flag==2){    //遥控开门状态
            flag=0;
            flag=door_test();
            if(flag==1){
            	flag=0;
            	TIMSK=0;
            	time_over=0;
            }
        	if(time_over==1){
        	    time_over=0;
          		door_close();
                state_flag=1;
            } 
        }
        read_id();
    	if(kz_flag==1){
    	kz_flag=0;
    	LIGHT()
    	flag=0;
       for(j=0;j<1500;j++){
    	    delay_ms(10); 
    		flag=acc_test();
    		if(flag==1){
    			flag=0;
    		    delay_ms(100);
    			TX_EN()
    			break;
    		}
        } 
        
     }
   }
     
 //WDTCR=0xff;                 // 开WDT,并设复位时间间隔为2.1秒
 //WDTCR=0xef;      */
 while(1){
 	read_id();
   	if(kz_flag==1){
    	kz_flag=0;
    	LIGHT()
    	flag=0;
       for(j=0;j<1500;j++){
    	    delay_ms(10); 
    		flag=acc_test();
    		if(flag==1){
    			flag=0;
    		    delay_ms(50);
    			TX_EN()
    			break;
    		}
        } 
	}
  }
}

⌨️ 快捷键说明

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