久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 11124|回復: 3
打印 上一主題 下一主題
收起左側

基于51單片機的出租車計價器源程序與Proteus仿真設計

  [復制鏈接]
跳轉到指定樓層
樓主
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


本設計是針對城市出租車運營的一個計價器。設計基于STC15F2K60S2單片機為主控制芯片,通過霍爾傳感器來給單片機產生脈沖,從而累計車輪旋轉的圈數,利用算法來計算出行駛的路程,并根據相應的收費標準計算出應當收取的費用,通過LCD1602液晶顯示屏來顯示路程,單價,消費金額,路程中等待的時間等信息。本設計還可以根據自身的需要對收費的標準進行調整。系統硬件包括CPU控制模塊、按鍵模塊、顯示模塊、電源模塊等四部分。軟件設計包括系統總流程圖與每個模塊的流程圖,最后將軟件與硬件聯調,達到所需功能要求。

(1)不同情況具有不同的收費標準。
白天,晚上,途中等待(>=10min 開始收費)
(2)能進行手動修改單價
(3)具有數據的復位功能
(4)具有啟動計時開關、白天/晚上收費標準的轉換開關、數據的清零開關、單價的調整(最好使用+和-按鍵)
(5) 數據輸出:單價輸出 2 位(要能輸入小數),路程輸出 2 位,總金額輸出 3 位(有 1 位小數)。

一個基于單片機STC15F2K60S2的出租車自動計價器,附帶有鍵盤電路,顯示模塊等。在上電時LCD1602顯示最初的起步價,里程單價,等待時間收費三種收費,通過按鍵可以調整起步價、里程單價和等待時間收費。通過電機來模擬出租車輪胎的轉動和停止。在LCD1602液晶上可以顯示運行的路程,運行時暫停的時間,通過軟件計算可以得出乘客所需要支付的費用。在這里主要是以STC15F2K60S2單片機為核心控制器,P0口接1602液晶顯示模塊,P1口接按鍵原理電路,霍爾傳感器連接在外部中斷0口向單片機輸入脈沖,一個脈沖代表車輪轉動一周,從而計算出運行的路程和費用。
設計方案

通過單片機作為主控器,利用1602字符液晶作為顯示電路,采用內部時鐘脈沖,通過按鍵可以方便調節,而且控制簡單,成本低廉,設計電路簡單,易操作,以下是系統流程圖。如圖1.1所示。
當我們乘坐出租車時,出租車司機通過電源啟動計價器后,只要汽車一啟動,隨著行駛里程的增加,當小于某一個值的時候<如3km>時,就會看到出租車里面的計價器里程數字顯示的讀數為起步價,而當行駛到某一值<如3km)計費數字顯示開始從起步價<如7.7元)增加。當出租車到達某地需要在那里等候時,司機只要按一下“等待”鍵,每等候一定的時間<如10分鐘),計費顯示就增加一個該收的等候費用<如每10 分鐘收取3.3元)。出租車繼續行駛時,停止計算等候費用,繼續增加里程計費。到達目的地,便可按顯示的數字收費。然后關閉計費器,對計數器清零,等待下次計費開始。
由stc15f2k60s2作為主控制芯片,并連接按鍵系統和lcd1602顯示系統,用電機來模擬車輪的轉動,通過霍爾傳感器對單片機輸入一個脈沖,一個脈沖待變車輪轉動一周,假設轉動一周的距離為0.01km,由此來判斷出租車行駛的距離,從而計算出乘客應付的價錢。
在司機等待時按下等待按鍵,則計時器開始工作,等待10分鐘則開始加價,停止等待時,頁面會自動返回到初始計價頁面,等待價錢和時間不清零,結束計價時則把等待價錢和顯示價錢一起算。
本次設計利用單片機技術來實現一臺出租車計價器,具有性能可靠、電路簡單、成本低等特點。本次設計所設計的出租車計價器的主要功能有:數據的復位、白天/晚上轉換、數據輸出、計時計價、單價輸出及調整、路程輸出、等功能。輸出采用LCD1602液晶。本電路設計的計價器不但能實現基本的計價,而且還能根據白天、黑夜、中途等待來調節單價,

第二章 硬件電路設計

2.1按鍵電路
采用獨立式鍵盤,每個按鍵占用一個I/O口,每個按鍵相對獨立,I/O口通過按鍵與地相連,無鍵按下時,引腳端為高電平,有鍵按下時,引腳端為低電平。所以可以通過判斷每個引腳端是否為低電平,就可以知道是否有鍵按下。圖2.1為按鍵電路。

圖2.1  按鍵電路

S1:接P1.0口,開始計費和結束計費按鍵,按單次為開始計費,按雙次為結束計費。
S2:接P1.1口,是暫停按鍵,按下后,開啟定時器0,LCD1602會開始顯示等待時間并且在等待開始十分鐘后開始增加等待價錢,在按下結束鍵之前,等待時間和金錢不會清零。
S3:接P1.2口,是設置按鍵,在結束計價的時候,按一次,對起步價可以進行調整;按兩次,對等待10分鐘的等待價錢可以進行調整;按三次,對晚上可以單價進行調整;按四次,可以對白天單價進行調整;按第五次時,回到初始界面,然后循環。
S4:接P1.3口,是用來調整單價增加的鍵。
S5:接P1.4口,是用來調整單價減少的鍵。
S6:接P1.5口,復位鍵,按下之后所有的數據恢復到剛開始的狀態。

2.2直流電機電路

該直流電機主要是通過驅動芯片L298來驅動,這款芯片可以同時驅動2個直流電機,可以用直流電或PWM脈沖波驅動第5,7腳為控制電機的正反轉,一個接負電壓,一個接正電壓,第6腳ENA控制電機的轉速,通過PWM可以控制轉速,.這里我們給它-一個高電平就可以了。直流電機電路如圖2.2所示。

圖2.2 直流電機電路

2.3顯示電路

2.3.1 LCD1602的基本參數及引腳功能

引腳功能說明:
1602LCD采用標準的14腳(無背光)或16腳(帶背光)接口,各引腳接口說明如表1所示。

2.4脈沖輸入電路

利用霍爾傳感器來對單片機輸入一個脈沖,從而計算出租車行駛的路程,將霍爾傳感器接到單片機外部中斷0上,觸發中斷,計算公里數。
由于A44E屬于開關型的霍爾器件,其工作電壓范圍比較寬<4.5~18V),其輸出的信號符合TTL電平標準,可以直接接到單片機的I0端口上,而且其最高檢測頻率可達到1MHz。
A44E集成霍耳開關由穩壓器A、霍耳電勢發生器(即硅霍耳片>B、差分放大器C、施密特觸發器D和0CI門輸出E五個基本部分組成。
如圖2.4所示為霍爾傳感器連接電路。

圖2.4  霍爾傳感器連接電路

2.5 STC15F2K60S2的引腳連接和說明

2.5.1 STC15F2K60S2的引腳連接

P2口連接LCD1602D0-D7口;
P0.0連接LCD1602RS口,P0.1連接LCD1602的R/W口,P0.2連接LCD1602的EN口;
P1.0-P1.5為按鍵連接口;
P3.2為外部中斷0連接口,連接霍爾傳感器輸入端,向單片機輸入脈沖來計算行車途中的行駛里程;
P3.0和P3.1口連接驅動芯片L298N的輸入端IN1和IN2,用來控制電機轉動和停止,用來模仿出租車的行駛和停止。
如圖2.5為STC15F2K60S2的引腳連接圖:

圖2.5 STC15F2K60S2的引腳連接圖

第三章 軟件設計

3.1 單片機資源利用

在本次設計中電路鍵盤用到了P1口,其中P1.0口到P1.5口作為鍵盤的輸入,顯示電路用到了P0口和P2口,P2口為液晶的數據口,P3.2口作為脈沖的輸入端。
3.2單片機軟件模塊設計
如圖3.1所示為總體軟件設計流程圖。
如圖3.2所示為外部中斷0計算路程流程圖。
如圖3.3所示為按鍵子函數流程圖。
如圖3.4 定時器T0計時收費流程圖。



圖3.3 按鍵子函數流程圖


在軟件設計中,用T0來計時,當汽車停下來等待時,出租車司機則按下等待鍵,開啟定時器T0,定時器每次定50ms,定20次就是1s,此時miao就加一,當miao=59時,執行miao=0,fen++;當fen=59時,執行fen=0,shi++;接下來判斷fen是否>=10?若>=10,計價器就按收費標準開始計算價錢。如圖3.3為定時器T0計時收費流程圖。

圖3.4 定時器T0計時收費流程圖

第四章 總結

本款出租車計價器有不少功能,其中包括單價輸出、單價調整、路程輸出、顯示途中等待時間和相應的價錢、顯示總價等功能。另外,這個出租車計價器還具有性能可靠、電路簡單、成本低、實用性強等特點。

單片機源程序如下:
  1. #include<reg51.h>
  2. #include<LCD1602.h>

  3. #define uchar unsigned char
  4. #define uint  unsigned int


  5. sbit key_start =P1^0;         //開始/結束計價
  6. sbit key_wait  =P1^1;         //等待
  7. sbit key_set   =P1^2;         //設置
  8. sbit key_jia   =P1^3;         //加值
  9. sbit key_jian  =P1^4;         //減值
  10. sbit key_dn    =P1^5;   //控制白天晚上
  11. sbit key_fuwei =P1^6;  //復位
  12. sbit mod=P1^7;          //電機控制


  13. /************************——變量定義***********************/
  14. uint start_price=77;                //起步價
  15. uint white_price=66;         //白天的單價   超過3公里每公里6元
  16. uint black_price=88;        //夜晚的單價   超過3公里每公里8元
  17. uint Wait_price=100;                //等待價錢
  18. bit dnc=0;                   //白天晚上的轉換標志
  19. bit qiting;                 //起 停標志位   
  20. uint price1,price2;                           //總價錢、等待價錢
  21. uint   mil;                //里程數

  22. uint mil2;               

  23. uchar shi,fen,miao;
  24. uchar  moshi,moshi2,ms,set_f;                                //模式mos=0初始界面,=1改價頁面,=2等待頁面           
  25.                                 //set_f設置標志=1設置初始價格,=2設置等待價格,=3設置晚上單價,=4設置白天單價

  26. void delay(uchar ms)        //延時函數
  27. {
  28.    uchar j;
  29.          while(ms--)
  30.          {
  31.           for(j=0;j<130;j++);
  32.          }
  33. }

  34. void key()        //按鍵函數
  35. {  
  36.                         if(key_dn==0)
  37.                                  {
  38.            delay(5);   //延時去抖
  39.                                          if(key_dn==0)
  40.                                           {
  41.              while(!key_dn);
  42.                                                  dnc=~dnc;                                                
  43.             }
  44.          }
  45.         if(key_start==0)
  46.                                  {
  47.            delay(5);
  48.                                          if(key_start==0)
  49.                                           {
  50.              while(!key_start);   //檢測按鍵是否松開
  51.                                                  qiting=~qiting;      //起 停 轉換
  52.                                                  if(qiting==0)         
  53.                                                    {
  54.                 moshi=0;
  55.                }
  56.               mod=~qiting;         //電機打開/關閉
  57.                                                         TR0=qiting;          //定時器0打開/關閉
  58.               set_f=0;                                                         
  59.             }
  60.          }
  61.                                  if(key_fuwei==0)          //復位
  62.                                  {
  63.            delay(5);
  64.                                          if(key_fuwei==0)
  65.                                           {
  66.              while(!key_fuwei);
  67.                                                  miao=0;fen=0;shi=0;
  68.                                                  price1=0;price2=0;        mil=0;moshi=0;
  69.             }
  70.          }
  71.                                 if(key_wait==0)
  72.                                 {
  73.                                  delay(5);
  74.                                  if(key_wait==0)
  75.                                  {
  76.                                   while(!key_wait);
  77.                                         miao=0;fen=0;shi=0;
  78.                                         moshi=2;
  79.                                  }
  80.                                 }        
  81.                                          
  82.                                 if(qiting==0)         //結束計價后才能設置
  83.                                 {                                       
  84.                                 if(key_set==0)
  85.                                  {
  86.            delay(5);
  87.                                          if(key_set==0)
  88.                                           {
  89.              while(!key_set);
  90.                                                  set_f++;
  91.                                                  moshi=1;
  92.              if(set_f==5){moshi=0;set_f=0;}                                                        
  93.             }
  94.          }
  95.         if(set_f!=0)
  96.                                  {
  97.          if(key_jia==0)
  98.                                  {
  99.            delay(5);
  100.                                          if(key_jia==0)
  101.                                           {
  102.              while(!key_jia);
  103.                                      if(set_f==1){if(start_price<999)start_price++;}
  104.                                                  if(set_f==2){if(Wait_price<999)Wait_price++;}
  105.                                                  if(set_f==3){if(black_price<999)black_price++;}
  106.                                                  if(set_f==4){if(white_price<999)white_price++;}
  107.             }
  108.          }
  109.                                  if(key_jian==0)
  110.                                  {
  111.            delay(5);
  112.                                          if(key_jian==0)
  113.                                           {
  114.              while(!key_jian);
  115.                                      if(set_f==1){if(start_price>0)start_price--;}
  116.                                                  if(set_f==2){if(Wait_price>0)Wait_price--;}
  117.                                                  if(set_f==3){if(black_price>0)black_price--;}
  118.                                                  if(set_f==4){if(white_price>0)white_price--;}
  119.             }
  120.          }
  121.          }
  122.                          }
  123.       }

  124. void xianshi()
  125.      {
  126.                          if(moshi!=moshi2)   
  127.                           {
  128.           lcd_wcmd(0x01);       //清顯示屏        
  129.                                         moshi2=moshi;
  130.         }                                 
  131.                          if(moshi==0)
  132.                          {        
  133.          lcd_wcmd(0x80);
  134.                          lcd_data('N');
  135.        lcd_data('J');        
  136.                          lcd_data(':');
  137.                          lcd_data(ASCII[black_price%1000/100]);
  138.                          lcd_data(ASCII[black_price%100/10]);
  139.                          lcd_data('.');
  140.                          lcd_data(ASCII[black_price%10]);

  141.                                  
  142. //       lcd_wcmd(0x80);
  143. //                         lcd_data('D');
  144. //       lcd_data('J');        
  145. //                         lcd_data(':');
  146. //                         lcd_data(ASCII[white_price%1000/100]);
  147. //                         lcd_data(ASCII[white_price%100/10]);
  148. //                         lcd_data('.');
  149. //                         lcd_data(ASCII[white_price%10]);
  150. //                         lcd_data('Y');
  151.                          lcd_data('G');
  152.                          lcd_data(':');  
  153.                          lcd_data(ASCII[mil%1000/100]);
  154.                          lcd_data(ASCII[mil%100/10]);
  155.                          lcd_data('.');
  156.                          lcd_data(ASCII[mil%10]);
  157.                          lcd_data('K');
  158.                          lcd_data('M');         
  159.                          lcd_wcmd(0x80+0x40);
  160.                          lcd_data('D');
  161.        lcd_data('J');        
  162.                          lcd_data(':');
  163.                          lcd_data(ASCII[white_price%1000/100]);
  164.                          lcd_data(ASCII[white_price%100/10]);
  165.                          lcd_data('.');
  166.                          lcd_data(ASCII[white_price%10]);
  167.                          lcd_data('Y');
  168.                          lcd_data('Y');
  169.        lcd_data('Q');        
  170.                          lcd_data(':');
  171.                          lcd_data(ASCII[price1%1000/100]);
  172.                          lcd_data(ASCII[price1%100/10]);
  173.                          lcd_data('.');
  174.                          lcd_data(ASCII[price1%10]);
  175.                          lcd_data('O');
  176.                          lcd_data('Y');
  177.                          }
  178.                         if(moshi==1)       //改價頁面
  179.                          {                                 
  180.        lcd_wcmd(0x80);
  181.                          lcd_data('S');
  182.        lcd_data('J');        
  183.                          lcd_data(ASCII[start_price%1000/100]);
  184.                          lcd_data(ASCII[start_price%100/10]);
  185.                          lcd_data('.');
  186.                          lcd_data(ASCII[start_price%10]);
  187.                          lcd_data('Y');
  188.                          lcd_data(' ');  
  189.                          lcd_data('P');
  190.                          lcd_data('T');

  191.                          lcd_data(ASCII[Wait_price%1000/100]);
  192.                          lcd_data(ASCII[Wait_price%100/10]);
  193.                          lcd_data('.');
  194.                          lcd_data(ASCII[Wait_price%10]);
  195.                          lcd_data('Y');
  196.                           
  197.                          lcd_wcmd(0x80+0x40);
  198.                          lcd_data('N');
  199.        lcd_data('J');        
  200.                          lcd_data(ASCII[black_price%1000/100]);
  201.                          lcd_data(ASCII[black_price%100/10]);
  202.                          lcd_data('.');
  203.                          lcd_data(ASCII[black_price%10]);
  204.                          lcd_data('Y');
  205.        lcd_data(' ');        
  206.              lcd_data('D');
  207.        lcd_data('J');        
  208.                          lcd_data(ASCII[white_price%1000/100]);
  209.                          lcd_data(ASCII[white_price%100/10]);
  210.                          lcd_data('.');
  211.                          lcd_data(ASCII[white_price%10]);
  212.                          lcd_data('Y');
  213.                          }
  214.                          if(moshi==2)       //等待頁面
  215.                           {
  216.                                 
  217.         lcd_wcmd(0x80);
  218.                          lcd_data('W');
  219.        lcd_data('a');        
  220.                          lcd_data('i');
  221.                          lcd_data('t');        
  222.                          lcd_data(':');
  223.                          lcd_data(' ');
  224.                          lcd_data(' ');
  225.         
  226.                          lcd_data(ASCII[shi%100/10]);
  227.                          lcd_data(ASCII[shi%10]);
  228.                          lcd_data(':');
  229.                          lcd_data(ASCII[fen%100/10]);
  230.                          lcd_data(ASCII[fen%10]);
  231.                          lcd_data(':');
  232.                          lcd_data(ASCII[miao%100/10]);
  233.                          lcd_data(ASCII[miao%10]);
  234.                
  235.          
  236.                          lcd_wcmd(0x80+0x40);
  237.                          lcd_data('D');
  238.        lcd_data('D');        
  239.                          lcd_data('M');
  240.                          lcd_data(':');
  241. //                         lcd_data(ASCII[(white_price/2)%1000/100]);
  242. //                         lcd_data(ASCII[(white_price/2)%100/10]);
  243.                          lcd_data(ASCII[price2%1000/100]);
  244.                          lcd_data(ASCII[price2%100/10]);
  245.                          lcd_data('.');
  246.                          lcd_data(ASCII[price2%10]);
  247.                          //lcd_data(ASCII[(white_price/2)%10]);
  248.                          lcd_data(' ');
  249.                          lcd_data('Y');
  250.         }  
  251.      }
  252.                  
  253. void jiaqianjisuan()         //計算價錢
  254.       {
  255.                                 if(dnc==0)   //白天價錢
  256.                                 {        
  257.                                 if(mil>30)
  258.                                  {        
  259.           price1=(white_price*((mil-30)/10));
  260.                                   price1=price1+start_price+price2;        
  261.                                  }
  262.                                 else
  263.                                  price1=start_price+price2;        
  264.                          }        
  265.        else         //晚上價錢
  266.                          {
  267.          if(mil>30)
  268.                                  {        
  269.           price1=(black_price*((mil-30)/10));
  270.                                   price1=price1+start_price+price2;        
  271.                                  }
  272.                                 else
  273.                                  price1=start_price+price2;        
  274.        }        
  275.                         
  276.              }                 

  277. void T0_init()                   //定時器0初始化
  278.                   {
  279.                 EA=1;                  //開總中斷
  280.                 ET0=1;                 //定時器T0中斷允許         
  281.                 TMOD=0x01;             //使用定時器T0的模式1
  282.                                         TH0=(65536-50000)/256; //定時器T0的高8位賦初值
  283.                                         TL0=(65536-50000)%256; //定時器T0的低8位賦初值
  284.                                         TR0=0;                                         //關閉定時器0
  285.                                   EX0=1;                 //外部中斷0允許位
  286.                                   IT0=1;                 //下降沿觸發外部中斷
  287.       }
  288.                  
  289. void main()
  290. {
  291.         lcd_init();           //LCD1602初始化

  292.         T0_init();           //定時器0初始化
  293. while(1)                                                         //死循環
  294.         {
  295.         
  296.                   jiaqianjisuan();
  297.                    key();                        //按鍵檢測處理
  298.             xianshi();
  299.                  
  300.   }
  301. }

  302. void timer0() interrupt 1                  //定時器0中斷函數
  303.    {
  304.      TH0=(65536-50000)/256;
  305.      TL0=(65536-50000)%256;                //定50ms
  306.      ms++;
  307.      if(ms>=20)
  308.            {
  309.             ms=0;
  310.             miao++;
  311.                   if(moshi==0)
  312. ……………………

  313. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載(仿真+代碼):
最終程序.7z (1.45 MB, 下載次數: 303)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏8 分享淘帖 頂2 踩
回復

使用道具 舉報

沙發
ID:922223 發表于 2021-5-18 10:55 | 只看該作者
程序用Keil5才能打開
回復

使用道具 舉報

板凳
ID:1013449 發表于 2022-4-3 20:15 | 只看該作者
用Proteus8.8版本才能打開仿真
回復

使用道具 舉報

地板
ID:992347 發表于 2022-6-29 15:58 | 只看該作者
Bug有點多,等待那塊,還有白天夜晚那塊,有些問題
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产黄色电影 | 五十女人一级毛片 | 国内精品免费久久久久软件老师 | 2一3sex性hd | 999国产视频 | 国产视频欧美 | 日韩视频免费看 | 国产精品区二区三区日本 | 91综合网 | 亚洲不卡在线观看 | 天天爽天天操 | 亚洲精品久久久久久宅男 | 国产一区久久 | 午夜电影在线播放 | 久久成人精品视频 | 日韩一区二区三区在线观看 | 中文字幕亚洲视频 | 91精品在线播放 | 精品国产乱码久久久久久牛牛 | 欧美日韩在线精品 | 日本高清视频在线播放 | 色成人免费网站 | 三级视频在线观看电影 | 欧美日韩国产传媒 | 中文字幕在线剧情 | 亚洲国产成人在线观看 | 国产精品视频网 | 欧美激情一区二区三级高清视频 | a黄视频| 九九精品在线 | 亚欧洲精品在线视频免费观看 | 一区亚洲 | 亚洲 中文 欧美 日韩 在线观看 | 国产免费一区二区 | 久在线观看| 就操在线 | 欧美一级二级在线观看 | 丁香综合 | 羞羞的视频在线观看 | 91高清在线观看 | 欧美一级艳情片免费观看 |