搜索
bottom↓
回复: 18

原来只懂得索取,感觉很内疚,现在特贡献一个没有太多技术含量的HT9032D调试成果

[复制链接]

出0入0汤圆

发表于 2011-4-25 16:24:50 | 显示全部楼层 |阅读模式
原来只懂得索取,感觉很内疚,现在特贡献一个没有太多技术含量的HT9032D调试成果,HT9032D有很多人调得很郁闷,给迷茫的同仁一点光明.
原理图+51程序

(原文件名:HT9032D原理图.jpg)

51原程序如下:
  //stc89c51
#include <reg52.h>


//-------HT9032接口定义----
sbit Ring=P3^6;
//sbit FSK_Test=P3^0  //RXD

sbit Ring_LED=P2^0; //振铃指示灯
sbit T0_LED=P2^1;         //定时指示灯


unsigned char BIT;  //位数
unsigned char Data[50]={0}; //数据
unsigned char T0_Num; //定时器0定时时间
bit BRE;
bit ReOK;          //接收OK标志
unsigned char TIME[8];
unsigned char Dial[16];         //号码长度
unsigned char Name[12];         //只有12 bit用于存放名字
bit Deal_Heard_Tag;
bit DMF;
#define OK   1
#define ERRO 0
#define SDMF 0
#define MDMF 1


void T0_isr()  interrupt 1      //定时器0中断         
{
        T0_Num ++;
        if(T0_Num==9)        //即500ms左右
        {
            BRE=0;
                Deal_Heard_Tag=0;
                   REN=1;    //接收数据允许
                ES=1;           //串口中断允许
            T0_LED=0;          //指示灯亮,表示进入串口接收状态
        }
        else if(T0_Num>91) //约5S  
    {
                 REN=0; //关闭串口
                 ES=0;
                 TR0=0;         //关断定时器
                 ET0=0;
                 ReOK=1;
                 T0_LED=1;        //接收完毕
         }
          TH0=0x3C; //重装值
        TL0=0xB0;
}

void uart_isr()  interrupt 4    //串口中断
{
   if(RI) //接收中断
   {
         RI=0;
         if(BRE)
         {
             Data[BIT]=SBUF;         //接收数据
                 if(BIT<49) //如果接收大于50个数据,就不再接收,等待主程序清零
                 {
                        BIT ++;
                 }
         }
         else
         {
            if(Deal_Heard_Tag==0)
                {
                   if(SBUF==0x55)
                   {
                              BIT ++;          //消干扰,必须有多于10个0x55
                           if(BIT>10) Deal_Heard_Tag=1;
                   }
                }
                else
                 {
                    if(SBUF!=0x55)  //过滤掉0x55
                    {
                   BRE=1;
                           Data[0]=SBUF;
                           BIT=1;
                    }
                 }
         }
   }
}
void Display(void)
{
   //显示程序

}

unsigned char Del(void)   //数据处理
{

    unsigned char Length;
        unsigned char Length_temp;
        unsigned char i=0;
        unsigned char itemp=0;

        Display(); //先把原始数据显示出来

        if((Data[0]==0x80)||(Data[0]==0x04))  //有可能是干扰
         {
             if(Data[0]==0x04) DMF=SDMF;
                 else DMF=MDMF;
         }
        if((Data[1]==0x80)||(Data[1]==0x04))  //如果前一位是干扰位,那这位一定是了
         {
              if(Data[1]==0x04) DMF=SDMF;
                  else { DMF=MDMF; }
                  Length=Data[2];
                  itemp=3;
         }
        else
         {
                  if(Data[1]<0x08)        return ERRO; //数据长度不可能小于8 bit
                  else { Length=Data[1];}          //前一位如果不是干扰位,那这位就认为是数据长度位
                  itemp=2;
         }
         if(DMF==SDMF) //单数据类型
         {
                    for(i=0;i<8;i++)
                        {
                                   TIME=Data[i+itemp];  //保存日期,包括月日时分
                        }
                        itemp +=8;
                        for(i=0;i<Length-8;i++)
                        {
                                   Dial=Data[i+itemp];
                        }
         }
         else  //复合
         {
            if(Data[itemp]==0x01) //等于参数类型是否为时间
                {
                itemp +=2;//再跳过2个
                    for(i=0;i<8;i++)          
                        {
                                   TIME=Data[i+itemp];  //保存日期,包括月日时分
                        }
                }
                else {return ERRO;}
                itemp +=8;
                if(Data[itemp]==0x02) //参数类型是否为号码
                {
                    itemp ++;
                        Length_temp=Data[itemp]; //保存号码长度
                        itemp ++;
                        for(i=0;i<Length_temp;i++)
                        {
                           Dial=Data[i+itemp];
                        }
                }
                else {return ERRO;}
                if(Length>(8+Length_temp+4))         //是否完了
                 {
                    itemp += Length_temp;
                        if(Data[itemp]==0x07)
                        {
                            itemp ++;
                                Length_temp=Data[itemp];
                                if(Length_temp>11) {Length_temp=11;}  //只有11个体
                                itemp ++;
                                for(i=0;i<Length_temp;i++)
                                {
                                          Name=Data[i+itemp];
                                }
                        }
                        else return ERRO;
                 }
          }
   
       Display(); //把有用的数据显示出来
        for(i=0;i<=BIT;i++) //清零
        {
          Data=0;
        }
        BIT=0;
                  
   return OK;
}

void main(void)
{
        bit  SetTag=1;
        bit Del_OK=0;
        BIT=0;
        T0_LED=1;         //两个指示灯都灭
        Ring_LED=1;
        BRE=0;


    PCON=0x00;  //复位为00110000 B        若PCON.7=1波特率加倍
        TMOD=0x21;        //T0作为定时用,T1作为波特率用
        TH1=0xe8;         //11.0592MHZ  1200
        TL1=0xe8;
        SCON=0x40;         //REN=0;SM1=1?
        TR1=1;           //启动定时器1
        EA=1;
                               
    while(1)
    {
          if(Ring==0) //振铃了
          {
            Ring_LED=0;  //振铃指示灯开
           if(SetTag) //设置标志
                {
                    SetTag=0;
                    T0_Num=0;
                        ReOK=0;
                           TH0=0x3C;        //(65536-50000)/256=60=0x3C  1个周期 1.085us,即50000*1.085=54.25ms
                    TL0=0xB0;   //(65536-50000)%256=176=0xB0
                    ET0=1; //允许定时器0中断
                    TR0=1; //启动定时器0
                }
          }
          else
          {
               Ring_LED=1; //振铃指示灯关
                   if(Del_OK)
                   {
                      Del_OK=0;
                          SetTag=1;        //其实应该在整个振铃结事后,再打开
                   }
          }
      if(ReOK)          //数据收到了
          {
                  ReOK=0;
                  Del();
                  Del_OK=1;
          }

   }

}

               
注明一下哦,没有加验证码,需要处理.

出0入0汤圆

发表于 2011-4-25 16:33:23 | 显示全部楼层
顶下,虽然没用到~

出0入0汤圆

发表于 2011-4-25 16:34:56 | 显示全部楼层
顶一下

出0入0汤圆

发表于 2011-4-25 16:39:17 | 显示全部楼层
顶一下,以后可能有用

出0入0汤圆

发表于 2011-4-27 22:19:09 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-5-4 15:40:28 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-6-3 10:59:07 | 显示全部楼层
问一下    串口如何怎么都接受不到0X55..空闲状态下   一插电话线就有数据,不知道电容和电阻如何匹配?

出0入0汤圆

发表于 2011-8-11 14:55:19 | 显示全部楼层
太好了 正在找它呢 谢谢lz啊

出0入0汤圆

发表于 2011-8-11 15:20:36 | 显示全部楼层
来电显示。还是有一些兼容问题的。9032接某些交换机没法显示来电号码,但交换机接电话机却可以正常显示。

出0入0汤圆

发表于 2011-8-19 23:41:33 | 显示全部楼层
这个好

出0入0汤圆

发表于 2011-11-27 20:28:42 | 显示全部楼层
来电显示,记号

出0入0汤圆

发表于 2013-2-20 11:31:42 | 显示全部楼层
楼上做过HT9032D成功,求成功的原理图和原程序 发我EMaiwww88999126.com也可以 thanks you so much,

出0入0汤圆

发表于 2013-2-22 14:09:44 来自手机 | 显示全部楼层
学习一下....

出0入0汤圆

发表于 2013-5-3 15:30:18 | 显示全部楼层
想问一下,现在的来电显示主流的芯片是哪款?HT9032刚才打电话合泰要停产了

出0入0汤圆

发表于 2013-5-3 15:36:46 | 显示全部楼层
要给导师做个DEMO,求原理图和代码邮箱1928780921@qq.com 感激不尽。

出0入0汤圆

发表于 2013-5-20 17:35:27 | 显示全部楼层
LZ,刚好看到这篇文章,有些地方不是很明白,能否留个QQ号请教一下呢?或者我留我的QQ号吧,2426203566,非常感谢。

出0入0汤圆

发表于 2013-12-16 09:40:41 | 显示全部楼层
现在没有用到,先收藏,谢谢

出0入0汤圆

发表于 2016-7-16 09:39:47 | 显示全部楼层
请问楼主这个RingTest信号线的作用。我量了下没有电话进来是低电平,电话打进来是最高也就1v左右。 if(Ring==0) //振铃了程序可以用这个来判断振铃呢?不是很明白求指点

出0入0汤圆

发表于 2016-7-16 14:44:54 | 显示全部楼层
11年的帖子,现在16年了,固定电话,几乎很少用了,,,
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-9 18:26

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表