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

📄 clock.lst

📁 KEIL C上的门禁控制器源代码
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.07   CLOCK                                                                 09/14/2005 15:20:46 PAGE 1   


C51 COMPILER V7.07, COMPILATION OF MODULE CLOCK
OBJECT MODULE PLACED IN Clock.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Clock.c LARGE OPTIMIZE(9,SPEED) BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          //
   2          // I2C操作函数库
   3          // I2C有关概念参见《MCS-51系列单片机应用及接口技术》P289
   4          //
   5          // idata=14
   6          
   7          #include "Global.h"
   8          
   9          ///////////////////////////////////////////////////////////////////////////////
  10          // 内部存储区变量       0~128字节 直接寻址
  11          // 全局变量定义
  12          extern data  uchar cur_time[15];                // 系统当前时间显示存储区 XXXX年XX月XX日XX时XX分XX秒星期X
  13          extern data  uchar time[10];                    // 读取时钟存储区                                       
  14          extern bdata bit ack;                                   // 时钟I2C总线通信应答状态
  15          
  16          //
  17          // 在I2C总线数据传送过程中,定义了一种开始和结束信号(有时也称启动和停止信号),
  18          // 开始和结束信号的定义在I2C协议中具有十分重要的意义。当SCL为高电平时,SDA发生
  19          // 高到低跳变定义为开始信号;当SCL为高电平时,SDA发生低到高跳变定义为结束信号,
  20          // 开始和结束信号的定义参见《MCS-51系列单片机应用及接口技术》P291所示。开始和
  21          // 结束信号都是由主器件(这里是8051单片机)发出的。在开始信号以后,总线被认为
  22          // 是忙的。在结束信号后过一定时间,总线被认为是空闲的。如果连接在总线上的器件
  23          // 具有相应的硬件接口电路,开始和结束信号的检测还比较容易,但是没有这种硬件接
  24          // 口电路的微处理器必须在一个时钟周期内至少2次采样,SDA才能检测到这种跳变。
  25          //
  26          
  27          
  28          //
  29          // 启动I2C总线
  30          // 函数原型:void Start_I2c8563();
  31          // 功能:
  32          //              启动I2C时钟8563总线,即发送I2C起始条件
  33          //
  34          void Start_I2c8563()
  35          {
  36   1              SDA=1;                  // SDA维持高电平,准备发送起始信号
  37   1              SCL=1;                  // SCL为高电平,SDA由高变低,表明通信起始信号
  38   1              Some_NOP;               // SCL信号高电平维持至少4us,等待电平稳定
  39   1              SDA=0;                  // 发送起始信号,SDA下跳
  40   1              Some_NOP;               // 起始信号至少维持4.7us
  41   1              SCL=0;                  // 时钟信号跳变
  42   1              Some_NOP;               // 等待一段时间
  43   1      }
  44          
  45          //
  46          // 结束I2C总线
  47          // 函数原型: void  Stop_I2c8563();  
  48          // 功能: 
  49          //              结束I2C总线,即发送I2C结束条件.
  50          //
  51          void Stop_I2c8563()
  52          {
  53   1              SDA=0;                  // SDA维持低电平,准备发送停止信号
  54   1              _Nop();
  55   1              SCL=1;                  // SCL信号高电平,SDA由低变高,表明通信停止信号
C51 COMPILER V7.07   CLOCK                                                                 09/14/2005 15:20:46 PAGE 2   

  56   1              Some_NOP;               // SCL信号高电平维持至少4us
  57   1              SDA=1;                  // 发送停止信号
  58   1              Some_NOP;               // 停止信号至少维持4us
  59   1      }
  60          
  61          
  62          //
  63          // 送到SDA线上的每个字节必须为8位长度,每次传送的字节数是不受限制的,每个字节后
  64          // 面必须跟随一个响应位。数据传送时先传送最高位。如果接收器不能接收下一个字节(
  65          // 例如正在处理一个内部中断,在这个中断处理完之前不能接收I2C总线上的数据字节),
  66          // 可以使时钟保持低电平,迫使主处理器处于等待状态。当从器件准备好接收下一个数据
  67          // 字节时就释放SCL,以便数据继续传送。
  68          //
  69          // 接收器必须确认数据的接收,确认位相对于主器件产生一个时钟在这个时钟内发送器件
  70          // 释放SDA线。接收器件在这个时钟内必须将SDA拉成低电平,使SDA在该时钟的高电平期间
  71          // 为稳定的低电平。
  72          // 通常,被寻址的接收器件必须在收到每个字节后发出响应信息。若一个从器件在处理一
  73          // 个实时事件不能接收数据时,从器件必须使SDA保持高电平。此时,主器件产生一个结
  74          // 束信号使传送异常结束。
  75          // 在主器件接收的传送中,主器件对最后一个数据字节不予确认,以对从发送器指出数据
  76          // 传送的结束,从发送器释放SDA线,使主器件能产生一个结束信号。
  77          //
  78          
  79          // 字节数据传送函数,,向从器件写一个字节
  80          // 函数原型: void  SendByte8563(uchar c);
  81          // 功能: 
  82          //              将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
  83          //              此状态位进行操作.(不应答或非应答都使ack=0 假)     
  84          //              发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
  85          //
  86          void  SendByte8563(uchar c)
  87          {
  88   1              idata uchar i;
  89   1      
  90   1              for(i=0;i<8;i++)// 每字节必须8位长度
  91   1              {
  92   2                      if((c<<i)&0x80)
  93   2                      {
  94   3                              SDA=1;                                          // 数据最高位先发送,数据1
  95   3                      }
  96   2                      else
  97   2                      {
  98   3                              SDA=0;                                          // 数据0
  99   3                      }
 100   2                      _Nop();
 101   2                      SCL=1;                                                  // 每个主器件在SCL线上产生时钟,数据仅在
 102   2                                                                                      // 时钟的高电平期间有效,锁存数据。
 103   2                      Some_NOP;                                       // 保证SCL时钟高电平至少为4us     
 104   2                      SCL=0;                                                  // 时钟低电平,准备写入下一个字节
 105   2                      _Nop();                                                 // 等待
 106   2                      _Nop();
 107   2              }
 108   1              
 109   1              _Nop();
 110   1              _Nop();
 111   1              SDA=1;                                                          // 8位数据发送完毕,检测从器件响应
 112   1              _Nop();
 113   1              _Nop();   
 114   1              SCL=1;                                                          // SCL为高电平,发送第9时钟作为应答信号
 115   1              _Nop();
 116   1              _Nop();
 117   1              _Nop();
C51 COMPILER V7.07   CLOCK                                                                 09/14/2005 15:20:46 PAGE 3   

 118   1              if(SDA==1)
 119   1                      ack=0;                                                  // 从器件保持SDA为高电平,发送异常  
 120   1              else
 121   1                      ack=1;                                                  // 从器件拉低SDA为低电平,发送正常
 122   1      
 123   1              SCL=0;                                                          // SCL为低电平,清除时钟
 124   1              _Nop();
 125   1              _Nop();
 126   1      }
 127          
 128          //
 129          // 字节数据传送函数,读出从器件一个字节
 130          // 函数原型: uchar  RcvByte();
 131          // 功能:
 132          //              用来接收从器件传来的数据,并判断总线错误(不发应答信号),
 133          //              发完后请用应答函数。  
 134          //
 135          uchar  RcvByte8563()
 136          {
 137   1              idata uchar temp=0;
 138   1              idata uchar i;
 139   1      
 140   1              SDA=1;                                          // 准备接收数据
 141   1              for(i=0;i<8;i++)
 142   1              {
 143   2                      _Nop();           
 144   2                      SCL=0;                                  // SCL时钟下跳准备接收数据
 145   2                      Some_NOP;                               // SCL时钟信号,最小低电平为4.7us
 146   2                      SCL=1;                                  // 时钟上跳
 147   2                      _Nop();                                 // 等待数据出现
 148   2                      _Nop();
 149   2                      temp=temp<<1;   // 数据移位
 150   2                      if(SDA==1)
 151   2                              temp=temp+1;// 接收数据位
 152   2                      _Nop();                                 // 接收下一位数据
 153   2                      _Nop(); 
 154   2              }
 155   1      
 156   1              SCL=0;                                          // 准备发送结束信号 
 157   1              _Nop();
 158   1              _Nop();
 159   1              return temp;                    // 返回接收到的字节
 160   1      }
 161          
 162          //
 163          // 应答子函数
 164          // 原型:  void Ack_I2c8563(bit a);
 165          // 功能:
 166          //              主控器进行应答信号,(可以是应答或非应答信号)
 167          //
 168          void Ack_I2c8563(bit a)
 169          {
 170   1              if(a==0)
 171   1                      SDA=0;                                  // 发应答信号

⌨️ 快捷键说明

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