C51与HT9170和HT9200接口程序(双音多频)

发布者:美好梦想最新更新时间:2016-11-23 来源: eefocus关键字:C51  HT9170  HT9200  接口程序  双音多频 手机看文章 扫描二维码
随时随地手机看文章

/********************************************

    ht9200A/ht9170程序

    双音多频接收发射程序

********************************************/

sbit DATA  = P3^7 ;

sbit CLK  = P3^6 ;

sbit CE  = P2^7 ;

/*******************************************

    DTMF 数据口:P0^0 ~ P0^3

*******************************************/

sbit DV  = P2^6 ;

sbit OE  = P3^2 ;

//sbit PWDN  = P3^6 ;

//sbit INH  = P3^7 ;

sbit DXC  = P3^5 ;

sbit RING = p3^0 ;

#ifndef  TRUE

    define     TRUE    1 ;

#endif

#ifndef  FALSE

    define     FALSE    0 ;

#endif

uchar idata Check0 ;

uchar idata Counter0 ;

uchar idata Check1 ;

uchar idata Counter1 ;

uchar idata Check3 ;

uchar idata Counter3 ;

uchar code Table_DTMF[] = {0x0a,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0d,0x0e,0x0f,0x00,0x0b,0x0c} ;

//                0    1    2    3     4    5   6    7    8    9    A    B     C    D    *    #

void senddata_ht9200(uchar in)

{

    uchar i;

    for(i=0;i<5;i++)

    {

        if(((in>>i)&0x01) == 1)

            DATA = 1 ;

        else    DATA = 0 ;

        CLK = 0 ;

        CLK = 1 ;

    }

}

/******************************************

    发送子程序

    in 为要发送的数 0-15

******************************************/

void send_ht9200(uchar in)

{

    CE   = 0 ;

    CLK  = 1 ;

    time(50) ;            //delay about 6 ms

    EA = 0 ;

    senddata_ht9200(Table_DTMF[in]) ;

    EA = 1 ;

    delay(100) ;            //delay about 100 ms

    CE   = 1 ;

}

/*****************************************

    DTMF 读程序

    返回 DTMF值

*****************************************/

uchar DTMF_read(void)

{

    uchar temp ;

    uchar i ;

    

    EA = 0 ;

    P0 = 0xff ;

    OE = 1 ;

    ACC = ACC ;

    temp = P0&0x0f ;

    OE = 0 ;

    EA = 1 ;

    for(i=0;i<16;i++)

    {

        if(temp == Table_DTMF[i])

            return i ;

    }

    return(0xff) ;

}

/******************************************

    初始化检测程序

******************************************/

void checkRING_Init()

{

    Check0 = 2 ;

    Counter0 = 20 ;

}

void checkDV_Init()

{

    Check1 = 2;

    Counter1 = 20;

}

void checkDXC_Init()

{

    Check3 = 2 ;

    Counter3 = 20 ;

}

/***************************************

     检测有无振铃RING 程序

     返回         TRUE :有

               FALSE:无

***************************************/

uchar check_RING(void)        //

{

    uchar flag ;

    

    flag = RING ;            //check RING

    if((flag == 0)&&(Counter0 < 30))

        Counter0 ++ ;

    if((flag == 1)&&(Counter0 > 0))

        Counter0 -- ;

    if(Counter0 == 30)

    {

        Counter0 = 20 ;

        if(flag != Check0)

        {

            Check0 = flag ;

            return TRUE ;

        }

        else return FALSE;

    }

    else if(Counter0 == 0)

    {

        Counter0 = 20 ;

        Check0 = 1;

        return FALSE;

    }

    else

        return FALSE ;

}

/***************************************

     检测有无DTMF信号 DV 程序

     返回         TRUE :有

               FALSE:无

***************************************/

uchar check_DV(void)        //

{

    uchar flag ;

    

    flag = DV ;            //check DV

    if((flag == 1)&&(Counter1<30))

        Counter1 ++ ;

    if((flag == 0)&&(Counter1 >0))

        Counter1 -- ;

    if(Counter1 == 30)

    {

        Counter1 = 20 ;

        if(flag != Check1)

        {

            Check1 = flag ;

            return TRUE ;

        }

        else    return FALSE ;

    }

    else if(Counter1 == 0)

    {

        Counter1 = 20 ;

        Check1  = 0 ;

        return FALSE ;

    }

    else return FALSE ;

}

/***************************************

     检测有无掉线信号 DXC 程序

     返回         TRUE :有

               FALSE:无

***************************************/

uchar check_DXC(void)        //

{

    uchar flag ;

    

    flag = DXC ;            //check DXC

    if((flag == 1)&&(Counter3<30))

        Counter3 ++ ;

    if((flag == 0)&&(Counter3 >0))

        Counter3 -- ;

    if(Counter3 == 30)

    {

        Counter3 = 20 ;

        if(flag != Check3)

        {

            Check3 = flag ;

            return TRUE ;

        }

        else    return FALSE ;

    }

    else if(Counter3 == 0)

    {

        Counter3 = 20 ;

        Check3  = 0 ;

        return FALSE ;

    }

    else return FALSE ;

}


关键字:C51  HT9170  HT9200  接口程序  双音多频 引用地址:C51与HT9170和HT9200接口程序(双音多频)

上一篇:c51写的93C46的读写程序
下一篇:浅谈C51内存优化(data idata xdata)

推荐阅读最新更新时间:2024-03-16 15:21

C51单片机IIC总线通信协议及简单应用例程
首先我们要分清通信协议和通讯协议中的信和讯的含义 “通信”仅指数据通信,即通过计算机网络系统和数据通信系统实现数据的端到端传输。 通信的“信”指的是信息(Information),信息的载体是二进制的数据,数据则是可以用来表达传统媒体形式的信息,如声音、图像、动画等。 “通信”重在传输手段或使用方式,从这个角度,“通信”的概念包括了信息“传输”。 因此通信协议主要集中在ISO七层协议中的物理层、数据链路层、网络层和传输层。 先简单的说明以下I2C总线, I2C总线是一种串行数据总线,只有二根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。 处理器和芯片间的通信可以形象的比喻成两个人讲话:1、你说的别人得能听懂:双方
[单片机]
S51的由来及与C51的区别
AT89很多初学51单片机的网友会有这样的问题:AT89S51是什么?书上和网络教程上可都是8051,89C51等!没听说过有89S51,这里,初学者要澄清单片机实际使用方面的一个产品概念,MCS-51单片机是美国INTEL公司于1980年推出的产品,典型产品有 8031(内部没有程序存储器,实际使用方面已经被市场淘汰)、8051(芯片采用HMOS,功耗是630mW,是89C51的5倍,实际使用方面已经被市场淘汰)和8751等通用产品,一直到现在, MCS-51内核系列兼容的单片机仍是应用的主流产品(比如目前流行的89S51、已经停产的89C51等),各高校及专业学校的培训教材仍与MCS-51单片机作为代表进行理论基础学习。   有
[单片机]
C51单片机学习笔记之LCD1602
简介 简单说LCD1602这玩意就是液晶显示屏。 引脚功能: 写操作时序 读操作时序 指令集 cgrom表 原理图 代码部分 LCD1602.C #include reg52.h #include intrins.h sbit RS = P2^0; sbit RW = P2^1; sbit EN = P2^2; #define RS_CLR RS = 0 #define RS_SET RS = 1 #define RW_CLR RW = 0 #define RW_SET RW = 1 #define EN_CLR
[单片机]
<font color='red'>C51</font>单片机学习笔记之LCD1602
单片机控制舵机的C51程序
用stc89c51单片机来控制舵机的程序,测试成功,仅供大家参考. #include "reg52.h" unsigned char count; //0.5ms次数标识 sbit pwm =P3^0 ; //PWM信号输出 sbit jia =P3^7; //角度增加按键检测IO口 sbit jan =P3^6; //角度减少按键检测IO口 unsigned char jd; //角度标识 void delay(unsigned char i)//延时 { unsigned char j,k; for(j=i;j 0;j--) for(k=125;k 0;k--); } void
[单片机]
c51单片机中断详解
工程图 第一题 **每次亮一个灯的流水灯,定义P1为led1。 外部中断0允许中断:EX0=1;下降沿触发:IT0=1;总开关:EA=1; 中断要执行的是P0引脚的4个二极管闪六次。 其实这里还有个想说的是,IE在中断请求的时候,会置位为1,然后CPU同意并执行中断程序后,IE自动清零。为什么说这个,这个可以在以后的一些情况,作为中断条件。 第二题 每次亮一个灯的流水灯和第一题的一样; 中断0下降沿触发也和第二题一样; 中断0程序是:P1引脚每次亮两个二极管的流水灯 讨论一下:每次亮两个二极管,如果低电平亮,那就要11111100B→11110011B。 个人觉得在中断中使用while造成的后果是很致命的
[单片机]
<font color='red'>c51</font>单片机中断详解
基于C51单片机中的通信协议分享
一、基本格式: 通信头-》巴克码-》地址字-》长度字-》命令字-》信息位-》校准字 1.通信头:占1~8个字节,表通信开始(0x00、0xff不能用作通信头); 2.巴克码:占1字节,一般为0x72,表通信头结束; 3.地址字:表终端的地址,占1字节(0x00作为广播地址); 4.长度字:占1字节,表示从地址字到信息位之间的字节数; 5.命令字:占1字节,指示终端的不同操作; 6.信息位:不定长,从0~252字节; 7.校验位:两个字节,采用和校验及CRC校验。 二、应答 1.如果终端接收正确,则应答ACK;如果终端接收错误,则应答NAK; 2.发送方收到ACK,此次通信结束; 3.发送方收到NAK,重发刚才的命令字(最多7次
[单片机]
基于<font color='red'>C51</font>单片机中的通信协议分享
C51和汇编混合编程函数声明
最近看了一些C51的书,遇到了困难,查阅后终于理解了,望对大家有帮助! 先看个例子: ?PR?CLRME SEGMENT CODE; //在程序存储区中定义段 PUBLIC CLRME; //声明函数 RSEG ?PR?CLRME; //函数可被连接器放置在任何地方 CLRME: MOV R0,#7FH CLR A LOOP: MOV @R0,A DJNZ R0,LOOP RET END 只需给存放功能函数的段指定一个段名; ?PR? CLRME SEGMENT CODE;作用是在程序存储区中定义段,CLRME为段名,?PR?表示段位于程序存储区内 PUBLIC CLRME;作用是声明函数为公共函数 RSEG ?PR?CLRME
[单片机]
利用全局及外部变量实现C51无能数化调用A51函数
摘要: 利用C51全局及外部变量,可实现无参数化调用A51函数,不但避免开了传统C51调用C51时繁琐的接口约定,而且把在A51中所用到的变量全部放至C51程序中而不必考虑变量在内存中的位置,使编程更加简洁。用实例验证了该方法的优越性和有效性。 关键词: C51 A51 汇编语言 无参数化调用 电子技术应用 2001年第7期发表苟帅的文章“ASM51无参数化调用C51函数的实现”,阐述了ASM51无参数化调用C51函数的实现原理并给出实例来验证该方法的优越性和可行性。作者在文章中
[应用]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved