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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于單片機的出租車計價器設計

  [復制鏈接]
跳轉到指定樓層
樓主
出租車計價器電路原理圖如下:


實物圖:


單片機源程序:
  1. #include <reg52.h>                 //調用單片機頭文件
  2. #define uchar unsigned char  //無符號字符型 宏定義        變量范圍0~255
  3. #define uint  unsigned int         //無符號整型 宏定義        變量范圍0~65535

  4. uchar d_miao,d_fen = 0,d_shi;
  5. uchar flag_bai_hei;         //白天的晚上的標志位
  6. uchar value;
  7. uint bai_3l_price = 60;        //白天3千米內的單價       6元
  8. uint bai_3w_price = 18;        //白天3千米外的單價/千米         1.8元
  9. uint bai_wait_price = 5;       //白天等待時的單價/分鐘         0.5元

  10. uint wan_3l_price = 70;        //晚上3千米內的單價/千米         7元
  11. uint wan_3w_price = 22;        //晚上3千米外的單價/千米         2.2元
  12. uint wan_wait_price = 10;       //晚上等待時的單價/分鐘         1元

  13. uint distance = 0;    //行使的距離
  14. uint zong_jia;        //總的價
  15. bit flag_200ms = 0;
  16. bit flag_1s ;
  17. bit flag_time_en = 0;

  18. uchar flag_time_xs = 1;    //顯示時間和等待時間切換

  19. sbit beep = P3^7;   //蜂鳴器IO口定義

  20. uchar i;

  21. sbit clk = P1^3;          //ds1302時鐘線定義
  22. sbit io =  P1^4;          //數據線
  23. sbit rst = P1^5;          //復位線
  24.                                                 //秒  分   時   日   月  年   星期         
  25. uchar code write_add[]={0x80,0x82,0x84,0x86,0x88,0x8c,0x8a};   //寫地址
  26. uchar code read_add[] ={0x81,0x83,0x85,0x87,0x89,0x8d,0x8b};   //讀地址
  27. uchar code init_ds[]  ={0x55,0x17,0x15,0x01,0x05,0x15,0x13};   
  28. uchar idata miao,fen,shi,ri,yue,week,nian;

  29. uchar t1_num,t2_num;        //計時間中斷的次數
  30. unsigned long  speed1,juli,time2;
  31. float f_hz,speed_km,speed_m;
  32. uchar TH11,TL11;
  33. uchar flag_en;   //開始計算速度使能
  34. uchar flag_stop_en;   //要確定車子是否停下了

  35. uint juli_s;             //每秒走的距離
  36. uint juli_z;         //總路程
  37. float zhijing = 0.75;  //直徑 0.55M
  38. bit flag_1s = 1;             //1s
  39. uchar menu_1;        //菜單設置變量
  40. uchar menu_2;        //菜單設置變量
  41. uint shudu;   //定義速度的變量
  42. uint bj_shudu = 80;         //報警速度

  43. uchar flag_ds_en;

  44. long zong_lc;        //總量程


  45. #include "lcd1602.h"

  46. /***********************1ms延時函數*****************************/
  47. void delay_1ms(uint q)
  48. {
  49.         uint i,j;
  50.         for(i=0;i<q;i++)
  51.                 for(j=0;j<120;j++);
  52. }

  53. #include "iic.h"

  54. void write_iic_data()
  55. {
  56.         write_24c02(0,flag_bai_hei);
  57.         write_24c02(1,bai_3l_price % 256);   //保存數據
  58.         write_24c02(2,bai_3l_price / 256);   //保存數據
  59.         write_24c02(3,bai_3w_price % 256);   //保存數據                 
  60.         write_24c02(4,bai_3w_price / 256);   //保存數據               
  61.         write_24c02(5,bai_wait_price % 256);   //保存數據               
  62.         write_24c02(6,bai_wait_price / 256);   //保存數據            
  63.         write_24c02(7,wan_3l_price % 256);   //保存數據
  64.         write_24c02(8,wan_3l_price / 256);   //保存數據
  65.         write_24c02(9,wan_3w_price % 256);   //保存數據                 
  66.         write_24c02(10,wan_3w_price / 256);   //保存數據               
  67.         write_24c02(11,wan_wait_price % 256);   //保存數據               
  68.         write_24c02(12,wan_wait_price / 256);   //保存數據            
  69. }

  70. /****************讀出來保存的數據**********************/           
  71. void read_iic_data()
  72. {        
  73.         flag_bai_hei = read_24c02(0);        
  74.         bai_3l_price = read_24c02(2);
  75.         bai_3l_price = bai_3l_price * 256 + read_24c02(1);
  76.         bai_3w_price = read_24c02(4);
  77.         bai_3w_price = bai_3w_price * 256 + read_24c02(3);
  78.         bai_wait_price = read_24c02(6);
  79.         bai_wait_price = bai_wait_price * 256 + read_24c02(5);

  80.         wan_3l_price = read_24c02(8);
  81.         wan_3l_price = wan_3l_price * 256 + read_24c02(7);
  82.         wan_3w_price = read_24c02(10);
  83.         wan_3w_price = wan_3w_price * 256 + read_24c02(9);
  84.         wan_wait_price = read_24c02(12);
  85.         wan_wait_price = wan_wait_price * 256 + read_24c02(11);

  86. }
  87. /********************獨立按鍵程序*****************/
  88. uchar key_can;         //按鍵值

  89. void key()         //獨立按鍵程序
  90. {
  91.         static uchar key_new;
  92.         key_can = 20;                   //按鍵值還原
  93.         P3 |= 0x78;                     //對應的按鍵IO口輸出為1
  94.         if((P3 & 0x78) != 0x78)                //按鍵按下
  95.         {
  96.                 delay_1ms(1);                     //按鍵消抖動
  97.                 if(((P3 & 0x78) != 0x78) && (key_new == 1))
  98.                 {                                                //確認是按鍵按下
  99.                         key_new = 0;
  100.                         switch(P3 & 0x78)
  101.                         {
  102.                                 case 0x70:  key_can = 1;  break;         //得到按鍵值
  103.                                 case 0x68:  key_can = 2;  break;         //得到按鍵值
  104.                                 case 0x58:  key_can = 3;  break;         //得到按鍵值
  105.                                 case 0x38:  key_can = 4;  break;         //得到按鍵值
  106.                         }
  107.                         beep = 0;
  108.                         delay_1ms(50);
  109.                         beep = 1;               
  110.                 }        
  111.         }
  112.         else
  113.                 key_new = 1;        
  114. }
  115. /*************寫一個數據到對應的地址里***************/
  116. void write_ds1302(uchar add,uchar dat)
  117. {               
  118.         rst = 1;                         //把復位線拿高
  119.         for(i=0;i<8;i++)
  120.         {                                     //低位在前
  121.                 clk = 0;                 //時鐘線拿低開始寫數據
  122.                 io = add & 0x01;            
  123.                 add >>= 1;                 //把地址右移一位
  124.                 clk = 1;                 //時鐘線拿高
  125.         }        
  126.         for(i=0;i<8;i++)
  127.         {
  128.                 clk = 0;                 //時鐘線拿低開始寫數據
  129.                 io = dat & 0x01;
  130.                 dat >>= 1;                 //把數據右移一位
  131.                 clk = 1;                 //時鐘線拿高
  132.         }
  133.         rst = 0;                         //復位線合低
  134.         clk = 0;
  135.         io = 0;
  136. }

  137. /*************從對應的地址讀一個數據出來***************/
  138. uchar read_ds1302(uchar add)
  139. {
  140.         uchar value,i;
  141.         rst = 1;                         //把復位線拿高
  142.         for(i=0;i<8;i++)
  143.         {                                     //低位在前
  144.                 clk = 0;                 //時鐘線拿低開始寫數據
  145.                 io = add & 0x01;            
  146.                 add >>= 1;                 //把地址右移一位
  147.                 clk = 1;                 //時鐘線拿高
  148.         }               
  149.         for(i=0;i<8;i++)
  150.         {
  151.                 clk = 0;                 //時鐘線拿低開始讀數據
  152.                 value >>= 1;
  153.                 if(io == 1)
  154.                         value |= 0x80;
  155.                 clk = 1;                 //時鐘線拿高
  156.         }
  157.         rst = 0;                         //復位線合低
  158.         clk = 0;
  159.         io = 0;
  160.         return value;                 //返回讀出來的數據
  161. }



  162. /*************把要的時間 年月日 都讀出來***************/
  163. void read_time()
  164. {
  165.         miao = read_ds1302(read_add[0]);        //讀秒
  166.         fen  = read_ds1302(read_add[1]);        //讀分
  167.         shi  = read_ds1302(read_add[2]);        //讀時
  168.         ri   = read_ds1302(read_add[3]);        //讀日
  169.         yue  = read_ds1302(read_add[4]);        //讀月
  170.         nian = read_ds1302(read_add[5]);        //讀年
  171.         week = read_ds1302(read_add[6]);        //讀星期
  172. }

  173. /*************把要寫的時間 年月日 都寫入ds1302里***************/
  174. void write_time()
  175. {
  176.         write_ds1302(write_add[0],miao);        //寫秒
  177.         write_ds1302(write_add[1],fen);                //寫分
  178.         write_ds1302(write_add[2],shi);                //寫時
  179.         write_ds1302(write_add[3],ri);                //寫日
  180.         write_ds1302(write_add[4],yue);                //寫月
  181.         write_ds1302(write_add[5],nian);        //寫星期
  182.         write_ds1302(write_add[6],week);        //寫年
  183. }


  184. /**********************設置ds1302時間函數**********************/
  185. void set_ds1302time(uchar num,uchar *shi,uchar dat)         //調時
  186. {
  187.           if(num == 1)
  188.     {
  189.             *shi+=0x01;
  190.                 if((*shi & 0x0f) >= 0x0a)
  191.                         *shi = (*shi & 0xf0) + 0x10;
  192.                 if(*shi >= dat)
  193.                         *shi = 0;
  194.     }
  195.     else
  196.     {
  197.                 if(*shi == 0x00)
  198.                         *shi = dat;
  199.                 if((*shi & 0x0f) == 0x00)
  200.                         *shi = (*shi | 0x0a) - 0x10;
  201.                 *shi -=0x01 ;
  202.     }  
  203. }


  204. #include "menu.h"


  205. /*********************對應菜單內的處理函數******************/
  206. void menu_dis()
  207. {
  208.         if(menu_1 == 0)
  209.         {
  210.                 if(key_can == 2)                   //清零 從新計價
  211.                 {
  212.                         flag_time_en = 0;        
  213.                         d_shi = 0;
  214.                         d_fen = 0;
  215.                         flag_ds_en = 0;
  216.                 }
  217.                 if(key_can == 4)         //時間和等待的時間的切換
  218.                 {
  219.                         flag_time_xs ++;    //為1顯示當前時間
  220.                         if(flag_time_xs > 2)        
  221.                                 flag_time_xs = 0;

  222.                         if(flag_time_xs == 0)        //顯示時間
  223.                         {
  224.                                 write_string(1,0,"    :  :    W:  ");                        
  225.                                 write_string(2,0," 20  -  -       ");        
  226.                         }
  227.                 }
  228.                 if(flag_200ms == 1)
  229.                 {
  230.                         if(distance <= 30)//3公里內的價格
  231.                         {
  232.                                 if(flag_bai_hei == 0)
  233.                                 {
  234.                                         if((d_fen == 0) && (d_miao <= 10))
  235.                                                 zong_jia = bai_3l_price;
  236.                                         else
  237.                                                 zong_jia = bai_3l_price + (d_shi * 60*60 +  d_fen*60 + d_miao) * bai_wait_price -bai_wait_price*10;        
  238.                                 }                                
  239.                                 else
  240.                                 {
  241.                                         if((d_fen == 0) && (d_miao <= 10))
  242.                                                 zong_jia = wan_3l_price;
  243.                                         else
  244.                                                 zong_jia = wan_3l_price + (d_shi * 60*60 +  d_fen*60 + d_miao) * wan_wait_price -bai_wait_price*10;
  245.                                 }
  246.                                        
  247.                         }else                          //3公里外的價格
  248.                         {
  249.                                 if(flag_bai_hei == 0)
  250.                                 {
  251.                                         if((d_fen == 0) && (d_miao <= 10))
  252.                                                 zong_jia = bai_3l_price + bai_3w_price * (distance - 30) / 10 ;
  253.                                         else
  254.                                                 zong_jia = bai_3l_price + bai_3w_price * (distance - 30) / 10 + (d_shi * 60*60 +  d_fen*60 + d_miao) *  bai_wait_price -bai_wait_price*10;
  255.                                 }
  256.                                 else
  257.                                 {
  258.                                         if((d_fen == 0) && (d_miao <= 10))
  259.                                                 zong_jia = wan_3l_price + wan_3w_price * (distance - 30) / 10 ;        
  260.                                         else
  261.                                                 zong_jia = wan_3l_price + wan_3w_price * (distance - 30) / 10 + (d_shi * 60*60 +  d_fen*60 + d_miao) *  wan_wait_price -bai_wait_price*10;        
  262.                                 }
  263.                         }
  264.                         if(flag_time_xs == 1)          //顯示當前的時間
  265.                         {
  266.                                 write_sfm2_ds1302(2,0,shi);  //顯示時        
  267.                                 write_data(':');   
  268.                                 write_sfm2_ds1302(2,6,miao); //顯示秒
  269.                                 write_sfm4(2,10,zong_jia);

  270.                                 write_sfm2(1,1,shudu);               
  271.                                 write_sfm4(1,9,juli_z);        

  272.                         }
  273.                         else if(flag_time_xs == 2)            //顯示等待時間
  274.                         {
  275.                                 write_sfm2(2,1,d_fen);  //顯示分
  276.                                 write_data(':');   
  277.                                 write_sfm2(2,4,d_miao); //顯示秒
  278.         
  279.                                 write_sfm2(1,1,shudu);               
  280.                                 write_sfm4(1,9,juli_z);        
  281.                         }
  282.                         else    //顯示當前的時間
  283.                         {
  284.                                 write_sfm2_ds1302(1,2,shi);           //顯示時
  285.                                 write_sfm2_ds1302(1,5,fen);           //顯示分
  286.                                 write_sfm2_ds1302(1,8,miao);        //顯示秒
  287.                                 write_sfm1(1,14,week);                           //顯示星期                                       
  288.                                 write_sfm2_ds1302(2,6,yue);           //顯示月
  289.                                 write_sfm2_ds1302(2,9,ri);           //顯示日
  290.                
  291.                         }
  292.                 }
  293.         }
  294. }

  295. /*******************停車計時函數 *****************/
  296. void jishu_chashu()
  297. {        
  298.         if((flag_1s == 1) && (flag_time_en == 1))
  299.         {
  300.                 if(flag_ds_en == 1)
  301.                 {
  302.                         d_miao++;                        //秒鐘加1
  303.                         if(d_miao >= 60)
  304.                         {
  305.                                 d_miao = 0;
  306.                                 d_fen ++;                //分鐘加1
  307.                                 if(d_fen >= 60)
  308.                                 {
  309.                                         d_fen = 0;
  310.                                         d_shi++;
  311.                                         if(d_shi >= 24)
  312.                                         {
  313.                                                 d_shi = 0;
  314.                                         }
  315.                                 }
  316.                         }
  317.                 }               
  318.         }
  319. }


  320. /*************定時器0初始化程序***************/
  321. void time_init()         
  322. {
  323.         EA   = 1;                   //開總中斷
  324.         TMOD = 0X11;          //定時器0、工作方式1
  325.         ET0  = 1;                  //開定時器0中斷
  326.         TR0  = 1;                  //允許定時器0定時
  327.         ET1  = 1;                  //開定時器1中斷
  328.         TR1  = 1;                  //允許定時器1定時
  329. }


  330. /***********外部中斷0初始化程序****************/
  331. void init_int0()
  332. {
  333.         EX0=1;                          //允許外部中斷0中斷
  334.         EA=1;                           //開總中斷
  335.         IT0 = 1;                   //外部中斷0負跳變中斷
  336. }

  337. /***********計算速度函數**************/
  338. void shudu_dis()          //計算速度函數
  339. {
  340.         static uchar value,value1;
  341.         if(menu_1 == 0)
  342.         {        
  343.                 if(flag_1s == 1)   
  344.                 {        
  345.                         flag_1s = 0;                 
  346.                         if(flag_en == 0)
  347.                         {
  348.                                 value ++;
  349.                                 if(value >= 3)        //2秒
  350.                                 {        
  351.                                         speed_km = 0;  //速度為0
  352.                                         shudu = (uint)speed_km;        
  353.                                         value = 0;        
  354.                                         flag_time_en = 1;                        
  355.                                 }
  356.                         }
  357.                         if((flag_en == 1))
  358.                         {        
  359.                                 value = 0;               
  360.                                 flag_en = 0;         
  361.                                  //1s = 1 / 1000000us;          // 1m/s=0.001km除以1/3600h=3.6km/h                        
  362.                                 f_hz =(t2_num * 65536.0 + TH11 * 256 + TL11)  / 1000000;  //算出來就是秒
  363.                                 speed_m = f_hz * zhijing * 3.14  ;        //算出來的是m/s
  364.                                 juli_z = (juli_z + (uint)speed_m) ;        //總路程m        
  365.                                 speed_km = speed_m * 3.6 ;        //(帶個小數點) km/s               
  366.                             shudu = (uint)speed_km;
  367.                                 zong_lc += speed_m;
  368.                                 distance = juli_z;
  369.                                 value1++;
  370.                                 flag_time_en = 0;
  371.                         }               
  372.                 }
  373.         }
  374. }
  375. /******************主函數*******************/
  376. void main()
  377. {
  378.         P0 = P1 = P2 = P3 = 0XFF;          //讓IO口全部輸出高電平
  379.         init_1602();                                  //初始化1602液晶
  380.         init_1602_dis_csf();                   //初始化1602液晶顯示
  381.         read_iic_data();                          //把保存的數據讀出來
  382.         time_init();                                  //定時器初始化
  383.         init_int0();
  384.         while(1)
  385.         {
  386.                 key();                                          //按鍵程序
  387.                 menu_dis();        
  388.                 if(key_can < 20)
  389.                         key_with();
  390.                 shudu_dis();          //計算速度函數
  391.                 if(flag_200ms == 1)
  392.                 {
  393.                         flag_200ms = 0;

  394.                         if(menu_1 == 0)
  395.                                 read_time();                  //讀時間
  396.                         if((shi >= 0x21) || (shi <= 5))
  397.                                 flag_bai_hei = 1;     //晚上模式
  398.                         else                                                         
  399.                                 flag_bai_hei = 0;  //白天模式
  400.                 }
  401.         }
  402. }

  403. /*************定時器0中斷服務程序***************/
  404. void time0_int() interrupt 1
  405. {        
  406.         static uchar value;
  407.         TH0 = 0x3c;
  408.         TL0 = 0xb0;     // 50ms
  409.         value ++;
  410.         if(value % 4 == 0)
  411.                 flag_200ms = 1;
  412.         if(value >= 20)
  413.         {
  414.                 flag_1s = 1;
  415.                 value = 0;
  416.                 jishu_chashu();
  417.         }

  418. }


  419. /*********************外部中斷0中斷服務程序************************/
  420. void int0() interrupt 0
  421. {
  422.         static uchar value;
  423.         switch(value)
  424.         {
  425.                 case 0:
  426.                         t1_num = 0;                 //第一次就把變量清零
  427.                         TH1 = 0;
  428.                         TL1 = 0;
  429.                         break;
  430.                 case 1:
  431.                                 t2_num = t1_num;  //保存
  432.                                 TH11 = TH1;
  433.                                 TL11 = TL1;
  434.                                 flag_en = 1;
  435.                         break;
  436.         }               
  437.         value ++;
  438.         if(value >= 2)
  439.                 value =0;
  440. }

  441. /*************定時器1中斷服務程序***************/
  442. void time1_int() interrupt 3
  443. {
  444.         t1_num++;
  445. }


復制代碼

評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:436272 發表于 2018-11-30 15:08 | 只看該作者
求PCB加原理圖啊
回復

使用道具 舉報

板凳
ID:657581 發表于 2019-12-6 15:07 | 只看該作者
你好大神 這個原理圖有bom嗎 我是新手
回復

使用道具 舉報

地板
ID:707219 發表于 2020-3-12 18:19 | 只看該作者
程序運行有錯啊????
回復

使用道具 舉報

5#
ID:421783 發表于 2020-4-3 23:16 | 只看該作者
uchar key_can;        這個是什么意思 求大佬告知
回復

使用道具 舉報

6#
ID:769774 發表于 2020-6-5 12:16 | 只看該作者
#include "lcd1602.h"
#include "iic.h"
#include "menu.h"

這三個源文件可以發一下嗎
回復

使用道具 舉報

7#
ID:778730 發表于 2020-6-14 09:50 來自手機 | 只看該作者
有仿真嗎?
回復

使用道具 舉報

8#
ID:900242 發表于 2021-4-3 11:25 | 只看該作者
求各部分的原理圖
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久国产精品一区二区三区 | av黄在线观看| 中文精品视频 | 成人国产精品久久 | 一区二区三区欧美在线 | 欧美黄色网 | 成人免费视频网站 | 91网站视频在线观看 | 婷婷久久综合 | 黄色a视频| 青青久久久 | 精品欧美一区二区精品久久久 | 爱草视频 | 岛国av免费在线观看 | 亚洲一区视频在线 | 国产一区二区中文字幕 | 日韩av网址在线观看 | 中文在线一区二区 | 久久久免费 | 91视频网址 | 亚洲三级国产 | 欧美日韩一区精品 | 91视频在线观看免费 | 成人在线小视频 | 99久久婷婷国产综合精品 | 日本高清视频网站 | 作爱视频免费观看 | 男女免费在线观看视频 | 国产剧情一区二区三区 | 国产福利在线免费观看 | 国产亚洲www | 伊人二区 | 成人国产精品久久 | 狠狠操电影 | 精品美女久久久久久免费 | 古装三级在线播放 | www.日韩 | 亚洲视频在线播放 | 欧美一区二区三区的 | 91免费观看 | 免费三级网站 |