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

📄 eeprom.lst

📁 基于PIC16F877 温湿度控制器原代码及原理图PCB图
💻 LST
字号:
     1: #include <pic.h>

     2: #include "Pindefine.h"

     3: #include "variable.h"

     4: #define  Nop()   asm("nop")

     5: #define   SDAMODE   TRISB7 

     6: #define  FM24C16addr         0xa0

     7: #define  FM24C16addr2        0xa8

     8: #define  DZSUM    6

     9: #define  TRUE           1

    10: #define  FALSE          0

    11: bank1 para_data Para;

    12: const  unsigned char ParaDefault[]=                                               //确省定值

    13: {

    14:         0x01,           //地址

    15:         0x00,           //波特率

    16:         0x00,           //PT高字节

    17:         0x01,           //PT低字节

    18:         0x00,           //CT高字节

    19:         0x01,           //CT低字节

    20: };

    21: void  I2C_Start(void);

    22: void  I2C_Stop(void);

    23: void  I2C_Wait(void);

    24: unsigned  char  I2C_SendByte(unsigned  char byte);

    25: unsigned  char  I2C_ReceiveByte(void);

    26: void  SendAcknowledge(unsigned  char ack);

    27: unsigned  char  I2C_ReceiveByte(void);

    28: unsigned  char  I2C_Read(unsigned  char slvaddr,unsigned  char address,unsigned  char length,unsigned  char *databuf);

    29: unsigned  char  I2C_Write(unsigned  char slvaddr,unsigned  char address,unsigned  char length,unsigned  char *databuf);

    30: char CheckParameter(void);

    31: void Load_DefaultValue(void);

    32: void FinishParams(void);

    33: char LoadParameter(void);

    34: unsigned char ReadParameter(void);

    35: unsigned char WriteParameter(void);

    36: extern void watchDOG(void);

    37: extern void DelyNms(unsigned int Nms);

    38: void  I2C_Start(void)

    39: {

    40:     SCLPort = 0;

    41:     SDAMODE = 0;

    42:     I2C_Wait();

    43:     SDA = 1;

    44:     I2C_Wait();

    45:     SCL = 1;

    46:     I2C_Wait();

    47:     SDA = 0;

    48:     I2C_Wait();

    49:     SCL = 0;    

    50: }

    51: /***********************************************************************/

    52: void  I2C_Stop(void)

    53: {

    54:     SDAMODE = 0;

    55:     I2C_Wait();

    56:     SDA = 0;

    57:     I2C_Wait();

    58:     SCL = 1;

    59:     I2C_Wait();

    60:     SDA = 1;    

    61: }

    62: /***********************************************************************/

    63: void  I2C_Wait(void)

    64: {

    65:    Nop();Nop();Nop();Nop();Nop();Nop();  Nop();Nop();Nop() ;Nop();Nop();Nop();                                                   

    66: }

    67: /***********************************************************************/

    68: unsigned  char  I2C_SendByte(unsigned  char byte)

    69: {

    70:     unsigned  char i,ack;

    71:     SDAMODE = 0;

    72:     I2C_Wait();

    73:     for (i = 0;i <= 7;i++)

    74:     {

    75:         if(byte & 0x80)

    76:         {

    77:           SDA=1;

    78:         }

    79:         else

    80:         {

    81:           SDA=0;

    82:         }

    83:         byte <<= 1;        

    84:         SCL = 1;

    85:         I2C_Wait();

    86:         SCL = 0;

    87:         I2C_Wait();        

    88:     }

    89:     SDA = 1; 

    90:     Nop();      

    91:     SDAMODE = 1;                                                         

    92:     I2C_Wait();

    93:     SCL = 1;

    94:     I2C_Wait();      

    95:     if(SDA == 1) 

    96:     {

    97:         ack = 0;        

    98:     }                                    

    99:     else 

   100:     {

   101:         ack = 1;

   102:     }

   103:     SCL = 0;

   104:     SDAMODE = 0;

   105:     return(ack);        

   106: }

   107: /***********************************************************************/

   108: unsigned  char  I2C_ReceiveByte(void)

   109: {

   110:     unsigned  char i,byte = 0;

   111:     SDAMODE = 1;

   112:     I2C_Wait();

   113:     for(i = 0;i <= 7;i++)

   114:     {       

   115:        SCL = 1;

   116:        I2C_Wait(); 

   117:        byte <<= 1;             

   118:        if(SDA == 1)

   119:        {

   120:          byte |= 0x01;

   121:        }       

   122:        SCL = 0;

   123:     }

   124:     return(byte);       

   125: }

   126: /***********************************************************************/

   127: void  SendAcknowledge(unsigned  char ack)

   128: {

   129:     SDAMODE = 0;

   130:     I2C_Wait();

   131:     if(ack)

   132:     {

   133:        SDA = 1;

   134:     }   

   135:     else

   136:     {

   137:        SDA = 0;

   138:     }

   139:     I2C_Wait();

   140:     SCL = 1;

   141:     I2C_Wait();

   142:     SCL = 0;

   143: }

   144: unsigned  char  I2C_Read(unsigned  char slvaddr,unsigned  char address,unsigned  char length,unsigned  char *databuf)

   145: {

   146:     unsigned  char i,j,ack;   

   147:     for(j = 0;j < 3;j++)                                                         

   148:     {

   149:          I2C_Start();   

   150:        ack = I2C_SendByte(slvaddr);

   151:        if(ack == 0)

   152:        {

   153:           I2C_Stop();

   154:           continue;     

   155:        }

   156:        I2C_Wait();

   157:        ack = I2C_SendByte(address);

   158:        if(ack == 0)

   159:        {

   160:           I2C_Stop();

   161:           continue;     

   162:        }

   163:        I2C_Wait();    

   164:        

   165:        I2C_Start();

   166:        ack = I2C_SendByte(slvaddr | 0x01);

   167:        if(ack == 0)

   168:        {

   169:           I2C_Stop();

   170:           continue;     

   171:        }

   172:        Nop();

   173:        Nop();

   174:        for(i = 0;i < length;i++)

   175:        {

   176:          *(databuf+i) = I2C_ReceiveByte();

   177:          if(i < length-1)

   178:          {

   179:                 SendAcknowledge(0);

   180:              }

   181:          else

   182:          {

   183:                 SendAcknowledge(1);     

   184:              }

   185:        }

   186:        I2C_Stop();

   187:        if(ack == 1)

   188:            {  

   189:                    break;

   190:            } 

   191:         }

   192:     return(ack);

   193: }

   194: /***********************************************************************/

   195: unsigned  char  I2C_Write(unsigned  char slvaddr,unsigned  char address,unsigned  char length,unsigned  char *databuf)

   196: {

   197:     unsigned  char i,j,ack;

   198:     WP = 0;

   199:     for(j = 0;j < 3;j++)                                                         

   200:     {

   201:           I2C_Start();  

   202:           ack = I2C_SendByte(slvaddr);

   203:           if(ack == 0)

   204:           {

   205:                 I2C_Stop();continue;    

   206:           }

   207:           I2C_Wait();

   208:           ack = I2C_SendByte(address);

   209:         if(ack == 0)

   210:           {

   211:                 I2C_Stop();continue;

   212:         }               

   213:           for(i = 0;i < length;i++)

   214:           {

   215:                 ack = I2C_SendByte(*(databuf+i));

   216:                 if(ack == 0) 

   217:                 {

   218:                         break;

   219:                 }

   220:           }

   221:           if(ack == 0)

   222:           {

   223:                 I2C_Stop();continue;

   224:           }

   225:         I2C_Stop();

   226:           if(ack == 1)  

   227:           {

   228:                   break;

   229:           }

   230:     }

   231:     return(ack);                                                

   232: }

   233: 

   234: char CheckParameter(void)

   235: {

   236:         unsigned char *P,crc0,sum0,data,crc,sum;

   237:         char i;

   238:     P = &Para;

   239:         I2C_Read(FM24C16addr,0,1,&crc0);

   240:     I2C_Read(FM24C16addr,1,1,&sum0);

   241: 

   242:         if((crc0==0x55)&&(sum0==0xaa))                          //定值标志

   243:         {

   244:                 crc=0;

   245:                 sum=0;

   246:             I2C_Read(FM24C16addr,0x02,1,&crc0);

   247:             I2C_Read(FM24C16addr,0x03,1,&sum0);

   248: 

   249:                 for(i=4;i<DZSUM+4;i++)

   250:                 {

   251:             I2C_Read(FM24C16addr,i,1,&data);

   252:             *P++ = data;

   253:                         crc^=data;

   254:                         sum^=data;

   255:                 }

   256:                 if((crc==crc0)&&(sum==sum0)) return TRUE;

   257:         }

   258:         return FALSE;

   259:         

   260: }

   261: 

   262: void Load_DefaultValue(void)                                    

   263: {       

   264:         unsigned char i,*P; 

   265:     P = &Para;

   266:     watchDOG();

   267:     for(i=0;i<DZSUM;i++)  *P++ = ParaDefault[i];

   268:     I2C_Write(FM24C16addr,0x04,4,P++);

   269:     DelyNms(1);

   270:     I2C_Write(FM24C16addr,8,2,P++);  

   271:     WP = 1;

   272:         FinishParams();   

   273:     watchDOG();

   274:         

   275: }

   276: void FinishParams(void)

   277: {       

   278:         unsigned char crc0,sum0,para;

   279:         char i;

   280: 

   281:     crc0 = 0x55;

   282:         I2C_Write(FM24C16addr,0,1,&crc0);

   283:      DelyNms(1);

   284:     sum0 = 0xaa;

   285:     I2C_Write(FM24C16addr,1,1,&sum0);

   286:      DelyNms(1);

   287:         crc0=0;

   288:         sum0=0;

   289:         for(i=4;i<DZSUM+4;i++)

   290:                 {

   291:           I2C_Read(FM24C16addr,i,1,&para); 

   292:                   crc0^=para;

   293:                   sum0^=para;

   294:         }

   295:         I2C_Write(FM24C16addr,2,1,&crc0);

   296:      DelyNms(1);

   297:     I2C_Write(FM24C16addr,3,1,&sum0);

   298:      DelyNms(1);

   299:      WP = 1;

   300: }

   301: 

   302: char LoadParameter(void)                                                //调装置定值

   303: {

   304:         if(CheckParameter()==FALSE)

   305:         {

   306:                 Load_DefaultValue();                                    //调确省定值

   307:                 if(CheckParameter()==FALSE)

   308:                 {               

   309:                         return FALSE;

   310:                 }

   311:         }

   312:         return TRUE;

   313: }

   314: unsigned char ReadParameter(void)

   315: {

   316:    if(CheckParameter()==FALSE) Load_DefaultValue();             

   317:    return TRUE;                 //调确省定值

   318: }

   319: 

   320: unsigned char WriteParameter(void)

   321: {

   322:      unsigned char *P;

   323:      *P = &Para;

   324:      I2C_Write(FM24C16addr,0x04,4,P++);

   325:      DelyNms(1);

   326:      I2C_Write(FM24C16addr,8,2,P++);  

   327:      DelyNms(1);

   328:      WP = 1;

   329:      watchDOG();     

   330:          FinishParams(); 

   331:      watchDOG();

   332:      return  TRUE;

   333: }

⌨️ 快捷键说明

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