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

📄 myc.c

📁 用PIC16f630实现的 315MHZ 软件解码和编码.代替PT2272 和 PT2262.
💻 C
字号:
#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				//当解码程序发现接收的数据是无效数据时返回此值

char DeviceAddr[9]="1010ffff";	//报警器的地址,1 接高电平,0 接低电平(地), F 为悬空.(人可读)

uchar AddrH,AddrL;				//产品地址(机可读)

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()			//人可读地址转换为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;//如果超时则返回
		 }
		//-----------------------接收地址码和数据码-----------------
		 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出现
						for(k=0;k<255;k++)
						 {  delay_50us(2);
							if(DIN==0)break;
							if(k>12)return Err;//超时,返回错误代码
						 }
				}
			    //while(!DIN);//等待1出现
				for(k=0;k<255;k++)
				 {  delay_50us(2); 
				 	if(DIN==1)break;
					if(k>12)return Err;//超时,返回错误代码
				 }
		   	}
		 }			
		//-------------------校验地址及运算数据---------------------
		 	  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) //中断服务程序
{
	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 中断标志
 	}
 	if(TMR1IE && TMR1IF) //判TMR1 中断
 	{
 		TMR1IF = 0; //清除TMR1 中断标志
 	}*/
}

void main()
{ 

uchar mydata;

	DOUT=0;	//发送数据端口上电为低电平
	CMCON=0x07;		//关闭比较器
	TRISA=0x33;		//PORTA_1为输入。
	OPTION=0x7f;	//弱上拉全局控制位使能
	WPUA=0xFF;		//PORTA弱上拉控制位使能
	TRISC=0x08;		//设置C口输入输出

  RAIF=0;			//中断标志位清零
  PORTA=0x00;		//配合  PORTA = PORTA 给电平中断做准备
  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;
			}
			
	
}

	
	
}

⌨️ 快捷键说明

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