/*用W77E58单片机,对GPS进行解码。注:GPS的解码算法来源于网络,忘记了从那抄的了。呵呵
现在改进后是:
串口0:接PC,波特率
串口1:接GPS,波特率
代码如下,留作纪念,也算纪念奋斗了夜!
用W77E58单片机,对GPS进行解码。注:GPS的解码算法来源于网络,忘记了从那抄的了。呵呵
现在改进后是:
串口0:接PC,波特率
串口1:接GPS,波特率
代码如下,留作纪念,也算纪念奋斗了夜! */ /* 说明:Winbond 单片机W77E58 双串口测试程序 时间:年月日 程序:张建波 串口采用波特率 串口采用波特率 */ #include" w77e58.h" static int flag_1,flag_0; char c1[]="hello china"; //串口 char c2[]="hello World"; //串口 //串口9600 8 N 1 //串口4800 8 N 1 //GPS ----
//GPS数据存储数组 unsigned char JD[10]; //经度 unsigned char JD_a; //经度方向 unsigned char WD[9]; //纬度 unsigned char WD_a; //纬度方向 unsigned char time[6]; //时间 unsigned char speed[5]; //速度 unsigned char high[6];
//高度 unsigned char angle[5]; //方位角 unsigned char use_sat[2]; //使用的卫星数 unsigned char total_sat[2]; //天空中总卫星数 unsigned char lock; //定位状态
//串口中断需要的变量 unsigned char seg_count; //逗号计数器 unsigned char dot_count; //小数点计数器 unsigned char byte_count; //位数计数器 unsigned char cmd_number; //命令类型 unsigned char mode; //0:结束模式,:命令模式,:数据模式 unsigned char
buf_full; //1:整句接收完成,相应数据有效。:缓存数据无效。 unsigned char cmd[5]; //命令类型存储数组
//------ //状态指示灯 sbit P0_0=P0^0; sbit P0_1=P0^1; sbit P0_2=P0^2; sbit P0_3=P0^3; sbit P0_4=P0^4; sbit P0_5=P0^5; sbit P0_6=P0^6; sbit P0_7=P0^7; //----------------- main() { int i; flag_1=1; flag_0=1;
P0_0=1; P0_1=1; P0_2=1; P0_3=1; P0_4=1; P0_5=1; P0_6=1; P0_7=1;
//system init ,其中串口用定时器,串口用定时器 //串口的设置 IE=0x90; //允许总中断和串口的中断 TMOD=0x20; //定时器工作在模式 TL1=0xfa; //baud rate=4800 TH1=0xfa; SCON=0x58; //工作在模式,接收允许 PCON=0x00; // SM0=0 SM1=1 在位异步收发模式SMOD=0 溢出速率/32 ES1=1; //串口中断允许
//串口设置 T2CON=0x30; //用定时器做串口的波特率发生器 RCAP2H=0xff; // 11.0592M晶振下,baud rate=9600 //2400 RCAP2L=0xdc; //0x70; SCON1=0x58; //工作在模式,允许接收 TR2=1; TR1=1;
while(1) { if(flag_0) {TI=1;flag_0=0;} for(i=0;i<1000;i++); //if(flag_1) {TI_1=1;flag_1=0;} // for(i=0;i<1000;i++); if(buf_full==0) //无GPS信号时 { P0_0=1; //1表示没有信号 }else { P0_0=0; //有信号 if(buf_full|0x01) { //GGA语句 if(lock=='0')
{ //如果未定位 P0_0=1; }else { //如果已定位 P0_0=0; } } } } }
void serial_0(void)interrupt 4 { int i; if(RI) { flag_0=1; RI=0; } if(TI) { TI=0; SBUF=JD_a; //经度方向 while(TI==0) ; TI=0; for(i=0;i<10;i++){//经度 TI=0; SBUF=JD[i]; while(TI==0) ; TI=0; } TI=0; SBUF=WD_a; //纬度方向 while(TI==0)
; TI=0; for(i=0;i<6;i++){ //纬度 TI=0; SBUF=WD[i]; while(TI==0) ; TI=0; } TI=0; SBUF='D'; while(TI==0) ; TI=0;
TI=0; SBUF=use_sat[0]; while(TI==0) ; TI=0;
TI=0; SBUF=use_sat[1]; while(TI==0) ; TI=0;
TI=0; SBUF='/r'; while(TI==0) ; TI=0;
TI=0; SBUF='/n'; while(TI==0) ; TI=0;
} }
void serial_1(void)interrupt 7 { unsigned char tmp; if(RI_1) { P0_7=~P0_7; tmp=SBUF1; switch(tmp) { case '$': cmd_number=0; //命令类型清空 mode=1; //接收命令模式 byte_count=0; //接收位数清空 break; case ',': seg_count++;
//逗号计数加 byte_count=0; break; case '*': switch(cmd_number) { case 1: buf_full|=0x01; break; case 2: buf_full|=0x02; break; case 3: buf_full|=0x04; break; } mode=0; break; default: if(mode==1) { //命令种类判断 cmd[byte_count]=tmp; //接收字符放入类型缓存 if(byte_count>=4)
{ //如果类型数据接收完毕,判断类型 if(cmd[0]=='G') { if(cmd[1]=='P') { if(cmd[2]=='G') { if(cmd[3]=='G') { if(cmd[4]=='A') { cmd_number=1; mode=2; seg_count=0; byte_count=0; } } else if(cmd[3]=='S') { if(cmd[4]=='V') { cmd_number=2; mode=2; seg_count=0; byte_count=0;
} } } else if(cmd[2]=='R') { if(cmd[3]=='M') { if(cmd[4]=='C') { cmd_number=3; mode=2; seg_count=0; byte_count=0; } } } } } } } else if(mode==2) { //接收数据处理 switch (cmd_number) { case 1: //类型数据接收。GPGGA switch(seg_count) { case 2:
//纬度处理 if(byte_count<9) { WD[byte_count]=tmp; } break; case 3: //纬度方向处理 if(byte_count<1) { WD_a=tmp; } break; case 4: //经度处理 if(byte_count<10) { JD[byte_count]=tmp; } break; case 5:
//经度方向处理 if(byte_count<1) { JD_a=tmp; } break; case 6: //定位判断 if(byte_count<1) { lock=tmp; } break; case 7: //定位使用的卫星数 if(byte_count<2) { use_sat[byte_count]=tmp; } break; case 9:
//高度处理 if(byte_count<6) { high[byte_count]=tmp; } break; } break; case 2: //类型数据接收。GPGSV switch(seg_count) { case 3: //天空中的卫星总数 if(byte_count<2) { total_sat[byte_count]=tmp; } break; } break; case
3: //类型数据接收。GPRMC switch(seg_count) { case 1: if(byte_count<6) { //时间处理 time[byte_count]=tmp; } break; case 7: //速度处理 if(byte_count<5) { speed[byte_count]=tmp; } break; case 8:
//方位角处理 if(byte_count<5) { angle[byte_count]=tmp; } break; } break; } } byte_count++; //接收数位加 break; } } RI_1=0; }
分享到:
相关推荐
W77E58是一个快速8051 兼容微控制器...计,W77E58能够在低时钟频率下运行。W77E58内含32KB Flash EPROM,工作电压为4.5v-5.5v,具 有 1KB片上外部数据存储器,当用户应用时使用片上SRAM代替外部SRAM,可节省更多I/O口。
Keil C51中不自带W77E58 的头文件。自己做了一个,还是很久以前做得。希望有用。
W77E58的芯片英文资料,很详细的,希望对大家有用
W77E58中文资料
本文给大家介绍了W77E58单片机控制电路原理图。
W77E58双串口单片机原理图,笔者原创,欢迎有兴趣的朋友交流学习。QQ:281451020
有关此单片机的中文资料,来源于网上,和大家分享下,用于技术交流,望大家支持原作者
c语言编写的,如何使用串口进行通信,c语言编写的,如何使用串口进行通信
W77E58/W77E516 看门狗操作方法 C51代码
W77E58B中文手册,帮助大家尽快掌握W77E58
W77E58 华邦单片机12864 串口 矩阵键盘测试程序
W77E58知识和GPRS一些相关代码 W77E58知识和GPRS一些相关代码
W77E58单片机+MAX232+MAX485接口板AD设计硬件原理图+PCB文件,2层板设计,大小为72*53mm,可做为你的学习设计参考。
winbond w77e58扩展RAM以及双数据指针的编程方法演示
77E58与标准8051相兼容的全新核心的微处理器。由于去掉了多余的存储器周期和运算周期,它在相同周期里执行8051的指令比最初的8051快得多。典型的指令周期77E58比8051快1.5到3倍。电源消耗也做了改进采用静态COMS设计...
详细论述了W77E58单片机,MG-12232图形点阵式液晶显示器的硬件接口电路特点和接口软件编程方法,设计了液晶动态显示信息的算法,利用该算法可左右、上下滚动显示信息。给出了液晶显示模块在智能车载终端应用的实例,...
用keil编写的华邦W77E58贪吃蛇游戏,包括整个工程文件
W77E58 51单片机+CPLD 30路自动测温电路protel 设计硬件原理图PCB设计文件,采用2层板设计,板子大小为151x164mm,双面布局布线,主要器件包括W77E58,EPM7128SLC84-15(84),MAX232,SN7407 ,XTR105 等。...
华邦MCU,双串口,双数据指针等,高速单片机
w77e58 希望做毕业设计 的同胞们有个英文资料希望大家都有所进步,谢谢支持