以前我的一个帖子介绍GPS+AT89S52+LCD1602显示,见下面链接内容 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
http://bbs.ednchina.com/showtopic.aspx?id=42543。很多网友问有没有c版
本的,现在提供一个基于51系列 lcd128*64 显示的GPS接收机。
1.GPS模块
GPS模块选用常用的GARMIN GPS25-LP型GPS-OEM板。
图1.1
其管脚功能如下:
引脚1: 串行口2数据的输出端。
引脚2: 串行口2数据的输入端。
引脚3: 秒脉冲输出端,精度为±1us。
引脚4: 串行口1数据的输出端。
引脚5: 串行口1数据的输入端。
引脚6: 掉电模式控制端。
引脚7: 外部备用电源输入端。
引脚8: GND接地端。
引脚9: Vin输入端
引脚10:电源输入端,与9脚相连。
引脚11:空脚NC。
引脚12: NMEA(美国海洋电子协会)0183,Ver1.5格式语句输出端。
注意:
本人使用的是LVS版本的GARMIN25-LP型。串口是232电平。与
计算机连接的串口2无需电平转换。而与单片机连接的串口1要进行电平转换。
切记--(^_^)。
图1.2
2. LCD128*64液晶
选用带字库的ST7920控制器的JHD<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />529M1型12864液晶作为显示器,采用串行接
口,简单方便。
管脚号 | 管脚名称 | 电平 | 管脚功能描述
|
1 | VSS | 0V | 电源地
|
2 | VCC | 3.0+5V | 电源正
|
3 | V0 | - | 对比度(亮度)调整
|
4 | RS(CS) | H/L | RS=“H”,表示DB7——DB0为显示数据
RS=“L”,表示DB7——DB0为显示指令数据
|
5 | R/W(SID) | H/L | R/W=“H”,E=“H”,数据被读到DB7——DB0
R/W=“L”,E=“H→L”, DB7——DB0的数据被写
到IR或DR
|
6 | E(SCLK) | H/L | 使能信号
|
7 | DB0 | H/L | 三态数据线
|
8 | DB1 | H/L | 三态数据线
|
9 | DB2 | H/L | 三态数据线
|
10 | DB3 | H/L | 三态数据线
|
11 | DB4 | H/L | 三态数据线
|
12 | DB5 | H/L | 三态数据线
|
13 | DB6 | H/L | 三态数据线
|
14 | DB7 | H/L | 三态数据线
|
15 | PSB | H/L | H:8位或4位并口方式,L:串口方式(见注释1)
|
16 | NC | - | 空脚
|
17 | /RESET | H/L | 复位端,低电平有效(见注释2)
|
18 | VOUT | - | LCD驱动电压输出端
|
19 | A | VDD | 背光源正端(+5V)(见注释3)
|
20 | K | VSS | 背光源负端(见注释3) |
*注释1:如在实际应用中仅使用并口通讯模式,可将PSB接固定高电平,也可
以将模块上的J8和“VCC”用焊锡短接。
*注释2:模块内部接有上电复位电路,因此在不需要经常复位的场合可将该端
悬空。
*注释3:如背光和模块共用一个电源,可以将模块上的JA、JK用焊锡短接。
3.电源
电源部分可以采用市电变压供电也可以采用7~9电源器供电。
部分程序:
1.串行口中断函数,用于语句'$GPGGA'判断和此语句的接收。
void serial() interrupt 4 using 2
{
uchar pp;
RI=0;
pp=SBUF;
if(ENflag==1) //串口接收完毕,可以用来显示,清标志位重新开始
{
disp_flag=1;
serial_byte = 0;
}
else if(DFflag==1) //'$GPGGA'头判断完毕,开始接收$GPGGA,语句的数据
{
if(pp==42)
ENflag="1"; //等待收到'*'结束接收
else
{
serial_buff[serial_counter]=pp; //没收到'*',继续接收,数据放入串口缓冲
serial_counter++;
}
}
else if(Aflag==1) //第六个为'A',判断第七个是不是','
{
if(pp==44)
DFflag="1"; //第七个个是','开始接收$GPGGA,语句的数据
else
serial_byte = 0; //不是',',清标志位
}
else if(G3flag==1) //第五个为'G',判断第六个是不是'A'
{
if(pp==65)
Aflag="1"; //第六个是'A'判断下一个是不是','
else
serial_byte = 0; //不是'A',清标志位
}
else if(G2flag==1) //第四个为'G',判断第五个是不是'G'
{
if(pp==71)
G3flag=1; //第五个是'G'判断下一个是不是'A'
else
serial_byte = 0; //不是'G',清标志位
}
else if(Pflag==1) //第三个为'P',判断第四个是不是'G'
{
if(pp==71)
G2flag=1; //第四个是'G'判断下一个是不是'G'
else
serial_byte = 0; //不是'G',清标志位
}
else if(G1flag==1) //第二个为'G',判断第三个是不是'P'
{
if(pp==80)
Pflag="1"; //第三个是'P'判断下一个是不是'G'
else
serial_byte = 0; //不是'P',清标志位
}
else if(Sflag==1) //第一个为'$',判断第二个是不是'G'
{
if(pp==71)
G1flag=1; //第二个是'G'判断下一个是不是'P'
else
serial_byte = 0; //不是'G',清标志位
}
else if(pp==0x24) //判断第一个是不是$
{
Sflag="1"; //第一个为$,判断下一个是不是G
serial_counter=0; //串行计数器清零
}
}
2.LCD 写函数
void wr_lcd (uchar dat_comm,uchar content)
{
uchar a,i,j;
delay (50);
a="content";
cs="1";
sclk="0";
std="1";
for(i=0;i<5;i++)
{
sclk="1";
sclk="0";
}
std="0";
sclk="1";
sclk="0";
if(dat_comm)
std="1"; //data
else
std="0"; //command
sclk="1";
sclk="0";
std="0";
sclk="1";
sclk="0";
for(j=0;j<2;j++)
{
for(i=0;i<4;i++)
{
a="a"<<1;
std="CY";
sclk="1";
sclk="0";
}
std="0";
for(i=0;i<4;i++)
{
sclk="1";
sclk="0";
}
}
}
---------------------------------zjw500 写于17:49.
文章评论(0条评论)
登录后参与讨论