找回密码
 立即注册

QQ登录

只需一步,快速开始

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

stm32出租车计价器设计源码与文档资料分享

[复制链接]
跳转到指定楼层
楼主
     (1)能显示里程,单位为公里,最后一位为小数位。
        2)能显示金额数,单位为元,最后一位为小数位。
        3)可设定单程价格和往返价格,单程价格为2/公里,往返价格为1.5/公里。
        4)车速<5公里/小时的时间累积为总等待时间,每5分钟等待时间相当于里程数增加1公里。
        5)起步公里数为3公里,价格为5元,若实际距离大于3公里,按规则3计算价格。
        6)按暂停键,计价器可暂停计价,按查询键,可显示总等待时间。

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

制作出来的stm32出租车计价器实物图如下:


stm32
单片机出租车计价器源程序如下:
  1. /******************** CHD1807 Team **************************
  2. * 文件名  :main.c
  3. * 描述    :LCD显示实验,可中英混合显示,可显示BMP格式的图片,可截图,
  4. *           截图保存在MicroSD卡中,文件名存为myScreen.bmp,
  5. *           需显示的BMP图片和字库存放在MicroSD卡中。         
  6. * 实验平台:CHD1807-STM32开发板
  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;                 //用于判断接收/发送状态
  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.                           /*等待接收数据*/
  46.          
  47.         status = NRF_Rx_Dat(rxbuf);         /*判断接收状态*/

  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();        //定时器初始化
  121.         TIM2_Configuration();

  122.                 START_TIME;         //TIM2 开始计时

  123.         
  124.    

  125. //        LCD_Num_6x12_O(100, 200, 520, 8000);                           //在指定坐标处悬浮显示6*12大小的数字  

  126. //  LCD_Str_CH(100,20,"出租车计价器",0x0333,GRED);
  127. //        LCD_Str_CH(60,60,"单价",0x0333,0x0ff);
  128. ///        LCD_Str_CH(60,100,"行驶距离",0x0333,0x00ff);
  129. //        LCD_Str_CH(60,140,"总金额",0x0333,0x00ff);
  130. //        LCD_Str_CH(60,180,"车内温度",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) //确保是否产生了EXTI Line中断
  241.         {
  242.         
  243.                 k++;
  244.                

  245.                 EXTI_ClearITPendingBit(EXTI_Line2);     //清除中断标志位
  246.         }  

  247. }


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


  249. void EXTI3_IRQHandler(void)
  250. {
  251.         if(EXTI_GetITStatus(EXTI_Line3) != RESET) //确保是否产生了EXTI Line中断
  252.         {
  253.                    flag=1;
  254.                  danjia=2;
  255.                
  256.         
  257.                 EXTI_ClearITPendingBit(EXTI_Line3);     //清除中断标志位
  258.         }  



  259. }


  260. void EXTI4_IRQHandler(void)
  261. {
  262.          
  263.         if(EXTI_GetITStatus(EXTI_Line4) != RESET) //确保是否产生了EXTI Line中断
  264.         {
  265.            flag=1;
  266.            danjia=1.5;
  267.            

  268.                 EXTI_ClearITPendingBit(EXTI_Line4);     //清除中断标志位
  269.         }  

  270. }



  271.   
  272.         
  273.         
  274.          
  275. /******************* CHD1807 Team *****END OF FILE************/
复制代码

所有资料51hei提供下载:

程序.7z

663.47 KB, 下载次数: 84, 下载积分: 黑币 -5

出租车计价器设计.doc

6.15 MB, 下载次数: 87, 下载积分: 黑币 -5

ILI9341_DS_V1[1].09_20110315.pdf

3.41 MB, 下载次数: 23, 下载积分: 黑币 -5

Outline- BL32007V2.pdf

214.24 KB, 下载次数: 16, 下载积分: 黑币 -5

触摸控制器tsc2046.pdf

790.92 KB, 下载次数: 16, 下载积分: 黑币 -5

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩1
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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