📄 dtmf.c
字号:
/*————————————————————
〖说明〗89c52的电话网络控制驱动程序
〖文件〗main.c ﹫2004/10/12
〖作者〗陈建
〖修改〗修改建议请到论坛公布 http://www.mcu51.com/bbs
〖版本〗V1.00A kc51_701
—————————————————————*/
#include <reg51.h>
#include <stdio.h>
//#include <io.h>
#include <intrins.h>
//#define b_init 0
//#define b_erase 1
typedef unsigned char uchar;
typedef unsigned int uint;
//#define uint unsigned int
//#define uchar unsigned char
sbit p3_0=P3^0;
sbit p3_1=P3^1;
sbit p3_2=P3^2;
sbit p3_3=P3^3;
sbit p3_4=P3^4;
sbit p3_5=P3^5;
sbit p3_6=P3^6;
sbit p3_7=P3^7;
sbit p1_0=P1^0;
sbit p1_1=P1^1;
sbit p1_2=P1^2;
sbit p1_3=P1^3;
sbit p1_4=P1^4;
sbit p1_5=P1^5;
sbit p1_6=P1^6;
sbit p1_7=P1^7;
//sbit yanzhengbiao;
uchar data yuyinhao,llsh,mima[10];//标准密码
uchar data cmd[16];
uchar data mm[10];//读入密码
uchar data q,yanzhengbiao;
void utrset()//串口通讯参数设置
{
SCON = 0xf0; //串口方式3,允许接收,SM2=1
TMOD = 0x21; //定时器01 定时方式2
TH1 = 0xfa; //11.0592MHz 9600波特率
TL1 = 0xfa;
PCON=0x80;
ES=1;
EX0=1;
EX1=1;
ET0=0;
EA=1;
TR1 =1; //启动定时器1
//TR0=0;//关闭定时器0
}
void yuyin()//输出语音段码(IIC总线)
{
}
void time0set()//定时器0设置,用于超时跳出
{
TH0=0x00;
TL0=0x00;
TR0=1;
}
void delay()//长延时程序,用于等待信号
{
uint data i;
for(i=0;i<60000;i++)
{
_nop_();
_nop_();
}
}
void zhaiji()//摘机操作
{
EX0=0;;//关闭铃流计数器
p3_7=1;//开启外线接通
yuyinhao=0;
yuyin();//启动语音提示
}
void lingliujishu()interrupt 0 using 2 //外中断0处理函数.铃流计数器,6次后自动摘机
{
if(llsh>5)
{
// zhaiji();//转向摘机操作。
F0=1;
llsh=0x00;
}
//---------------------------增加喂狗程序
llsh++;
}
void guaji()//挂断外线,开始重新铃流计数
{
EX0=1;
p3_7=0;
}
void mimayanzheng()//六位密码验证,正确输出1,错误输出0
{
if(mm[0]==mima[0]&mm[1]==mima[1]&mm[2]==mima[2]&mm[3]==mima[3]&mm[4]==mima[4]&mm[5]==mima[5])
{
mm[0]=0xff;
mm[1]=0xff;
mm[2]=0xff;
mm[3]=0xff;
mm[4]=0xff;
mm[5]=0xff;
yuyinhao=2;
yuyin();
yanzhengbiao=1;
}
else{
mm[0]=0xff;
mm[1]=0xff;
mm[2]=0xff;
mm[3]=0xff;
mm[4]=0xff;
mm[5]=0xff;
yuyinhao=1;
yuyin();
yanzhengbiao=0;
}
}
void dushuju()//读数据至缓冲区
{
ssss: while (p3_6)
{
//P0=0xff;//正常程序必须
q=P0;
q&=0x0f;//屏蔽高四位
p3_6=0;
goto ssd;
}
goto ssss;
ssd:if (p3_6)//---------------加长延时时间
{
goto ssd;
}
}
void cuowu()//错误处理
{
yuyinhao=9;//错误提示
yuyin();
}
void minglingchuli()//处理接收dtmf数据,执行指令
{
switch(q)
{
case 0:P1|=0x01;break;//----须加或运算
case 1:P1|=0x00;break;
case 2:P1|=0x02;break;
case 3:P1|=0x00;break;
case 4:P1|=0x04;break;
case 5:P1|=0x00;break;
case 6:P1|=0x08;break;
case 7:P1|=0x00;break;
case 8:P1|=0x10;break;
case 9:P1|=0x00;break;
default:cuowu();break;
}
delay();
}
void mmxiugai()//密码修改
{
uchar w;
for (w=0;w<6;w++)
{
dushuju();
mm[w]=q;
}
mima[0]=mm[0];
mima[1]=mm[1];
mima[2]=mm[2];
mima[3]=mm[3];
mima[4]=mm[4];
mima[5]=mm[5];
}
//void int_ex0(void) interrupt 0 using 2 //外中断0处理函数
//{
//}
void int_ex1(void) interrupt 2 using 2 //外中断1处理函数
{
}
void show()//输出状态执行程序
{
}
void int_rs(void) interrupt 4 using 3 //串口中断处理函数
{
uchar data log=4;//缓冲指针
uchar code addcom=0x01,begn=0x55,endcom=0xaa;//单片机地址
EA=0;
RI=0;
if (SBUF==begn)
{
SM2=0;
p1_7=0;
time0set();//重设time0
while (TF0==0)
{
while (RI==1)
{
RI=0;
cmd[log]=SBUF;
log--;
if(log==1)
{
goto ppp;
}
time0set();//重设time0
}
}
}
else{
goto exitint;
}
ppp: if(cmd[4]==addcom,&cmd[2]==endcom)
{
show();
}
exitint: RI=0;// 以下*恢复初始值
TI=0;
TR0=0;
TF0=0;
SM2=1;
EA=1;
p1_7=1;
TH0=0;
TL0=0;
}
void main(void)
{
P1=0x00;
utrset();//初始化串口
P0=0x05;
P3=0x00;
llsh=0x00;
mima[0]=0x05;
mima[1]=0x05;
mima[2]=0x05;
mima[3]=0x05;
mima[4]=0x05;
mima[5]=0x05;
loop:if(F0)//f0震铃计数标志位
{
uchar e;
zhaiji();
for (e=0;e<6;e++)//读六位密码
{
dushuju();
mm[e]=q;
}
mimayanzheng();
if(yanzhengbiao==1)//密码正确处理
{
dushuju();
if(q==0x0c)
{
yuyinhao=20;//请输入六位修改密码
yuyin();
mmxiugai();
//---------------------------加语音报号
yuyinhao=21;//修改成功
yuyin();
}
else{
prompt: yuyinhao=19;//语音提示确认------------加
yuyin();
dushuju();
if(q==0x0b)
{
minglingchuli();
yuyinhao=18;//操作成功提示
yuyin();
}
else {
goto prompt;
}
}
}
else//密码错误处理
{
cuowu();
}
F0=0;
guaji();
}
goto loop;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -