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

📄 jm-003.c

📁 电动车防盗器主机c语言程序
💻 C
字号:

/************************************************************************
*****JM-003Master.c
*****created by gaoguanshi
*****date 2007 12.6
/**********************************************************************/
#include	<Ht48r30a-1.h>	//28pin
#define SCL_C   _13_3
#define SDA_C   _13_5
#define _pa3	_12_3
//#define bell	_pa3
#define _ton	_0e_4
#define RF_IO	_13_4
#define RF		_12_4 //_16_1
#define _pbc3	_14_3
//#define _pcc1   _17_1

#define AccOutput _pa0
#define RF_VCC 	  _pa1
#define Vib		  _pa2
#define SCL		  _pa3////
#define TxData	  _pa4 //_pa3
#define RxData	  _pa4
#define SDA		  _pa5////
//#define SP1		  _pa5
#define SP0		  _pa6
#define Valet	  _pa7

#define Flameout  _pb1
#define Light	  _pb2
#define Startup	  _pb3

#define AccIn	  _pc5 //_pd0

//=== Music Ram ==============================
bit flag;    
bit delayF;
unsigned char m;   //m为频率常数
unsigned char n;   //n为节拍常数 	HT定义时不能赋初值,不支持此功能
//unsigned char i;
unsigned char index;
unsigned char Musiclong;	
unsigned char MusicCnt;
unsigned char j;
unsigned char k;
unsigned long delayCnt;		//16 bit
unsigned char Music5OnCnt;
//============================================

unsigned char data1  		@0x2a;
unsigned char data2  		@0x2b;
unsigned char data3  		@0x2c;
unsigned char Rdata1 		@0x2d;
unsigned char Rdata2 		@0x2e;
unsigned char Rdata3 		@0x2f;
bit RFbit;
//bit AddrBuf;
bit ReceiveRight_F;
//============================================
unsigned char TxData1;
unsigned char TxData2;
unsigned char TxData3;
unsigned char FlashTemp;
unsigned long HornTime;
unsigned long FirstVib10s;
unsigned long GuardTime;
unsigned long StartTimeL;
unsigned char StartTimeH;
unsigned long AutoTime;
unsigned char SensorCnt;
unsigned char TemperCnt;

bit MuteF;
bit StartF;
bit UnGuardF;
bit SecondVibF;
bit LFlashF;
bit EnableBugleF;
bit AlarmingF;
bit RobF;
bit AutoGuardF;
bit AccOnF;
//====== I2C ==============
#define _24c_StartAddr  0x10
unsigned char AT24c_Addr;
unsigned char MCU_Addr;
unsigned char AddrBuf;
unsigned char WriteCnt;
//=========================
void Tx();		//函数宣告
void Tx0();
void Tx1();
void LightOff();

/*void delayms1(unsigned long a)  
{
  while(--a);                 
}*/
void delayms(unsigned long a)  
{
  while(--a)
	{_nop();_nop();_nop();_clrwdt();}                 
}

 void Receive(void)
{
 unsigned char i;
 unsigned char k;
	if(RF)
	{
		i=0;
		do
		{_clrwdt();
		 _delay(50);
		 i++;
		 if(RF==0) 
			goto CountLow;
		}while(i<10); //注意分号
		goto Error;
	}
	else 
	{
	CountLow:	
	i=0;
	do
	 {_clrwdt(); 
	  _delay(100);
	  i++;
	  if(RF) 
		{k=24;
		 if(i>50) 
			goto RightStartBit;
		}
	 }while(i<130);
	goto Error;
	}
RightStartBit:
		i=0;
		do
		{
		 _clrwdt();
		 _delay(50);
		 i++;
		 if(RF==0) goto NextCount;
		}while(i<26);
		goto Error;
NextCount:
	if(i<4) goto Error;		//不到200us丢掉
	if(i<10) {_c=0;RFbit=0;}
	 else {_c=1;RFbit=1;}
	_rlc(&data3);
	_rlc(&data2);
	_rlc(&data1);
	if(--k) goto WaitHigh;
	_nop();	//加本机遥控码比较
	if((data3&0xf0)==(Rdata3&0xf0))
	  {
		if(data2==Rdata2)
			if(data1==Rdata1) 
			  { _clrwdt();
				ReceiveRight_F=1;
				return;
			  }
	  }
	
	//_nop();							//0x10					//SysValue1	学习时恢复原厂默认设置,退出时保存WriteSys();	
	/*if(WaitRemoteF) {WriteMemory(&data1,AddrBuf);BiBugle(2);SysValue1=0x88;SysValue2=0;KeyInputTime=950;AccON_F=1;WriteCnt--;if(WriteCnt==0) {WaitRemoteF=0;KeyInputTime=0;}goto Error;}
	i=4;	//四个遥控
	AddrBuf=_24c_StartAddr;//AddrBuf=0x10;
NextCode:
	ReadMemory(AddrBuf);//(0x10);
	if((data3&0xf0)==(Rdata3&0xf0))
	  {
		if(data2==Rdata2)
			if(data1==Rdata1) 
			  { _clrwdt();
				ReceiveRight_F=1;
				return;//return(ReceiveRight_F);
			  }
	  }
	i--;
	if(i) goto NextCode;
	goto Error;*/

WaitHigh:
	if(RFbit)
	 {
		i=0;
		do
		{_clrwdt();
		 _delay(50);
		 i++;
		 if(RF) goto RightStartBit;
		}while(i<10); 
		goto Error;
	 }
	else
	 {
		i=0;
		do
		{_clrwdt();
		 _delay(50);
		 i++;
		 if(RF) goto RightStartBit;
		}while(i<26); 
		goto Error;
	 }

Error:		
	ReceiveRight_F=0;
	return;//return(ReceiveRight_F);
}

#pragma vector timer0 @ 0x08
void timer0(void)
 {	
	if(!EnableBugleF) 
	  {
		//if(!UnGuardF&Vib&!AlarmingF) {if(++Temp==TemperCnt) En_VibF=1;}
		//else Temp=0; //En_VibF=0;//灵敏度
		if(AutoTime) {if(AccIn) AutoTime=10000;if(!--AutoTime) AutoGuardF=1;}
		if(StartTimeH) {if(!StartTimeL--) StartTimeH--;} //3分
		else {StartF=0;AccOutput=0;}
		if(GuardTime) {GuardTime--;if(!GuardTime) UnGuardF=0;}
		if(FirstVib10s) FirstVib10s--;
		 else SecondVibF=0;
		_tmr=0;
		goto ExitTimer;
	  }
//	if(HornTime) HornTime--;
	//  else {SP0=0;SP1=0;EnableBugleF=0;AlarmingF=0;SecondVibF=0;LFlashF=0;Light=0;_tmr=0;goto ExitTimer;}

	if(Musiclong==0) 
	  {
	   MusicCnt++;
	   switch(MusicCnt)
	      {
		default:flag=0;MusicCnt=1;
		case 1: flag=0;m=186;n=12;index=34;Musiclong=30;goto RetPup;
		case 2:	flag=1;m=158;n=3;index=70;Musiclong=30;goto RetPup;
		case 3: flag=1;m=144;n=20;		  Musiclong=6; goto RetPup;
		case 4: flag=0;m=0;n=30;index=130;Musiclong=2;goto RetPup;
		case 5: flag=1;m=211;n=2;index=10;Musiclong=80;delayF=0;Music5OnCnt=4;goto RetPup;
		case 6:	flag=1;m=156;n=4;index=100;Musiclong=20;goto RetPup;
		//default:flag=0;MusicCnt=1;
	      }
	  //m=MusicTAB[i++];j=MusicTAB[i++];
	  //index=MusicTAB[i++];k=index;
	  //Musiclong=MusicTAB[i++];
	RetPup:
		j=n;k=index; //保存初始值
	 }
	_tmr=m;
	if(MusicCnt==5&&delayF) goto Music5Delay; //第5音的停顿延时
//kk:	
        //n=j;//30;//m=music_tab[i++];n=music_tab[i++];//取频率到m,取节拍到n
	//bell=!bell;
   #asm 
	mov a,[12h]
	xor a,01000000b;00001000b
	mov [12h],a
   #endasm
  	//_tmr=m;
	n--; //节拍
	if(!n) 
	  {
	     	n=j;
	     	_nop();
		if(--index==0) 
			{index=k;flag=!flag;--Musiclong;}
		_nop();
		if(MusicCnt==3)
		 	{
		     	 if(flag) {m=144;j=20;}
		     	 else 
				{m=186;j=28;}
		     	 goto ExitTimer;
		  	}
		if(MusicCnt==4)
		  	{
			 if(flag) {m=0;j=30;flag=0;}
		  	}
	     	if(flag) m--;
		else 
			m++;
	Music5Delay:
		if(MusicCnt==5)
		  	{ 
				if(Musiclong==0&&delayF==0) {Musiclong=80;delayF=1;delayCnt=1200;}
			  	if(delayF){if(delayCnt--) goto ExitTimer;//delayms1(1530);
						   else	{delayCnt=1200;m=211;
					 			 flag=1;index=10;delayF=0;if(!--Music5OnCnt) Musiclong=0;
								}
			    		  }
		  	}


		//====================test
				/*if(MusicCnt==5)
					{ if(m==168) {_ton=0;
						delayms1(1530);flag=1;index=30;
					  _nop();_ton=1;
					}
					}*/
		//====================
	  }
	ExitTimer:_nop();	
	  
 }

/*****************************************
				EEPROM
 ****************************************/
void Start()
{
WaitFree:
// SDA_C=1;
// SCL_C=1;
// if(SDA==1&SCL==1) goto free;
//   else goto WaitFree;
//free:
 SDA_C=0;
 SCL_C=0;	//Output
 SDA=1;
 _nop();
 SCL=1;
 _clrwdt();
 _nop();
 SDA=0;
 _nop();
 _nop();
 SCL=0;
}
void Stop()
{
 SDA_C=0;
 SCL_C=0;
 SDA=0;
 _nop();
 SCL=1;
 _clrwdt();
 _nop();
 SDA=1;
}

char I2C_RX()
{
 unsigned char i=8;
 unsigned char RxBuff=0;
 //RxBuff=0;
 SDA_C=1;
 SCL_C=0;
 _nop();
 //SDA=1;
 _nop();
 _nop();
 do
 {
 SCL=1;
 _nop();
 _nop();
 //SCL=0;
 if(SDA) _c=1;
   else _c=0;
 _rlc(&RxBuff);
 SCL=0;
 _clrwdt();
 _nop();
 }while(--i);  //注意i--,就循环9次了
 //data1=RxBuff;
 return(RxBuff);//(data1);
}
void I2C_TX( unsigned char TxBuff)
{
 unsigned char i=8;
 //unsigned char j;
 //j=TxBuff;
 SCL_C=0;
 SDA_C=0;
 do
 {
 _rlc(&TxBuff);
 if(_c) SDA=1;
	else SDA=0;
 SCL=1;
 _nop();
 _nop();
 SCL=0;
 _nop();
 _clrwdt();
 _nop();
 }while(--i);  //注意i--,就循环9次了
//check ACK 
 SDA=1;
 SDA_C=1;
 //SCL_C=0;
 //9th clock
 _nop();
 _nop();
 _nop();
 SCL=1;
 _nop();

 //SCL=0;////????不能加,SCL=0后,就没应答信号
 _nop();
 i=0xff;
  while(i--) 
   {
	_nop();
	_clrwdt();
    if(SDA==0) 
		goto ACK_OUT;
   }
ACK_OUT:
  _nop();
  SCL=0;
}

void ReadMemory(unsigned char addr)
 {
  unsigned char *k,i;
  k=&Rdata1;
  for(i=0;i<3;i++)		//读三个字节数据
	{
  	 AT24c_Addr=addr++;AddrBuf++;
  	 //*k=ReadByte();k++;addr++;
	 Start();
  	 I2C_TX(0b10100000);
  	 I2C_TX(AT24c_Addr);
  	 Start();
  	 I2C_TX(0b10100001);
  	 _clrwdt();
  	 //_nop();
  	 *k++=I2C_RX();//RxBuff=I2C_RX();
  	 Stop();

	 //*k++=RxBuff;
	}
 }
void WriteMemory(unsigned char *i,unsigned char k)
 {
  unsigned char j;
  for(j=0;j<3;j++)		//写三个字节数据
    {
  	 MCU_Addr=*i++;
  	 AT24c_Addr=k++;AddrBuf++;
     //WriteByte();
	 Start();
  	 I2C_TX(0b10100000);
     I2C_TX(AT24c_Addr);
  	 I2C_TX(MCU_Addr);
  	 Stop();
  	 delayms(600);//Delayms(8);//12ms ;_delay(5000);
     //i++;k++;
    }
 }
//=============================================
void Init()
 {
	
 }
void BugleOn()
 {
	EnableBugleF=1;
	MusicCnt=0;
	Musiclong=0;
	_intc=0x05;
	_tmrc=0x83;
	_tmr=256-70;
	_ton=0x01;
 }
void BugleOff()
 {
	SP0=0;EnableBugleF=0;AlarmingF=0;//_ton=0;
 }	
void BugleTimes(unsigned char x)
 {
	while(x--) {if(!MuteF)BugleOn();Light=1;delayms(6000);
				BugleOff();LightOff();delayms(8000);HornTime=65500;}
 }
void LightFlash()
 {
	if(LFlashF)
	 {
		if(!FlashTemp--) {Light=~Light;FlashTemp=250;}
	 }
	else FlashTemp=250;//Light=0;EnableBugleF=0;
	if(!RobF)
	{
		//if(HornTime==60000||HornTime==50000||HornTime==40000)
		//			{if(!AccOnF) {Tx(0x06);Tx(0x06);Tx(0x06);}else {Tx(0x07);Tx(0x07);Tx(0x07);}}
		if(HornTime) HornTime--;
	  	else {SP0=0;EnableBugleF=0;AlarmingF=0;SecondVibF=0;LFlashF=0;Light=0;}
 	}
 }
void LightOff()
 {
	LFlashF=0;Light=0;
 }
void Function()
 {
	switch(data3&0x0f)
	 {
		case 2: goto Key1;
		case 4: goto Key2;
		case 8: goto MuteKey3;
		case 3: goto StartKey4;
		default: goto NoKey;
	 }
Key1:
	if(AlarmingF&!RobF) goto Key1Stop;
	if(!UnGuardF) goto Find; //设防UnGuardF=0;
	if(AccIn) goto Rob;
	MuteF=0;
	GuardTime=3000;//UnGuardF=0;
	AutoGuardF=0;
	AutoTime=0;
 Key1Stop:
	RobF=0;
	SecondVibF=0;
	BugleTimes(1);Tx(0x02);goto NoKey;
 Find:
	BugleTimes(3);Tx(0x01);goto NoKey;
 Rob:
	if(RobF) goto NoKey;RobF=1;LFlashF=1;BugleOn();goto NoKey;//消除多次接收,造成的杂音
Key2:
	if(!AccIn) AutoTime=30000;//30s未插入钥匙自动设防
	  AutoGuardF=0;
	RobF=0;
	SecondVibF=0;
	GuardTime=0;UnGuardF=1;//LightOff();
	BugleTimes(2);Tx(0x04);goto NoKey;
MuteKey3:
	if(AlarmingF&!RobF) goto NoKey;
	MuteF=1;
	SecondVibF=0;
	GuardTime=3000;//UnGuardF=0;
	AutoGuardF=0;
	AutoTime=0;
	BugleTimes(1);Tx(0x08);goto NoKey;
StartKey4:
	if(AlarmingF&RobF) goto NoKey;
	if(StartF) goto Flameout;
	StartTimeL=60000;//1分
	StartTimeH=3;	//3分
	StartF=1;
	AccOutput=1;
	Startup=1;
	BugleTimes(1);Tx(0x03);
	delayms(65500);
	Startup=0; goto NoKey;
 Flameout:
	StartF=0;
	AccOutput=0;
	BugleTimes(2);Tx(0x05);
	
NoKey:_nop();
 }
void Tx(unsigned char KeyCode)
 {
	unsigned char BitTemp,TxTimes=4;
ReTx:
	TxData3=0xf4;
	TxData2=0x08;
	TxData1=0x03;
	TxData3=(TxData3&0xf0)|KeyCode;
	BitTemp=24;

	RF_VCC=1;RF_IO=0;//_delay(1000);//发射,IO=输出

	TxData=1;
	_delay(400);
	TxData=0;
	_delay(11300);

	while(BitTemp--)
	 {
		if(TxData1&0x80) Tx1(); //SZ TxData1.7
		else Tx0();
		_rlc(&TxData3);
		_rlc(&TxData2);
		_rlc(&TxData1);
		
	 }
	if(TxTimes--) goto ReTx;
	RF_VCC=0;RF_IO=1;		//恢复接收,IO=输入
 }
void Tx0()
 {
	TxData=1;
	_delay(400);
	TxData=0;
	_delay(1200);
 }
void Tx1()
 {
	TxData=1;
	_delay(1200);
	TxData=0;
	_delay(400);
 }
void Auto()
 {	if(AccIn) {AutoGuardF=0;AutoTime=10000;}//停车熄火10s内未插入钥匙
	if(AutoGuardF) 
	 {
		AutoGuardF=0;
		UnGuardF=0;
		BugleTimes(3); //"BI,BI,BI"
	 }
 }
void TemperSensor()
 {
	SensorCnt++;
	switch(SensorCnt)
	 {
	    default: SensorCnt=1;
		case 1: TemperCnt=10;break;
		case 2: TemperCnt=20;break;
		case 3: TemperCnt=30;break;
		case 4: TemperCnt=40;break;
		case 5: TemperCnt=50;break;
	 }
	BugleTimes(SensorCnt);
 }
void main(void)
 {
	MusicCnt=0;
	Musiclong=0;
	_intc=0x05;
	_tmrc=0x83;
	_tmr=256-70;
	_ton=0x0;//01;
	_pa=0x80;
	_pac=0b10010100;
	_pb=0;
	_pbc=0;
	_pc=0;
	_pcc=0b00100000;

	Rdata3=0xf0;
	Rdata2=0x08;
	Rdata1=0x03;

	UnGuardF=1;
	SecondVibF=0;
	while(1)
	 {				//LightFlash,声音重复已经解决
		_nop();
		Receive();
		if(ReceiveRight_F) Function();
		//else Once();
		if(!UnGuardF&AccIn&!StartF&!AlarmingF) {AlarmingF=1;BugleOn();LFlashF=1;Light=1;HornTime=65500;AccOnF=1;Tx(0x07);Tx(0x07);Tx(0x07);}//消除,抖动造成杂音
		if(!UnGuardF&Vib&!AlarmingF) 
			{if(!SecondVibF) {BugleTimes(3);FirstVib10s=10000;SecondVibF=1;} 
				else {	if(!MuteF) BugleOn();
						LFlashF=1;Light=1;HornTime=65500;AlarmingF=1;AccOnF=0;Tx(0x06);Tx(0x06);Tx(0x06);}}
		/*==============================================================================
		if(En_VibF) 
			{En_VibF=0;if(!SecondVibF) {BugleTimes(3);FirstVib10s=10000;SecondVibF=1;} 
						else {	if(!MuteF) BugleOn();
								LFlashF=1;Light=1;HornTime=65500;AlarmingF=1;
								AccOnF=0;Tx(0x06);Tx(0x06);Tx(0x06);}
							 }
		 ==============================================================================*/

		LightFlash();
		if(UnGuardF) Auto();//{if(!AccIn) Auto();}
		
	 }
 }

⌨️ 快捷键说明

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