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

📄 main.c

📁 RS232+485+USB+nRF2401,该程序主要是nRF2401在各种通讯接口的应用
💻 C
字号:
/*

  项目: 人员定位:读卡器
  文件: main.c
  日期: 2007.09.12
  作者: 邵子扬
  说明: 主程序,完成初始化,开始运行,低功耗等

*/

#include <avr/io.h>
#include <avr/power.h>
#include <avr/sleep.h>
#include <avr/eeprom.h>
#include <stdlib.h>

#include "common.h"

struct Timer tmr;
struct uCard card[MAX_CARD_NO];
struct Config cfg;


uint8 DataReady = 0;//有数据需要读取
uint8 dat __attribute__ ((section (".noinit")));

//使用环形缓冲区管理卡片
uint16 cdHead = 0, cdTail = 0;  //首尾卡片地址
uint8 cdRTNum = 0;

void init()
{
  wdt_disable();
  io_init();
  spi_init();
  timer_init();
  uart_init();
  isr_init();
  //sleep_enable();

  nRF2401_init();

  //延时,8MHz
  tmr0delay(3);

  nRF2401_config();

}


void readTimeFromBuf(uint8 *buf, struct Timer time)
{
  time.day = buf[0] >> 3;
  time.hour = ((buf[0] & 0x07) << 2) | (buf[1] >> 6);
  time.min = buf[1] & 0x3F;
  time.sec = buf[2] >> 2;
}

void WriteTimeToBuf(uint8 *buf, struct Timer time)
{
  buf[0] = (time.day << 3) | (time.hour >>2);
  buf[1] = (time.hour <<6) | time.min;
  buf[2] = time.sec << 2;
}

//删除记录
void deleteID(uint16 ID)
{
  uint16 i;

  if(cdHead == cdTail)
    return;

  //不在有效范围之内
  if(cdHead < cdTail)// 0  H  T  MAX
  {
    if((cdHead > ID)||(ID >= cdTail))
      return;
    else
    {
      for(i = ID; i < cdTail; i++)
      {
        card[i] = card[i+1];
        //card[i].ID = card[i+1].ID;
        //card[i].time[0] = card[i+1].time[0];
        //card[i].time[1] = card[i+1].time[1];
        //card[i].time[2] = card[i+1].time[2];
      }
      cdTail--;
    }
  }
  else
  {
    if((cdHead > ID)&&(ID >= cdTail))// 0  T  H  MAX
      return;
    else
    {
      for(i = ID; i < (cdTail + MAX_CARD_NO); i++)
      {
        card[i % MAX_CARD_NO] = card[(i + 1) % MAX_CARD_NO];
        //card[i % MAX_CARD_NO].ID = card[(i + 1) % MAX_CARD_NO].ID;
        //card[i % MAX_CARD_NO].time[0] = card[(i + 1) % MAX_CARD_NO].time[0];
        //card[i % MAX_CARD_NO].time[1] = card[(i + 1) % MAX_CARD_NO].time[1];
        //card[i % MAX_CARD_NO].time[2] = card[(i + 1) % MAX_CARD_NO].time[2];
      }
      cdTail = (cdTail - 1) % MAX_CARD_NO;
    }
  }

  
}

//查找ID号是否已经记录
uint16 findID(uint16 ID)
{
  uint16 i;

  i = cdHead;
  while(i != cdTail)
  {
    if((card[i].ID % 1024) == (ID % 1024))
    {
      return i;
    }
    i = (i + 1) % MAX_CARD_NO;
  }
  return -1;
}

//添加卡片
void addCard(uint16 id)
{
  uint16 pos;

  pos = findID(id);
  if(pos == -1)  //没有记录
  {
    pos = cdTail;//记录到最后位置
  }
  else
  {
    if(cdHead < cdTail)// 0  H  T  MAX
    {
      if()
    }
    else               // 0  T  H  MAX
    {
    }
  }

  card[pos].ID = id;  //卡号
  WriteTimeToBuf(card[pos].time, tmr);//保存当前时间

  if(pos == cdTail)
  {
    cdTail = (cdTail + 1) % MAX_CARD_NO;
    if(cdTail == cdHead)//缓冲区回绕
    {
      cdHead = (cdHead + 1) % MAX_CARD_NO;
    }
  }
}

int main(void)
{
  init();
  ce_high();
  cfg.addr=0;

  while(1)
  {
    //读取卡片信息
    if(DataReady)
    {
      DataReady = 0;
      nRF2401_receiver();
      addCard((uint16)RFBuf[0]*256 + RFBuf[1]);
      LEDPORT ^= (1 << LED);
    }
    
    //处理串口数据
    if(RTflag == 2)
    {
      RTflag = 3;//改变状态标志
      if(FrameAnalyse(RTBuf))
      {
        RTflag = 0;
        RTptr = 0;
      }
    }
  }

  return 0;
}

⌨️ 快捷键说明

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