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

📄 ex08.lst

📁 单片机串行通讯程序
💻 LST
字号:
C51 COMPILER V7.03   EX08                                                                  05/23/2005 23:20:59 PAGE 1   


C51 COMPILER V7.03, COMPILATION OF MODULE EX08
OBJECT MODULE PLACED IN ex08.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ex08.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          /*******************************************************************************
   2            Title:  演示程序8 - 读写AT93C46                                                                                               *                                       
   3            Name:   ex08.c                                                                        *
   4            Date:   2005-5-21                                                             *
   5            Ver:    1.0                                                                   *                         
             -                       *
   6            web:   http://www.mcustudy.com                                               *
   7          ********************************************************************************
   8                                                                                                          *
   9          *                AT93C46读写演示程序                                            *
  10          *                从地址0x00开始写入数据, 然后再读出                                                    *
  11          *                                                                               *
  12          *                注意:在擦除和写入数据之前,必须先写入EWEN指令                 *                         
             -                   *
  13          ********************************************************************************/
  14          
  15          #include <reg51.h>
  16          #include <intrins.h>
  17          
  18          //define OP code
  19          #define OP_EWEN_H               0x00    // 00                                   write enable
  20          #define OP_EWEN_L               0x60    // 11X XXXX                             write enable
  21          #define OP_EWDS_H               0x00    // 00                                   disable
  22          #define OP_EWDS_L               0x00    // 00X XXXX                             disable
  23          
  24          #define OP_ERAL_H               0x00    // 00                                   erase all
  25          #define OP_ERAL_L               0x40    // 10X XXXX                             erase all
  26          #define OP_WRAL_H               0x00    // 00                                   write all       
  27          #define OP_WRAL_L               0x20    // 01X XXXX                             write all       
  28          
  29          #define OP_WRITE_H              0x40    // 01 A6-A0                             write data
  30          
  31          #define OP_READ_H               0x80    // 10 A6-A0                             read data
  32          
  33          #define OP_ERASE_H              0xc0    // 11 A6-A0                             erase a word
  34          
  35          
  36          //define pin
  37          sbit CS = P1^1;
  38          sbit SK = P1^2;
  39          sbit DI = P1^0;
  40          sbit DO = P1^3;
  41          
  42          unsigned char code dis_code[] = {0x7e,0xbd,0xdb,0xe7,0xdb,0xbd,0x7e,0xff};
  43          
  44          void start();
  45          void ewen();
  46          void ewds();
  47          void erase();
  48          void write(unsigned char addr, unsigned char indata);
  49          unsigned char read(unsigned char addr);
  50          void inop(unsigned char op_h, unsigned char op_l);
  51          void shin(unsigned char indata);
  52          unsigned char shout();
  53          void delayms(unsigned char ms);
C51 COMPILER V7.03   EX08                                                                  05/23/2005 23:20:59 PAGE 2   

  54          
  55          main()
  56          {
  57   1              unsigned char i;
  58   1              CS = 0;                         //初始化端口
  59   1              SK = 0;
  60   1              DI = 1;
  61   1              DO = 1;
  62   1      
  63   1              ewen();                         // 使能写入操作
  64   1              erase();                        // 擦除全部内容
  65   1                      
  66   1              for(i = 0 ; i < 8; i++)         //写入显示代码到AT93C46
  67   1              {
  68   2                      write(i, dis_code[i]);
  69   2              }
  70   1              
  71   1              ewds();                         // 禁止写入操作 
  72   1              
  73   1              i = 00;
  74   1              while(1)
  75   1              {
  76   2                      P0 = read(i);   // 循环读取AT93C46内容,并输出到P0口
  77   2                      i++;
  78   2                      i &= 0x07;              // 循环读取地址为0x00~0x07
  79   2                      delayms(250);           
  80   2              }
  81   1      }
  82          
  83          // 写入数据indata到addr
  84          void write(unsigned char addr, unsigned char indata)
  85          {
  86   1              inop(OP_WRITE_H, addr); // 写入指令和地址
  87   1                      shin(indata);
  88   1                      CS = 0;
  89   1              delayms(10);                    // Twp
  90   1      }
  91          
  92          
  93          // 读取addr处的数据
  94          unsigned char read(unsigned char addr)
  95          {
  96   1              unsigned char out_data;
  97   1              inop(OP_READ_H, addr);  // 写入指令和地址
  98   1              out_data = shout();
  99   1              CS = 0; 
 100   1              return out_data;
 101   1      }
 102          
 103          void ewen()
 104          {
 105   1              inop(OP_EWEN_H, OP_EWEN_L);
 106   1              CS= 0;
 107   1      }
 108          
 109          void ewds()
 110          {
 111   1              inop(OP_EWDS_H, OP_EWDS_L);
 112   1              CS= 0;  
 113   1      }
 114          
 115          void erase()
C51 COMPILER V7.03   EX08                                                                  05/23/2005 23:20:59 PAGE 3   

 116          {
 117   1              inop(OP_ERAL_H, OP_ERAL_L);
 118   1              delayms(30);
 119   1              CS = 0;
 120   1      }
 121          
 122          
 123          //移入op_h的高两位和op_l的低7位
 124          //op_h为指令码的高两位
 125          //op_l为指令码的低7位或7位地址
 126          void inop(unsigned char op_h, unsigned char op_l)
 127          
 128          {       
 129   1      
 130   1              unsigned char i;
 131   1              
 132   1              SK = 0;         // 开始位
 133   1              DI = 1;
 134   1              CS = 1;
 135   1              _nop_();
 136   1              _nop_(); 
 137   1              SK = 1;
 138   1              _nop_();
 139   1              _nop_();
 140   1              SK = 0;         // 开始位结束
 141   1      
 142   1              DI = (bit)(op_h & 0x80);        // 先移入指令码高位
 143   1              SK = 1;
 144   1              op_h <<= 1;
 145   1              SK = 0;         
 146   1      
 147   1              DI = (bit)(op_h & 0x80);        // 移入指令码次高位
 148   1              SK = 1;
 149   1              _nop_();
 150   1              _nop_();        
 151   1              SK = 0;
 152   1              
 153   1              // 移入余下的指令码或地址数据
 154   1              op_l <<= 1;     
 155   1              for(i = 0; i < 7; i++)          
 156   1              {
 157   2                      DI = (bit)(op_l & 0x80);        // 先移入高位
 158   2                      SK = 1;
 159   2                      op_l <<= 1;
 160   2                      SK = 0;         
 161   2              }
 162   1              DI = 1;         
 163   1      }
 164          
 165          
 166          void shin(unsigned char indata)         
 167          //移入数据
 168          {
 169   1              unsigned char i;
 170   1              for(i = 0; i < 8; i++)
 171   1              {
 172   2                      DI = (bit)(indata & 0x80);      // 先移入高位
 173   2                      SK = 1;
 174   2                      indata <<= 1;
 175   2                      SK = 0;         
 176   2              }
 177   1              DI = 1;
C51 COMPILER V7.03   EX08                                                                  05/23/2005 23:20:59 PAGE 4   

 178   1      }
 179          
 180          unsigned char shout(void)                       
 181          // 移出数据
 182          {
 183   1              unsigned char i, out_data;
 184   1              for(i = 0; i < 8; i++)
 185   1              {
 186   2                      SK = 1;
 187   2                      out_data <<= 1;
 188   2                      SK = 0;
 189   2                      out_data |= (unsigned char)DO;
 190   2              }
 191   1              return(out_data);
 192   1      }
 193          
 194          // 延时子程序
 195          void delayms(unsigned char ms)  
 196          {                                               
 197   1              unsigned char i;
 198   1              while(ms--)
 199   1              {
 200   2                      for(i = 0; i < 140; i++);
 201   2              }
 202   1      }
 203          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    250    ----
   CONSTANT SIZE    =      8    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----       2
   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 + -