maxuedong 发表于 2013-5-1 00:49:34

关于红外遥控密码锁的问题

把程序下载到了单片机里面,但是接收部分毫无反应,希望各位指出代码那里出问题了!!!!!!!
发射模块代码
#include <stc89.h>
//13.37589
#define uchar unsigned char
#define uint unsigned int
sbit led=P3^7;
sbit out=P3^6;
#define port P2
//定义地址码
#define addr00x01
#define addr10x02
bit key_bit;//按键重复标记
bit hw;
bit over;
bit ss;
uchar time;
void delay();
void InitTimer0(void);
void InitUART(void);
void send(uchar c);
uchar key();
void send_star();
void send_char(uchar c);
void send_hw(uchar c);
void delay1s(void)   //误差 -0.000000000003us
{
    unsigned char a,b,c;
    for(c=45;c>0;c--)
      for(b=132;b>0;b--)
            for(a=167;a>0;a--);
}
void delay()   //1ms 误差 -0.651041666667us
{
    unsigned char a,b;

    for(b=102;b>0;b--)
      for(a=3;a>0;a--);
}
void InitTimer0(void)
{
    TMOD = 0x22;
    TH0 = 0xe6;
    TL0 = 0xe6;
    EA = 1;
    ET0 = 1;
    TR0 = 1;
}                   //13us
void InitUART(void)        //4800
{
//    TMOD = 0x20;
    SCON = 0x50;//采用串口工作方式1(8位异步收发,波特率可变);允许串行口接收数据
    TH1 = 0xF3;
    TL1 = TH1;
    PCON = 0x00;
    ES = 1;
        TR1 = 1;
}
void send(uchar c)
{
    SBUF = c;
    while(!TI);//一直发送数据,直至发送完毕
    TI = 0;
}
uchar key()
{
uchar a;
a=0;
port=0x0f;
a=port;

if(a==0x0f)
   {
   key_bit=1;
       delay();
       return 0;
   }
if(!key_bit) return 0;
delay();
if(port==a)       
{       
port=0xf0;
a|=port;
a=~a;
}
else return 0;
if(a)
{
key_bit=0;
switch(a)
{
   case 0x11:return 1;
   case 0x12:return 2;
   case 0x14:return 3;
   case 0x18:return 4;
   case 0x21:return 5;
   case 0x22:return 6;
   case 0x24:return 7;
   case 0x28:return 8;
   case 0x41:return 9;
   case 0x42:return 10;
   case 0x44:return 11;
   case 0x48:return 12;
   case 0x81:return 13;
   case 0x82:return 14;
   case 0x84:return 15;
   case 0x88:return 16;
   default: return 0;
}
}// if(a)
}

void main(void)
{
    uchar c;
        InitTimer0();
        InitUART();
        led=0;
        send(0xaa);        //为了测试串口是否正常工作
while(1)
{
c=key();
if(c)
{
    send(c);
        send_hw(c);
}


}
}
void send_star()
{
uchar i;
i=8;
/*9ms内发射38KHZ方波*/
while(i--)
{
time=173;               //9ms
hw=1;                       //发射
while(!over);
}
/*4.5ms内发射高电平*/
i=4;
while(i--)               //4.5ms
{       
time=173;
hw=0;
while(!over);       
}
}
void send_char(uchar c)
{
uchar i;
for(i=0;i<8;i++)
{
time=45;
hw=1;                   //0.565ms的38KHZ方波
while(!over);

if(c&0x80) time=126; //1.685ms的间隔
else time=45;       //0.565ms的间隔
hw=0;
c=c<<1;
while(!over);
time=45;
hw=1;
   
}
}
void send_hw(uchar c)
{
key_bit=0;
send_star();
send_char(addr0);
send_char(addr1);
send_char(c);
send_char(~c);

}
void Timer0Interrupt(void) interrupt 1
{
if(time) time--,over=0;
else over=1,hw=0;
if(hw) out=~out;
else out=1;
}
void UARTInterrupt(void) interrupt 4
{
uchar c;
    if(RI)
    {
      RI = 0;                //接收中断标志位;RI=1,表示数据接收完毕,并申请中断,要求CPU从接收SBUF提走数据,
    }
    else
      TI = 0; //发送中断标志位;TI=1,表示一帧数据发送结束;TI必须由软件清零
}


接收模块代码
#include <stc89.h>
#define uchar unsigned char
#define uint unsigned int
sbit rs=P2^0;//数据命令选择端
sbit rw=P2^1;//读写选择端
sbit e=P2^2;//使能端
#define port P0//lcd数据
sbit beep=P1^0;//蜂鸣器
sbit led=P1^1;//开锁指示灯
uchar buffer;
uchar n;
uchar dat;
uchar js;//解锁
bit ks; //开锁
uchar wrong;
uchar bp;//蜂鸣器时间控制
uchar mima;                          //已设定密码
uchar mima_temp;          //当前输入密码
uchar mima1;                  //改密码用
uchar mmxg;   //密码修改控制
uchar asc="01234567890ABCDEF";
void show(uchar c);
void lcd_wr(uchar a,uchar c);
void delay(uchar c);
void send(uchar c);
void IAP_Disable();
void eeprom_wr();
void eeprom_re();
void delay(uchar c)   //1ms误差 -0.651041666667us          
{
    unsigned char a,b;
while(c--)
{
    for(b=102;b>0;b--)
      for(a=3;a>0;a--);
}
}
void InitUART(void)       //9600串口初始化
{
    TMOD = 0x21;
    SCON = 0x50;
    TH1 = 0xFD;
    TL1 = TH1;
    PCON = 0x00;
    EA = 1;
    ES = 1;
    TR1 = 1;
}
uchar lcd_re(uchar a)
{
uchar c;
e=0;
rw=1;
rs=a;
;
;
e=1;
;
;
e=0;
c=port;
return c;
}
void busy()
{
uchar i;
i=1;
while((lcd_re(0)&0x80)&&i++);
}
void lcd_wr(uchar a,uchar c)
{
busy();
e=0;
rw=0;
rs=a;
port=c;
;
;
e=1;
;
;
e=0;
}
/**************初始化**************/
void lcd_int(void)
{
delay(15);
rs=0;
rw=0;
port=0x38;
e=1;
;
;
e=0;
delay(5);
port=0x38;
e=1;
;
;
e=0;
delay(5);
port=0x38;
e=1;
;
;
e=0;
rw=1;
rs=1;
lcd_wr(0,0x38); //显示模式设置
lcd_wr(0,0x08); //关闭显示
lcd_wr(0,0x01); //清屏
lcd_wr(0,0x02);
lcd_wr(0,0x06); //光标又移,整屏不移动
lcd_wr(0,0x0c); //开显示
}
//mm:ss:s
void show(uchar c)
{
uchar i;
lcd_wr(0,0x80);//地址为第一行第一个字符
lcd_wr(1,'E');
lcd_wr(1,'n');
lcd_wr(1,'t');
lcd_wr(1,'e');
lcd_wr(1,'r');
lcd_wr(1,' ');
lcd_wr(1,'P');
lcd_wr(1,'a');
lcd_wr(1,'s');
lcd_wr(1,'s');
lcd_wr(1,'W');
lcd_wr(1,'o');
lcd_wr(1,'r');
lcd_wr(1,'d');
lcd_wr(1,' ');
if(mmxg==1) lcd_wr(1,'1');
else if(mmxg==2) lcd_wr(1,'2');
else lcd_wr(1,' ');
lcd_wr(0,0xc0);//o代表指令,1代表数据//地址为第二行第一个字符
if(c<17)//c输入密码个数
{
for(i=0;i<c;i++)
lcd_wr(1,'*');
}
else
{
if(c==110)                //show PassWord        Right
{
lcd_wr(1,'P');
lcd_wr(1,'a');
lcd_wr(1,'s');
lcd_wr(1,'s');
lcd_wr(1,'W');
lcd_wr(1,'o');
lcd_wr(1,'r');
lcd_wr(1,'d');
lcd_wr(1,' ');
lcd_wr(1,'R');          //Ringht
lcd_wr(1,'i');
lcd_wr(1,'g');
lcd_wr(1,'h');
lcd_wr(1,'t');
lcd_wr(1,'!');
}
if(c==119)
{
lcd_wr(1,'P');
lcd_wr(1,'a');
lcd_wr(1,'s');
lcd_wr(1,'s');
lcd_wr(1,'W');
lcd_wr(1,'o');
lcd_wr(1,'r');
lcd_wr(1,'d');
lcd_wr(1,' ');
lcd_wr(1,'W');   //wrong
lcd_wr(1,'r');
lcd_wr(1,'o');
lcd_wr(1,'n');
lcd_wr(1,'g');
lcd_wr(1,'!');
}
}
for(i=0;i<16;i++)               //写空格,防止显示重叠
lcd_wr(1,' ');
lcd_wr(0,0x0c); //开显示

}
uchar mmyz()//密码验证
{
uchar j;
for(j=0;j<17;j++)
{
send(mima_temp);
send(mima);
}
if(mima_temp==mima)
{
for(j=0;j<mima;j++)
if(mima_temp!=mima)        return 2;//密码错误退出
wrong=0;
return 1;
}
else return 2;
}
main()
{
uchar i,j;
uchar k,s;
eeprom_re();
if(mima>16)
{
for(j=0;j<17;j++)
mima=6;
}
lcd_int();
InitUART();   //串口初始化
ET0=1;
EX1=1;//开外部中断1   
IT1=1;//下隆沿中断
show(0);
while(1)
{
if(js)
{
   js=0;
   if(buffer<13)
   {
    if(i<16)
        {
       mima_temp=buffer;
       i++;
          show(i);
        }
   }
   else
   {
    if(buffer==13&&i)i--,show(i);       //退格
        if(buffer==14)
        {
       if(ks) ks=0;
       i=0,show(i);                  //清屏
    }
        if(buffer==15&&ks)        //修改密码
          {
          mmxg=1;
                i=0;
                show(i);
          }
        if(buffer==16)                    //确定
        {
       i=0;
       if(mmxg)                //密码修改
       {
          if(mmxg==2)
          {
           s=0;
           if(mima1==mima_temp)
           {
          s++;
          for(j=0;j<mima_temp;j++)
                {
             if(mima1==mima_temp)
               {
                  s++;
               }
          }
           }
           mmxg=0;
           if(s>mima1)
           {
                for(j=0;j<17;j++)
                {
               mima=mima1;
//               send(mima);
                }
                show(110);
                eeprom_wr();
           }
           else show(119);
          }
          if(mmxg==1)
          {
          for(j=0;j<17;j++)
          mima1=mima_temp;
                mmxg=2;
          show(i);
          }          
       }
       elsek=mmyz();
        }
   }
   mima_temp=i;                                       //密码长度
//send(buffer);
//send(mima_temp);
}
if(k==1) ks=1,show(110);
if(k==2) ks=0,show(119),wrong++;
k=0;
if(ks) led=0;
else led=1;
if(wrong>2) wrong=0,bp=100;
}
}                                               
/************外部中断1**********************/
void Int1(void) interrupt 2using 1
{
uchar dh;
uchar k;
TR0=0;
dh=TH0;
TL0=0;
TH0=0;
TR0=1;
if(dh>25&&dh<100) n=33;
else if(dh>2&&dh<5) k=0;
else if(dh>6&&dh<12) k=1;
else n=0;
if(n)
{
   dat=dat<<1;
   dat+=k;
   if(n==25) buffer=dat,dat=0;
   if(n==17) buffer=dat,dat=0;
   if(n==9) buffer=dat,dat=0;
   if(n==1) buffer=dat,dat=0;
   n--;
        if(!n)
    {
          if(!(buffer&buffer))//数据校验
          {
              js=1;//接收完成
                  beep=0;
               }
          else
          {
                  buffer=0;
                  buffer=0;
               }
       }
}
//send(dh);
}
/************定时器0**********************/

void Timer0Interrupt(void) interrupt 1
{
TR0=1;
n=0;
if(bp) bp--,beep=0;
else beep=1;
}
/************串口**********************/
void send(uchar c)
{
   EA=0;
    SBUF = c;
    while(!TI);
    TI = 0;   
   EA=1;
}
void delay1s(void)   //误差 -0.000000000285us
{
    unsigned char a,b,c;
    for(c=13;c>0;c--)
      for(b=247;b>0;b--)
            for(a=142;a>0;a--);

}
void UARTInterrupt(void) interrupt 4
{
uchar c;
    if(RI)
    {
      RI = 0;
      c=SBUF;
                if(c==0xaa)
                {
               delay1s();
               ISP_CONTR=0x60;
                }
    }
    else
      TI = 0;
}
//******************************EEPROM***********************************//
void IAP_Disable()
{
    //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
    //一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
    ISP_CONTR = 0;      //关闭IAP 功能
    ISP_CMD   = 0;      //清命令寄存器,使命令寄存器无命令,此句可不用
    ISP_TRIG= 0;      //清命令触发寄存器,使命令触发寄存器无触发,此句可不用
    ISP_ADDRH = 0;
    ISP_ADDRL = 0;
}
void eeprom_wr()
{
uchar*p;
uchar i;
p=mima;
ISP_CONTR=0x82;//启动IAP
ISP_CMD=0x03; //        擦除
ISP_ADDRH=0x20;//地址
ISP_ADDRL=1;
EA=0;
ISP_TRIG=0x46;   //命令生效
ISP_TRIG=0xb9;
;
EA=1;
ISP_CMD=0x02;           //命令写
for(i=0;i<17;i++)
{
ISP_DATA=*p;   //数据
p++;
ISP_ADDRH=0x20;//地址
ISP_ADDRL=i;
EA=0;
ISP_TRIG=0x46;   //命令生效
ISP_TRIG=0xb9;
;
EA=1;   
}
IAP_Disable();
}
void eeprom_re()
{
uchar *p;
uchar i;
p=mima;
ISP_CONTR=0x82;//启动IAP
ISP_CMD=0x01;           //命令读
for(i=0;i<17;i++)
{
ISP_ADDRH=0x20;//地址
ISP_ADDRL=i;

ISP_TRIG=0x46;   //命令生效
ISP_TRIG=0xb9;
;
*p=ISP_DATA;
p++;
}
IAP_Disable();
}

lxa0 发表于 2013-5-1 14:02:59

你对应的硬件正确吗?

maxuedong 发表于 2013-5-1 14:56:39

lxa0 发表于 2013-5-1 14:02 static/image/common/back.gif
你对应的硬件正确吗?

{:lol:} 我是照着原理图焊的,应该是没有问题。
页: [1]
查看完整版本: 关于红外遥控密码锁的问题