24c256.LST
上传用户:liao132
上传日期:2020-09-03
资源大小:26k
文件大小:14k
源码类别:

PropertySheet

开发平台:

C++ Builder

  1. C51 COMPILER V7.05   24C256                                                                11/06/2009 08:47:56 PAGE 1   
  2. C51 COMPILER V7.05, COMPILATION OF MODULE 24C256
  3. OBJECT MODULE PLACED IN 24c256.OBJ
  4. COMPILER INVOKED BY: D:SiLabsMCUIDEfilesC51BINC51.exe 24c256.c DB OE
  5. stmt level    source
  6.    1          /*编辑:赵大帅*/
  7.    2          /*日期:2009-04-12*/
  8.    3          /////////////////////////////////
  9.    4          /*修改:XXX*/
  10.    5          /*日期:XX-XX-XX*/
  11.    6          /////////////////////////////////////////////////////////////////
  12.    7          /*本文档是基于C8051F330单片机的EEPROM 24C512和时钟芯片FCP8563
  13.    8          的驱动程序,本文档可以对24C512实现单字节读写、多字节读写,还可
  14.    9          以实现对FCP8563的初始化和读操作;可以通过串口对24C512和FCP8563
  15.   10          进行调试查看*/
  16.   11          /////////////////////////////////////////////////////////////////
  17.   12          #include <c8051f330.h>
  18.   13          //////////////////I2C接口
  19.   14          sbit SCL=P0^6;
  20.   15          sbit SDA=P0^0;
  21.   16          
  22.   17          ///////////////////////////////////////
  23.   18          /*延时子程序:delay()*/
  24.   19          /*输入参数:num1,num2*///设定延时时间
  25.   20          /*输出参数:无*/
  26.   21          /*返回:无*/
  27.   22          void delay(unsigned char char1,unsigned int int1)
  28.   23          {
  29.   24   1              unsigned char j;
  30.   25   1              unsigned int i;
  31.   26   1              for(j=0;j<char1;j++)
  32.   27   1              {
  33.   28   2                      for(i=0;i<int1;i++)
  34.   29   2                      {
  35.   30   3                              
  36.   31   3                      }
  37.   32   2              }
  38.   33   1      }
  39.   34          ////////////////////////////////////////
  40.   35          /*IO初始化:IO_Init()*/
  41.   36          /*输入参数:无*/
  42.   37          /*输出参数:无*/
  43.   38          /*返回:无*/
  44.   39          void Io_init(void)
  45.   40          {
  46.   41   1              XBR0    =0x01;//USART 使能
  47.   42   1              XBR1    =0X40;
  48.   43   1              P0MDIN  =0xF3;//P02、P03为模拟输入;其余为数字输入
  49.   44   1              P0MDOUT =0x3e;//P04、P05为推挽输出;P06、P07为漏极开路输出
  50.   45   1              P0SKIP  =0xCF;
  51.   46   1              P1MDIN  =0xFF;//P1均为数字输入
  52.   47   1              P1MDOUT =0xC7;//P13,P14,P15为漏极开路输出,P10,P11,P12为推挽输出
  53.   48   1              P1SKIP  =0xFF;
  54.   49   1      }
  55.   50          ///////////////////////////////////////
  56.   51          /*晶振初始化:oscillator()*/
  57.   52          /*输入参数:无*/
  58.   53          /*输出参数:无*/
  59.   54          /*返回:无*/
  60.   55          void oscillator()
  61. C51 COMPILER V7.05   24C256                                                                11/06/2009 08:47:56 PAGE 2   
  62.   56          { 
  63.   57   1              OSCXCN  =0x67;//开启外部震荡(晶体振荡器方式,12MHZ)
  64.   58   1              while((OSCXCN & 0x80)  ==0X00 ){} //判断XTLVLD:晶体振荡器S是否工作稳定?
  65.   59   1              CLKSEL =0x01; //切换到外部晶振
  66.   60   1      }
  67.   61          /////////////////////////////////
  68.   62          void WDT_reset()
  69.   63          {
  70.   64   1              PCA0MD =0x08;
  71.   65   1              PCA0CPL2        =0xFF;
  72.   66   1              PCA0H   =PCA0L  =0x00;
  73.   67   1              PCA0MD  =0x41;
  74.   68   1              PCA0CPH2        =0x00;
  75.   69   1      }
  76.   70          /*起始位:I2C_Start()*/
  77.   71          /*输入参数:无*/
  78.   72          /*输出参数:无*/
  79.   73          /*返回:无*/
  80.   74          void I2C_Start()
  81.   75          {
  82.   76   1              SCL     =1;
  83.   77   1              SDA     =1;
  84.   78   1              delay(1,20);
  85.   79   1              SDA     =0;
  86.   80   1              delay(1,20);
  87.   81   1              WDT_reset();
  88.   82   1      }
  89.   83          ////////////////////////////////
  90.   84          /*停止位:I2C_Stop()*/
  91.   85          /*输入参数:无*/
  92.   86          /*输出参数:无*/
  93.   87          /*返回:无*/
  94.   88          void I2C_Stop()
  95.   89          {
  96.   90   1              SCL     =1;
  97.   91   1              SDA     =0;
  98.   92   1              delay(1,20);
  99.   93   1              SDA     =1;
  100.   94   1              delay(1,20);
  101.   95   1              WDT_reset();
  102.   96   1      //      SCL     =0;
  103.   97   1      }
  104.   98          ////////////////////////////////
  105.   99          /*接受应答位:I2C_Receive_ACK()*/
  106.  100          /*输入参数:无*/
  107.  101          /*输出参数:无*/
  108.  102          /*返回:无*/
  109.  103          void I2C_Receive_ACK()
  110.  104          {
  111.  105   1              SCL     =0;
  112.  106   1              delay(1,20);
  113.  107   1              SCL     =1;
  114.  108   1              delay(1,20);
  115.  109   1              /*
  116.  110   1              if(!SDA)
  117.  111   1              {
  118.  112   1                      UART_send(0xAA);        
  119.  113   1              }
  120.  114   1              */
  121.  115   1              SCL     =0;
  122.  116   1      }
  123.  117          ////////////////////////////////
  124. C51 COMPILER V7.05   24C256                                                                11/06/2009 08:47:56 PAGE 3   
  125.  118          /*发送应答位:I2C_Send_ACK()*/
  126.  119          /*输入参数:无*/
  127.  120          /*输出参数:无*/
  128.  121          /*返回:无*/
  129.  122          void I2C_Send_ACK()
  130.  123          {
  131.  124   1              SCL     =0;
  132.  125   1              SDA     =0;
  133.  126   1              delay(1,20);
  134.  127   1              SCL     =1;
  135.  128   1              delay(1,20);
  136.  129   1              SCL     =0;
  137.  130   1              SDA     =1;
  138.  131   1      }
  139.  132          ////////////////////////////////
  140.  133          /*发送非应答位:I2C_Send_NOACK()*/
  141.  134          /*输入参数:无*/
  142.  135          /*输出参数:无*/
  143.  136          /*返回:无*/
  144.  137          void I2C_Send_NOACK()
  145.  138          {
  146.  139   1              SCL     =0;
  147.  140   1              SDA     =1;
  148.  141   1              delay(1,20);
  149.  142   1              SCL     =1;
  150.  143   1              delay(1,20);
  151.  144   1              SCL     =0;
  152.  145   1      }
  153.  146          ////////////////////////////////
  154.  147          /*写一个字节数据到24CXXX:I2Cwrite_byte_to24C256()*/
  155.  148          /*输入参数:dat*///写24C512一个字节
  156.  149          /*输出参数:无*/
  157.  150          /*返回:无*/
  158.  151          void I2Cwrite_byte_to24C256(unsigned char dat)
  159.  152          {
  160.  153   1              unsigned char i;
  161.  154   1              for(i=0;i<8;i++)
  162.  155   1              {
  163.  156   2                      SCL     =0;
  164.  157   2                      if(dat & 0x80)
  165.  158   2                      {
  166.  159   3                              SDA     =1;
  167.  160   3                      }
  168.  161   2                      else
  169.  162   2                      {
  170.  163   3                              SDA     =0;
  171.  164   3                      }
  172.  165   2                      delay(1,20);
  173.  166   2                      SCL     =1;
  174.  167   2                      delay(1,20);
  175.  168   2                      dat<<=1;
  176.  169   2              }
  177.  170   1              SCL     =0;
  178.  171   1      }
  179.  172          ////////////////////////////////
  180.  173          /*从24C256读一个字节的数据:I2Cread_byte_from24C256()*/
  181.  174          /*输入参数:无*/
  182.  175          /*输出参数:无*/
  183.  176          /*返回:无*/
  184.  177          unsigned char I2Cread_byte_from24C256()
  185.  178          {
  186.  179   1              unsigned char i;
  187. C51 COMPILER V7.05   24C256                                                                11/06/2009 08:47:56 PAGE 4   
  188.  180   1              unsigned char dat;
  189.  181   1              for(i=0;i<8;i++)
  190.  182   1              {
  191.  183   2                      SCL     =0;
  192.  184   2                      delay(1,20);
  193.  185   2                      SCL     =1;
  194.  186   2                      if(SDA)
  195.  187   2                      {
  196.  188   3                              dat     =(dat<<1)+1;
  197.  189   3                      }
  198.  190   2                      else
  199.  191   2                      {
  200.  192   3                              dat     =dat<<1;
  201.  193   3                      }
  202.  194   2              }
  203.  195   1              SCL     =0;
  204.  196   1              return dat;
  205.  197   1      }
  206.  198          /////////////////////////////
  207.  199          /*随机读24C256  n个字节的数据*/
  208.  200          /*输入参数:I2C_add,addr*///I2C_add:24C512地址,addr:读EEPROM起始地址,num:字节个数
  209.  201          /*输出参数:da*///数组首地址
  210.  202          /*返回:无*/
  211.  203          void READ_24C256(unsigned char I2C_add,unsigned int addr,unsigned char *da,unsigned char num)
  212.  204          
  213.  205          {       unsigned char i;
  214.  206   1              unsigned char buffer1,buffer2;
  215.  207   1              buffer2=addr;//地址低8位
  216.  208   1              buffer1=(addr>>8);//地址高8位
  217.  209   1              I2C_Start();
  218.  210   1              I2Cwrite_byte_to24C256(I2C_add);
  219.  211   1              I2C_Receive_ACK();              //(sun)主机只发送脉冲,并不监测数据位
  220.  212   1              I2Cwrite_byte_to24C256(buffer1);
  221.  213   1              I2C_Receive_ACK();
  222.  214   1              I2Cwrite_byte_to24C256(buffer2);
  223.  215   1              I2C_Receive_ACK();
  224.  216   1              I2C_Start();
  225.  217   1              I2Cwrite_byte_to24C256((I2C_add|0x01));
  226.  218   1              I2C_Receive_ACK();
  227.  219   1              for(i=0;i<(num-1);i++)
  228.  220   1              {
  229.  221   2                      *da=I2Cread_byte_from24C256();
  230.  222   2                      I2C_Send_ACK();
  231.  223   2                      da++;
  232.  224   2              }
  233.  225   1              *da=I2Cread_byte_from24C256();
  234.  226   1              I2C_Send_NOACK();
  235.  227   1              I2C_Stop();
  236.  228   1      }
  237.  229          ///////////////////////////////////////////////
  238.  230          /*写24C256  n个字节的数据*/
  239.  231          /*输入参数:I2C_add,addr*///I2C_add:24C512地址,addr:写EEPROM起始地址,da:数组首地址,num:字节数
  240.  232          /*输出参数:无*/
  241.  233          /*返回:无*/
  242.  234          void WRITE_24C256(unsigned char I2C_add,unsigned int addr,unsigned char *da,unsigned char num)
  243.  235          {
  244.  236   1              unsigned char i;
  245.  237   1              unsigned char buffer1,buffer2;
  246.  238   1              buffer2=addr;//地址低8位
  247.  239   1              buffer1=(addr>>8);//地址高8位
  248.  240   1              I2C_Start();
  249.  241   1              I2Cwrite_byte_to24C256(I2C_add);
  250. C51 COMPILER V7.05   24C256                                                                11/06/2009 08:47:56 PAGE 5   
  251.  242   1              I2C_Receive_ACK();
  252.  243   1              I2Cwrite_byte_to24C256(buffer1);
  253.  244   1              I2C_Receive_ACK();
  254.  245   1              I2Cwrite_byte_to24C256(buffer2);
  255.  246   1              I2C_Receive_ACK();
  256.  247   1              for(i=0;i<num;i++)
  257.  248   1              {
  258.  249   2                      I2Cwrite_byte_to24C256(*da);
  259.  250   2                      I2C_Receive_ACK();
  260.  251   2                      da++;
  261.  252   2              }
  262.  253   1              I2C_Stop();
  263.  254   1      }
  264.  255          ///////////////////////////////////////
  265.  256          /*波特率设置:Band_Init()*/
  266.  257          /*输入参数:band///设定串口通信波特率
  267.  258          /*输出参数:无*/
  268.  259          /*返回:无*/
  269.  260          void Band_init(unsigned char band)
  270.  261          {
  271.  262   1              TH1=TL1 =band;//9600:0xB8;14400:0xD0;28800:0xE8;57600:0xF4;115200:0xFA;230400:0xFD
  272.  263   1              CKCON   |=(1<<1)|(1<<0);//T1适用外部时钟8分频
  273.  264   1              TMOD    =0x20;//T1采用8位自动重装方式
  274.  265   1              TCON    =0x40;//T1允许,中断不使能
  275.  266   1      }
  276.  267          ///////////////////////////////////////
  277.  268          /*UART初始化:UART_init()*/
  278.  269          /*输入参数:无*/
  279.  270          /*输出参数:无*/
  280.  271          /*返回:无*/
  281.  272          void UART_init()
  282.  273          {
  283.  274   1              SCON0=0x10;     //允许接收
  284.  275   1              ES0=1;          //UART0中断允许
  285.  276   1      }
  286.  277          ///////////////////////////////////////
  287.  278          /*发送数据:USART_Send()*/
  288.  279          /*输入参数:KEY_DATA///UART发送的数据
  289.  280          /*输出参数:无*/
  290.  281          /*返回:无*/
  291.  282          /*void UART_send(char c) 
  292.  283          {
  293.  284                  SBUF0   = c;
  294.  285                  while (!TI0);
  295.  286                  TI0     = 0;
  296.  287          }*/
  297.  288          ///////////////////////////////////////////////////////////////////
  298.  289          int main()
  299.  290          {
  300.  291   1              unsigned char a[6]={2,2,3,4,5,6};
  301.  292   1              unsigned char b[6]={1,1,1,1,1,1};
  302.  293   1              unsigned int ad=0;              
  303.  294   1              PCA0MD=0x08;                                                                    //关开门狗
  304.  295   1              Io_init();                                                                      //IO初始化
  305.  296   1              oscillator();                                                                   //晶振初始化
  306.  297   1              Band_init(0xB8);                                                                //波特率设置
  307.  298   1              UART_init();
  308.  299   1      //      for(i=0;i<512;i++)                                                                      //串口初始化            
  309.  300   1                                                                      
  310.  301   1      //      {
  311.  302   1                      WRITE_24C256(0xA0,10,a,64);
  312.  303   1                      delay(10,1000);
  313. C51 COMPILER V7.05   24C256                                                                11/06/2009 08:47:56 PAGE 6   
  314.  304   1      //              ad+=64;
  315.  305   1      //      }
  316.  306   1              READ_24C256(0xA0,10,b,6);
  317.  307   1              delay(10,1000);
  318.  308   1      
  319.  309   1              return 0;
  320.  310   1      }
  321. MODULE INFORMATION:   STATIC OVERLAYABLE
  322.    CODE SIZE        =    568    ----
  323.    CONSTANT SIZE    =     12    ----
  324.    XDATA SIZE       =   ----    ----
  325.    PDATA SIZE       =   ----    ----
  326.    DATA SIZE        =   ----      36
  327.    IDATA SIZE       =   ----    ----
  328.    BIT SIZE         =   ----    ----
  329. END OF MODULE INFORMATION.
  330. C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)