找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 629|回复: 0
打印 上一主题 下一主题
收起左侧

跪求大神看下我编写的单片机程序有哪些问题

[复制链接]
跳转到指定楼层
楼主
ID:738774 发表于 2020-4-26 19:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include"reg51.h"
  2. #include "stdio.h"
  3. #include "intrins.h"
  4. #include"System.h"

  5. #define  FALSE   0
  6. #define  TRUE     1
  7. sbit       SCLK  = P1^7;
  8. sbit       MISO  = P1^6;
  9. sbit       MOSI  = P1^5;
  10. sbit       LCD_SH = P1^2;
  11. sbit       LCD_CS = P1^1;
  12. #define LCD_SCLK  SCLK
  13. #define LCD_MISO  MISO
  14. #define LCD_MOSI  MOSI
  15. #define LCD_16dot_mode             1
  16. #define LCD_12dot_mode             2
  17. #define LCD_DRAW_mode            3
  18. #define LCD_FD_DRAW_mode      4
  19. #define LCD_FD_DATA                  1
  20. #define LCD_FD_ADDR                  0
  21. #define LCD_FD_CMD                   0
  22. //LCD命令及参数定义
  23. #define LCD_CMD_HEAD                    0x80
  24. #define LCD_CMD_END                      0x93

  25. #define LCD_16DOT_MODE_CMD       0x81
  26. #define LCD_12DOT_MODE_CMD       0x82
  27. #define LCD_DRAW_MODE_CMD        0X83
  28. #define LCD_FD_MODE_CMD             0x84
  29. #define LCD_SET_CONTRAST_CMD   0x85
  30. #define LCD_SET_BK_LCD_CMD        0x86
  31. #define LCD_CLR_CMD                      0x88
  32. #define LCD_SLEEP_CMD                  0x89
  33. #define LCD_Cursor_CMD                  0x8B
  34. #define LCD_Hilight_CMD                  0x8C
  35. #define LCD_BK_Light_Ctl_Cmd         0x8d
  36. #define LCD_ALL_Hilight                    0
  37. #define LCD_TXT_Hilight       1
  38. #define LCD_DRAW_PIC_CMD            0x90

  39. //命令画图模式下的画图模式设置
  40. #define LCD_DRAW_WHOLE_PIC       0x01
  41. #define LCD_DRAW_SPECIAL_ICON   0x02
  42. #define LCD_DRAW_PROGRESS        0x03
  43. #define LCD_EXIT_SLEEP_STA         0x9F
  44. #define LCD_SET_NEW_POS_WORD  0x20
  45. #define LCD_SET_DEF_POS_WORD   0x00
  46. #define LCD_BK_ON                           0x01
  47. #define LCD_BK_OFF                         0x00
  48. #define LCD_START_ADC_CMD         0x87
  49. #define LCD_READ_CMD           0x00   
  50. unsigned char idata temp_bu[20];
  51. unsigned char idata temp_buf[20];
  52. unsigned char idata gps_time1[12];            
  53. unsigned char idata gps_mode[3];              
  54. unsigned char idata gps_longitude[15];         
  55. unsigned char idata gps_longitude_dir[3];     
  56. unsigned char idata gps_latitude[15];         
  57. unsigned char idata gps_latitude_dir[3];     
  58. unsigned char idata gps_speed[8];            
  59. unsigned char idata gps_speed_dir[8];         
  60. unsigned char idata gps_time2[10];              
  61. unsigned char gps_data_ok_flag;     
  62. unsigned char idata gps_height[10];              
  63. unsigned char rx_height_mode;           
  64. unsigned char rx_height_count;
  65. #define   MAX_RX_BUF  12
  66. unsigned char gps_rx_mode;
  67. unsigned char rx_pointer;
  68. unsigned char com_rx_buf[MAX_RX_BUF+1];

  69. void cal_position_disp_datalatitude(void);
  70. void cal_position_disp_datalongitude(void);
  71. void TR_LCD_SPI_BYTE_FD(unsigned char dat,mode);
  72. unsigned char TR_LCD_SPI_BYTE(unsigned char dat);
  73. void Change_lcd_mode(unsigned char LCD_mode);
  74. void LCD_Send_CMD_END(void);
  75. void SET_LCD_POS(unsigned char mode ,Y,X);
  76. void LCD_print_char(unsigned char Y,X,unsigned char *char_ptr,unsigned char End_flag);
  77. void LCD_print_Curr_char(unsigned char *char_ptr,unsigned char End_flag);
  78. void Send_LCD_string(unsigned char *char_ptr);
  79. void Draw_lcd_whole_PIC(unsigned char ST_PIC,END_PIC,time);
  80. void Draw_LCD_Specail_ICON(unsigned char mode,Y,X,height,width,unsigned char *data_ptr);
  81. void Draw_LCD_Srepress(unsigned char Y,X,mode,width,curr_POS);
  82. void Set_LCD_contrast(unsigned char CON_dat);
  83. void Set_LCD_BK(unsigned char BKL_dat);
  84. unsigned char Read_LCD_ADC(void);
  85. unsigned char Check_LCD_Busy(unsigned char mode);
  86. void Draw_LCD_Big_PIC(unsigned char Y,X,height,width,unsigned char *PIC_ptr);
  87. void LCD_Exit_FD_DRAW_MODE(unsigned char new_mode);
  88. void SET_LCD_SLEEP_MODE(void);
  89. unsigned char SET_LCD_Exit_SLEEP(void);
  90. void LCD_CLR_ALL(unsigned char At_once );
  91. void LCD_Open_Cursor(unsigned char Cursor_width);
  92. void LCD_Close_Cursor(void);
  93. void LCD_Open_hilight(unsigned char Hilight_mode);
  94. void LCD_Close_hilight(unsigned char Hilight_mode);
  95. void LCD_BK_Light_SET(unsigned char Light_MODE);
  96. void Init_LCD(void);
  97. void Init_GPS_module(void);
  98. unsigned char  Cal_gas_data_to_disp(void);
  99. void rx_gps_data(unsigned char com_rx_byte);
  100. void delay_time(unsigned short t)
  101. {
  102. unsigned short n,m;
  103. for(n=0;n<t;n++)
  104. {
  105. for(m=0;m<1000;m++)
  106.   {;}
  107. }
  108. }
  109. void main(void)
  110. {
  111. unsigned char  i;
  112. Init_GPS_module();
  113. Init_LCD();                     
  114. EA=1;
  115. while(1)
  116. {
  117. LCD_BK_Light_SET(TRUE);        
  118. Set_LCD_BK(1);                 
  119. LCD_Open_Cursor(1);
  120. LCD_Send_CMD_END();
  121. delay_time(20);
  122. LCD_Open_hilight(LCD_ALL_Hilight);
  123. LCD_Send_CMD_END();
  124. delay_time(500);
  125. LCD_CLR_ALL(TRUE);
  126. if(gps_data_ok_flag)
  127. {
  128.    i=Cal_gas_data_to_disp();
  129.    if(i==1)
  130.    {
  131.      LCD_print_char(0, 0, "该地时间为~", FALSE);
  132.          LCD_Open_Cursor(0);
  133.      LCD_print_Curr_char(gps_time1,TRUE);
  134.             delay_time(200);
  135.          LCD_Open_Cursor(1);
  136.      LCD_print_char(1, 0, "该地经度为~", FALSE);
  137.          LCD_Open_Cursor(0);
  138.      LCD_print_Curr_char(temp_bu , TRUE);
  139.          delay_time(200);
  140.          LCD_Open_Cursor(0);
  141.      LCD_print_char(3, 0, "该地纬度为~", FALSE);
  142.          LCD_Open_Cursor(0);
  143.      LCD_print_Curr_char(temp_buf ,TRUE);
  144.    }
  145. }
  146.     delay_time(20000);
  147. }
  148. }
  149. void Delay_3US(void)
  150. {
  151. unsigned char t;
  152. for(t=0;t<10;t++)  //----
  153.      {
  154.      _nop_();
  155.      }
  156. }
  157. #ifdef HARD_SPI
  158. unsigned char TR_LCD_SPI_BYTE(unsigned char dat)
  159. {
  160. while(!LCD_SH);   
  161. LCD_CS=0;
  162. SPDAT=dat;
  163. while(!(SPSTAT&0x80));
  164. SPSTAT=0xc0;
  165. LCD_CS=1;
  166. return SPDAT;
  167. }
  168. #else
  169. unsigned char TR_LCD_SPI_BYTE(unsigned char dat)
  170. {
  171. unsigned char temp_data,i;
  172. while(!LCD_SH);   
  173. LCD_SCLK=0;      
  174. temp_data=dat;
  175. LCD_CS=0;
  176. MOSI=0;
  177. for(i=0;i<8;i++)
  178.   {
  179.   if(temp_data&0x80)
  180.           LCD_MOSI=1;
  181.   else
  182.           LCD_MOSI=0;
  183.   temp_data<<=1;
  184.   LCD_SCLK=1;
  185.   if(LCD_MISO)
  186.           temp_data|=0x01;
  187.   //_nop_();
  188.   LCD_SCLK=0;
  189.   //_nop_();  
  190.   }
  191. LCD_CS=1;
  192. return temp_data;
  193. }
  194. #endif
  195. void Change_lcd_mode(unsigned char LCD_mode)
  196. {
  197. unsigned char temp_data;
  198. if(LCD_mode)
  199.   {
  200.   if(LCD_mode<=LCD_FD_DRAW_mode)
  201.           {
  202.         temp_data=0x80+LCD_mode;     
  203.         TR_LCD_SPI_BYTE(LCD_CMD_HEAD);        
  204.         TR_LCD_SPI_BYTE(temp_data);  
  205.         //LCD_Send_CMD_END();
  206.           }
  207.   }
  208. }
  209. void LCD_Send_CMD_END(void)
  210. {
  211. TR_LCD_SPI_BYTE(LCD_CMD_END);
  212. Delay_3US();
  213. Delay_3US();
  214. }
  215. void SET_LCD_POS(unsigned char mode ,Y,X)
  216. {
  217. unsigned char temp_data;
  218. TR_LCD_SPI_BYTE(LCD_CMD_HEAD);
  219. if(mode)
  220.   {
  221.   temp_data=Y;
  222.   temp_data&=0x0f;
  223.   temp_data|=LCD_SET_NEW_POS_WORD;
  224.   }
  225. else
  226.   temp_data=LCD_SET_DEF_POS_WORD;
  227. TR_LCD_SPI_BYTE(temp_data);
  228. if(mode)
  229.    TR_LCD_SPI_BYTE(X);
  230. }
  231. void LCD_print_char(unsigned char Y,X,unsigned char *char_ptr,unsigned char End_flag)
  232. {
  233. SET_LCD_POS(TRUE, Y, X);
  234. Send_LCD_string(char_ptr);
  235. if(End_flag)
  236.      LCD_Send_CMD_END();
  237. }
  238. void LCD_print_Curr_char(unsigned char *char_ptr,unsigned char End_flag)
  239. {
  240. SET_LCD_POS(FALSE, 0, 0);
  241. Send_LCD_string(char_ptr);
  242. if(End_flag)
  243.      LCD_Send_CMD_END();
  244. }
  245. void Send_LCD_string(unsigned char *char_ptr)
  246. {
  247. while(*char_ptr!='~')
  248. {
  249. TR_LCD_SPI_BYTE(*char_ptr);
  250. char_ptr++;
  251. }
  252. }
  253. void Set_LCD_BK(unsigned char BKL_dat)
  254. {
  255. TR_LCD_SPI_BYTE(LCD_CMD_HEAD);
  256. TR_LCD_SPI_BYTE(LCD_SET_BK_LCD_CMD);
  257. TR_LCD_SPI_BYTE(BKL_dat);
  258. }
  259. void LCD_CLR_ALL(unsigned char At_once )
  260. {
  261. TR_LCD_SPI_BYTE(LCD_CMD_HEAD);
  262. TR_LCD_SPI_BYTE(LCD_CLR_CMD);
  263. if(At_once)
  264.         LCD_Send_CMD_END();
  265. }
  266. void LCD_Open_Cursor(unsigned char Cursor_width)
  267. {
  268. TR_LCD_SPI_BYTE(LCD_CMD_HEAD);
  269. TR_LCD_SPI_BYTE(LCD_Cursor_CMD);
  270. TR_LCD_SPI_BYTE(0x01);
  271. TR_LCD_SPI_BYTE(Cursor_width);
  272. }
  273. void LCD_Open_hilight(unsigned char Hilight_mode)
  274. {
  275. TR_LCD_SPI_BYTE(LCD_CMD_HEAD);
  276. TR_LCD_SPI_BYTE(LCD_Hilight_CMD);
  277. TR_LCD_SPI_BYTE(Hilight_mode);
  278. TR_LCD_SPI_BYTE(0x01);
  279. }
  280. void LCD_BK_Light_SET(unsigned char Light_MODE)
  281. {
  282. TR_LCD_SPI_BYTE(LCD_CMD_HEAD);
  283. TR_LCD_SPI_BYTE(LCD_BK_Light_Ctl_Cmd );
  284. TR_LCD_SPI_BYTE(Light_MODE);
  285. }
  286. void Init_LCD(void)
  287. {
  288. unsigned char i;
  289. for(i=0;i<250;i++)
  290.         Delay_3US();
  291. LCD_SH=1;
  292. while(!LCD_SH);  
  293. }
  294. void Init_GPS_module(void)
  295. {
  296. rx_pointer=0;
  297. gps_rx_mode=0;
  298. gps_data_ok_flag=0;
  299. RI=0;
  300. TI=0;
  301. SCON=0x40;
  302. PCON=0x00;  
  303. TMOD=0x20;
  304. TH1=0xFD;
  305. TL1=0xFD;   
  306. TR1=1;        
  307. REN=1;      
  308. ES=1;      
  309. }
  310. void Uart_Isr(void)  interrupt 4
  311. {
  312. if(RI)
  313. {
  314.    rx_gps_data(SBUF);
  315. }
  316. if(TI)         
  317. {
  318. ;
  319. }
  320. RI=0;
  321. TI=0;
  322. }
  323. void rx_gps_data(unsigned char com_rx_byte)
  324. {
  325. unsigned char i;
  326. if(com_rx_byte==')
  327. {
  328. gps_rx_mode=0;
  329. rx_pointer=0;
  330. for(i=0;i<5;i++)         
  331.          com_rx_buf[i]=0;
  332. }
  333. else
  334. {
  335. if(rx_pointer<MAX_RX_BUF)   
  336.          com_rx_buf[rx_pointer++]=com_rx_byte;
  337. }
  338. switch(gps_rx_mode)
  339. {
  340. case 0:                        
  341. if(com_rx_byte==',')
  342.   {
  343.   if((com_rx_buf[0]=='G')&&(com_rx_buf[1]=='P')&&(com_rx_buf[2]=='R')&&
  344.   (com_rx_buf[3]=='M')&&(com_rx_buf[4]=='C'))
  345.    {
  346.    gps_rx_mode=1;
  347.    }
  348. else if((com_rx_buf[0]=='G')&&(com_rx_buf[1]=='P')&&(com_rx_buf[2]=='G')&&
  349.   (com_rx_buf[3]=='G')&&(com_rx_buf[4]=='A'))
  350.   {
  351.   rx_height_count=0;
  352.   rx_height_mode=0;
  353.   gps_rx_mode=12;
  354.   }
  355.    rx_pointer=0;
  356.   }
  357. break;
  358. case 1:                     
  359. if(com_rx_byte==',')
  360.   {
  361.   for(i=0;i<rx_pointer;i++)
  362.     {
  363.         gps_time1[i]=com_rx_buf[i];
  364.         }
  365.   //gps_time1[i]='|';
  366.   gps_rx_mode=2;
  367.   rx_pointer=0;
  368.   }
  369. break;
  370. case 2:                          
  371. if(com_rx_byte==',')
  372.   {
  373.   for(i=0;i<rx_pointer;i++)
  374.     {
  375.         gps_mode[i]=com_rx_buf[i];
  376.         }
  377.   //gps_mode[i]='|';
  378.   gps_rx_mode=3;
  379.   rx_pointer=0;
  380.   }
  381. break;
  382. case 3:                           
  383. if(com_rx_byte==',')
  384.   {
  385.   for(i=0;i<rx_pointer;i++)
  386.     {
  387.         gps_latitude[i]=com_rx_buf[i];
  388.         }
  389.   //gps_longitude[i]='|';
  390.   gps_rx_mode=4;
  391.   rx_pointer=0;
  392.   }
  393. break;
  394. case 4:                        
  395. if(com_rx_byte==',')
  396.   {
  397.   for(i=0;i<rx_pointer;i++)
  398.     {
  399.         gps_latitude_dir[i]=com_rx_buf[i];
  400.         }
  401.   //gps_longitude_dir[i]='|';
  402.   gps_rx_mode=5;
  403.   rx_pointer=0;
  404.   }
  405. break;
  406. case 5:                             
  407. if(com_rx_byte==',')
  408.   {
  409.   for(i=0;i<rx_pointer;i++)
  410.     {
  411.         gps_longitude[i]=com_rx_buf[i];
  412.         }
  413.   //gps_latitude[i]='|';
  414.   gps_rx_mode=6;
  415.   rx_pointer=0;
  416.   }
  417. break;
  418. case 6:                           
  419. if(com_rx_byte==',')
  420.   {
  421.   for(i=0;i<rx_pointer;i++)
  422.     {
  423.         gps_longitude_dir[i]=com_rx_buf[i];
  424.         }
  425.   //gps_latitude_dir[i]='|';
  426.   gps_rx_mode=7;
  427.   rx_pointer=0;
  428.   }
  429. break;
  430. case 7:                              
  431. if(com_rx_byte==',')
  432.   {
  433.   for(i=0;i<rx_pointer;i++)
  434.     {
  435.         gps_speed[i]=com_rx_buf[i];
  436.         }
  437.   gps_rx_mode=8;
  438.   rx_pointer=0;
  439.   }
  440. break;
  441. case 8:                        
  442. if(com_rx_byte==',')
  443.   {
  444.   for(i=0;i<rx_pointer;i++)
  445.     {
  446.     gps_speed_dir[i]=com_rx_buf[i];
  447.     }
  448.   gps_rx_mode=9;
  449.   rx_pointer=0;
  450.   }
  451. break;
  452.   case 9:                     
  453.   if(com_rx_byte==',')
  454.   {
  455.   for(i=0;i<rx_pointer;i++)
  456.     {
  457.         gps_time2[i]=com_rx_buf[i];
  458.         }
  459.   gps_rx_mode=10;
  460. rx_pointer=0;
  461.   }
  462.   break;
  463.   case 10:        
  464.   if(com_rx_byte==',')
  465.   {
  466.   gps_rx_mode=11;
  467.   rx_pointer=0;
  468.   }
  469.   break;
  470.   case 11:      
  471.   if(com_rx_byte==',')
  472.           {
  473.        gps_data_ok_flag=1;
  474.        gps_rx_mode=0;
  475.        rx_pointer=0;
  476.           }
  477.   break;
  478.   case 12:    //接收海拔高度数据
  479.   if(com_rx_byte==',')
  480.           {
  481.         if(rx_height_mode==0)
  482.                 {
  483.                rx_height_count++;
  484.                 if(rx_height_count==8)
  485.                         {
  486.                         rx_height_mode=1;
  487.                         rx_pointer=0;
  488.                         }
  489.                 }
  490.         else
  491.                 {
  492.                  for(i=0;i<rx_pointer;i++)
  493.                     {
  494.                     gps_height[i]=com_rx_buf[i];
  495.                     }
  496.                  gps_rx_mode=0;
  497.                  rx_pointer=0;
  498.                  // rx_height_mode=1;
  499.                 // rx_pointer=0;
  500.                  }
  501.        }

  502.   break;
  503.   default:
  504.   gps_rx_mode=0;
  505.   rx_pointer=0;
  506.   break;
  507. }
  508. com_rx_byte=0xff;
  509. }
  510. unsigned char cal_data_len(unsigned char *str)
  511. {
  512. unsigned char  i=0;
  513. while(*str!=',')
  514. {
  515. i++;
  516. str++;
  517. }
  518. *str='~';
  519. return i;
  520. }
  521. void Cal_gps_height(void)
  522. {
  523. unsigned char i;
  524. i= cal_data_len(gps_height);
  525. gps_height[i]='m';
  526. gps_height[i+1]='~';
  527. }
  528. void Cal_gps_time(void)
  529. {
  530. unsigned char hh;
  531. unsigned char i,temp_buff[10];
  532. if(cal_data_len(gps_time1)!=0)
  533. {
  534. hh=(gps_time1[0]-'0')*10+(gps_time1[1]-'0');
  535. hh+=8;                     
  536. if(hh>=24)
  537.         hh-=24;                 
  538. temp_buff[0]=hh/10+'0';
  539. temp_buff[1]=hh%10+'0';
  540. temp_buff[2]=':';
  541. temp_buff[3]=gps_time1[2];
  542. temp_buff[4]=gps_time1[3];
  543. temp_buff[5]=':';
  544. temp_buff[6]=gps_time1[4];
  545. temp_buff[7]=gps_time1[5];
  546. temp_buff[8]='~';           
  547. for(i=0;i<9;i++)
  548.     gps_time1[i]=temp_buff[i];
  549. }
  550. }
  551. unsigned char  Cal_gas_data_to_disp(void)
  552. {
  553. Cal_gps_height();
  554. Cal_gps_time();
  555. cal_position_disp_datalatitude();
  556. cal_position_disp_datalongitude();
  557. if(gps_mode[0]=='A')
  558.         return 1;
  559. else
  560.         return 0;  
  561. }
  562. void cal_position_disp_datalatitude(void)
  563. {
  564. unsigned int hen;
  565. if(cal_data_len(gps_latitude)!=0)
  566. {
  567.   hen=(gps_latitude[5]-'0')*1000+( gps_latitude[6]-'0')*100+( gps_latitude[7]-'0')*10+( gps_latitude[8]-'0');
  568. hen=hen*60;
  569. temp_buf[0]=gps_latitude_dir[0];
  570. temp_buf[1]=gps_latitude[0];
  571. temp_buf[2]=gps_latitude[1];
  572. temp_buf[3]='d';
  573. temp_buf[4]=gps_latitude[2];
  574. temp_buf[5]=gps_latitude[3];
  575. temp_buf[6]='m';
  576. temp_buf[7]=hen/100000+'0';
  577. temp_buf[8]=hen/10000%10+'0';
  578. temp_buf[9]='.';
  579. temp_buf[10]=hen%1000/100+'0';
  580. temp_buf[11]=hen%100/10+'0';
  581. temp_buf[12]=hen%10+'0';
  582. temp_buf[13]='s';
  583. temp_buf[14]='~';
  584. }
  585. }
  586. void cal_position_disp_datalongitude(void)
  587. {
  588. unsigned int hen;
  589. if(cal_data_len(gps_longitude)!=0)
  590. {
  591. hen=(gps_longitude[6]-'0')*1000+(gps_longitude[7]-'0')*100+(gps_longitude[8]-'0')*10+( gps_longitude [9]-'0');
  592. hen=hen*60;
  593. temp_bu[0]= gps_longitude_dir[0];
  594. temp_bu[1]= gps_longitude[0];
  595. temp_bu[2]= gps_longitude[1];
  596. temp_bu[3]= gps_longitude[2];
  597. temp_bu[4]='d';
  598. temp_bu[5]= gps_longitude[3];
  599. temp_bu[6]= gps_longitude[4];
  600. temp_bu[7]='m';
  601. temp_bu[8]=hen/100000+'0';
  602. temp_bu[9]=hen/10000%10+'0';
  603. temp_bu[10]='.';
  604. temp_bu[11]=hen%1000/100+'0';
  605. temp_bu[12]=hen%100/10+'0';
  606. temp_bu[13]=hen%10+'0';
  607. temp_bu[14]='s';
  608. temp_bu[15]='~';
  609. }
  610. }
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表