PIC单片机滚动码解码C程序

发布者:QuantumPulse最新更新时间:2016-11-16 来源: eefocus关键字:PIC单片机  滚动码解码 手机看文章 扫描二维码
随时随地手机看文章

//-------------------------------------------------------------------- 
//  Interrupt based receive routine
//
//  Compiled using HiTech PIC C compiler v.7.93
//********************************************************************
#define CLOCK           4       // MHz
#define TE            400       // us
#define OVERSAMPLING    3       
#define PERIOD          TE/OVERSAMPLING*4/CLOCK

#define NBIT            65      // number of bit to receive -1(HCS300 66-1=65)

unsigned char B[9];             // receive buffer

static byte  RFstate;           // receiver state
static sbyte RFcount;           // timer counter
static byte  Bptr;              // receive buffer pointer
static byte  BitCount;          // received bits counter
word   XTMR;                    // 16 bit extended timer

volatile bit RFFull;            // buffer full
volatile bit RFBit;             // sampled RF signal

#define TRFreset    0
#define TRFSYNC     1
#define TRFUNO      2
#define TRFZERO     3

#define HIGH_TO     -10         // longest high Te
#define LOW_TO       10         // longest low  Te
#define SHORT_HEAD   20         // shortest Thead accepted 2,7ms
#define LONG_HEAD    45         // longest Thead accepted 6,2ms

//-----------------------------------------------------------------------------------
#pragma int_rtcc       // install as interrupt handler (comment for HiTech!)
void interrupt rxi(void)  //this routine gets called every time TMR0 overflows
{
    RFBit = RFIn;               // sampling RF pin verify!!!
    TMR0 -= PERIOD;             // reload
    T0IF = 0;

    XTMR++;                     // extended 16 long timer update
//-----------------------------------------------------------------
    if (RFFull)                 // avoid overrun
    {    return;}

    switch( RFstate)            // state machine main switch
    {
     
    case TRFUNO:
        if ( RFBit)
        { // while high 
            RFcount--;
            if ( RFcount < HIGH_TO)
                RFstate = TRFreset;      // reset if too long
        }
        else
        { // falling edge detected  ----+
          //                            |
          //                            +----
                RFstate= TRFZERO;
        }        
        break;
        
    case TRFZERO:
        if ( RFBit)
        { // rising edge detected     +----
          //                          |
          //                      ----+
            RFstate= TRFUNO;
            B[Bptr] >>= 1;              // rotate 
            if ( RFcount >= 0)
            {    B[Bptr]+=0x80; }       // shift in bit
            RFcount = 0;                // reset length counter
            
            if ( ( ++BitCount & 7) == 0)
            {    Bptr++;    }           // advance one byte
            if (BitCount == NBIT)  

            {
                RFstate = TRFreset;     // finished receiving 
                RFFull = TRUE;
            }    
        }
        else
        { // still low
            RFcount++;
            if ( RFcount >= LOW_TO)     // too long low
            {
                RFstate = TRFSYNC;      // fall back into RFSYNC state 
                Bptr = 0;               // reset pointers, while keep counting on 
                BitCount = 0;
            }
        }
        break;

    case TRFSYNC:
        if ( RFBit)
        { // rising edge detected  +---+                +---..
          //                       |   |  <-Theader->   |   
          //                           +----------------+
            if ( ( RFcount < SHORT_HEAD) || ( RFcount >= LONG_HEAD))
            {
                RFstate = TRFreset;
                break;                  // too short/long, no header
            }
            else
            {
                RFcount =0;             // restart counter
                RFstate= TRFUNO;  //合适的长低电平信号出现
            }
        }
        else
        { // still low
            RFcount++;
        }
        break;

    case TRFreset:      //初始状态
    default:
        RFstate = TRFSYNC;          // reset state machine in all other cases
        RFcount = 0;
        Bptr = 0;
        BitCount = 0;
        break;
        
    } // switch
//-----------------------------------------------------------------
} // rxi


void InitReceiver()
{
    T0IF = 0;
    T0IE = 1;                   // TMR0 overflow interrupt
    GIE = 1;                    // enable interrupts
    RFstate = TRFreset;         // reset state machine in all other cases
    RFFull = 0;                 // start with buffer empty
    XTMR = 0;                   // start extende

}


关键字:PIC单片机  滚动码解码 引用地址:PIC单片机滚动码解码C程序

上一篇:一种基于MAX5980芯片的POE网络交换机设计方案
下一篇:pic单片机软件解码PT2240

推荐阅读最新更新时间:2024-03-16 15:20

C语言的位域结构体在PIC单片机中的应用
在写程序中遇到要用标志位的情况,以为可以和keil51一样进行位定义,虽知道一直报错,后来才知道MC18编译器是不支持位定义的(PICC18编译器倒是支持的)。下面给出一种解决办法 位域结构体。 有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为 位域 或 位段 。所谓 位域 是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把几个不同的对象用一个字节的二进制位域来表示。一、位域的定义和位域变
[单片机]
基于PIC单片机的数字式智能铅酸电池充电器的设计
  0 引言   铅酸蓄电池由于其成本低、容量大、安全可靠等特点,在通信、电动汽车、军事、航空航天等各个领域都有广泛的应用。电池的性能好坏、使用寿命的长短直接影响到电子产品的使用寿命和使用安全;而充电器的好坏又直接影响到电池的使用寿命。因此研究低成本又有智能管理功能的充电器是有实际应用价值的课题。   1 目前智能充电器的几种结构[1]   1.1 基于专用芯片的管理系统   现在,UNITRODE 公司已开发出系列电池管理专用芯片。因为电池管理中采用最多的就是控制充电电压及充放电电流,电池管理芯片正是抓住了这一点,为VRLA 电池研制了具有四状态管理的专用控制芯片,可以智能地实现带温度补偿的四状态管理方案:涓流充电模式、
[单片机]
基于<font color='red'>PIC单片机</font>的数字式智能铅酸电池充电器的设计
pic单片机程序设计的基本方法解析
pic单片机在学习和工作中均扮演着重要角色,在往期文章中,小编曾对pic单片机汇编指令加以介绍,以帮助大家更好掌握pic单片机。而在本文中,将介绍pic单片机程序设计内容,以助大家写出更为优美的pic单片机程序,主要内容如下。 1、PIC单片机程序的基本格式 先介绍二条伪指令: EQU ——标号赋值伪指令 ORG ——地址定义伪指令 PIC16C5X单片机在RESET后指令计算器PC被置为全“1”,所以PIC16C5X几种型号芯片的复位地址为: PIC16C54/55:1FFH PIC16C56:3FFH PIC16C57/58:7FFH 一般来说,PIC单片机的源程序并没有要求统一的格式,大家可以根据自己的风格来编写。但这里
[单片机]
<font color='red'>pic单片机</font>程序设计的基本方法解析
PIC单片机常用指令介绍与指令功能分类表
  源程序的编写主要就是用这些基本的指令实现你的控制任务。但为了增加源程序的可读性和可维护性,我们引入了伪指令的概念。伪指令本身不会产生可执行的汇编指令,但它们可以帮组“管理”你编写的程序,其实用性和必要性绝不亚于 35 条正真的汇编指令。我们在此着重介绍最常用的几种伪指令。   PIC单片机最常用的几种指令介绍   #include 或 include   #include 伪指令的作用是把另外一个文件的内容全部包含复制到本伪指令所在的位置。被包含复制的文件可以是任何形式的文本文件,当然文件中的内容和语法结构必须是MPASM 能够识别的。最经常被“include”的是针对 PIC 单片机内部特殊功能寄存器定义的包 含 头
[单片机]
什么是PIC单片机又有何应用
PIC单片机(Peripheral Interface Controller)是一种用来开发的去控制外围设备的集成电路(IC)。一种具有分散作用(多任务)功能的CPU。与人类相比,大脑就是CPU,PIC 共享的部分相当于人的神经系统。 PIC 单片机是一个小的计算机 PIC单片机有计算功能和记忆内存像CPU并由软件控制允行。然而,处理能力—存储器容量却很有限,这取决于PIC的类型。但是它们的最高操作频率大约都在20MHz左右,存储器容量用做写程序的大约1K—4K字节。 时钟频率与扫描程序的时间和执行程序指令的时间有关系。但不能仅以时钟频率来判断程序处理能力,它还随处理装置的体系结构改变(1*)。如果是同样的体系结构,
[单片机]
什么是<font color='red'>PIC单片机</font>又有何应用
PIC单片机的中断资源及应用
1 PIC 单片机 简介 PIC系列 单片机 是美国Microchip技术公司推出的高性能价格比的8位嵌入式控制器(Embedded Controller),它采用了精简指令集计算机RISC(Reduced Instruction Set Computer)和哈佛(Harvard)双总线以及两级指令流水线结构。具有高速度、低工作电压、低功耗等特点和优良的性能价格比,因而PIC系列单片机越来越受到单片机开发与应用工程技术人员的青睐。该系列独特的结构和中断资源使其在使用时与其它系列的单片机有许多不同之处。下面以PIC16CXX系列微控制器为例来介绍PIC系列单片机的中断资源特点以及应用方法。 2 中断资源的开发与屏蔽 图1是PIC16
[单片机]
<font color='red'>PIC单片机</font>的中断资源及应用
PIC单片机的清零指令详解
看到这篇文章的朋友,想必大家对pic单片机均具备一定兴趣,或对pic单片机具备一定使用需求。前文中,小编曾对pic单片机汇编语言进行过部分讲解。本文中,将对pic单片机的清零等指令加以讲解,以帮助大家更好掌握pic单片机编程。 一、清零指令 1.寄存器清零指令 实例:CLRW;寄存器W被清零 说明:该条指令很简单,其中W为PIC单片机的工作寄存器,相当于MCS-51系列单片机中的累加器A,CLR是英语Clear的缩写字母。 2.看门狗定时器清零指令。 实例:CLRWDT;看门狗定时器清零(若已赋值,同时清预分频器) 说明:WDT是英语Watchdog Timer的缩写字母。CLR见上述说明。注意该两条指令无操作数。 3.寄存器
[单片机]
<font color='red'>PIC单片机</font>的清零指令详解
PIC单片机开发环境搭建
1.PIC单片机的开发环境常用的是MPLAB, MPLAB可以从微芯公司网站上(http://www.microchip.com)下载;这个开发环境自带的是汇编程序的编译器,如果想用C语言做开发,那么需要下载相应的C语言编译器并安装,配套的C语言编译器为 MPLAB-C18, 可以从微芯公司网站上(http://www.microchip.com)下载。 2.首先下载好MPLAB和MPLAB-C18两个软件并解压。 首先安装MPLAB,解压好的MPLAB如下图所示: 双击setup,前半部分直接点击next即可,到中间部分会出现如下图所示的选择框: 这里可以选择是,后面的点击next即可。MPLAB安装完成之后,重启系统
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved