📄 dtmf_main.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 + -