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

📄 dtmf_main.c

📁 DS12C887在MSP430上读写操作程序
💻 C
字号:
#include <reg51.h>
#include <MODBUSCR.H>
#include <ABSACC.H>

#define COMMAND           PBYTE[0x0A]
#define RAM_READY         PBYTE[0x0E]
#define TOOK_AWAY         PBYTE[0x0F]
#define CODE_NUMBER       DBYTE[0x3F]
#define fff      0x00
unsigned char pdata * data p_point;     /*双口RAM中存放号码处*/
unsigned char data * data buffer;       /*CPU内存放号码处*/

sbit StD=P3^3;                          /*解码测试线,有号码为高*/
sbit voice_control=P3^4;                /*控制对讲机发送输出*/
sbit busyR=P3^2;
sbit watchdog=P3^5;                     /*看门狗*/

bit code_saved;         /*新号码已储存*/
bit code_removed;       /*buffer中有新号码*/

read_code()
{
  int i=0;
  do
  {
    i++;
  } while(StD==1&&i<=100);      /*延时判断*/
  watchdog=!watchdog;
  if (StD==0){;}                /*如是扰动*/
  else
  {
    *buffer=P1&0x0F;            /*读出号码*/
    buffer++;
    code_saved=1;               /*设已存储新号码标志*/
    CODE_NUMBER++;              /*收到号码数+1*/
    code_removed=0;             /*清号码已送出标志*/
  }
}

wait_code()
{

  unsigned int data i,j;
  i=0;
  code_saved=0;                 /*清号码已存储标志*/
  if(RAM_READY!=0xE)
     RAM_READY=0;
  if(RAM_READY==0)
     {TOOK_AWAY=0;}/*如果送出的号码已被收走,送出的号码个数清零*/
  else;
  do
  {
    i++;
    watchdog=!watchdog;
  }while(StD==0&&i<=15000);     /*检测是否在300MS内无新号码被解码*/

  if(StD==1){;}                 /*如有新号码,退出*/
  else if(code_removed==0)      /*如无,看是否有新号码需要送出*/
  {
    if(TOOK_AWAY==0&&RAM_READY==0)   /*如右新号码需送出,看上次送出的号码是否被取走*/
    {
      buffer=0x40;                   /*恢复号码缓存区指针*/
      p_point=fff;                   /*恢复送出号码区指针*/
      if(CODE_NUMBER<=16&&CODE_NUMBER!=0) /*缓存区号码数超过16位,不发送*/
      {
        for(j=0;j<CODE_NUMBER;j++)       /*送出号码*/
        {
          *p_point=(*buffer);
          p_point++;
          buffer++;
        }
        RAM_READY=0x0E;                  /*通知微机已送出号码*/
      }
      else;
      TOOK_AWAY=CODE_NUMBER;             /*送出号码个数*/
      code_removed=1;
    }
    else if(RAM_READY==0)
      {TOOK_AWAY=0;}  /*如果送出的号码已被收走,送出的号码个数清零*/
    else;
    buffer=0x40;                         /*恢复号码缓存取初始状态*/
    CODE_NUMBER=0;
  }
  else
  {
    buffer=0x40;                         /*恢复号码缓存取初始状态*/
    CODE_NUMBER=0;
  }

    /*读语音控制指令*/
  if(COMMAND==0x0A){voice_control=0;}    /*打开对讲机*/
  else if(COMMAND==0x00)
    {voice_control=1;}                   /*关闭对讲机*/
  else{;}

}

main()
{
  unsigned char data w;
  SCON=0x00;
  PCON=0x00;
  TMOD=0x91;
  PSW=0x00;
  IE=0x00;
  P2=0x00;
  CODE_NUMBER=0;
  RAM_READY=0;
  TOOK_AWAY=0;
  voice_control=1;
  p_point=0x00;

  for(p_point=0;p_point<=0xFE;p_point++)  /*清理RAM*/
  {
    *p_point=0x00;
  }

  for(;;)                  /*无限循环*/
  {
    watchdog=!watchdog;
    if(StD==1)             /*判断检测到新号码,进入号码存储程序*/
    {
      if(code_saved==0)
      {
        read_code();
      }
      else;
    }
    else
    {
      wait_code(); /*否则,进入号码等待程序,同时处理于微机的信息传递*/
    }
  }
}

⌨️ 快捷键说明

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