找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機出租車計價器程序

[復(fù)制鏈接]
ID:782043 發(fā)表于 2020-6-20 12:53 | 顯示全部樓層 |閱讀模式
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. /*定義1602讀寫使能端口*/
  5. sbit rw=P2^1;
  6. sbit rs=P2^0;
  7. sbit en=P2^2;
  8. sbit b=P0^7;
  9. sbit gl=P1^0;

  10. void lcd_init();                        //lcd設(shè)置函數(shù)
  11. void wr_com(uchar command);       //命令函數(shù)
  12. void wr_data(uchar data0);      //數(shù)據(jù)函數(shù)
  13. void lcd_clear();                     //清屏函數(shù)
  14. void lcd_set();                                 //屏幕設(shè)置函數(shù)
  15. void busy();        //測忙函數(shù)
  16. void display();    //啟動前顯示函數(shù)
  17. void printstring(uchar *s);
  18. void display1(); //啟動后顯示函數(shù)
  19. void key1();                //啟動前按鍵

  20. sbit K=P3^0;
  21. sbit K1=P3^1;
  22. sbit K2=P3^5;             //開始計價
  23. sbit K3=P3^3;             //模式選擇(行程/等待)
  24. sbit K4=P3^4;             //復(fù)位

  25. sbit g=P2^7;                  
  26. sbit aa=P2^3;               //運行
  27. sbit bb=P2^4;              //等待
  28. sbit cc=P2^5;               //暫停

  29. //sbit led_run=P3^0;
  30. //sbit led_await=P3^1;
  31. //sbit led_stop=P3^2;

  32. bit f_start;
  33. bit jump_in;
  34. bit jump_out;
  35. void key();                    //啟動后按鍵
  36. /*定義液晶顯示地址數(shù)組*/
  37. uchar codetable[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x70};
  38. uchar dispbuf[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
  39. uchar dispbuf1[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

  40. uchar v,v1;
  41. uchar i,m=0;

  42. void init();

  43. void chuli();
  44. void chuli1();

  45. void delay(uchar t);  //延時函數(shù)
  46. void clear();                  //終止函數(shù)

  47. void set(uchar x);
  48. void set1(uchar y);
  49. uchar command;

  50. uchar count,count1;
  51. uchar second,minite,second1,minite1;
  52. unsigned int tt,tt1;
  53. unsigned char value1=70,value2=17,value3=15;               //value1=起步價,value2=超出每公里價格,value3=等待價格
  54. unsigned int money;
  55. void main()
  56. {
  57. //  Init_Timer1();     //定時器中斷函數(shù)
  58. EX0=1;//開外部中斷0
  59. IT0=1;//采用跳變沿觸發(fā)方式
  60.   
  61.   init();
  62.   lcd_init();
  63.   while(1)
  64.   {
  65.     key1();
  66.          chuli();
  67.    display();
  68.     if(jump_in==1)
  69.       {
  70.       jump_in=0;
  71.             lcd_init();           
  72.       while(1)
  73.         {
  74.         key();
  75.             chuli1();
  76.         display1();
  77.                    if(jump_out==1)
  78.                     {
  79.                     lcd_init();
  80.                     jump_out=0;
  81.                     clear();
  82.                     break;
  83.                     }
  84.         }
  85.       }
  86.    }
  87. }
  88. void clear(){
  89.   TR0=0;
  90.   TR1=0;
  91.   money=0;
  92.   second=0;
  93.   second1=0;
  94.   minite=0;
  95.   minite1=0;
  96.   value1=70;
  97.   value2=17;
  98.   value3=15;
  99. //led_run=1;
  100. //led_await=1;
  101. //led_stop=1;
  102.   v=0;
  103.   v1=0;
  104. for(i=0;i<15;i++)
  105.   {
  106.   dispbuf[ i]=0;[ i]
  107.    dispbuf1[ i]=0;[ i]
  108.   }
  109.   m=0;
  110. }

  111. void init()                             //中斷定時
  112. {
  113.   TMOD=0x11;
  114. TH0=(65536-50000)/256;
  115. TL0=(65536-50000)%256;
  116. TH1=(65536-50000)/256;
  117. TL1=(65536-50000)%256;
  118.   ET0=1;
  119.   ET1=1;
  120.   EA=1;
  121.   TR0=0;
  122.   TR1=0;
  123. }
  124. void t0_(void) interrupt 1 using 0                                       //中斷1模式0 用來計時 秒、分
  125. {
  126.   count++;
  127. if(count==20)
  128.     {
  129.           count=0;
  130.           second++;
  131.           if(second==60)
  132.             {
  133.              second=0;
  134.                   minite++;
  135.                   if(minite==99)
  136.                     {
  137.                      minite=0;
  138.                }
  139.              }
  140.          }
  141. TH0=(65536-50000)/256;
  142. TL0=(65536-50000)%256;
  143. dispbuf1[0]=m/10;
  144.   dispbuf1[1]=m%10;
  145. dispbuf1[2]=second/10;
  146. dispbuf1[3]=second%10;
  147. }

  148. void t1_(void) interrupt 3 using 3                                       //中斷3模式3用來計時 秒、分
  149. {
  150.   count1++;
  151. if(count1==20)
  152.     {
  153.           count1=0;
  154.           second1++;
  155.           if(second1==60)
  156.             {
  157.              second1=0;
  158.                   minite1++;
  159.                   if(minite1==99)
  160.                     {
  161.                      minite1=0;
  162.                }
  163.              }
  164.          }
  165. TH1=(65536-50000)/256;
  166. TL1=(65536-50000)%256;
  167. dispbuf1[4]=minite1/10;
  168. dispbuf1[5]=minite1%10;
  169. dispbuf1[6]=second1/10;
  170. dispbuf1[7]=second1%10;
  171. }
  172.                                                                                           
  173. void lcd_init()
  174. {
  175. wr_com(0x3c);
  176.   wr_com(0x06);
  177. wr_com(0x0c);
  178. wr_com(0x01);
  179. }
  180. void wr_com(uchar command)                                 //命令
  181. {
  182.    busy();
  183.    rs=0;
  184.    rw=0;
  185.   P0=command;
  186.    en=1;
  187.    en=0;
  188. }
  189. void wr_data(uchar data0)                                        //數(shù)據(jù)
  190. {
  191.    busy();
  192.    rs=1;
  193.    rw=0;
  194.    P0=data0;
  195.    en=1;
  196.    en=0;
  197. }
  198. void busy()                                                                        //測忙函數(shù)
  199. {
  200. while(1)
  201.    {
  202.     en=0;
  203.     rs=0;
  204.     rw=1;
  205.    P0=0xff;                                                                                                      
  206.     en=1;
  207.    if(b!=1)break;
  208.    }
  209.    en=0;
  210. }
  211. void chuli()                                             //分離出百位十位個位
  212. {
  213. dispbuf[0]=value1/100%10;
  214. dispbuf[1]=value1/10%10;
  215.   dispbuf[2]=value1%10;
  216. dispbuf[3]=value2/100%10;
  217. dispbuf[4]=value2/10%10;
  218. dispbuf[5]=value2%10;
  219. dispbuf[6]=value3/100%10;
  220. dispbuf[7]=value3/10%10;
  221. dispbuf[8]=value3%10;
  222. }
  223. void display()                                          //初始顯示函數(shù)
  224. {
  225. set(0);
  226. printstring("step  :");
  227. wr_data(table[dispbuf[0]]);
  228. wr_data(table[dispbuf[1]]);
  229. printstring(".");
  230. wr_data(table[dispbuf[2]]);

  231. set(16);
  232. printstring("mileage :");
  233. wr_data(table[dispbuf[3]]);
  234. wr_data(table[dispbuf[4]]);
  235. printstring(".");
  236. wr_data(table[dispbuf[5]]);

  237. set1(0);
  238. printstring("await:");
  239. wr_data(table[dispbuf[6]]);
  240. wr_data(table[dispbuf[7]]);
  241. printstring(".");
  242. wr_data(table[dispbuf[8]]);

  243. set1(16);
  244. printstring("run : ");
  245. wr_data(table[dispbuf1[0]]);
  246. wr_data(table[dispbuf1[1]]);
  247. printstring(":");
  248. wr_data(table[dispbuf1[2]]);
  249. wr_data(table[dispbuf1[3]]);

  250. }

  251. void chuli1()
  252. {
  253. if(f_start==1)
  254.   {
  255. tt=minite*60+second;
  256. tt1=minite1;
  257.   if(m<=3)
  258. {money=value1+value3*tt1;}
  259.   if(m>3)
  260. {money=value1+value2*(m-3)+value3*tt1;}  
  261. }

  262.   elseif(f_start==0)
  263.    {
  264.     money=0;
  265.    }
  266. dispbuf1[8]=money/100%10;
  267. dispbuf1[9]=money/10%10;
  268. dispbuf1[10]=money%10;
  269. }

  270. void display1()                                         //運行后顯示函數(shù)
  271. {
  272. set(0);
  273. printstring("run: ");
  274. // wr_data(table[m]);
  275. wr_data(table[dispbuf1[0]]);
  276. wr_data(table[dispbuf1[1]]);
  277. // printstring(":");
  278. // wr_data(table[dispbuf1[2]]);
  279. // wr_data(table[dispbuf1[3]]);

  280. set(14);
  281. printstring("await:");
  282. wr_data(table[dispbuf1[4]]);
  283. wr_data(table[dispbuf1[5]]);
  284. printstring(":");
  285. wr_data(table[dispbuf1[6]]);
  286. wr_data(table[dispbuf1[7]]);

  287. set1(0);
  288. printstring("sum is: ");
  289. wr_data(table[dispbuf1[8]]);
  290. wr_data(table[dispbuf1[9]]);
  291. printstring(".");
  292. wr_data(table[dispbuf1[10]]);

  293. }

  294. void printstring(uchar *s)               //輸出顯示函數(shù)
  295. {
  296.    while(*s)
  297.   wr_data(*s++);
  298. }

  299. void key()                                                      //啟動按鍵
  300. {
  301.   if(K3==0)                                                      
  302.   {
  303.    delay(50);                                         //延時消抖動
  304.          if(K3==0)
  305.          {
  306.     while(K3==0);
  307.           v1++;
  308.           if(v1==4) v1=1;
  309.          }
  310.   }
  311.   switch(v1)
  312.   {
  313.     case1:f_start=1;TR0=1;TR1=0;/*led_run=0;led_await=1;led_stop=1*/;aa=0;bb=1;cc=1;break;                 //運行
  314.          case2:TR0=0;TR1=1;/*led_run=1;led_await=0;led_stop=1*/;aa=1;bb=0;cc=1;break;                              //等待
  315.          case3:TR0=0;TR1=0;/*led_run=1;led_await=1;led_stop=0*/;aa=1;bb=1;cc=0;break;                             //暫停
  316.   }
  317.   if(K4==0)                                           //跳出運行
  318.   {
  319.     delay(50);
  320.           if(K4==0)
  321.           {
  322.            while(K4==0);
  323.            jump_out=1;
  324.           }
  325.   }
  326. }
  327. void delay(uchar t)
  328. {
  329.   while(--t);
  330. }
  331. void set(uchar x)
  332. {
  333. command=0x80+x;
  334. wr_com(command);
  335. }
  336. void set1(uchar y)
  337. {
  338. command=0xc0+y;
  339. wr_com(command);
  340. }
  341. void key1()                                                                //初始調(diào)節(jié)按鍵
  342. {
  343.   if(K==0)
  344.    {  
  345.       delay(100);
  346.            if(K==0)
  347.            {
  348.             while(K==0);
  349.             v++;
  350.             if(v==4) v=0;
  351.            }
  352.    }
  353.   switch(v)
  354.    {
  355.             case     0:break;
  356.        case1:if(K1==0){while(K1==0);value1=value1+10;}break;   
  357.             case     2:if(K1==0){while(K1==0);value2=value2+5;}break;
  358.             case3:if(K1==0){while(K1==0);value3=value3+5;}break;   }
  359.   if(K2==0)
  360.    {
  361.      delay(50);
  362.      if(K2==0)
  363.       {
  364.       while(K2==0);
  365.       jump_in=1;
  366.       }
  367.    }
  368. }

  369. void mode( ) interrupt 0  //外部中斷0控制選位
  370. {
  371.         m++;
  372. }

復(fù)制代碼


《單片微型計算機與接口技術(shù)51hei設(shè)計任務(wù)書》.doc

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

回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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