51单片机利用串口接收GPS信号并液晶显示C语言

更新时间:2023-11-25 14:16:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

#include //89C52单片机头文件 #include //液晶LCD的字模文件 #include

//功能引脚定义

sbit A = P0^7; //数据1/命令0选择 sbit RW = P0^6; //读1/写0 sbit E1 = P0^4; //片选1(Master) sbit E2 = P0^5; //片选2(slave) sbit LED= P0^3; //背光 sbit up = P0^0; //向上翻页键 sbit down= P0^1; //向下翻页键 #define data P2 //液晶并行数据

//液晶显示控制命令表 #define disp_on 0xAf //显示关闭 #define disp_off 0xAe //显示打开 #define disp_start_line 0xC0 //显示起始地址(后5位-表示0-31行) #define page_addr_set 0xB8 //页地址设置(0~3) #define col_addr_set 0x00 //列地址设置(0~61) #define status_busy 0x80 //0=ready #define modeRWite 0xEE //写模式 #define dynamic_driver 0xA4 //动态驱动 #define adc_select 0xA0 //clockwise #define clk32 0xA9 //刷新时钟设置1/32 #define clk16 0xA8 //刷新时钟设置1/16 #define reset 0xE2 //软件复位

#define uchar unsigned char #define uint unsigned int

//全局变量,及标志位定义 uchar time_counter = 0; //定时器的软件计数器 uchar key = 0; //键盘值 uchar serial_counter; //串行计数器

bit disp_flag = 0; //显示更新标志

uchar bdata serial_byte = 0; //串行口标志位定义字节

sbit Sflag = serial_byte^0; //串行接收头部标志,一下8个都定义在'serial_byte'内 sbit G1flag = serial_byte^1;

sbit Pflag = serial_byte^2; sbit G2flag = serial_byte^3; sbit G3flag = serial_byte^4; sbit Aflag = serial_byte^5; sbit DFflag = serial_byte^6; sbit ENflag = serial_byte^7; bit r_flag = 0;

unsigned char idata serial_buff[77]; //串行接收缓冲 //uchar code head[] = {'$','G','P','G','G','A',','}; //bit serial_flag = 0;

////液晶操作主要函数//////////////////////////////////////////////////////////// //void lcd_init(void)

//引用:lcd_init(); 说明:LCD初始化;

//////////////////////////////////////////////////////////////////////////////// //void lcd_clr(void)

//引用:lcd_clr(); 说明:LCD清屏;

////////////////////////////////////////////////////////////////////////////////

void lcd_init(void); //LCD初始化 void lcd_clr(void); //LCD清屏 void wait_ready(void); //等待ready

void draw_bmp(uchar col,uchar layer,uchar width,uchar *bmp); //点阵码显示输出 void ASCII2BCD(void); //ASCII码转换为BCD码 void logo(void); //开机画面显示

/*---------------------------------------------------------------------------- 中断程序

-----------------------------------------------------------------------------*/ //////////////////////////////////////////////////////////////////////////////// //定时器0中断函数,用于控制背光灯延时10S熄灭 /////////////////////////////////////////////////////////////////////////////// void int_t0() interrupt 1 using 1 { //定时器0中断函数,用于控制背光灯延时10S熄灭 TH0 = 0x4C; TL0 = 0x00; //重装定时器0,定时50mS time_counter ++; //软件计数器+1;

if (time_counter == 200) //软件计数器定时到10S,关背光,定时器0,清软件计数器 { time_counter = 0; LED = 1; TR0 = 0;

} }

////////////////////////////////////////////////////////////////////////////////

//串行口中断函数,用于语句'$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; //串行计数器清零 } } /*

void serial() interrupt 4 using 2 {

uchar i,buff; RI = 0;

buff = SBUF;

if(serial_flag == 1) {

serial_buff[serial_counter] = buff;

serial_counter ++; if(serial_counter > 37) {

serial_flag = 0; serial_counter = 0; for(i=0;i>7;i++) {

if(head[i] == serial_buff[i]) {

disp_flag = 1; } else {

disp_flag = 0; i = 8; } }

}

} else {

if(SBUF == '$') {

serial_buff[0] = buff; serial_flag = 1; serial_counter ++; } else {

serial_flag = 0; serial_counter = 0; } } } */

//////////////////////////////////////////////////////////////////////////////// //调用方式:void send_mi(uchar instuction)

//函数说明:发指令instruction到主窗口(内函数,私有,用户不能直接调用)

本文来源:https://www.bwwdw.com/article/xpst.html

Top