先声明一下,这只是个演示的程序和设备,你真的想拿这个程序去偷别的的什么数据,那还是不可能的事情。
因为我专门在程序结构上做了些文章,处理的速度慢了很多,想得逞,难!
就是这么个东西,下面把程序共享!
#include<reg52.h>
#include <intrins.h>
#define uchar unsigned char
uchar code dis1[] = {" 2262 CODE IS "};
void delay_1s(uchar);
typedef unsigned char BYTE;
typedef unsigned int WORD;
typedef bit BOOL ;
sbit rs = P2^6 ;
sbit rw = P3^6 ;
sbit ep = P2^7 ;
delay(BYTE ms)
{ // 延时子程序
BYTE i;
while(ms--)
{
for(i = 0; i< 250; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
BOOL lcd_bz()
{ // 测试LCD忙碌状态
BOOL result;
rs = 0;
rw = 1;
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
result = (BOOL)(P0 & 0x80);
ep = 0;
return result;
}
lcd_wcmd(BYTE cmd)
{ // 写入指令数据到LCD
while(lcd_bz());
rs = 0;
rw = 0;
ep = 0;
_nop_();
_nop_();
P0 = cmd;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 0;
}
lcd_pos(BYTE pos)
{ //设定显示位置
lcd_wcmd(pos | 0x80);
}
lcd_wdat(BYTE dat)
{ //写入字符显示数据到LCD
while(lcd_bz());
rs = 1;
rw = 0;
ep = 0;
P0 = dat;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 0;
}
lcd_init()
{ //LCD初始化设定
lcd_wcmd(0x38); //
delay(1);
lcd_wcmd(0x0c); //
delay(1);
lcd_wcmd(0x06); //
delay(1);
lcd_wcmd(0x01); //清除LCD的显示内容
delay(1);
}
bit T0Action;
bit Action;
bit RECEIVE; //接收标志
sbit P1_7=P1^1; //接收脚
sbit P3_5=P1^3; //发光二极管
void main()
{
uchar temp,data0,data1,counttime,i=0;
int time,time1,time2;
lcd_init(); // 初始化LCD
T0Action=0;
RECEIVE=0; //接收标志位
Action=0;
TMOD = 0x01; // 定时器0 工作方式1
TH0=0x00;
TL0=0x00;
P3_5=1;
lcd_pos(0x00);
while(dis1[i] != '\0')
{ // 显示字符ttnu.com
lcd_wdat(dis1[i]);
i++;
}
while(1)
{
do{P3_5=1;}while(P1_7==1);
if((P1_7==0) && (T0Action==0)) //等待低电平,低电平开始记时
{
TR0=0; TH0=0x00; TL0=0x00; TF0=0; TR0=1; T0Action=1;
while(1)
{
if((P1_7==1) && (T0Action==1))
{
TR0=0;
time=TH0*256+TL0; //记下低电平宽度时间
T0Action=0;
break;
}
}
}
if((time>9500) && (time<11500)) //检测同步码约11ms
{
counttime=0;
data0=0;
data1=0;
time=0;
RECEIVE=1; //检测到同步码时 置标志位 RECEIVE=1
P3_5=0; //绿发光二极管灯亮(调试用)
}
if(RECEIVE==1) //检测到同步码后开始解码
{
RECEIVE=0;
lcd_pos(0x42);
while(1)
{
do{}while(P1_7==1);
if((P1_7==0) && (T0Action==0)) //等待第一个低电平,一有低电平马上记时
{
TR0=0; T0Action=1; TH0=0x00; TL0=0x00; TF0=0; TR0=1;
while(1)
{
if((P1_7==1) && (T0Action==1))
{
TR0=0;
time=TH0*256+TL0; //记下第一个低电平宽度时间
T0Action=0;
TH0=0x00;TL0=0x00; TF0=0;TR0=1; //开始记高电平时间
break;
}
}
}
do{}while(P1_7==1);
if((P1_7==0) && (T0Action==0)) //等待第二个低电平,一有低电平马上记时
{
TR0=0;
time2=TH0*256+TL0; //记下一个高电平宽度时间
T0Action=1;
TH0=0x00; TL0=0x00; TF0=0; TR0=1;
while(1)
{
if((P1_7==1) && (T0Action==1))
{
TR0=0;
time1=TH0*256+TL0; //记下第二个低电平宽度时间
T0Action=0; break;
}
}
}
if((time<1500)) //判断两个低电平宽度时间是否相等,限时1500us
{
if(((time-time1)>=-600&&(time-time1)<=600) && (time>780) && (time<1150)) //低电平宽度时间
{
if((time2>210) && (time2<450)) //高电平宽度时间
lcd_wdat('0');temp=0x00; //0
}
if(((time-time1)>=-600&&(time-time1)<=600) && (time>210) && (time<450)) //低电平宽度时间
{
if((time2>780) && (time2<1150)) //高电平宽度时间
lcd_wdat('1');temp=0x01; //1
}
if((time>780) && (time<1150)&&(time1>210) && (time1<450))
lcd_wdat('f'); // f
counttime++;
if(counttime<=8) //开始接收前8位 地址码
data0=(data0<<1)|temp;
else if((counttime>8) && (counttime<=12)) //开始接收后4位 数据码
data1=(data1<<1)|temp;
if(counttime==12) // 第12位
{
Action=1;
break; //接收完毕,退出解码程序
}
}
}
}
}
}
大家在搞之前还是最好把2262发码的时序和结构弄一下。
你真正明白了,做个全段扫描的出来,最好用汇编,那要的解码速度是非常快的。
这些东西,我现在已经实现了。
主要是用来在厂矿搞车辆定位的。
这样就节省了很多买gps的资金。