#ifndef __GENERIC_TYPE_DEFS_H_ #define __GENERIC_TYPE_DEFS_H_ typedef enum _BOOL { FALSE = 0, TRUE } BOOL; typedef unsigned char BYTE; // 8-bit typedef unsigned short int WORD; // 16-bit typedef unsigned long DWORD; // 32-bit typedef union _BYTE_VAL { BYTE val; struct { unsigned char b0:1; unsigned char b1:1; unsigned char b2:1; unsigned char b3:1; unsigned char b4:1; unsigned char b5:1; unsigned char b6:1; unsigned char b7:1; } bits; } BYTE_VAL; typedef union _WORD_VAL { WORD val; BYTE v[2]; struct { BYTE LB; BYTE HB; } byte; struct { unsigned char b0:1; unsigned char b1:1; unsigned char b2:1; unsigned char b3:1; unsigned char b4:1; unsigned char b5:1; unsigned char b6:1; unsigned char b7:1; unsigned char b8:1; unsigned char b9:1; unsigned char b10:1; unsigned char b11:1; unsigned char b12:1; unsigned char b13:1; unsigned char b14:1; unsigned char b15:1; } bits; } WORD_VAL; typedef union _DWORD_VAL { DWORD val; WORD w[2]; BYTE v[4]; struct { WORD LW; WORD HW; } word; struct { BYTE LB; BYTE HB; BYTE UB; BYTE MB; } byte; struct { unsigned char b0:1; unsigned char b1:1; unsigned char b2:1; unsigned char b3:1; unsigned char b4:1; unsigned char b5:1; unsigned char b6:1; unsigned char b7:1; unsigned char b8:1; unsigned char b9:1; unsigned char b10:1; unsigned char b11:1; unsigned char b12:1; unsigned char b13:1; unsigned char b14:1; unsigned char b15:1; unsigned char b16:1; unsigned char b17:1; unsigned char b18:1; unsigned char b19:1; unsigned char b20:1; unsigned char b21:1; unsigned char b22:1; unsigned char b23:1; unsigned char b24:1; unsigned char b25:1; unsigned char b26:1; unsigned char b27:1; unsigned char b28:1; unsigned char b29:1; unsigned char b30:1; unsigned char b31:1; } bits; } DWORD_VAL; #endif //__GENERIC_TYPE_DEFS_H_ //=================================== #include <pic.h> #include "basicTYPE.h" /* 地址碼為0xF7, 0xC1,命令為0x30或者0x0C 950PL2,無優(yōu)化,9級(jí)優(yōu)化 */ /* ;主頻率4m,單條匯編指令1US ;b=350us.周期1400us。 ; ;0 1b 3b ;1 3b 1b ;同步頭 1b 31b ;24脈沖,接收不反向; */ #define RECIO RA3 //接收管腳 BYTE rec_time=31; //最多31次接收 BYTE rec_pulse; //24脈沖記數(shù)單元 struct { BYTE over :1; BYTE type :1; BYTE equ :1; BYTE ramval :1; BYTE idle :1; BYTE :3; }recflag; BYTE recadd_h; BYTE recadd_m; BYTE recadd_l; BYTE cmd_data; BYTE savedata_h; BYTE savedata_m; BYTE savedata_l; void delay_150us(void) { BYTE i=30; while(i--); CLRWDT(); } void delay_30us(void) { BYTE i=5; while(i--); CLRWDT(); } void main(void) { BYTE temp; CLRWDT(); ADCON1=0X07; T1CON=0; PORTA=0; PORTB=0; TRISA=0X0C; TRISB=0XAD; //OPTION=0X0B; while(1) { while(recflag.over==0) { recadd_h=0; recadd_m=0; recadd_l=0; cmd_data=0; if(rec_pulse--) { temp=0; recflag.over=0; // while(RECIO==0) //循環(huán)體執(zhí)行一次40us { delay_30us(); temp++; if(temp>50) { temp=0; break; } } if((RECIO==0)&&(temp==0)) continue; //脈沖次數(shù)減一 for(rec_pulse=0;rec_pulse<24;rec_pulse++) { delay_150us(); if(RECIO==0) //高電平時(shí)間太短,視為抖動(dòng),跳出 break; while(RECIO); //依然為高,等待低電平 temp=0; //后續(xù)計(jì)數(shù)用 while(RECIO==0) //循環(huán)體執(zhí)行一次40us { delay_30us(); temp++; if(temp>50) { temp=0; break; } } if(temp==0) // { //超時(shí)退出 break; //跳到for之外 } else if(temp>10) //大于720US,認(rèn)為為0,否則為1 { //記錄0 recflag.ramval=0; } else { //記錄1 recflag.ramval=1; } temp=0; #asm BCF _STATUS,0; RLF _cmd_data,f ; RLF _recadd_l,f ; RLF _recadd_m,f ; RLF _recadd_h,f ;//從左到右,按11H,10H,0FH,0EH排列,整體左移補(bǔ)0 #endasm if(recflag.ramval==1) cmd_data|=0x01; } if(rec_pulse>20) { //rec_pulse=0; recflag.over=1; CLRWDT(); break; } } else { break; //最多31次循環(huán) } } } }
|