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

📄 straincollector.lst

📁 51单片机实现接收桥梁健康监测数据的代码,主要测量桥梁挠度!!数据通过GPRS传送!
💻 LST
📖 第 1 页 / 共 4 页
字号:
 979   2              {
 980   3                  // timeout时,用0改写数据。
 981   3                  g_strainData[i][0] = 0;
 982   3                  g_strainData[i][1] = 0;
 983   3                  g_strainData[i][2] = 0;
 984   3                  g_strainData[i][3] = 0;
 985   3                  g_strainData[i][4] = 0;
C51 COMPILER V8.02   STRAINCOLLECTOR                                                       10/08/2002 23:21:00 PAGE 17  

 986   3              }
 987   2              else
 988   2              {
 989   3                  g_strainData[i][0] = g_sdata[0];
 990   3                  g_strainData[i][1] = g_sdata[1];
 991   3                  g_strainData[i][2] = g_sdata[2];
 992   3                  g_strainData[i][3] = g_sdata[3];
 993   3                  g_strainData[i][4] = g_sdata[4];
 994   3              }
 995   2                  count++;
 996   2                  ET0 = 1;
 997   2              // 找到下一个有效的应变计,设置选通,再开始发方波
 998   2          }
 999   1          // todo: 关采集电路电源
1000   1          P3_6 = 1;
1001   1      }
1002          /******************************************
1003          执行一条命令
1004          1. 接收一条命令
1005          2. 如果不是发送给自己的,返回。
1006          3. 处理命令
1007          example: 
1008          rec: (0xAA 0x01 0x13 0x01 0x00 crc)
1009          send: (0xAA 0x14 0x13 0x01 0x00 crc)
1010          *****************************************/
1011          void do_cmd()
1012          {
1013   1          uchar n;
1014   1          receive_cmd();
1015   1              
1016   1          if (ISTIMEOUT())
1017   1              return;
1018   1          if (TID != g_cmdData[CMDTID] || MID != g_cmdData[CMDMID])
1019   1              return;
1020   1              
1021   1          if (g_cmdData[CMDCRC] != 0)
1022   1          {   // data invalid
1023   2              g_cmdData[CMD] = CMD_CRCERR;
1024   2              g_cmdData[CMDDLEN] = 0;
1025   2              send_cmd();
1026   2              return;
1027   2          }
1028   1              
1029   1          switch (g_cmdData[CMD])
1030   1          {
1031   2          case 0x00:
1032   2              break;
1033   2          case CMD_ADDRCONFIRM:
1034   2              //  地址确认
1035   2              g_cmdData[CMD] = 0x14;
1036   2              g_cmdData[CMDDLEN] = 0;
1037   2              send_cmd();
1038   2              break;
1039   2          case CMD_COLLECT:
1040   2              //  采样命令
1041   2              g_cmdData[CMD] = 0x14;
1042   2              g_cmdData[CMDDLEN] = 0;
1043   2              send_cmd();
1044   2                      
1045   2              //  进行采样
1046   2                      Collect();
1047   2              break;
C51 COMPILER V8.02   STRAINCOLLECTOR                                                       10/08/2002 23:21:00 PAGE 18  

1048   2                      
1049   2          case CMD_READDATA:
1050   2              // 读取数据
1051   2              send_data();
1052   2              break;
1053   2                      
1054   2          case CMD_RETRY:
1055   2              // todo: 重发命令(暂缓)
1056   2              break;
1057   2                      
1058   2          case CMD_UPSLPTM:
1059   2              //  更新唤醒时间
1060   2              n=7;
1061   2              CLEAR(g_dslpTime, n)
1062   2                              switch(g_cmdData[CMDDLEN])
1063   2              {
1064   3                              
1065   3              case 0x02:
1066   3                      g_dslpTime[MIN] = g_cmdData[CMDDATA1];
1067   3              case 0x01:
1068   3              default:
1069   3                      g_dslpTime[HOUR] = g_cmdData[CMDDATA0];
1070   3                      break;
1071   3              }
1072   2              break;
1073   2                      
1074   2          case CMD_DSLEEP:
1075   2              // todo: 将定时器改为每小时报警功能,进入深度休眠
1076   2              //set_wake_time();
1077   2              deep_sleep();
1078   2              break;
1079   2          default:
1080   2              // send error cmd message
1081   2              break;
1082   2          }
1083   1      }
1084          
1085          ///////////////////////////////////////////////////////////////////////////////
1086          // 外部定时器函数
1087          /********************************************
1088          内部函数,延时1
1089          ********************************************/
1090          void Delay()
1091          {
1092   1          _nop_();
1093   1              _nop_();
1094   1              _nop_();
1095   1         _nop_(); /*根据晶振频率制定延时时间*/
1096   1      }
1097          
1098          /********************************************
1099          内部函数,I2C开始
1100          ********************************************/
1101          void Start()
1102          {  EA=0;
1103   1         SDA=1;
1104   1         SCL=1;
1105   1         Delay();
1106   1         SDA=0;
1107   1         Delay();
1108   1         SCL=0;
1109   1      }
C51 COMPILER V8.02   STRAINCOLLECTOR                                                       10/08/2002 23:21:00 PAGE 19  

1110          /********************************************
1111          内部函数,I2C结束
1112          ********************************************/
1113          void Stop()
1114          {
1115   1         SDA=0;
1116   1         SCL=0;
1117   1         Delay();
1118   1         SCL=1;
1119   1         Delay();
1120   1         SDA=1;
1121   1         Delay();
1122   1         EA=1;
1123   1      }
1124          /********************************************
1125          内部函数,输出ACK ,每个字节传输完成,输出ack=0,结束读书据,ack=1;
1126          ********************************************/
1127          void WriteACK(uchar ack)
1128          {
1129   1         SDA=ack;
1130   1         Delay();
1131   1         SCL=1;
1132   1         Delay();
1133   1         SCL=0;
1134   1      }
1135          /********************************************
1136          内部函数,等待ACK
1137          ********************************************/
1138          void WaitACK()
1139          {  uchar errtime=20;
1140   1         SDA=1;
1141   1         Delay(); /*读ACK*/
1142   1         SCL=1;
1143   1         Delay();
1144   1         while(SDA)
1145   1         {  errtime--;
1146   2            if(!errtime) Stop();
1147   2         }
1148   1         SCL=0;
1149   1         Delay();
1150   1      }
1151          /********************************************
1152          内部函数.输出数据字节
1153          入口:B=数据
1154          ********************************************/
1155          void writebyte(uchar wdata)
1156          {
1157   1         uchar i;
1158   1         for(i=0;i<8;i++)
1159   1         {
1160   2             if(wdata&0x80) SDA=1;
1161   2             else SDA=0;
1162   2             wdata<<=1;
1163   2             SCL=1;
1164   2             Delay();
1165   2             SCL=0;
1166   2         }
1167   1         WaitACK();     //I2C器件或通讯出错,将会退出I2C通讯
1168   1      }
1169          /********************************************
1170          内部函数.输入数据
1171          出口:B
C51 COMPILER V8.02   STRAINCOLLECTOR                                                       10/08/2002 23:21:00 PAGE 20  

1172          ********************************************/
1173          uchar Readbyte()
1174          {
1175   1         uchar i,bytedata;
1176   1         SDA=1;
1177   1         for(i=0;i<8;i++)
1178   1         {
1179   2            SCL=1; 
1180   2            bytedata<<=1;
1181   2            bytedata|=SDA;
1182   2            SCL=0;
1183   2            Delay();
1184   2         }
1185   1         return(bytedata);
1186   1      }
1187          /********************************************
1188          输出数据->pcf8563
1189          ********************************************/
1190          void writeData(uchar address,uchar mdata)
1191          {
1192   1         Start();
1193   1         writebyte(0xa2); /*写命令*/
1194   1         writebyte(address); /*写地址*/
1195   1         writebyte(mdata); /*写数据*/
1196   1         Stop();
1197   1      }
1198          /********************************************
1199          输入数据<-pcf8563
1200          ********************************************/
1201          uchar ReadData(uchar address) /*单字节*/
1202          {  uchar rdata;
1203   1         Start();
1204   1         writebyte(0xa2); /*写命令*/
1205   1         writebyte(address); /*写地址*/
1206   1         Start();
1207   1         writebyte(0xa3); /*读命令*/
1208   1         rdata=Readbyte();
1209   1         WriteACK(1);
1210   1         Stop();
1211   1         return(rdata);
1212   1      }
1213          
1214          void ReadBuff(uchar address,uchar count,uchar * buff) /*多字节*/
1215          {  uchar i;
1216   1         Start();
1217   1         writebyte(0xa2); /*写命令*/
1218   1         writebyte(address); /*写地址*/
1219   1         Start();
1220   1         writebyte(0xa3); /*读命令*/
1221   1         for(i=0;i<count;i++)
1222   1         {
1223   2              buff[i]=Readbyte();
1224   2              if(i<count-1) WriteACK(0);
1225   2         }
1226   1        WriteACK(1);
1227   1         Stop();
1228   1      }
1229          
1230          void P8563_set3s()
1231          {
1232   1          writeData(0x01,0x11);   // 定时有效
1233   1          writeData(0x0E,0x81);   // 64Hz
C51 COMPILER V8.02   STRAINCOLLECTOR                                                       10/08/2002 23:21:00 PAGE 21  

1234   1          writeData(0x0F,0xC0);   // 0xc0/64 = 3s
1235   1      }
1236          
1237          void P8563_setAlarm()
1238          {
1239   1          writeData(0x1,0x12); /*报警有效*/
1240   1          writeData(0x9,0x55); /*每个小时的59'报警*/ 
1241   1          writeData(0x00,0x00);   
1242   1      }
1243          
1244          void P8563_init()
1245          {
1246   1          set_wake_time();
1247   1              writeData(0x1,0x12); /*报警有效*/
1248   1          writeData(0x9,0x55); /*每个小时的59'报警*/ 
1249   1              writeData(0x00,0x00);   
1250   1      }         
1251          
1252          void main()
1253          {
1254   1              uchar i,j;
1255   1          Init_Interrupt();
1256   1          // Init Chip
1257   1          Init_Chip();
1258   1      
1259   1      //      P8563_init();
1260   1          
1261   1              for (i=0; i<8; i++)
1262   1              for (j=0; j<5;j++)
1263   1                      gx_straindata[i][j] = (i<<4)|(i+j);
1264   1      
1265   1              change();
1266   1              // 确定应变计个数
1267   1      //      Init_Strainor();
1268   1              g_strainflag = 0xFF;
1269   1              gprs_start();
1270   1      
1271   1              gprs_Init();
1272   1              
1273   1          while(1)
1274   1              {
1275   2                  // 工作状态
1276   2                      gprs_CMGF();
1277   2                      gprs_delay();
1278   2                      gprs_CNMI();
1279   2                      gprs_delay();
1280   2                      if (gprs_CMGR())
1281   2                      {
1282   3                              Collect();
1283   3                              change();
1284   3                              gprs_CMGS();
1285   3                      }
1286   2                      for(i=0;i<250;i++)
1287   2                              delay500ms();
1288   2      
1289   2              }
1290   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   5417    ----
   CONSTANT SIZE    =     15    ----
C51 COMPILER V8.02   STRAINCOLLECTOR                                                       10/08/2002 23:21:00 PAGE 22  

   XDATA SIZE       =    344    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     15      32
   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 + -