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

📄 main.lst

📁 利用89s52开发的密码锁.有兴趣的自己
💻 LST
字号:
C51 COMPILER V7.50   MAIN                                                                  06/05/2007 13:38:03 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE main.c BROWSE DEBUG OBJECTEXTEND TABS(2)

line level    source

   1          /*
   2             //*************************************************************************
   3             //
   4             //                  9键密码锁演示源文件
   5             //
   6             //           COPYRIGHT (c)   2006 BY 明浩
   7             //           --  ALL RIGHTS RESERVED  --
   8             //
   9             // File Name:  main.c
  10             // Created:    2007.3.10
  11             // Modified:   2007.3.10
  12             // Revision:   1.0
  13             //
  14             //*************************************************************************
  15             //*************************************************************************
  16          */
  17          
  18          #include <at89x051.h>
  19          #include <INTRINS.H>
  20          
  21          //引脚定义,可以自行定义使用
  22          #define Key   P1
  23          #define RLed  P3_5
  24          #define GLed  P3_4
  25          #define CS  P3_1
  26          #define SO  P3_0
  27          #define SI  P3_3
  28          #define SCK P3_2
  29          #define Switch  P3_7
  30          
  31          void RESWDI(void);
  32          void WREN(void);
  33          void WRSR(void);
  34          void WRDI(void);
  35          void WIPCHK(void);
  36          unsigned char RSDR(void);
  37          unsigned char INPUTByte(void);
  38          void OUTByte(unsigned char Byte);
  39          void WriteByte(unsigned char Byte, unsigned char ADD);
  40          unsigned char ReadByte(unsigned  char ADD);
  41          void Delay10ms();
  42          void CLSPSW();
  43          
  44          unsigned char KSVel[3]={0xFB,0xF7,0xEF};
  45          unsigned char data UPSW[6]={3,1,5,8,1,8}, KPSW[6], KN; //写入的密码
  46          unsigned int SW, SW2;
  47          
  48          void main(void)
  49          {
  50   1        unsigned char Temp;
  51   1      
  52   1        CS = 0;
  53   1        KN = 0;
  54   1        SW = 0;
  55   1        SW2 = 0;
C51 COMPILER V7.50   MAIN                                                                  06/05/2007 13:38:03 PAGE 2   

  56   1        CLSPSW();
  57   1      
  58   1        WREN();
  59   1        WRSR(); //看门狗复位时间1.4s
  60   1        WRDI();
  61   1      
  62   1        for (Temp=0; Temp<6; Temp++)
  63   1          {   
  64   2            WREN();
  65   2            WriteByte(UPSW[Temp],Temp+1); //这里演示读出和写入 EEPROM  
  66   2            UPSW[Temp] = ReadByte(Temp+1); //从EEPROM读数据到数组; 这里使用1-6地址
  67   2            //可以改成可以更改密码的
  68   2            WRDI();
  69   2          }
  70   1        
  71   1        EA = 1;         //允许CPU中断
  72   1        ET0 = 1;        //定时器0中断打开
  73   1        TMOD = 0x1;     //设定时器0为模式1,16位模式
  74   1        TH0 = 0xB1;
  75   1        TL0 = 0xE1;     //设定时值为20000us(20ms)调整
  76   1        TR0 = 1;        //开始定时
  77   1        
  78   1        RLed = 0; //指示灯状态  红灯亮
  79   1        GLed = 1;
  80   1      
  81   1        while(1);
  82   1      }
  83          
  84          //定时中断
  85          void KeyAndDis_Time0(void) interrupt 1
  86          {
  87   1        unsigned char data Temp, TempV, TempN;
  88   1      
  89   1        TR0 = 0;
  90   1        TH0 = 0xB2;
  91   1        TL0 = 0x06; //设定时值(己调整)
  92   1      
  93   1        RESWDI(); //喂狗
  94   1      
  95   1        if (Switch==0) //继电器被打开时计数
  96   1          SW++;
  97   1      
  98   1        if (SW > 500)
  99   1          {
 100   2            SW = 0; 
 101   2            Switch = 1; //继电器打开时间,10秒
 102   2            RLed = 0;
 103   2            GLed = 1;
 104   2          }
 105   1      
 106   1        if (KN>0)
 107   1          SW2++;
 108   1      
 109   1        if (SW2 > 1000)
 110   1          {
 111   2            SW2 = 0;
 112   2            KN = 0; //二十秒内没有输入完6个数则要重新输入
 113   2            CLSPSW();
 114   2          }
 115   1      
 116   1        for (Temp=0; Temp<3; Temp++)
 117   1          {
C51 COMPILER V7.50   MAIN                                                                  06/05/2007 13:38:03 PAGE 3   

 118   2            Key = KSVel[Temp];    
 119   2            TempV = Key;
 120   2            if (TempV<0xE0) //有键被按下时
 121   2              {
 122   3                Delay10ms(); //延时
 123   3                if (TempV == Key)
 124   3                  {
 125   4                    SW2 = 0;
 126   4                    if (P1_7==0) KPSW[KN]=Temp*3+1;
 127   4                    if (P1_6==0) KPSW[KN]=Temp*3+2;
 128   4                    if (P1_5==0) KPSW[KN]=Temp*3+3;
 129   4                    KN++;
 130   4                    GLed = 0; //当键按下时 GLED亮1S
 131   4                    for (TempV=0; TempV<30; TempV++)
 132   4                      {
 133   5                       Delay10ms();
 134   5                      }
 135   4                    GLed = 1;
 136   4                    if (KN==6)
 137   4                      {
 138   5                        TempN = 0;
 139   5                        for (TempV=0; TempV<6; TempV++)
 140   5                          {
 141   6                            if (KPSW[TempV] == UPSW[TempV])
 142   6                              TempN++;
 143   6                          }
 144   5                        if (TempN==6)
 145   5                          {
 146   6                            Switch = 0;
 147   6                            GLed = 0;
 148   6                            RLed = 1; //绿灯亮
 149   6                          }
 150   5                        CLSPSW();
 151   5                        KN = 0;
 152   5                        SW2 = 0;
 153   5                      }
 154   4                  }
 155   3              }
 156   2          }
 157   1        TR0 = 1;
 158   1      }
 159          
 160          //---------------------------------
 161          //x5045子程序
 162          //---------------------------------
 163          void RESWDI(void) //复位看门狗(喂狗)
 164          {
 165   1       CS = 0;
 166   1       CS = 1;
 167   1      }
 168          
 169          void WREN(void) //写使能锁存
 170          {
 171   1        SCK=0;
 172   1        CS=0;
 173   1        OUTByte(0x06); //发送06H写使能命令字
 174   1        SCK=0;
 175   1        CS=1;
 176   1      }
 177          
 178          void WRDI(void) //写使能复位(禁止写)
 179          {
C51 COMPILER V7.50   MAIN                                                                  06/05/2007 13:38:03 PAGE 4   

 180   1        SCK=0;
 181   1        CS=0;
 182   1        OUTByte(0x04); //发送04H写禁止命令字
 183   1        SCK=0;
 184   1        CS=1;
 185   1      }
 186          
 187          void WRSR(void) //写状态寄存器
 188          {
 189   1        SCK=0;
 190   1        CS=0;
 191   1        OUTByte(0x01); //发送01H写寄存器命令字
 192   1        OUTByte(0x20); //发送寄存器值BL0,BL1为0没写保护,WD0=0 WD1=0看门狗复位时间为1.4s
 193   1        SCK=0;
 194   1        CS=1;
 195   1        WIPCHK(); //判断是否写入
 196   1      }
 197          
 198          unsigned char RSDR(void) //读状态寄存器
 199          {
 200   1        unsigned char Temp;
 201   1      
 202   1        SCK=0;
 203   1        CS=0;
 204   1        OUTByte(0x05); //发送05H读状态寄存器命令字
 205   1        Temp = INPUTByte(); //读状态寄存器值
 206   1        SCK=0;
 207   1        CS=1;
 208   1        return Temp;
 209   1      }
 210          
 211          void WIPCHK(void) //检查WIP位,判断是否写入完成
 212          {
 213   1        unsigned char Temp;
 214   1        unsigned int TempCyc;
 215   1        
 216   1        for(TempCyc=0;TempCyc<0xFFFF;TempCyc++)
 217   1          {
 218   2            Temp = RSDR(); //读状态寄存器
 219   2            Temp = Temp&0x01;
 220   2            if (!Temp)
 221   2              TempCyc = 0xFFFE;
 222   2          }
 223   1      }
 224          
 225          void OUTByte(unsigned char Byte) //输出一个定节
 226          {
 227   1        unsigned char TempCyc;
 228   1      
 229   1        for(TempCyc=0;TempCyc<8;TempCyc++)
 230   1          {
 231   2            SCK = 0;
 232   2            SI = Byte & 0x80;
 233   2            Byte = Byte<<1; //右移         -+
 234   2            SCK = 1;
 235   2          }
 236   1        SI=0; //使SI处于确定的状态
 237   1      }
 238          
 239          unsigned char INPUTByte(void) //输入一个字节
 240          {
 241   1        unsigned char Temp=0, TempCyc;
C51 COMPILER V7.50   MAIN                                                                  06/05/2007 13:38:03 PAGE 5   

 242   1        
 243   1        for(TempCyc=0;TempCyc<8;TempCyc++)
 244   1          {
 245   2            Temp = Temp<<1; //右移
 246   2            SCK = 0;
 247   2            SCK = 0;
 248   2            SCK = 1;
 249   2            SCK = 1;
 250   2            if (SO) 
 251   2              Temp = Temp|0x01; //SO为1,则最低位为1
 252   2          }
 253   1        return Temp;
 254   1      }
 255          
 256          unsigned char ReadByte(unsigned  char ADD) //读地址中的数据这里不做先导字处理,只能读00-FFH
 257          {
 258   1        unsigned char Temp;
 259   1      
 260   1        SCK=0;
 261   1        CS=0;
 262   1        OUTByte(0x3); //发送读指令03H 如要支持000-FFF则要把高位地址左移3位再为03H相或
 263   1        OUTByte(ADD); //发送低位地址
 264   1        Temp = INPUTByte();
 265   1        SCK=0;
 266   1        CS=1;
 267   1        return Temp;
 268   1      }
 269          
 270          void WriteByte(unsigned char Byte, unsigned char ADD) //向地址写入数据这里同样不做先导字处理,只能写00-FFH
 271          {
 272   1        SCK=0;
 273   1        CS=0;
 274   1        OUTByte(0x2); //发送写指令02H 如要支持000-FFF则要把高位地址左移2位再为02H相或
 275   1        OUTByte(ADD); //发送低位地址
 276   1        OUTByte(Byte); //发送数据
 277   1        SCK=0;
 278   1        CS=1;
 279   1        WIPCHK(); //判断是否写入
 280   1      }
 281          
 282          void Delay10ms()
 283          {
 284   1        unsigned int Temp;
 285   1        
 286   1        for (Temp=0; Temp<1900; Temp++);
 287   1      }
 288          
 289          void CLSPSW()
 290          {
 291   1        unsigned char Temp;
 292   1        
 293   1        for (Temp=0; Temp<6; Temp++)
 294   1          KPSW[Temp] = 0;
 295   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    649    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     20       5
C51 COMPILER V7.50   MAIN                                                                  06/05/2007 13:38:03 PAGE 6   

   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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