|
原来只懂得索取,感觉很内疚,现在特贡献一个没有太多技术含量的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;
}
}
}
注明一下哦,没有加验证码,需要处理. |
|