#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; //接收完毕,退出解码程序
}
}
}
}
}
}