📄 can_gps.lst
字号:
967 1 byte_count=0; //位数计数器
968 1 cmd_number=0; //命令类型,数据类型:1、GGA 2、GSV 3、RMC
969 1 mode=0; //0:结束模式,1:命令模式(判断数据类型)2:数据模式(数据接受和处理)
970 1 buf_full=0; //1:整句接收完成,相应数据有效。0:缓存数据无效。
971 1
972 1 initial_screen();
973 1 screen_cls();
974 1 dis_hz_str(1,2,"卫星定位系统",6);
975 1 dis_hz_str(3,1,"不大点电子实验室",8);
976 1 dis_hz_str(4,2,"东北农业大学",6);
977 1 delay_us(60000);
978 1 instruct(clear);delay_us(100);
979 1 init();
980 1 dis_str(2,4,"Connect...",10);
981 1 delay_us(65000);
982 1 screen_cls();
C51 COMPILER V8.05a CAN_GPS 06/20/2008 15:11:44 PAGE 17
983 1 }
984 /**************************************************************************************************/
985 /********************** 主函数 ********************************************************************/
986 /**************************************************************************************************/
987 void main(void)
988 {
989 1 uchar key_val;
990 1 //code uchar buff0[]="a1234567890";
991 1 //code uchar buff1[]={'a','0','1','2','3','4','5','6','7','8','9'};
992 1 //uchar str[6];
993 1
994 1 SYS_init(); /*系统初始化*/
995 1 InitialCAN();
996 1 EX0=1; // 开外部中断
997 1 IT0=0; // 外部中断源采用边沿触发方式
998 1
999 1 while(1)
1000 1 {
1001 2 //key_val=keys();
1002 2 switch(key_val)
1003 2 {
1004 3 case 1: /*get_24_buff(buff_send_SPI,1);comm_buff(buff_send_SPI,17);*/;break;
1005 3 case 2: machine_NUM++;break;
1006 3 case 3: machine_NUM--;break;
1007 3 case 4: break;
1008 3 default:break;
1009 3 }
1010 2 if(buf_full==0) //无GPS信号时
1011 2 {
1012 3 dsp_count++;
1013 3 if(dsp_count>=1000)
1014 3 {
1015 4 screen_cls(); //清屏
1016 4 dis_str(2,1,"No GPS Connect..",16);
1017 4 while(buf_full==0)
1018 4 {
1019 5 delay_us(30000);
1020 5 //spi_out(NO_GPS,19);
1021 5 request_data(NO_GPS,19);
1022 5 }
1023 4 screen_cls();
1024 4 dsp_count=0;
1025 4 }
1026 3 }
1027 2 else
1028 2 { //有GPS信号时
1029 3 if(lock=='0') //未定位
1030 3 //spi_out(NO_position,19);
1031 3 request_data(NO_position,19);
1032 3 else
1033 3 { //已定位
1034 4 //data_dispose();
1035 4 //spi_out(buff_send_SPI,19);
1036 4 request_data(GPSdata,40);
1037 4 }
1038 3 //save_24_buff(buff_send_SPI,1);
1039 3 if(buf_full|0x01) //GGA语句
1040 3 {
1041 4 if(lock=='0')//如果未定位
1042 4 {dis_str(1,1,"**/**/",6); //日期
1043 5 dis_str(1,11,"**:**:**",8); //时间
1044 5 dis_str(2,1,"***.**",6); //海拔
C51 COMPILER V8.05a CAN_GPS 06/20/2008 15:11:44 PAGE 18
1045 5 dis_str(2,11,"***.**",6); //速度
1046 5 dis_str(3,1,"-----.----",12);
1047 5 dis_str(3,11,"**",2); //显示经度方向
1048 5 dis_str(3,15,"**",2); //显示接收卫星数
1049 5 dis_str(4,1," --.--.---- ",12);
1050 5 dis_str(4,11,"**",2); //显示纬度方向
1051 5 dis_str(4,15,"**",2); //显示天空卫星总数
1052 5 }
1053 4 else //如果已定位
1054 4 {
1055 5 dis_str(1,1,date,6); //日期
1056 5 dis_str(1,9,time,8); //时间
1057 5
1058 5 dis_str(2,1,altitude,7); //海拔
1059 5 dis_str(2,11,speed,6); //速度
1060 5
1061 5 dis_str(3,1,JD,10); //显示经度
1062 5 dis_str(3,11,JD_a,2); //显示经度方向
1063 5 dis_str(3,15,use_sat,2); //显示接收卫星数
1064 5
1065 5 dis_str(4,2,WD,9); //显示纬度
1066 5 dis_str(4,11,WD_a,2); //显示纬度方向
1067 5 dis_str(4,15,total_sat,2); //显示天空卫星总数
1068 5
1069 5 buf_full&=~0x01;
1070 5 dsp_count=0;
1071 5 }
1072 4 }
1073 3 if(buf_full|0x02) //GSV语句
1074 3 {
1075 4 dis_str(1,15,total_sat,2); //显示天空卫星总数
1076 4 buf_full&=~0x02;
1077 4 dsp_count=0;
1078 4 }
1079 3 if(buf_full|0x04) //RMC语句
1080 3 {
1081 4 if(lock=='0')//如果未定位
1082 4 {
1083 5 dis_str(1,1,"**/**/",6); //日期
1084 5 dis_str(1,11,"**:**:**",8); //时间
1085 5 dis_str(2,1,"***.**",6); //海拔
1086 5 dis_str(2,11,"***.**",6); //速度
1087 5 dis_str(3,1,"-----.----",12);
1088 5 dis_str(3,11,"**",2); //显示经度方向
1089 5 dis_str(3,15,"**",2); //显示接收卫星数
1090 5 dis_str(4,1," --.--.---- ",12);
1091 5 dis_str(4,11,"**",2); //显示纬度方向
1092 5 dis_str(4,15,"**",2); //显示天空卫星总数
1093 5 }
1094 4 else //如果已定位
1095 4 {
1096 5 dis_str(1,1,date,6); //日期
1097 5 dis_str(1,9,time,6); //时间
1098 5
1099 5 //dis_str(2,1,altitude,7); //海拔
1100 5 dis_str(2,1,high,7); //高度
1101 5 dis_str(2,11,speed,6); //速度
1102 5
1103 5 dis_str(3,1,JD,12); //显示经度
1104 5 dis_str(3,13,JD_a,2); //显示经度方向
1105 5 dis_str(3,15,use_sat,2); //显示接收卫星数
1106 5
C51 COMPILER V8.05a CAN_GPS 06/20/2008 15:11:44 PAGE 19
1107 5 dis_str(4,2,WD,11); //显示纬度
1108 5 dis_str(4,13,WD_a,2); //显示纬度方向
1109 5 dis_str(4,15,total_sat,2); //显示天空卫星总数
1110 5
1111 5 buf_full&=~0x04;
1112 5 dsp_count=0;
1113 5 }
1114 4 }
1115 3 }
1116 2 }
1117 1 }
1118 /*************************************************************/
1119 /********************** 中断 *********************************/
1120 /*************************************************************/
1121 void DataReceive() interrupt 0 using 1
1122 {
1123 1 red=0; //接受指示
1124 1 EX0=0;
1125 1 SJA_BCANAdr=REG_INTERRUPT; //读取中断寄存器值,判断中断类型
1126 1 interrupt_flag=*SJA_BCANAdr;
1127 1 if((interrupt_flag&0x01)==1)//接收中断
1128 1 {
1129 2 BCAN_DATA_RECEIVE(SystemBuf); //读取缓冲区数据
1130 2 BCAN_CMD_PRG(RRB_CMD); //释放接收缓冲区
1131 2 request_flag=1;
1132 2 }
1133 1 if((interrupt_flag&0x04)==1)//错误中断
1134 1 {
1135 2 SJA_reset=0; //复位
1136 2 }
1137 1 EX0=1;
1138 1 }
1139 void time1_int(void) interrupt 3 using 2
1140 {
1141 1 return;
1142 1 }
1143 /*----------------------------------*/
1144 void SCON_int(void) interrupt 4 using 2 //串口接收中断
1145 {
1146 1 unsigned char tmp;
1147 1 if(RI)
1148 1 {
1149 2 tmp=SBUF;
1150 2 switch(tmp)
1151 2 {
1152 3 case '$':
1153 3 cmd_number=0; //命令类型清空
1154 3 mode=1; //接收命令模式
1155 3 byte_count=0; //接收位数清空
1156 3 GPSdataCount=0; //接收总数据计数器清空
1157 3 break;
1158 3 case ',':
1159 3 seg_count++; //逗号计数加1
1160 3 byte_count=0;
1161 3 break;
1162 3 case '*':
1163 3 switch(cmd_number)
1164 3 {
1165 4 case 1:
1166 4 buf_full|=0x01; //GGA接收完毕
1167 4 break;
1168 4 case 2:
C51 COMPILER V8.05a CAN_GPS 06/20/2008 15:11:44 PAGE 20
1169 4 buf_full|=0x02; //GSV接收完毕
1170 4 break;
1171 4 case 3:
1172 4 buf_full|=0x04; //RMC接收完毕
1173 4 break;
1174 4 }
1175 3 mode=0;
1176 3 break;
1177 3 default:
1178 3 if(mode==1)
1179 3 {
1180 4 //命令种类判断
1181 4 cmd[byte_count]=tmp; //接收字符放入类型缓存
1182 4 if(byte_count>=4)
1183 4 { //如果类型数据接收完毕,判断类型
1184 5 if(cmd[0]=='G')
1185 5 {
1186 6 if(cmd[1]=='P')
1187 6 {
1188 7 if(cmd[2]=='G')
1189 7 {
1190 8 if(cmd[3]=='G')
1191 8 {
1192 9 if(cmd[4]=='A')
1193 9 {
1194 10 cmd_number=1;
1195 10 mode=2;
1196 10 seg_count=0;
1197 10 byte_count=0;
1198 10 }
1199 9 }
1200 8 else if(cmd[3]=='S')
1201 8 {
1202 9 if(cmd[4]=='V')
1203 9 {
1204 10 cmd_number=2;
1205 10 mode=2;
1206 10 seg_count=0;
1207 10 byte_count=0;
1208 10
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -