51单片机利用串口接收GPS信号并液晶显示C语言
更新时间:2023-11-25 14:16:01 阅读量: 教育文库 文档下载
#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到主窗口(内函数,私有,用户不能直接调用)
正在阅读:
中国最新行政区划调整方案出台05-20
知识竞赛规则及评分标准03-08
大学生护肤品化妆品使用市场调查报告03-18
大上海观后感 - 图文04-27
初三一模考试语文总结05-23
文献检索考试题库(1)06-14
英语morning report09-06
江门市2008年高考模拟考试(历史)03-03
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 串口
- 单片机
- 液晶显示
- 接收
- 信号
- 利用
- 语言
- GPS
- 新世纪2大学英语教案
- 厦门集美区2011届初中毕业班质量检查物理试卷 - 图文
- 2019-2020学年九年级化学下册 第九单元 课题1 溶液的形成导学案(新版)新人教版 doc - 图文
- 电路原理填空题试题
- “十三五”规划重点-硫铅锌矿开采项目建议书(立项报告)
- 2017届高三上学期第一次三校联考英语试题带答案
- 人教部编版八年级语文下册第2课《回延安》导学案(无答案)
- 教育最新K12甘肃省武威第十八中学2019届高三语文上学期第二次诊断考试试题
- 2018年呼吁保护黄河作文
- 文化语言学
- (人教版)第五册数学全册教案-备课本模版(17)
- 成都宽窄巷子保护性开发的特点与启示
- 请从个人专业发展规划的角度谈一谈作为特岗教师应该从哪些方面提升自身的专业素养
- 关联词大全
- 2003年1月自学考试马克思主义哲学原理试题
- 锌空电池
- 税收学原理期末复习提纲
- 投资学-习题(第二篇)
- 公司OA办公系统存在的问题及建议
- ARCGIS软件应用案例