- #include <pic.h>
- //#include <pic16630.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define PORTAIT(adr,bit) ((unsigned)(&adr)*8+(bit)) ///絕對尋址位操作指令
- #define PORTCIT(adr,bit)((unsigned)(&adr)*8+(bit)) ///絕對尋址位操作指令
- static bit KEY1 @ PORTAIT(PORTA,0);
- static bit KEY2 @ PORTAIT(PORTA,1);
- static bit KEY3 @ PORTAIT(PORTA,4);
- static bit KEY4 @ PORTAIT(PORTA,5);
- static bit DECODE_POWER_ON_OFF @ PORTCIT(PORTC,0);
- static bit LED1 @ PORTCIT(PORTC,1);
- static bit LED2 @ PORTCIT(PORTC,5);
- static bit BEEP @ PORTCIT(PORTC,2);
- static bit DIN @ PORTCIT(PORTC,3);
- static bit DOUT @ PORTCIT(PORTC,4);
- uint i;
- uchar keyCode;
- bit sign_key;
- #define Err 0xFF //當(dāng)解碼程序發(fā)現(xiàn)接收的數(shù)據(jù)是無效數(shù)據(jù)時返回此值
- char DeviceAddr[9]="1010ffff"; //報警器的地址,1 接高電平,0 接低電平(地), F 為懸空.(人可讀)
- uchar AddrH,AddrL; //產(chǎn)品地址(機可讀)
- void delay_150us(uchar t)
- { uchar k;
- uchar j;
- for(k=t;k>0;k--)
- for(j=50;--j;);
- }
- void delay_50us(uchar t)
- {
- uchar k;
- uchar i;
- for(k=t;k>0;k--)
- for(i=14;--i;);
- }
- void Convert() //人可讀地址轉(zhuǎn)換為MCU可讀
- {
- uchar i;
- for(i=0;i<4;i++){
- if(DeviceAddr[i]=='0')
- { AddrH<<=2;
- AddrH|=0;
- }
- if(DeviceAddr[i]=='1')
- {
- AddrH<<=2;
- AddrH|=3;
- }
- if(DeviceAddr[i]=='f')
- {
- AddrH<<=2;
- AddrH|=1;
- }
- }
- for(i=4;i<8;i++){
- if(DeviceAddr[i]=='0')
- {
- AddrL<<=2;
- AddrL|=0;
- }
- if(DeviceAddr[i]=='1')
- {
- AddrL<<=2;
- AddrL|=3;
- }
- if(DeviceAddr[i]=='f')
- {
- AddrL<<=2;
- AddrL|=1;
- }
- }
- }
- void Send(uchar *DAddr,uchar SendData)
- { uchar temp,i;
- DOUT=1;
- delay_150us(2);
- DOUT=0;
- delay_150us(60);
- for(i=0;i<8;i++)//Send AddrCode
- { temp=*DAddr++;
- if(temp=='1')
- { DOUT=1;
- delay_150us(6);
- DOUT=0;
- delay_150us(2);
- DOUT=1;
- delay_150us(6);
- DOUT=0;
- delay_150us(2);
- }
- if(temp=='f')
- { DOUT=1;
- delay_150us(2);
- DOUT=0;
- delay_150us(6);
- DOUT=1;
- delay_150us(6);
- DOUT=0;
- delay_150us(2);
- }
- if(temp=='0')
- { DOUT=1;
- delay_150us(2);
- DOUT=0;
- delay_150us(6);
- DOUT=1;
- delay_150us(2);
- DOUT=0;
- delay_150us(6);
- }
- }
- for(i=0;i<4;i++)///Send Data
- { if(SendData&(8>>i))
- {
- DOUT=1;
- delay_150us(6);
- DOUT=0;
- delay_150us(2);
- ////////////////////
- DOUT=1;
- delay_150us(6);
- DOUT=0;
- delay_150us(2);
- }
- else
- {
- DOUT=1;
- delay_150us(2);
- DOUT=0;
- delay_150us(6);
- ///
- DOUT=1;
- delay_150us(2);
- DOUT=0;
- delay_150us(6);
- }
- }
- }
- uchar GetData()//解碼程序
- {
- uchar i,j,k;
- uchar ReadCode[3],GetCode;
- //------------------------找同步頭-------------------------
- if(!DIN)return Err;
- delay_150us(3);
- for(i=0;i<28;i++)
- {
- if(DIN)return Err;
- delay_150us(2);
- }
- for(i=0;i<30;i++)
- {
- if(DIN)break;
- delay_50us(1);
- if(i>25)return Err;//如果超時則返回
- }
- //-----------------------接收地址碼和數(shù)據(jù)碼-----------------
- for(j=0;j<3;j++)
- {
- for(i=0;i<8;i++)
- {
- delay_150us(2);
- delay_50us(1);
- ReadCode[j]=ReadCode[j]<<1;
- ReadCode[j]=ReadCode[j]|DIN;
- if(DIN)
- { //while(DIN);//等待0出現(xiàn)
- for(k=0;k<255;k++)
- { delay_50us(2);
- if(DIN==0)break;
- if(k>12)return Err;//超時,返回錯誤代碼
- }
- }
- //while(!DIN);//等待1出現(xiàn)
- for(k=0;k<255;k++)
- { delay_50us(2);
- if(DIN==1)break;
- if(k>12)return Err;//超時,返回錯誤代碼
- }
- }
- }
- //-------------------校驗地址及運算數(shù)據(jù)---------------------
- if(ReadCode[0]!=AddrH)return Err;
- if(ReadCode[1]!=AddrL)return Err;//校驗地址
- GetCode=ReadCode[2]&0x01;
- GetCode|=(ReadCode[2]&0x04)>>1;
- GetCode|=(ReadCode[2]&0x10)>>2;
- GetCode|=(ReadCode[2]&0x40)>>3;
- return GetCode;
- }
- void delay(){ for(i=6553;i!=0;i--)continue;}
- void beep(void)
- { uchar i;
- for(i=0;i<0xff;i++)
- { delay_150us(5);
- BEEP=!BEEP;
- }
- BEEP=0;
- }
- void interrupt ISR(void) //中斷服務(wù)程序
- {
- if(RAIE && RAIF)
- { RAIF = 0;
- delay();
- if(KEY1==0){sign_key=1;keyCode=1;}
- if(KEY2==0){sign_key=1;keyCode=2;}
- if(KEY3==0){sign_key=1;keyCode=3;}
- if(KEY4==0){sign_key=1;keyCode=4;}
- //PORTA = PORTA;
- }
- /* if(T0IE && T0IF) //判TMR0 中斷
- {
- T0IF = 0; //清除TMR0 中斷標(biāo)誌
- }
- if(TMR1IE && TMR1IF) //判TMR1 中斷
- {
- TMR1IF = 0; //清除TMR1 中斷標(biāo)誌
- }*/
- }
- void main()
- {
- uchar mydata;
- DOUT=0; //發(fā)送數(shù)據(jù)端口上電為低電平
- CMCON=0x07; //關(guān)閉比較器
- TRISA=0x33; //PORTA_1為輸入。
- OPTION=0x7f; //弱上拉全局控制位使能
- WPUA=0xFF; //PORTA弱上拉控制位使能
- TRISC=0x08; //設(shè)置C口輸入輸出
- RAIF=0; //中斷標(biāo)誌位清零
- PORTA=0x00; //配合 PORTA = PORTA 給電平中斷做準(zhǔn)備
- RAIE=1; //A口電平中斷允許
- IOCA=0x33; //A口各個中斷允許
- GIE =1; //總中斷允許
- PORTA = PORTA;
- Convert();
- Send("1010ffff",1);
- for(;;){
- if(sign_key)
- { switch(keyCode){
- case 1:
- LED1=0;
- Send(DeviceAddr,1);
- Send(DeviceAddr,1);
- Send(DeviceAddr,1);
- Send(DeviceAddr,1);
- break;
- case 2:
- Send(DeviceAddr,2);
- Send(DeviceAddr,2);
- Send(DeviceAddr,2);
- Send(DeviceAddr,2);
- LED1=1;
- break;
- case 3:
- Send(DeviceAddr,4);
- Send(DeviceAddr,4);
- Send(DeviceAddr,4);
- Send(DeviceAddr,4);
- LED2=1;
- DECODE_POWER_ON_OFF=1;
- break;
- case 4:
- Send(DeviceAddr,8);
- Send(DeviceAddr,8);
- Send(DeviceAddr,8);
- Send(DeviceAddr,8);
- DECODE_POWER_ON_OFF=0;
- LED2=0;
- break;
- }
- sign_key=0;
- //beep();
- }
- mydata=GetData();
- if(mydata!=Err)
- {
- if(mydata==1)LED1=0;
- if(mydata==2)LED1=1;
- if(mydata==4)LED2=0;
- if(mydata==8)LED2=1;
- }
- }
- }
復(fù)制代碼 |