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

📄 66.lst

📁 IIC单片机时钟
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V8.05a   66                                                                   03/06/2012 21:09:20 PAGE 1   


C51 COMPILER V8.05a, COMPILATION OF MODULE 66
OBJECT MODULE PLACED IN 66.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE 66.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include<reg52.h>
   2          #include<intrins.h>
   3          #include "string.h"
   4          
   5          #define DelayTime 10 //DelayTime用于控制IIC的速度,有些器件可能并不支持高速的IIC通信
   6                               //可以调整DelayTime来调节IIC的速度
   7          
   8          sbit speak=P1^4;
   9          struct Time  //时间结构体,包括了秒,分,时,日,周,月,年
  10          {
  11           unsigned char second;
  12           unsigned char minute;
  13           unsigned char hour;
  14           unsigned char day;
  15           unsigned char week;
  16           unsigned char month;
  17           unsigned char year;
  18          };
  19          
  20          
  21          extern struct Time time; //用来装时间数据,需要在外部定义
  22          
  23          //函数声明
  24          unsigned char P8563_Read_Time();
  25          unsigned char P8563_Set_Time();
  26          
  27          void delay1(unsigned int i)
  28          {
  29   1        while(i--);
  30   1      }
  31          
  32          void delay(unsigned int time) 
  33          {
  34   1       while(time--);
  35   1      }
  36          
  37          unsigned char table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //数字表
  38          
  39          
  40          //端口定义
  41          sbit SCL=P1^0; //IIC的时钟线
  42          sbit SDA=P1^1; //IIC的数据线
  43          
  44          //函数声明
  45          void IIC_Start();
  46          void IIC_Stop();
  47          void IIC_Ack();
  48          void IIC_NAck();
  49          unsigned char IIC_Get_Ack();
  50          unsigned char IIC_Write_Byte(unsigned char dat);
  51          unsigned char IIC_Read_Byte();
  52          
  53          struct Time time; //用于装载时间数据的结构体型的变量time
  54          
  55          void IIC_Start() 
C51 COMPILER V8.05a   66                                                                   03/06/2012 21:09:20 PAGE 2   

  56          {
  57   1       SDA=1;
  58   1       delay(DelayTime); 
  59   1       SCL=1; 
  60   1       delay(DelayTime);
  61   1       SDA=0; 
  62   1       delay(DelayTime);
  63   1       SCL=0;
  64   1       delay(DelayTime);
  65   1      }
  66          
  67          /******************************************************************
  68           - 功能描述:IIC结束
  69           - 隶属模块:IIC模块
  70           - 函数属性:外部,供用户使用
  71           - 参数说明:无      
  72           - 返回说明:无
  73           - 注:无
  74           ******************************************************************/
  75          
  76          void IIC_Stop()  
  77          {
  78   1       SDA=0; 
  79   1       delay(DelayTime);
  80   1       SCL=1;
  81   1       delay(DelayTime); 
  82   1       SDA=1;
  83   1       delay(DelayTime); 
  84   1       SCL=0;
  85   1       delay(DelayTime);
  86   1      }
  87          
  88          /*********************************************************************
  89           - 功能描述:主设备发出应答
  90           - 隶属模块:IIC模块
  91           - 函数属性:外部,供用户使用
  92           - 参数说明:无      
  93           - 返回说明:无
  94           - 注:主设备(比如单片机),从从设备(比如PCF8563、AT24C64)读取字节后,如果
  95                 要继续读取,就要给从设备一个ACK(即所谓的“应答”,数据位SDA为0)
  96           *********************************************************************/
  97          
  98          void IIC_Ack() 
  99          {
 100   1       SDA=0;
 101   1       delay(DelayTime); 
 102   1       SCL=1; 
 103   1       delay(DelayTime);
 104   1       SCL=0; 
 105   1       delay(DelayTime);
 106   1      }
 107          
 108          /*********************************************************************
 109           - 功能描述:主设备发出无应答
 110           - 隶属模块:IIC模块
 111           - 函数属性:外部,供用户使用
 112           - 参数说明:无      
 113           - 返回说明:无
 114           - 注:主设备(比如单片机),从从设备(比如PCF8563、AT24C64)读取字节后,如果不再
 115                 进行读取,就要给从设备一个NACK(即所谓的“无应答”,数据位SDA为1)
 116           *********************************************************************/
 117          
C51 COMPILER V8.05a   66                                                                   03/06/2012 21:09:20 PAGE 3   

 118          void IIC_NAck() 
 119          {
 120   1       SDA=1; 
 121   1       delay(DelayTime);
 122   1       SCL=1;
 123   1       delay(DelayTime); 
 124   1       SCL=0;
 125   1       delay(DelayTime);
 126   1      }
 127          
 128          /*********************************************************************
 129           - 功能描述:主设备检测从设备应答
 130           - 隶属模块:IIC模块
 131           - 函数属性:外部,供用户使用
 132           - 参数说明:无      
 133           - 返回说明:从设备的应答值
 134           - 注:主设备(比如单片机),向从设备(比如PCF8563、AT24C64)写入字节后,要检测从
 135                 设备发出的应答,如果数据位SDA为0,说明向从设备成功写入了字节
 136           *********************************************************************/
 137          
 138          unsigned char IIC_Get_Ack() 
 139          {
 140   1       unsigned char Error;
 141   1       SDA=1;
 142   1       delay(DelayTime); 
 143   1       SCL=1; 
 144   1       delay(DelayTime);
 145   1       Error=SDA; 
 146   1       delay(DelayTime);
 147   1       SCL=0; 
 148   1       delay(DelayTime);
 149   1       return Error;
 150   1      }
 151          
 152          /*********************************************************************
 153           - 功能描述:主设备向从设备写入一字节
 154           - 隶属模块:IIC模块
 155           - 函数属性:外部,供用户使用
 156           - 参数说明:dat:将要写入的字节      
 157           - 返回说明:从设备的应答值
 158           - 注:向从设备写入一个字节,并返回从设备的应答值
 159           *********************************************************************/
 160          
 161          unsigned char IIC_Write_Byte(unsigned char dat)
 162          {
 163   1       unsigned char i;
 164   1       for(i=0;i<8;i++)
 165   1       {
 166   2        SDA=((dat<<i)&0x80);  
 167   2        SCL=1; 
 168   2        delay(DelayTime); 
 169   2        SCL=0;
 170   2        delay(DelayTime);
 171   2       }
 172   1       return IIC_Get_Ack();
 173   1      }
 174          
 175          /*********************************************************************
 176           - 功能描述:主设备从从设备读取一字节
 177           - 隶属模块:IIC模块
 178           - 函数属性:外部,供用户使用
 179           - 参数说明:无     
C51 COMPILER V8.05a   66                                                                   03/06/2012 21:09:20 PAGE 4   

 180           - 返回说明:读到的字节
 181           - 注:无
 182           *********************************************************************/
 183          
 184          unsigned char IIC_Read_Byte() 
 185          {
 186   1       unsigned char i,rbyte=0;
 187   1       SDA=1;
 188   1       for(i=0;i<8;i++)
 189   1       {
 190   2        SCL=1;
 191   2        delay(DelayTime);
 192   2        if(SDA) rbyte|=(0x80>>i); 
 193   2        SCL=0;
 194   2        delay(DelayTime);
 195   2       }
 196   1       return rbyte; 
 197   1      }
 198          
 199          unsigned char PCF8563_Write_Bytes(unsigned char addr,unsigned char length,unsigned char *pbuf)
 200          {
 201   1       unsigned char i=0;
 202   1       IIC_Start(); //IIC通信开始
 203   1       if(IIC_Write_Byte(0xa2)) return 1; //写PCF8563的ID与读写控制位,通信有错误立即返回
 204   1       if(IIC_Write_Byte(addr)) return 1; //写寄存器地址
 205   1       for(i=0;i<length;i++) //写入length个字节
 206   1       {
 207   2        if(IIC_Write_Byte(pbuf[i])) return 1;//写数据
 208   2       }
 209   1       IIC_Stop(); 
 210   1       return 0;
 211   1      }
 212          
 213          /******************************************************************
 214           - 功能描述:从地址addr的寄存器读取多个字节
 215           - 隶属模块:PCF8563驱动模块
 216           - 函数属性:内部
 217           - 参数说明:addr:寄存器地址
 218                       length:要读出的字节数
 219                       pbuf:指向数据缓冲区的指针           
 220           - 返回说明:操作结果,0表示成功,1表示失败
 221           - 注:无
 222           ******************************************************************/
 223          
 224          unsigned char PCF8563_Read_Bytes(unsigned char addr,unsigned char length,unsigned char *pbuf) //从地址addr
             -连续读取length个字节到pbuf
 225          { 
 226   1       unsigned char i=0,err=0;
 227   1       IIC_Start(); //IIC通信开始
 228   1       if(IIC_Write_Byte(0xa2)) return 1; //写PCF8563的ID与读写控制位,通信有错误立即返回
 229   1       if(IIC_Write_Byte(addr)) return 1; //写寄存器地址
 230   1      
 231   1       IIC_Start(); //IIC通信开始
 232   1       if(IIC_Write_Byte(0xa3)) return 1; //写PCF8563的ID与读写控制位
 233   1       for(i=0;i<length-1;i++) //写入前length-1个字节,并作出应答
 234   1       {
 235   2        pbuf[i]=IIC_Read_Byte();
 236   2        IIC_Ack();
 237   2       }
 238   1       pbuf[i]=IIC_Read_Byte(); //写入最后一个字节,并作出无应答
 239   1       IIC_NAck();
 240   1       IIC_Stop();
C51 COMPILER V8.05a   66                                                                   03/06/2012 21:09:20 PAGE 5   

 241   1       return 0;
 242   1      }

⌨️ 快捷键说明

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