📄 modbus.lst
字号:
857 4 }
858 3 else
C51 COMPILER V7.50 MODBUS 02/26/2006 22:47:28 PAGE 15
859 3 {
860 4
861 4 if(RX0_index==0)
862 4 {
863 5 if (the_char0 == RX0_START) //是起始符
864 5 {
865 6 RX0_Buf[RX0_index] = the_char0;
866 6 RX0_index++;
867 6 //RECEIVENUM1=2;
868 6 }
869 5 else //不是起始符
870 5 {
871 6
872 6 RX0_Ready =0;
873 6 RX0_index = 0;
874 6 //RECEIVENUM1=1;
875 6 }
876 5 }
877 4 else
878 4 {
879 5 if (the_char0 == RX0_END) //是结束符
880 5 {
881 6 RX0_Buf[RX0_index] = the_char0; // NULL-terminate message
882 6 RX0_Ready = 1; // post message ready
883 6 RX0_index = 0; // reset RX message index
884 6 }
885 5 else //不是结束符
886 5 {
887 6
888 6 RX0_Buf[RX0_index] = the_char0;
889 6 RX0_index++;
890 6 //RECEIVENUM1++;
891 6 }
892 5
893 5 }
894 4 }
895 3
896 3 }
897 2 else
898 2 {
899 3 ; // ignore character -- previous message has not been processed
900 3 }
901 2
902 2 }
903 1 else if (TI0 == 1)
904 1 {
905 2 TI0 = 0; // clear TX complete indicator
906 2 the_char0 = *TX0_ptr; // read next character in string
907 2 if(TX0_index<SENDNUM0)
908 2 {
909 3 TX0_ptr++;
910 3 TX0_index++; // get ready for next character
911 3 SBUF0 = the_char0; // transmit it
912 3
913 3 }
914 2 else
915 2 {
916 3 TX0_Ready = 1; // indicate ready for next TX
917 3 TX0_index=0;
918 3
919 3 }
920 2 }
C51 COMPILER V7.50 MODBUS 02/26/2006 22:47:28 PAGE 16
921 1 }
922
923 //------------------------------------------------------------------------------------
924 //RX0_BufClear()
925 //-----------------------------------------------------------------------------------
926 void RX0_BufClear(void)
927 {
928 1 unsigned char m;
929 1 for(m=0;m<5;m++)
930 1 {
931 2 RX0_Buf[m]=0x00;
932 2 }
933 1 }
934
935
936 //-------------------------------------------------------------------------------------
937 //写FLASH
938 //-------------------------------------------------------------------------------------
939 void FlashWrite(unsigned char xdata *pwrite,unsigned char *BufFrom)
940 {
941 1 unsigned char i;
942 1
943 1 WDTCN = 0xde; // disable watchdog timer
944 1 WDTCN = 0xad;
945 1 EA=0;
946 1
947 1 FLSCL |= 0x01; // Enable FLASH writes/erases
948 1
949 1 PSCTL |= 0x03; // set PSWE = PSEE = 1
950 1 PSCTL |= 0x04; // set SFLE = 1 (enable
951 1 // access to scratchpad)
952 1 *pwrite = 0x00; // erase SCRATCH PAGE 该页被擦除
953 1
954 1 PSCTL &= ~0x07; // set PSWE = PSEE = SLFE = 0
955 1
956 1 PSCTL |= 0x01; // set PSWE = 1 写FLASH允许
957 1
958 1
959 1 for(i=0;i<2;i++)
960 1 {
961 2 PSCTL |= 0x04; // set SFLE to enable FLASH writes
962 2 // to Scratch Pad memory
963 2 *pwrite++=*BufFrom++;
964 2
965 2 PSCTL &= ~0x04; // set SFLE to enable FLASH writes
966 2 // to Scratch Pad memory
967 2 }
968 1
969 1 PSCTL &= ~0x07; // set PSWE = PSEE = SFLE = 0
970 1 FLSCL &= ~0x01; // clear FLWE to disable FLASH
971 1 // write/erases
972 1 EA=1;
973 1
974 1
975 1 }
976
977 //--------------------------------------------------------------------------------------
978 //读FLASH
979 //--------------------------------------------------------------------------------------
980 void FlashRead(unsigned char code *pread,unsigned char *BufTo)
981 {
982 1 unsigned char i;
C51 COMPILER V7.50 MODBUS 02/26/2006 22:47:28 PAGE 17
983 1 for(i=0;i<2;i++)
984 1 {
985 2 PSCTL |= 0x04; // set SFLE to enable FLASH writes
986 2 // to Scratch Pad memory
987 2 BufTo[i]=*pread;
988 2 pread++;
989 2
990 2 PSCTL &= ~0x04; // clear SFLE to disable access
991 2 // to Scratch Pad memory
992 2 }
993 1
994 1 }
995
996 //-------------------------------------------------------------------------------------
997 //向总控中心发送传感器地址
998 //-------------------------------------------------------------------------------------
999 void SendCgqAddr(void)
1000 {
1001 1 unsigned char sendaddr[5];
1002 1 sendaddr[0]=0x7e;
1003 1 sendaddr[1]=0xe0;
1004 1 sendaddr[2]=raddr[0];
1005 1 sendaddr[3]=raddr[1];
1006 1 sendaddr[4]=0x0d;
1007 1 while (!TX0_Ready) ; // wait for transmitter to be available
1008 1 TX0_Ready = 0; // claim transmitter
1009 1 TX0_ptr = sendaddr; // set TX buffer pointer to point to
1010 1 // received message
1011 1 SENDNUM0=5;
1012 1
1013 1 TI0 = 1;
1014 1 }
1015
1016 //--------------------------------------------------------------------------------------
1017 //RX1_BufClear(void)
1018 //--------------------------------------------------------------------------------------
1019 void RX1_BufClear(void)
1020 {
1021 1 unsigned char m;
1022 1 for(m=0;m<64;m++)
1023 1 {
1024 2 RX1_Buf[m]=0x00;
1025 2 }
1026 1 }
1027
1028
1029 //---------------------------------------------------------------------------------------
1030 //定时器T2初始化子程序
1031 //---------------------------------------------------------------------------------------
1032 void Timer2_Init(void)
1033 {
1034 1 TH2=0XB8;
1035 1 TL2=0X00;
1036 1
1037 1 T2CON |=0X00; //T2定时器方式1,自动重装载
1038 1
1039 1 ET2=1; //定时器T2允许中断
1040 1
1041 1
1042 1 }
1043 //////////////////////////////////////////////////////////////////////////////////////////////////////////
-///////
C51 COMPILER V7.50 MODBUS 02/26/2006 22:47:28 PAGE 18
1044
1045
1046
1047 //---------------------------------------------------------------------------------------
1048 //定时器T2溢出中断处理子程序
1049 //---------------------------------------------------------------------------------------
1050 void Timer2_ISR(void) interrupt 5
1051 {
1052 1
1053 1 TF2=0; /*定时器T2溢出标志零*/
1054 1
1055 1 tend2=temp2;
1056 1 if(time2>=tend2)
1057 1 {
1058 2 TR2=0; //终止定时器T0
1059 2 sendinterva2=1;
1060 2 time2=0;
1061 2 }
1062 1 else
1063 1 {
1064 2 time2=time2+1;
1065 2 sendinterva2=0;
1066 2 }
1067 1
1068 1
1069 1 }
1070
1071 //--------------------------------------------------------------------------------------------
1072 //modubus串口通过485向传感器发送命令子程序,addr为传感器地址
1073 //--------------------------------------------------------------------------------------------
1074 void modbuscgqsend(unsigned char addr)
1075 {
1076 1 unsigned char Cd[6];
1077 1 unsigned char SendCd[8];
1078 1 unsigned int c,crc=0xFFFF;
1079 1 unsigned char i,j,temp;
1080 1 Cd[0]=addr;
1081 1 Cd[1]=0x03;
1082 1 Cd[2]=0x00;
1083 1 Cd[3]=0x00;
1084 1 Cd[4]=0x00;
1085 1 Cd[5]=0X02;
1086 1
1087 1 for (i=0;i<6;i++)
1088 1 {
1089 2 c=Cd[i] & 0x00FF;
1090 2 crc^=c;
1091 2 for(j=0;j<8;j++)
1092 2 {
1093 3 if (crc & 0x0001)
1094 3 {
1095 4 crc>>=1;
1096 4 crc^=0xA001;
1097 4 }
1098 3 else
1099 3 {
1100 4 crc>>=1;
1101 4 }
1102 3 }
1103 2 }
1104 1 temp=crc & 0x00ff;
1105 1 SendCd[6]=temp;
C51 COMPILER V7.50 MODBUS 02/26/2006 22:47:28 PAGE 19
1106 1 crc>>=8;
1107 1 temp=crc & 0x00ff;
1108 1 SendCd[7]=temp;
1109 1
1110 1 SendCd[0]=Cd[0];
1111 1 SendCd[1]=Cd[1];
1112 1 SendCd[2]=Cd[2];
1113 1 SendCd[3]=Cd[3];
1114 1 SendCd[4]=Cd[4];
1115 1 SendCd[5]=Cd[5];
1116 1
1117 1 while (!TX1_Ready); // wait for TX ready
1118 1 TX1_Ready = 0; // claim transmitter
1119 1 TX1_ptr = SendCd; // set buffer pointer
1120 1 SENDNUM1=8;
1121 1 RE485=1;
1122 1 SCON1 |= 0x02; // TI1 = 1; start transmit
1123 1
1124 1 }
1125
1126
1127
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 2438 ----
CONSTANT SIZE = 256 ----
XDATA SIZE = 2217 ----
PDATA SIZE = ---- ----
DATA SIZE = 15 32
IDATA SIZE = ---- ----
BIT SIZE = 13 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 1 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -