51单片机与RC500射频

发布者:春林初盛最新更新时间:2015-10-16 来源: eefocus关键字:51单片机  RC500射频 手机看文章 扫描二维码
随时随地手机看文章
#include

#include
#include
#include
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define GetRegPage(addr)    (0x80 | (addr>>3))
idata struct TranSciveBuffer{uchar MfCommand;
                             uchar MfLength;
                             uchar MfData[19];
                            };

void delay(uchar t)
{
 uchar i,j;
 for(i=0;i   for(j=0;j<110;j++);
}
void WriteRawIO(unsigned char Address,unsigned char value)
{
 XBYTE[Address]=value;
}
unsigned char ReadRawIO(unsigned char Address)
{
 return XBYTE[Address];
}
void WriteRC(unsigned char Address, unsigned char value)
{
    WriteRawIO(0x00,GetRegPage(Address)); 
    WriteRawIO(Address,value);             
}
unsigned char ReadRC(unsigned char Address)
{
   WriteRawIO(0x00,GetRegPage(Address));
   return ReadRawIO(Address);                 
   }
void ClearBitMask(uchar reg,uchar mask)
{
   char tmp=0x0;
   tmp = ReadRC(reg);
   WriteRC(reg,tmp & ~mask);
}
void SetBitMask(uchar reg,uchar mask)
{
   char tmp=0x0;
   tmp=ReadRC(reg);
   WriteRC(reg,tmp|mask);
}
void FlushFIFO(void)

    SetBitMask(RegControl,0x01);
}
void PcdAntennaOff()
{
    ClearBitMask(RegTxControl,0x03);
}
 void PcdAntennaOn()
{
    SetBitMask(RegTxControl,0x03);
}

void PcdSetTmo(unsigned char tmoLength)
{
    switch(tmoLength)
    { 
        case 1:                      
            WriteRC(RegTimerClock,0x07); 
            WriteRC(RegTimerReload,0x6a);
            break;
        case 2:                      
            WriteRC(RegTimerClock,0x07); 
            WriteRC(RegTimerReload,0xa0);
            break;
        case 3: 
            WriteRC(RegTimerClock,0x09);
            WriteRC(RegTimerReload,0xa0);
            break;
        case 4:
            WriteRC(RegTimerClock,0x09);
            WriteRC(RegTimerReload,0xff);
            break;
        case 5: 
            WriteRC(RegTimerClock,0x0b);
            WriteRC(RegTimerReload,0xff);
            break;
        case 6:                      
            WriteRC(RegTimerClock,0x0d);
            WriteRC(RegTimerReload,0xff);
            break;
        case 7:                     
            WriteRC(RegTimerClock,0x0f);
            WriteRC(RegTimerReload,0xff);
            break;
        default:                      
            WriteRC(RegTimerClock,0x07);
            WriteRC(RegTimerReload,tmoLength);
            break;
    }    
}

char PcdComTransceive(struct TranSciveBuffer *pi) 
{
   bit recebyte=0;
   char status;
   uchar irqEn=0x00;
   uchar waitFor=0x00;
   uchar lastBits;
   uchar n;
   uint i;
   FlushFIFO();
   switch(pi->MfCommand)
   {
      case PCD_IDLE:
         irqEn = 0x00;
         waitFor = 0x00;
         break;
      case PCD_WRITEE2:
         irqEn = 0x11;
         waitFor = 0x10;
         break;
      case PCD_READE2:
         irqEn = 0x07;
         waitFor = 0x04;
         recebyte=1;
         break;
      case PCD_LOADCONFIG:
      case PCD_LOADKEYE2:
      case PCD_AUTHENT1:
         irqEn = 0x05;
         waitFor = 0x04;
         break;
      case PCD_CALCCRC:
         irqEn = 0x11;
         waitFor = 0x10;
         break;
      case PCD_AUTHENT2:
         irqEn = 0x04;
         waitFor = 0x04;
         break;
      case PCD_RECEIVE:
         irqEn = 0x06;
         waitFor = 0x04;
         recebyte=1;
         break;
      case PCD_LOADKEY:
         irqEn = 0x05;
         waitFor = 0x04;
         break;
      case PCD_TRANSMIT:
         irqEn = 0x05;
         waitFor = 0x04;
         break;
      case PCD_TRANSCEIVE:
         irqEn = 0x3D;
         waitFor = 0x04;
         recebyte=1;
         break;
      default:
         pi->MfCommand=MI_UNKNOWN_COMMAND;
         break;
   }
   if(pi->MfCommand!=MI_UNKNOWN_COMMAND)
   {
     WriteRC(RegPage,0x00);
  WriteRC(RegInterruptEn,0x7F);//使能所有的中断
     WriteRC(RegInterruptRq,0x7F);//
     WriteRC(RegCommand,PCD_IDLE);//闲置状态
      SetBitMask(RegControl,0x01);//清除FIFO
     WriteRC(RegInterruptEn,irqEn|0x80); //允许对应的专断
     for(i=0;iMfLength;i++)
       {
         WriteRC(RegFIFOData,pi->MfData[i]);//写数据至FIFO
       }
        WriteRC(RegCommand,pi->MfCommand);//执行命令
     i=0x2000;
        do
        {
       n=ReadRC(RegInterruptRq);
    i--;
        }
        while((i!=0)&&!(n&irqEn&0x20)&&!(n&waitFor));//等待数据发送完 n&waitFor表示命令自动结束
        status=MI_COM_ERR;
        if((i!=0)&&!(n&irqEn&0x20))//FIFO数据超限或i=0
        {
         if(!(ReadRC(RegErrorFlag)&0x17))//没出错
          {
            status=MI_OK;
   if(recebyte)//表示有返回数据
            {
               n=ReadRC(RegFIFOLength);//读出返回的数据长度
    lastBits=ReadRC(RegSecondaryStatus)&0x07;
                if(lastBits)
                {  
                   pi->MfLength=(n-1)*8+lastBits;
                }
                else
                {  
                   pi->MfLength=n*8;
                }
                if(n==0)
                {
                   n=1;
                }
                for(i=0;i                 {
                 pi->MfData[i]=ReadRC(RegFIFOData);
                }
            }
         }
      }
      else if(n&irqEn&0x20)//FIFO数据超限
      {
          status=MI_NOTAGERR;
      }
      else
      {
          status=MI_COM_ERR;
      }
      WriteRC(RegInterruptEn,0x7F);
   delay(10);
      WriteRC(RegInterruptRq,0x7F);
   }
   return status;
}[page]

char PcdRequest(uchar req_code)
{
    char status;
 idata struct TranSciveBuffer MfComData;
    struct TranSciveBuffer *pi;
    pi=&MfComData;
    PcdSetTmo(106);
    PcdAntennaOn();
    WriteRC(RegChannelRedundancy,0x03);
    ClearBitMask(RegControl,0x08);//Crypto1on=0
    WriteRC(RegBitFraming,0x07);
    MfComData.MfCommand=PCD_TRANSCEIVE;
    MfComData.MfLength=1;
 MfComData.MfData[0]=req_code;
    status=PcdComTransceive(pi);
  if(!status)
    {   
  if(MfComData.MfLength!=0x10)
        {
         status=MI_BITCOUNTERR;
        }
    }
    return status;
}

uchar PiccCascAnticoll(uchar *snr)  //这个指针变量没有用,但少了就会报错

    uchar i;
    uchar snr_check=0;
    char status=MI_OK;
    idata struct TranSciveBuffer MfComData;
    struct TranSciveBuffer *pi;
 pi=&MfComData; 
 PcdAntennaOn();
 PcdSetTmo(106);//设置定时器
    WriteRC(RegDecoderControl,0x28);//设置碰撞后接收的所有位都用0表示
    ClearBitMask(RegControl,0x08);//Crypto1=0
    WriteRC(RegChannelRedundancy,0x03);//使能奇校验
 MfComData.MfCommand=PCD_TRANSCEIVE;//发送接收命令
    MfComData.MfLength=2;//发送两个字节
    MfComData.MfData[0]=PICC_ANTICOLL1;//PICC_ANTICOLL1=93H,PiCC反碰撞指令
    MfComData.MfData[1]=0x20;//反碰撞还需要在发送一个20H,即想picc发送两个字节
    status=PcdComTransceive(pi);//PcdComTransceive函数将Mfdate中的数据发送给Picc
    if(!status)//表示执行命令没出错
    {
     
   for(i=0;i<4;i++)//执行命令后返回的前4个字节
         {
          snr_check^=MfComData.MfData[i];//接收到的前四个字节按位异或存入snr_check中
         }
         if(snr_check!=MfComData.MfData[i])//判断所接收序列号是否正确
         {
          status=MI_SERNRERR;//接收到的5个字节出错
   }
   else
   {
    for(i=0;i<5;i++)
   {
    *(snr+i)=MfComData.MfData[i];
    }
   }
  
 }
    ClearBitMask(RegDecoderControl,0x20);
 return status;
}

char PcdSelect(uchar *snr,uchar *sar)
{
    uchar i;
    char status;
    uchar snr_check=0;
    idata struct TranSciveBuffer{uchar MfCommand;
                                 uchar MfLength;
                                 uchar MfData[7];
                                }MfComData;
    struct TranSciveBuffer *pi;

    pi=&MfComData;
    PcdSetTmo(106);
    WriteRC(RegChannelRedundancy,0x0F);
    ClearBitMask(RegControl,0x08);

    MfComData.MfCommand=PCD_TRANSCEIVE;
    MfComData.MfLength=7;
    MfComData.MfData[0]=PICC_ANTICOLL1;
    MfComData.MfData[1]=0x70;
    for(i=0;i<4;i++)
    {
     snr_check^=*(snr+i);
     MfComData.MfData[i+2]=*(snr+i);
    }
    MfComData.MfData[6]=snr_check;//select要传7个字节
    status=PcdComTransceive(pi);
    if(status==MI_OK)
    {    if(MfComData.MfLength!=0x8)
        {
         status = MI_BITCOUNTERR;
        }
  *sar=MfComData.MfData[0];
   }
   return status;
}


void init()

 delay(500);
 RC500CS=1;//这个位定义在rc500文件里
 RC500RST=1;
 delay(100);
 RC500RST=0;
 TMOD=0x20;//串口通讯的设置,采用9600波特率
 TH1=0xfd;
 TL1=0xfd;
 TR1=1;
 SCON=0x52;   
 PCON&=0x7f;
 TI=0;
 delay(10);//这个延时很重要,否则会写不进数据到RC500
}
void main()

    uchar i,a[5],b[5],status,*snr,c;//传递数组的首地址可以,传递指针必须初始化,且每个指针都要知道指向的地址,所以传递数组比较好
 snr=&c;
 init();
 PcdRequest(PICC_REQALL);
 PiccCascAnticoll(a);
 for(i=0;i<5;i++)    
 
  b[i]=a[i];
  SBUF=b[i];
  while(!TI);
  TI=0;
 }
 status=PcdSelect(b,snr);
 SBUF=status;
 while(!TI);
 TI=0;
 SBUF=*snr;
 while(!TI);
 TI=0;
 while(1); 
}

关键字:51单片机  RC500射频 引用地址:51单片机与RC500射频

上一篇:74ls164和51写的简单流水灯
下一篇:51单片机—软件看门狗

推荐阅读最新更新时间:2024-03-16 14:36

51单片机开发之定时器
4.1 定时器 4.1.1 51时钟周期介绍 时钟周期:时钟周期T是时序中最小的时间单位,具体计算的方法就是 1/时钟源频率,89C51单片机开发板上常用的晶振是11.0592M,对于这个单片机系统来说,时钟周期=1/11059200 秒。 机器周期:是单片机完成一个操作的最短时间。 机器周期主要针对汇编语言而言,在汇编语言下程序的每一条语句执行所使用的时间都是机器周期的整数倍,而且语句占用的时间是可以计算出来的,而 C 语言一条语句的时间是不确定的,受到诸多因素的影响。 51单片机系列,在其标准架构下一个机器周期是 12 个时钟周期,也就是 12/11059200 秒。 现在很多的增强型51单片机,其速度都比较块
[单片机]
<font color='red'>51单片机</font>开发之定时器
基于51单片机实现无源蜂鸣器控制
前言 前篇教程我们已经介绍了如何控制51 单片机的IO 口输出高低电平,本章我们通过另外一个实验来讲述51单片机IO口的输出。通过单片机的一个IO口控制板载无源蜂鸣器,实现蜂鸣器控制。学习可以参考前面LED实验教程内容。 一、蜂鸣器介绍 蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。 压电式蜂鸣器主要由多谐振荡器、压电蜂鸣片、阻抗匹配器及共鸣箱、外壳等组成。多谐振荡器由晶体管或集成电路构成,当接通电源后(1.5~15V 直流工作电压),多谐振荡器起振,输出1.5~
[单片机]
基于<font color='red'>51单片机</font>实现无源蜂鸣器控制
51单片机的LED的位定义
一、位定义原理 定义方法:sbit 位名=特殊功能寄存器^位置; sbit LED1 = P2^0; 符号 ^ 前面是特殊功能寄存器的名字,后面的数字定义的可寻址位在特殊功能寄存器中的位置,取值必须是0~7 p2是连接LED的IO口,p2^0到7分别对应LED1到8 二、代码实现 #include reg52.h //对八个LED分别进行位定义 sbit LED1 = P2^0; sbit LED2 = P2^1; sbit LED3 = P2^2; sbit LED4 = P2^3; sbit LED5 = P2^4; sbit LED6 = P2^5; sbit LED7 = P2^6; sbit LED8 = P2^
[单片机]
<font color='red'>51单片机</font>的LED的位定义
51单片机:LED灯流水灯
知道闪烁原理后,我们就可以将所有引脚依次输出0V、延时、输出5V,就能达到流水灯效果,但这样写太呆板,咱们利用C语言for循环,再进行位运算就可以简单达到效果,程序如下 #include reg52.h //引用头文件 void Delay(int time) { while(time--) //while循环一次需要10us { } } int main() { int i = 0; while(1) { for(i=0;i 8;i++) { P2=~(0x01 i); Delay(50000); } } return 0; } 实验现象如
[单片机]
<font color='red'>51单片机</font>:LED灯流水灯
51单片机和OLED仿真 芯片SSD1306
用的是7Pin的OLED,就那个宝买的那种。用的是不是中景园的程序我就不知道了。芯片应该是用SSD1306,但是用仿真里面的SSD1306总是不对。我随便试了试SSD1308到时对了! 单片机源程序如下 #include xianshispi.h #include oledfont.h void delay_ms(unsigned int ms) { unsigned int a; while(ms) { a=1800; while(a--); ms--; } return; } void OLED_WR_
[单片机]
<font color='red'>51单片机</font>和OLED仿真 芯片SSD1306
51单片机音乐盒设计 按键可以上一曲,下一曲,开始或暂停
功能介绍: 本设计采用STC89C51/52(与AT89C51/52、AT89S51/52通用,指定单片机请留言)单片机做为主控制器 主要功能: 单片机内置8首歌曲,按键可以上一曲,下一曲,开始或暂停。电位器可以调节音量。LM386驱动喇叭,够响亮! 使用说明: 一共4个按键 上面那个独立的是复位按键,按下去程序从头执行,详情请看视频讲解文件夹中的最小系统介绍。 下面3个按键分别是:上一曲、开始/暂停、下一曲。 单片机源程序如下: ////////////////////////////////////////////// //51单片机音乐播放器程序 // //共三个按键:上
[单片机]
51单片机C语言教程(七) 表达式2
关系运算符   对于关系运算符,同样我们也并不陌生。C中有六种关系运算符,这些家伙同样是在小时候学算术时学习过的:   > 大于   < 小于   >= 大于等于   <= 小于等于   == 等于   != 等于   或者你是个非C程序员,那么对前四个一定是再熟悉不过的了。而 == 在VB或PASCAL等中是用 = , != 则是用 not 。由于工作关系我自己要使用好几种的程序语言,所以有时也会头晕搞错。老了咯 :P 小学时的数学课就教授过运算符是有优先级别的,计算机的语言也不过是人类语言的一种扩展,这里的运算符同样有着优先级别。前四个具有相同的优先级,后两个也具有相同的优先级,但是前四个的优先级要高于后2个的。 当两个表达式
[单片机]
<font color='red'>51单片机</font>C语言教程(七) 表达式2
80C51单片机的定时计数器的结构和工作原理
单片机怎么学,先从哪入手开始学,怎么开始入门 无论是对于新手还是已经在行内的朋友,学习单片机技术,实战动手能力十分重要,如果只知道从网络上的视频以及配套教材来入手开始学,很肯定的说,你永远也学不会。为何?单片机的学习最重要的一点是需要去动手实战实操,单单只看培训教材,也许看的时候能懂一些,但过了一段时间就会遗忘得一干二净,中国有句成语交“纸上谈兵”,经常用来嘲讽一些完全没有实践过的人,单凭从书上了解的知识就胸有成竹的长篇大论。 在这里建议大家,一定要给自己构建一个合适的动手实战试验场所,结合具体的实操对象就很容易理解单片机的电路组态原理,以及理解单片机的程序编制原理,对于入行不深的人,建议给自己出一道居家智能化的物联网课题,采
[单片机]
80C<font color='red'>51单片机</font>的定时计数器的结构和工作原理
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

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

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