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

📄 rix_a.c

📁 使用曼切斯特码作为无线传输的程序,希望大家多多支持啦!
💻 C
字号:
#include <pic.h>
typedef unsigned char byte;
typedef signed char sbyte;
typedef signed int word;

#define CLOCK           4       // MHz
#define TE            300       // us
#define OVERSAMPLING    3       
#define PERIOD          0		//TE*OVERSAMPLING/CLOCK	//250us
#define NBIT            72      // number of bit to receive -1

#define RFIn   RA1           // i radio signal input

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

byte B[9];                      // receive buffer 

static byte  RFstate;           // receiver state
static byte 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 TRFDATAUP	2

#define HIGH_TO     -10         // longest high Te
#define LOW_TO       10         // longest low  Te
#define SHORT_HEAD   10         // shortest Thead accepted 10*208=2.08ms
#define LONG_HEAD    30         // longest Thead accepted 30*208=6.24ms
//开两种中断,定时器中断和端口电平变化中断
//其中定时器中断同时兼顾外部的系统时钟和脉冲宽度计数
//#pragma int_rtcc   // install as interrupt handler (comment for HiTech!)
interrupt
rxi()
{
    // this routine gets called every time TMR0 overflows
    if(T0IF)		//定时器中断程序
    {
        TMR0 = PERIOD;             // 装计时器初值
        T0IF = 0;					// 清定时器溢出标志
        XTMR++;                     // 外部的系统时钟计时器加1
        RFcount++;					// 脉冲宽度计数器加1
		return;
    }

    if(RAIF)		//端口电平变化中断程序
    {
        TMR0 = PERIOD;             // 装计时器初值
	    if (RFFull)                 // 如果接收位满就退出
	        return;
		RFBit = RFIn;               // 取样信号接收的值
		RAIF = 0;
	    switch (RFstate)            // 当前状态
	    {
		    case TRFDATAUP:
				switch (RFcount)
				{ 
				    case 1:
				    break;
			  
				    case 2:
						B[Bptr] <<= 1;              // rotate 
						if ( RFBit==0)		//如是有效的下跳变则该位的数据值为1,上跳变为0
						{ 
							B[Bptr]+=1;          // shift in bit
						}
						if ( ( ++BitCount & 7) == 0)
							Bptr++;                 // advance one byte	
						if (BitCount == NBIT)
						{
							RFstate = TRFreset;     // finished receiving 
							RFFull = 1;
						} 
						RFcount=0;	//重新记时
					break;
			
				    default:		//超时或不足则退出接收
				        RFstate = TRFreset;        // reset state machine in all other cases
					break;
				}
			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= TRFDATAUP;
		            }
		        }
		        else
		        { // still low
		            RFcount=0;
		        }
			break;
	
		    case TRFreset:
		    default:
		        RFstate = TRFSYNC;        // reset state machine in all other cases
		        RFcount = 0;
		        Bptr = 0;
		        BitCount = 0;
			break;
		    } // switch
	PORTA = PORTA;//启动端口电平中断
    } //电平中断
} // rxi


void InitReceiver()
{
	IOCA = 2;
    T0IF = 0;
    T0IE = 1;                   // TMR0 overflow interrupt
	RAIE = 1;					//使能端口电平变化中断
    GIE = 1;                    // enable interrupts
    RFstate = TRFreset;         // reset state machine in all other cases
    RFFull = 0;                 // start with buffer empty
    XTMR = 0;                   // start extended timer
    TMR0 = PERIOD;             // 装计时器初值
    PORTA = PORTA;//启动端口电平中断
}

⌨️ 快捷键说明

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