找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 4690|回復(fù): 0
收起左側(cè)

stm32出租車計(jì)價(jià)器設(shè)計(jì)源碼與文檔資料分享

[復(fù)制鏈接]
ID:265754 發(fā)表于 2018-12-31 19:36 | 顯示全部樓層 |閱讀模式
     (1)能顯示里程,單位為公里,最后一位為小數(shù)位。
        2)能顯示金額數(shù),單位為元,最后一位為小數(shù)位。
        3)可設(shè)定單程價(jià)格和往返價(jià)格,單程價(jià)格為2/公里,往返價(jià)格為1.5/公里。
        4)車速<5公里/小時(shí)的時(shí)間累積為總等待時(shí)間,每5分鐘等待時(shí)間相當(dāng)于里程數(shù)增加1公里。
        5)起步公里數(shù)為3公里,價(jià)格為5元,若實(shí)際距離大于3公里,按規(guī)則3計(jì)算價(jià)格。
        6)按暫停鍵,計(jì)價(jià)器可暫停計(jì)價(jià),按查詢鍵,可顯示總等待時(shí)間。

1 液晶尺寸是3.2寸,控制器是 ILI9341
2 SD卡4位模式DMA ,支持長文件名及中文文件名

制作出來的stm32出租車計(jì)價(jià)器實(shí)物圖如下:
IMG20130602002.jpg IMG20130602001.jpg

stm32
單片機(jī)出租車計(jì)價(jià)器源程序如下:
  1. /******************** CHD1807 Team **************************
  2. * 文件名  :main.c
  3. * 描述    :LCD顯示實(shí)驗(yàn),可中英混合顯示,可顯示BMP格式的圖片,可截圖,
  4. *           截圖保存在MicroSD卡中,文件名存為myScreen.bmp,
  5. *           需顯示的BMP圖片和字庫存放在MicroSD卡中。         
  6. * 實(shí)驗(yàn)平臺(tái):CHD1807-STM32開發(fā)板
  7. * 庫版本  :ST3.5.0
  8. **********************************************************************************/
  9. /* Includes ------------------------------------------------------------------*/

  10. #include "stm32f10x.h"
  11. #include "SysTick.h"
  12. #include "usart1.h"        
  13. #include "lcd.h"
  14. //#include "sd_fs_app.h"
  15. //#include "Sd_bmp.h"
  16. #include "adc.h"
  17. #include "exti.h"
  18. #include "led.h"
  19. #include "pwm_output.h"
  20. #include "SPI_NRF.h"
  21. #include "Time_test.h"
  22. //#include"ds18b20.h"

  23. int num=0,i=0,j=0,k=0,h,time=0,q=4,flag=0;
  24. u8 status;                 //用于判斷接收/發(fā)送狀態(tài)
  25. u8 rxbuf[4]={0,0,0,0};         //接收緩沖
  26. float distance=0,all_distance=0,danjia=0,all_money=0;
  27. float speed=10;
  28. int all_distance_a[2]={0,0};
  29. int all_money_a[2]={0,0};
  30. int danjia_a[2]={0,0};
  31. int s_a=0,t_a=0;;

  32. float R=6.5;

  33. int d1=0,d2=0,d3=0,d4=0;
  34. int m1=0,m2=0,m3=0,m4=0;

  35. u8 ReadValue;

  36. //////////////////////////////////////////////////////////////////////////////////////////////////////////
  37. void delay1()
  38. {int j,h;
  39. for(j=0;j<1000;j++)
  40. for(h=0;h<1000;h++);
  41. }

  42. /////////////////////////////////////////////////////////////////////////////////////////////////////////

  43. void NRF_control(void)
  44. {
  45.                           /*等待接收數(shù)據(jù)*/
  46.          
  47.         status = NRF_Rx_Dat(rxbuf);         /*判斷接收狀態(tài)*/

  48.          i=rxbuf[1];

  49.          if(i==1)  { LED_B14(ON); LED_B15(OFF); LED_D12(OFF);  LED_A8(OFF);  LED_C6(OFF);  LED_C7(OFF);                             
  50.                                            TIM_SetCompare3(TIM3,550);       TIM_SetCompare4(TIM3,450);
  51.                                            TIM_SetCompare3(TIM4,1000);      TIM_SetCompare4(TIM4,1000);                       }

  52.          if(i==2)  { LED_B14(OFF); LED_B15(ON); LED_D12(OFF);  LED_A8(OFF);  LED_C6(OFF);  LED_C7(OFF);                           
  53.                                            TIM_SetCompare3(TIM3,1000);      TIM_SetCompare4(TIM3,1000);
  54.                                            TIM_SetCompare3(TIM4,550);       TIM_SetCompare4(TIM4,500);                       }

  55.          if(i==3)  { LED_B14(OFF); LED_B15(OFF); LED_D12(ON);  LED_A8(OFF);  LED_C6(OFF);  LED_C7(OFF);                             
  56.                                            TIM_SetCompare3(TIM3,1000);      TIM_SetCompare4(TIM3,1000);
  57.                                            TIM_SetCompare3(TIM4,1000);      TIM_SetCompare4(TIM4,1000);                      }

  58.          if(i==4)  { LED_B14(OFF); LED_B15(OFF); LED_D12(OFF);  LED_A8(ON);  LED_C6(OFF);  LED_C7(OFF);                           
  59.                                            TIM_SetCompare3(TIM3,600);       TIM_SetCompare4(TIM3,350);
  60.                                            TIM_SetCompare3(TIM4,1000);      TIM_SetCompare4(TIM4,1000);                     }

  61.          if(i==5)  { LED_B14(OFF); LED_B15(OFF); LED_D12(OFF);  LED_A8(OFF);  LED_C6(ON);  LED_C7(OFF);                             
  62.                                            TIM_SetCompare3(TIM3,350);       TIM_SetCompare4(TIM3,600);
  63.                                            TIM_SetCompare3(TIM4,1000);      TIM_SetCompare4(TIM4,1000);                     }
  64.          
  65.         
  66. }

  67. ////////////////////////////////////////////////////////////////////////////////////////////////////

  68. void calculate(void)
  69. {

  70. //        temperature=(int)DS18B20_Get_Temp();

  71.    
  72.   
  73.    distance = k*2*3.14*R/1000;

  74.    speed = distance*100*10;

  75.    

  76.    all_distance = all_distance+distance;

  77.    if(all_distance<30)        all_money=50;

  78.    else  all_money = (all_distance-30)*danjia + 50;

  79.    all_distance_a[0]=(int)all_distance%10;         all_distance_a[1]=(int)all_distance/10;

  80.    all_money_a[0]=(int)all_money%10;               all_money_a[1]=(int)all_money/10;

  81.    danjia_a[1]=danjia*10;

  82.    danjia_a[0]=(int)danjia_a[1]%10;                                 danjia_a[1]=(int)danjia_a[1]/10;

  83.    if((all_distance/100)>=1)         d1=1;
  84.    if((all_distance/1000)>=1)    d2=1;
  85.    if((all_distance/10000)>=1)   d3=1;

  86.    if((all_money/100)>=1)             m1=1;
  87.    if((all_money/1000)>=1)       m2=1;
  88.    if((all_money/10000)>=1)             m3=1;

  89.    
  90.    if(speed<2) s_a++;

  91.    else s_a=s_a;

  92.    if(s_a>200)
  93.    {
  94.        s_a=0;

  95.            t_a++;

  96.            all_distance = all_distance+10;
  97.    }



  98.   
  99.    

  100.    k=0;

  101.    distance=0;

  102.    



  103. }

  104. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

  105. int main(void)
  106. {
  107.    /* USART1 config */
  108.         USART1_Config();

  109.         SysTick_Init();

  110.         LCD_Init();                        //液晶屏初始化
  111.         
  112.         Adc_Init();                                                
  113. //    sd_fs_init();

  114.         EXTI_PC2_Config();  //外部中斷測速初始化

  115.         LED_GPIO_Config();        //行駛指示燈初始化

  116.         TIM3_PWM_Init();        //pwm初始化

  117.         SPI_NRF_Init();                //無線通信初始化

  118.         NRF_RX_Mode();                 //接收模式

  119. //        temperature = DS18B20_Init();

  120.         TIM2_NVIC_Configuration();        //定時(shí)器初始化
  121.         TIM2_Configuration();

  122.                 START_TIME;         //TIM2 開始計(jì)時(shí)

  123.         
  124.    

  125. //        LCD_Num_6x12_O(100, 200, 520, 8000);                           //在指定坐標(biāo)處懸浮顯示6*12大小的數(shù)字  

  126. //  LCD_Str_CH(100,20,"出租車計(jì)價(jià)器",0x0333,GRED);
  127. //        LCD_Str_CH(60,60,"單價(jià)",0x0333,0x0ff);
  128. ///        LCD_Str_CH(60,100,"行駛距離",0x0333,0x00ff);
  129. //        LCD_Str_CH(60,140,"總金額",0x0333,0x00ff);
  130. //        LCD_Str_CH(60,180,"車內(nèi)溫度",0x0333,0x00ff);

  131.         LCD_Str_O(140, 20, "Taxi meter", GRED);
  132.         LCD_Str_O(60, 60, "price", GBLUE);                   LCD_Str_O(220, 60, "yuan/mi", GBLUE);
  133.         LCD_Str_O(60, 100, "distance", GBLUE);           LCD_Str_O(220, 100, "mi", GBLUE);
  134.         LCD_Str_O(60, 140, "money", GBLUE);                   LCD_Str_O(220, 140, "yuan", GBLUE);
  135.         LCD_Str_O(60, 180, "WaitTime",GBLUE);           LCD_Str_O(220, 180, "miao", GBLUE);

  136.         
  137.         


  138.     acc_z();
  139.         LCD_Line(20,50, 300, 50);           //----------
  140.         LCD_Line(20,90, 300, 90);
  141.         LCD_Line(20,130, 300, 130);
  142.         LCD_Line(20,170, 300, 170);
  143.         LCD_Line(20,210, 300, 210);           //----------

  144.         LCD_Line(20,50, 20, 210);
  145.         LCD_Line(300,50, 300, 210);

  146.         LCD_Num_6x12_O(180, 65, danjia_a[1], BLACK);  LCD_Point(187,74);        LCD_Num_6x12_O(189, 65, danjia_a[0], BLACK);
  147.         
  148.         LCD_Num_6x12_O(180, 105, all_distance_a[1], BLACK);  LCD_Point(187+(d1+d2+d3)*6,114);        LCD_Num_6x12_O(189+(d1+d2+d3)*6, 105, all_distance_a[0], BLACK);
  149.         LCD_Num_6x12_O(180, 145, all_money_a[1], BLACK);  LCD_Point(187+(m1+m2+m3)*6,154);        LCD_Num_6x12_O(189+(m1+m2+m3)*6, 145, all_money_a[0], BLACK);
  150.         LCD_Num_6x12_O(180, 185, t_a*2, BLACK);

  151.         
  152.         
  153.         

  154.          
  155.   while (1)
  156.   {
  157.          
  158.            t:if(flag==0)  goto t;

  159.            if(q>3)
  160.    {  q=0;
  161.         LCD_Rectangle(180,50,40,150,0x00ff);
  162.    }

  163.    // calculate();
  164.    // q++;

  165.   // NRF_control();

  166.                  q++;
  167.                    acc_z();
  168.         LCD_Line(20,50, 300, 50);           //----------
  169.         LCD_Line(20,90, 300, 90);
  170.         LCD_Line(20,130, 300, 130);
  171.         LCD_Line(20,170, 300, 170);
  172.         LCD_Line(20,210, 300, 210);           //----------

  173.         LCD_Line(20,50, 20, 210);
  174.         LCD_Line(300,50, 300, 210);

  175.         
  176.         
  177.         LCD_Num_6x12_O(180, 65, danjia_a[1], BLACK);  LCD_Point(187,74);        LCD_Num_6x12_O(189, 65, danjia_a[0], BLACK);
  178.         LCD_Num_6x12_O(180, 105, all_distance_a[1], BLACK);  LCD_Point(187+(d1+d2+d3)*6,114);        LCD_Num_6x12_O(189+(d1+d2+d3)*6, 105, all_distance_a[0], BLACK);
  179.         LCD_Num_6x12_O(180, 145, all_money_a[1], BLACK);  LCD_Point(187+(m1+m2+m3)*6,154);        LCD_Num_6x12_O(189+(m1+m2+m3)*6, 145, all_money_a[0], BLACK);
  180.         LCD_Num_6x12_O(180, 185, t_a*2, BLACK);

  181.         

  182.                  NRF_control();        
  183.         
  184.             
  185.         
  186.   }
  187. }

  188. ////////////////////////////////////////////////////////////////////////////////////////////////////////

  189.    void TIM2_IRQHandler(void)
  190. {
  191.         if ( TIM_GetITStatus(TIM2 , TIM_IT_Update) != RESET )
  192.         {        
  193.                 TIM_ClearITPendingBit(TIM2 , TIM_FLAG_Update);

  194.                 ReadValue = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_10);

  195.             if(ReadValue==1)         GPIO_SetBits(GPIOB, GPIO_Pin_11);

  196.            else GPIO_ResetBits(GPIOB, GPIO_Pin_11);

  197.            time++;
  198.            num++;

  199.            if(time>10)

  200.          {  time=0;
  201.          
  202.               calculate();        
  203.           }

  204.           if(num>0&&num<500)   GPIO_SetBits(GPIOC,GPIO_Pin_7);

  205.            if(num>500&&num<1000)         GPIO_ResetBits(GPIOC,GPIO_Pin_7);
  206.            
  207.            if(num>1000)        num=0;
  208.          
  209.            
  210.                  
  211. /*                   acc_z();
  212.         LCD_Line(20,50, 300, 50);           //----------
  213.         LCD_Line(20,90, 300, 90);
  214.         LCD_Line(20,130, 300, 130);
  215.         LCD_Line(20,170, 300, 170);
  216.         LCD_Line(20,210, 300, 210);           //----------

  217.         LCD_Line(20,50, 20, 210);
  218.         LCD_Line(300,50, 300, 210);

  219.         
  220.         
  221.         LCD_Num_6x12_O(180, 65, danjia, BLACK);
  222.         LCD_Num_6x12_O(180, 105,all_distance, BLACK);
  223.         LCD_Num_6x12_O(180, 145,all_money, BLACK);
  224.         LCD_Num_6x12_O(180, 185, 24, BLACK);

  225.         if(q>10)
  226.    {  q=0;
  227.         LCD_Rectangle(180,50,50,150,0x00ff);
  228.    }
  229.                   
  230.            */
  231.         
  232.         }
  233.         
  234.                                  
  235. }

  236. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


  237. void EXTI2_IRQHandler(void)
  238. {
  239.          
  240.         if(EXTI_GetITStatus(EXTI_Line2) != RESET) //確保是否產(chǎn)生了EXTI Line中斷
  241.         {
  242.         
  243.                 k++;
  244.                

  245.                 EXTI_ClearITPendingBit(EXTI_Line2);     //清除中斷標(biāo)志位
  246.         }  

  247. }


  248. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


  249. void EXTI3_IRQHandler(void)
  250. {
  251.         if(EXTI_GetITStatus(EXTI_Line3) != RESET) //確保是否產(chǎn)生了EXTI Line中斷
  252.         {
  253.                    flag=1;
  254.                  danjia=2;
  255.                
  256.         
  257.                 EXTI_ClearITPendingBit(EXTI_Line3);     //清除中斷標(biāo)志位
  258.         }  



  259. }


  260. void EXTI4_IRQHandler(void)
  261. {
  262.          
  263.         if(EXTI_GetITStatus(EXTI_Line4) != RESET) //確保是否產(chǎn)生了EXTI Line中斷
  264.         {
  265.            flag=1;
  266.            danjia=1.5;
  267.            

  268.                 EXTI_ClearITPendingBit(EXTI_Line4);     //清除中斷標(biāo)志位
  269.         }  

  270. }



  271.   
  272.         
  273.         
  274.          
  275. /******************* CHD1807 Team *****END OF FILE************/
復(fù)制代碼

所有資料51hei提供下載:

程序.7z

663.47 KB, 下載次數(shù): 84, 下載積分: 黑幣 -5

出租車計(jì)價(jià)器設(shè)計(jì).doc

6.15 MB, 下載次數(shù): 87, 下載積分: 黑幣 -5

ILI9341_DS_V1[1].09_20110315.pdf

3.41 MB, 下載次數(shù): 23, 下載積分: 黑幣 -5

Outline- BL32007V2.pdf

214.24 KB, 下載次數(shù): 16, 下載積分: 黑幣 -5

觸摸控制器tsc2046.pdf

790.92 KB, 下載次數(shù): 16, 下載積分: 黑幣 -5

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表