⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pplctn.asm

📁 8051和ibutton组成的门禁系统的代码
💻 ASM
字号:
    ORG 0000H
    SJMP MAIN
    ORG 0030H
MAIN:SETB P1.7;锁门吹灯
    SETB P1.4;打开三态门
    LCALL NK;调用钮扣程序
    JNC NK;若C为0(无应答或CRC错)则再调用钮扣程序发脉冲
    LCALL READROM;从EEPROM读入密码  
MATCH:MOV B,#07H;比较密码是否匹配
    MOV R0,#40H;外部输入密码存储的地址
    MOV R1,#5FH;从EEPROM读入密码存储的位置
LL: MOV A,@R0;
    INC R0;
    INC R1;
    XRL A,@R1;比较
    JZ TT;出现不匹配则重新开始
    DJNZ B,LL;循环比较所有字节
    CLR P1.7;全部匹配则开锁
TT:SJMP MAIN;
NK: PUSH B;
    CLR P1.5;主程序先在总线上产生高电平
    CLR C;清软件标志位
    LCALL RESET;进入复位与应答时隙
    JNC WAIT;若C为0则再去发复位脉冲
    MOV A,#0F0H;READROM指令
    LCALL BYTE;发送READROM指令
    MOV B,#08H;读入字节数
    MOV R1,#00H;CRC初始化
READ:MOV A,#00H;发送00H在读入数据时释放总线
    LCALL BYTE;读入数据
    PUSH ACC;保存读入的数据
    DJNZ B,READ;循环读入
    MOV B,#08H;需存储的字节数      
DIZHI:MOV R0,#047H;RAM地址
PO: POP ACC;
    MOV @R0,A;将读入的数据存入RAM
    DEC R0;
    DJNZ B,PO;循环储存读入数据
CRC:MOV R0,#3FH;地址
    MOV B,#07H;需校验的字节数
    MOV R1,#00H;CRC变量初始化
GG: INC R0;
    MOV A,@R0;
    LCALL DOCRC;
    DJNZ B,GG;循环计算CRC变量
    INC R0;CRC校验码地址
    MOV A,@R0;装入CRC校验码
    XRL A,R1;比较CRC校验码一致否
    JZ SUCCESS;
    SJMP FAILURE;
SUCCESS: SETB C;一致则置位软件标志位
    SJMP WAIT;
FAILURE: CLR C;不一致则复位软件标志位
WAIT:POP B;
    RET 
RESET: PUSH B;
    PUSH ACC;
    SETB P1.5;发送复位下降沿
    MOV B,#0FAH;设置复位脉冲保持时间
    DJNZ B,$;复位脉冲至少保持480uS
    CLR P1.5;释放总线产生上升沿
    MOV B,#08H;设置DS的等待时间
    CLR C;设置软件标志位
WAITLOW:JNB P2.2,WH;有应答脉冲则跳到WH
    DJNZ B,WAITLOW;监测是否有应答脉冲
    SJMP SHORT;没有应答则再去发复位脉冲
WH: MOV B,#01EH;要求应答脉冲保持一段时间
HL: ORL C,P2.2;若C为0则不响应此下降沿
    DJNZ B,HL;要求检验到DS释放总线
SHORT:POP ACC
    POP B
    RET
BYTE:PUSH B;发送读入子程序
    MOV B,#08H;指令和数据的8位
BITLOOP:RRC A;右移指令一位
    LCALL TOUCHBIT;发出又读入
    DJNZ B,BITLOOP;循环右移
    RRC A;再循环一次
    POP B;
    RET
TOUCHBIT:SETB P1.5;发送接收结合子程序先给下降沿
    NOP
    MOV P1.5,C;发送一位
    SETB P2.2;输入先写1
    MOV C,P2.2;读入一位
    PUSH B
    MOV B,#12H
    DJNZ B,$;延时到tSOLT
    POP B
    CLR P1.5;发送读入结束后释放总线
    RET
DOCRC:PUSH ACC;计算CRC变量子程序
    PUSH B;
    PUSH ACC;
    MOV B,#8;
CRC_LOOP:XRL A,R1;
    RRC A;
    MOV A,R1;
    JNC ZERO;
    XRL A,#018H;
ZERO:RRC A;
    MOV R1,A;
    POP ACC;
    RR A;
    PUSH ACC;
    DJNZ B,CRC_LOOP;
    POP ACC;
    POP B;
    POP ACC;
    RET  
READROM:MOV A,#03H;发送读指令
    MOV B,#08H;发送的指令位数 
    CLR P1.3;X25045的SCK置低 
    CLR P1.2;CS置低 
    ACALL TRANSFER;调发送子程序发送READ 
    MOV A,#01H;发送X25045地址 
    MOV B,#08H;  
    ACALL TRANSFER;发送地址 
    MOV R3,#07H;总共需要读入CPU的字节数
    MOV R1,#060H;RAM地址
RECE3:MOV B,#08H;读出X25045中的数据 
RECE1:SETB P1.1;CPU输入前写一  
    MOV C,P1.1;输入CPU  
    MOV ACC.0,C;赋值 
    RL A  
    SETB P1.3;SCK置高 
    CLR P1.3;SCK变低 
    NOP  
    DJNZ B,RECE1;CPU循环读入一字节 
    RR A    
    MOV @R1,A;将读出一字节的送CPU的RAM 
    INC R1
    DJNZ R3,RECE3;
    RET    
TRANSFER:NOP
   MOV C,ACC.7  ;a的最高位送Cy 
   MOV P1.0,C   ;将Cy送X25045的SI 
   SETB P1.3    ;SCK置高 
   RL   A       ;a左移一位 
   CLR P1.3     ;SCK变低 
   DJNZ B,TRANSFER ;循环8次 
   CLR P1.7 ;将SI变低 
   RET
DELA1ms:MOV TMOD,#00H;1mS延时子程序
   MOV TL0,#18H
   MOV TH0,#0E0H
   SETB TR0
   LOOP:JBC TF0,NEXT
   SJMP LOOP
   NEXT:MOV TL0,#018H
   MOV TH0,#0E0H
   SETB P1.2
   RET
DELA3ms:MOV TMOD,#00H;3mS延时子程序
   MOV TL0,#0CH
   MOV TH0,#0A2H
   SETB TR0
   LOOP1:JBC TF0,NEXT1
   SJMP LOOP
   NEXT1:MOV TL0,#0CH
   MOV TH0,#0A2H
   SETB P1.2
   RET
   END




 



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -