打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
用pic16f630 MCU实现的315MHZ无线软件解码和编码.代替PT2272和pt2262

#include   

//#include   

#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;   

            }   

}   

}   

[1] [2]
关键字:pic16f630  MCU  軟件解碼  編碼 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic478457.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:PIC单片机+LCD12864显示汉字程序
下一篇:PIC16F684单片机定时中断跑马灯


  • 关注eeworld公众号
    快捷获取更多信息


  • 关注eeworld服务号
    享受更多官方福利

0

推荐阅读

PIC16F630使用PICkit程序下载使用方法
PIC16F630程序下载使用说明1、PIC16F630与下载器PIC kit的连接图1图 2连接说明:图2中的1脚连接图1的2脚;       4脚连接图1的1脚;       12脚连接图1的5脚;       13脚连接图1的4脚;       14脚连接图1的3脚。2  MPLAB中程序下载注意:将下载器与电脑连接好后,打开test.X工程,如果可以直接下载,执行步骤3,4 ,如果不能直接下载,则执行步骤 1,2,3,4。步骤1:建立工程 
发表于 2020-02-03
基于PIC16F630的I/O口对流水灯的控制
实验目的:RC0-RC5口的流水灯,熟悉PIC16F630的I/O口的操作#include__CONFIG(0x31b4);//看门狗关;内部RC振荡,RA4/RA5做I/O,MCLR脚做复位//------------------------------------//延时函数voiddelay(){inti;//定义循环变量for(i=5000;i》0;i--)//循环次数控制{NOP();//消耗一个指令周期时间NOP();}}//------------------------------------//初始化函数voidinit(){TRISA=0X00;//设置A口为输出TRISC=0X00;//设置C口为输出
发表于 2020-01-18
PIC16F630单片机对流水灯的测试
//实验目的:RC0-RC5口的流水灯,熟悉PIC16F630的I/O口的操作#include__CONFIG(0x31b4);//看门狗关;内部RC振荡,RA4/RA5做I/O,MCLR脚做复位//------------------------------------//延时函数voiddelay(){inti;//定义循环变量for(i=5000;i》0;i--)//循环次数控制{NOP();//消耗一个指令周期时间NOP();}}//------------------------------------//初始化函数voidinit(){TRISA=0X00;//设置A口为输出TRISC=0X00;//设置C口为输出
发表于 2020-01-12
PIC16F630流水灯测试C程序
//实验目的:RC0-RC5口的流水灯,熟悉PIC16F630的I/O口的操作 #include<PIC.h>   __CONFIG(0x31b4);   //看门狗关;内部RC振荡,RA4/RA5做I/O,MCLR脚做复位 //------------------------------------ //延时函数 void delay() {  int i;         
发表于 2016-11-17
PIC16F630的I/O口的操作流水灯
//实验目的:RC0-RC5口的流水灯,熟悉PIC16F630的I/O口的操作 #include<PIC.h>   __CONFIG(0x31b4);   //看门狗关;内部RC振荡,RA4/RA5做I/O,MCLR脚做复位 //------------------------------------ //延时函数 void delay() {  int i;         
发表于 2016-11-17
PIC的开发环境和开发工具以及涉及的PIC MCU
开发环境IDE:MPLAB 8.73   编译器:HI-TECH PICC16 V9.81   HI-TECH PICC18 V9.66开发工具:PICKIT3相关mcu:PIC16F88 PIC16F648A PIC16F887 PIC18F2550 PIC18F4550
发表于 2020-06-07
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
触摸屏ADS7846/7843驱动程序
谁有STC 的 EEPROM C程序
51单片机:自制迷你摇摇棒(附代码)
STC12C5A60S2单片机的内置EEPROM的使用
DS18B20的51单片机驱动源代码
给C语言增加几个位操作函数
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服