论坛风格切换切换到宽版
  • 23616阅读
  • 44回复

使用AT89C2051解码PT2262 [复制链接]

上一主题 下一主题
离线bg4wby
发帖
460
只看该作者 40楼 发表于: 2009-06-11
谁上个图啊!!!!!!!!!
离线BG5DAH
发帖
26
只看该作者 41楼 发表于: 2010-06-18
vccvbcb
离线BG9CNF
发帖
988
只看该作者 42楼 发表于: 2010-06-20
#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 != '\0')
{     // 显示字符ttnu.com
  lcd_wdat(dis1);
  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(Ɔ');temp=0x00;     //0
      }
          if(((time-time1)>=-600&&(time-time1)<=600) && (time>210) && (time<450))   //低电平宽度时间
            {      
                if((time2>780) && (time2<1150))   //高电平宽度时间
                lcd_wdat(Ƈ');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;     //接收完毕,退出解码程序
              }
    }
  }
  }
  }
}
离线BG9CNF
发帖
988
只看该作者 43楼 发表于: 2010-06-20
http://hi.baidu.com/crasyboye/blog/item/163a1af4e78401ec7609d7a2.html
大家大家查考一下,我很久以前做过的
离线bg4wby
发帖
460
只看该作者 44楼 发表于: 2010-06-25
上个图看看 啊 ?
呵呵