📄 straincollector.lst
字号:
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 + -