找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机出租车计价器程序

[复制链接]
跳转到指定楼层
楼主
ID:782043 发表于 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设置函数
  11. void wr_com(uchar command);       //命令函数
  12. void wr_data(uchar data0);      //数据函数
  13. void lcd_clear();                     //清屏函数
  14. void lcd_set();                                 //屏幕设置函数
  15. void busy();        //测忙函数
  16. void display();    //启动前显示函数
  17. void printstring(uchar *s);
  18. void display1(); //启动后显示函数
  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;             //复位

  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. /*定义液晶显示地址数组*/
  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);  //延时函数
  46. void clear();                  //终止函数

  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();     //定时器中断函数
  58. EX0=1;//开外部中断0
  59. IT0=1;//采用跳变沿触发方式
  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)                                        //数据
  190. {
  191.    busy();
  192.    rs=1;
  193.    rw=0;
  194.    P0=data0;
  195.    en=1;
  196.    en=0;
  197. }
  198. void busy()                                                                        //测忙函数
  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()                                          //初始显示函数
  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()                                         //运行后显示函数
  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)               //输出显示函数
  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()                                                                //初始调节按键
  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. }

复制代码


《单片微型计算机与接口技术51hei设计任务书》.doc

41.5 KB, 下载次数: 4, 下载积分: 黑币 -5

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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