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

📄 dtmf.c

📁 dtmf c51 程序
💻 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 + -