📄 jm-003.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 + -