标题:
跪求大神看下我编写的单片机程序有哪些问题
[打印本页]
作者:
高九日
时间:
2020-4-26 19:22
标题:
跪求大神看下我编写的单片机程序有哪些问题
#include"reg51.h"
#include "stdio.h"
#include "intrins.h"
#include"System.h"
#define FALSE 0
#define TRUE 1
sbit SCLK = P1^7;
sbit MISO = P1^6;
sbit MOSI = P1^5;
sbit LCD_SH = P1^2;
sbit LCD_CS = P1^1;
#define LCD_SCLK SCLK
#define LCD_MISO MISO
#define LCD_MOSI MOSI
#define LCD_16dot_mode 1
#define LCD_12dot_mode 2
#define LCD_DRAW_mode 3
#define LCD_FD_DRAW_mode 4
#define LCD_FD_DATA 1
#define LCD_FD_ADDR 0
#define LCD_FD_CMD 0
//LCD命令及参数定义
#define LCD_CMD_HEAD 0x80
#define LCD_CMD_END 0x93
#define LCD_16DOT_MODE_CMD 0x81
#define LCD_12DOT_MODE_CMD 0x82
#define LCD_DRAW_MODE_CMD 0X83
#define LCD_FD_MODE_CMD 0x84
#define LCD_SET_CONTRAST_CMD 0x85
#define LCD_SET_BK_LCD_CMD 0x86
#define LCD_CLR_CMD 0x88
#define LCD_SLEEP_CMD 0x89
#define LCD_Cursor_CMD 0x8B
#define LCD_Hilight_CMD 0x8C
#define LCD_BK_Light_Ctl_Cmd 0x8d
#define LCD_ALL_Hilight 0
#define LCD_TXT_Hilight 1
#define LCD_DRAW_PIC_CMD 0x90
//命令画图模式下的画图模式设置
#define LCD_DRAW_WHOLE_PIC 0x01
#define LCD_DRAW_SPECIAL_ICON 0x02
#define LCD_DRAW_PROGRESS 0x03
#define LCD_EXIT_SLEEP_STA 0x9F
#define LCD_SET_NEW_POS_WORD 0x20
#define LCD_SET_DEF_POS_WORD 0x00
#define LCD_BK_ON 0x01
#define LCD_BK_OFF 0x00
#define LCD_START_ADC_CMD 0x87
#define LCD_READ_CMD 0x00
unsigned char idata temp_bu[20];
unsigned char idata temp_buf[20];
unsigned char idata gps_time1[12];
unsigned char idata gps_mode[3];
unsigned char idata gps_longitude[15];
unsigned char idata gps_longitude_dir[3];
unsigned char idata gps_latitude[15];
unsigned char idata gps_latitude_dir[3];
unsigned char idata gps_speed[8];
unsigned char idata gps_speed_dir[8];
unsigned char idata gps_time2[10];
unsigned char gps_data_ok_flag;
unsigned char idata gps_height[10];
unsigned char rx_height_mode;
unsigned char rx_height_count;
#define MAX_RX_BUF 12
unsigned char gps_rx_mode;
unsigned char rx_pointer;
unsigned char com_rx_buf[MAX_RX_BUF+1];
void cal_position_disp_datalatitude(void);
void cal_position_disp_datalongitude(void);
void TR_LCD_SPI_BYTE_FD(unsigned char dat,mode);
unsigned char TR_LCD_SPI_BYTE(unsigned char dat);
void Change_lcd_mode(unsigned char LCD_mode);
void LCD_Send_CMD_END(void);
void SET_LCD_POS(unsigned char mode ,Y,X);
void LCD_print_char(unsigned char Y,X,unsigned char *char_ptr,unsigned char End_flag);
void LCD_print_Curr_char(unsigned char *char_ptr,unsigned char End_flag);
void Send_LCD_string(unsigned char *char_ptr);
void Draw_lcd_whole_PIC(unsigned char ST_PIC,END_PIC,time);
void Draw_LCD_Specail_ICON(unsigned char mode,Y,X,height,width,unsigned char *data_ptr);
void Draw_LCD_Srepress(unsigned char Y,X,mode,width,curr_POS);
void Set_LCD_contrast(unsigned char CON_dat);
void Set_LCD_BK(unsigned char BKL_dat);
unsigned char Read_LCD_ADC(void);
unsigned char Check_LCD_Busy(unsigned char mode);
void Draw_LCD_Big_PIC(unsigned char Y,X,height,width,unsigned char *PIC_ptr);
void LCD_Exit_FD_DRAW_MODE(unsigned char new_mode);
void SET_LCD_SLEEP_MODE(void);
unsigned char SET_LCD_Exit_SLEEP(void);
void LCD_CLR_ALL(unsigned char At_once );
void LCD_Open_Cursor(unsigned char Cursor_width);
void LCD_Close_Cursor(void);
void LCD_Open_hilight(unsigned char Hilight_mode);
void LCD_Close_hilight(unsigned char Hilight_mode);
void LCD_BK_Light_SET(unsigned char Light_MODE);
void Init_LCD(void);
void Init_GPS_module(void);
unsigned char Cal_gas_data_to_disp(void);
void rx_gps_data(unsigned char com_rx_byte);
void delay_time(unsigned short t)
{
unsigned short n,m;
for(n=0;n<t;n++)
{
for(m=0;m<1000;m++)
{;}
}
}
void main(void)
{
unsigned char i;
Init_GPS_module();
Init_LCD();
EA=1;
while(1)
{
LCD_BK_Light_SET(TRUE);
Set_LCD_BK(1);
LCD_Open_Cursor(1);
LCD_Send_CMD_END();
delay_time(20);
LCD_Open_hilight(LCD_ALL_Hilight);
LCD_Send_CMD_END();
delay_time(500);
LCD_CLR_ALL(TRUE);
if(gps_data_ok_flag)
{
i=Cal_gas_data_to_disp();
if(i==1)
{
LCD_print_char(0, 0, "该地时间为~", FALSE);
LCD_Open_Cursor(0);
LCD_print_Curr_char(gps_time1,TRUE);
delay_time(200);
LCD_Open_Cursor(1);
LCD_print_char(1, 0, "该地经度为~", FALSE);
LCD_Open_Cursor(0);
LCD_print_Curr_char(temp_bu , TRUE);
delay_time(200);
LCD_Open_Cursor(0);
LCD_print_char(3, 0, "该地纬度为~", FALSE);
LCD_Open_Cursor(0);
LCD_print_Curr_char(temp_buf ,TRUE);
}
}
delay_time(20000);
}
}
void Delay_3US(void)
{
unsigned char t;
for(t=0;t<10;t++) //----
{
_nop_();
}
}
#ifdef HARD_SPI
unsigned char TR_LCD_SPI_BYTE(unsigned char dat)
{
while(!LCD_SH);
LCD_CS=0;
SPDAT=dat;
while(!(SPSTAT&0x80));
SPSTAT=0xc0;
LCD_CS=1;
return SPDAT;
}
#else
unsigned char TR_LCD_SPI_BYTE(unsigned char dat)
{
unsigned char temp_data,i;
while(!LCD_SH);
LCD_SCLK=0;
temp_data=dat;
LCD_CS=0;
MOSI=0;
for(i=0;i<8;i++)
{
if(temp_data&0x80)
LCD_MOSI=1;
else
LCD_MOSI=0;
temp_data<<=1;
LCD_SCLK=1;
if(LCD_MISO)
temp_data|=0x01;
//_nop_();
LCD_SCLK=0;
//_nop_();
}
LCD_CS=1;
return temp_data;
}
#endif
void Change_lcd_mode(unsigned char LCD_mode)
{
unsigned char temp_data;
if(LCD_mode)
{
if(LCD_mode<=LCD_FD_DRAW_mode)
{
temp_data=0x80+LCD_mode;
TR_LCD_SPI_BYTE(LCD_CMD_HEAD);
TR_LCD_SPI_BYTE(temp_data);
//LCD_Send_CMD_END();
}
}
}
void LCD_Send_CMD_END(void)
{
TR_LCD_SPI_BYTE(LCD_CMD_END);
Delay_3US();
Delay_3US();
}
void SET_LCD_POS(unsigned char mode ,Y,X)
{
unsigned char temp_data;
TR_LCD_SPI_BYTE(LCD_CMD_HEAD);
if(mode)
{
temp_data=Y;
temp_data&=0x0f;
temp_data|=LCD_SET_NEW_POS_WORD;
}
else
temp_data=LCD_SET_DEF_POS_WORD;
TR_LCD_SPI_BYTE(temp_data);
if(mode)
TR_LCD_SPI_BYTE(X);
}
void LCD_print_char(unsigned char Y,X,unsigned char *char_ptr,unsigned char End_flag)
{
SET_LCD_POS(TRUE, Y, X);
Send_LCD_string(char_ptr);
if(End_flag)
LCD_Send_CMD_END();
}
void LCD_print_Curr_char(unsigned char *char_ptr,unsigned char End_flag)
{
SET_LCD_POS(FALSE, 0, 0);
Send_LCD_string(char_ptr);
if(End_flag)
LCD_Send_CMD_END();
}
void Send_LCD_string(unsigned char *char_ptr)
{
while(*char_ptr!='~')
{
TR_LCD_SPI_BYTE(*char_ptr);
char_ptr++;
}
}
void Set_LCD_BK(unsigned char BKL_dat)
{
TR_LCD_SPI_BYTE(LCD_CMD_HEAD);
TR_LCD_SPI_BYTE(LCD_SET_BK_LCD_CMD);
TR_LCD_SPI_BYTE(BKL_dat);
}
void LCD_CLR_ALL(unsigned char At_once )
{
TR_LCD_SPI_BYTE(LCD_CMD_HEAD);
TR_LCD_SPI_BYTE(LCD_CLR_CMD);
if(At_once)
LCD_Send_CMD_END();
}
void LCD_Open_Cursor(unsigned char Cursor_width)
{
TR_LCD_SPI_BYTE(LCD_CMD_HEAD);
TR_LCD_SPI_BYTE(LCD_Cursor_CMD);
TR_LCD_SPI_BYTE(0x01);
TR_LCD_SPI_BYTE(Cursor_width);
}
void LCD_Open_hilight(unsigned char Hilight_mode)
{
TR_LCD_SPI_BYTE(LCD_CMD_HEAD);
TR_LCD_SPI_BYTE(LCD_Hilight_CMD);
TR_LCD_SPI_BYTE(Hilight_mode);
TR_LCD_SPI_BYTE(0x01);
}
void LCD_BK_Light_SET(unsigned char Light_MODE)
{
TR_LCD_SPI_BYTE(LCD_CMD_HEAD);
TR_LCD_SPI_BYTE(LCD_BK_Light_Ctl_Cmd );
TR_LCD_SPI_BYTE(Light_MODE);
}
void Init_LCD(void)
{
unsigned char i;
for(i=0;i<250;i++)
Delay_3US();
LCD_SH=1;
while(!LCD_SH);
}
void Init_GPS_module(void)
{
rx_pointer=0;
gps_rx_mode=0;
gps_data_ok_flag=0;
RI=0;
TI=0;
SCON=0x40;
PCON=0x00;
TMOD=0x20;
TH1=0xFD;
TL1=0xFD;
TR1=1;
REN=1;
ES=1;
}
void Uart_Isr(void) interrupt 4
{
if(RI)
{
rx_gps_data(SBUF);
}
if(TI)
{
;
}
RI=0;
TI=0;
}
void rx_gps_data(unsigned char com_rx_byte)
{
unsigned char i;
if(com_rx_byte==')
{
gps_rx_mode=0;
rx_pointer=0;
for(i=0;i<5;i++)
com_rx_buf[i]=0;
}
else
{
if(rx_pointer<MAX_RX_BUF)
com_rx_buf[rx_pointer++]=com_rx_byte;
}
switch(gps_rx_mode)
{
case 0:
if(com_rx_byte==',')
{
if((com_rx_buf[0]=='G')&&(com_rx_buf[1]=='P')&&(com_rx_buf[2]=='R')&&
(com_rx_buf[3]=='M')&&(com_rx_buf[4]=='C'))
{
gps_rx_mode=1;
}
else if((com_rx_buf[0]=='G')&&(com_rx_buf[1]=='P')&&(com_rx_buf[2]=='G')&&
(com_rx_buf[3]=='G')&&(com_rx_buf[4]=='A'))
{
rx_height_count=0;
rx_height_mode=0;
gps_rx_mode=12;
}
rx_pointer=0;
}
break;
case 1:
if(com_rx_byte==',')
{
for(i=0;i<rx_pointer;i++)
{
gps_time1[i]=com_rx_buf[i];
}
//gps_time1[i]='|';
gps_rx_mode=2;
rx_pointer=0;
}
break;
case 2:
if(com_rx_byte==',')
{
for(i=0;i<rx_pointer;i++)
{
gps_mode[i]=com_rx_buf[i];
}
//gps_mode[i]='|';
gps_rx_mode=3;
rx_pointer=0;
}
break;
case 3:
if(com_rx_byte==',')
{
for(i=0;i<rx_pointer;i++)
{
gps_latitude[i]=com_rx_buf[i];
}
//gps_longitude[i]='|';
gps_rx_mode=4;
rx_pointer=0;
}
break;
case 4:
if(com_rx_byte==',')
{
for(i=0;i<rx_pointer;i++)
{
gps_latitude_dir[i]=com_rx_buf[i];
}
//gps_longitude_dir[i]='|';
gps_rx_mode=5;
rx_pointer=0;
}
break;
case 5:
if(com_rx_byte==',')
{
for(i=0;i<rx_pointer;i++)
{
gps_longitude[i]=com_rx_buf[i];
}
//gps_latitude[i]='|';
gps_rx_mode=6;
rx_pointer=0;
}
break;
case 6:
if(com_rx_byte==',')
{
for(i=0;i<rx_pointer;i++)
{
gps_longitude_dir[i]=com_rx_buf[i];
}
//gps_latitude_dir[i]='|';
gps_rx_mode=7;
rx_pointer=0;
}
break;
case 7:
if(com_rx_byte==',')
{
for(i=0;i<rx_pointer;i++)
{
gps_speed[i]=com_rx_buf[i];
}
gps_rx_mode=8;
rx_pointer=0;
}
break;
case 8:
if(com_rx_byte==',')
{
for(i=0;i<rx_pointer;i++)
{
gps_speed_dir[i]=com_rx_buf[i];
}
gps_rx_mode=9;
rx_pointer=0;
}
break;
case 9:
if(com_rx_byte==',')
{
for(i=0;i<rx_pointer;i++)
{
gps_time2[i]=com_rx_buf[i];
}
gps_rx_mode=10;
rx_pointer=0;
}
break;
case 10:
if(com_rx_byte==',')
{
gps_rx_mode=11;
rx_pointer=0;
}
break;
case 11:
if(com_rx_byte==',')
{
gps_data_ok_flag=1;
gps_rx_mode=0;
rx_pointer=0;
}
break;
case 12: //接收海拔高度数据
if(com_rx_byte==',')
{
if(rx_height_mode==0)
{
rx_height_count++;
if(rx_height_count==8)
{
rx_height_mode=1;
rx_pointer=0;
}
}
else
{
for(i=0;i<rx_pointer;i++)
{
gps_height[i]=com_rx_buf[i];
}
gps_rx_mode=0;
rx_pointer=0;
// rx_height_mode=1;
// rx_pointer=0;
}
}
break;
default:
gps_rx_mode=0;
rx_pointer=0;
break;
}
com_rx_byte=0xff;
}
unsigned char cal_data_len(unsigned char *str)
{
unsigned char i=0;
while(*str!=',')
{
i++;
str++;
}
*str='~';
return i;
}
void Cal_gps_height(void)
{
unsigned char i;
i= cal_data_len(gps_height);
gps_height[i]='m';
gps_height[i+1]='~';
}
void Cal_gps_time(void)
{
unsigned char hh;
unsigned char i,temp_buff[10];
if(cal_data_len(gps_time1)!=0)
{
hh=(gps_time1[0]-'0')*10+(gps_time1[1]-'0');
hh+=8;
if(hh>=24)
hh-=24;
temp_buff[0]=hh/10+'0';
temp_buff[1]=hh%10+'0';
temp_buff[2]=':';
temp_buff[3]=gps_time1[2];
temp_buff[4]=gps_time1[3];
temp_buff[5]=':';
temp_buff[6]=gps_time1[4];
temp_buff[7]=gps_time1[5];
temp_buff[8]='~';
for(i=0;i<9;i++)
gps_time1[i]=temp_buff[i];
}
}
unsigned char Cal_gas_data_to_disp(void)
{
Cal_gps_height();
Cal_gps_time();
cal_position_disp_datalatitude();
cal_position_disp_datalongitude();
if(gps_mode[0]=='A')
return 1;
else
return 0;
}
void cal_position_disp_datalatitude(void)
{
unsigned int hen;
if(cal_data_len(gps_latitude)!=0)
{
hen=(gps_latitude[5]-'0')*1000+( gps_latitude[6]-'0')*100+( gps_latitude[7]-'0')*10+( gps_latitude[8]-'0');
hen=hen*60;
temp_buf[0]=gps_latitude_dir[0];
temp_buf[1]=gps_latitude[0];
temp_buf[2]=gps_latitude[1];
temp_buf[3]='d';
temp_buf[4]=gps_latitude[2];
temp_buf[5]=gps_latitude[3];
temp_buf[6]='m';
temp_buf[7]=hen/100000+'0';
temp_buf[8]=hen/10000%10+'0';
temp_buf[9]='.';
temp_buf[10]=hen%1000/100+'0';
temp_buf[11]=hen%100/10+'0';
temp_buf[12]=hen%10+'0';
temp_buf[13]='s';
temp_buf[14]='~';
}
}
void cal_position_disp_datalongitude(void)
{
unsigned int hen;
if(cal_data_len(gps_longitude)!=0)
{
hen=(gps_longitude[6]-'0')*1000+(gps_longitude[7]-'0')*100+(gps_longitude[8]-'0')*10+( gps_longitude [9]-'0');
hen=hen*60;
temp_bu[0]= gps_longitude_dir[0];
temp_bu[1]= gps_longitude[0];
temp_bu[2]= gps_longitude[1];
temp_bu[3]= gps_longitude[2];
temp_bu[4]='d';
temp_bu[5]= gps_longitude[3];
temp_bu[6]= gps_longitude[4];
temp_bu[7]='m';
temp_bu[8]=hen/100000+'0';
temp_bu[9]=hen/10000%10+'0';
temp_bu[10]='.';
temp_bu[11]=hen%1000/100+'0';
temp_bu[12]=hen%100/10+'0';
temp_bu[13]=hen%10+'0';
temp_bu[14]='s';
temp_bu[15]='~';
}
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1