找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机出租车计程计费器仿真及程序设计(12864显示)

[复制链接]
跳转到指定楼层
楼主
这是我做的一个51单片机设计,使用18b20实现温度采集,使用HMC5883实现磁场的检测,可以判断准确的方位,使用ds1302制作了万年历,并可以测速并累计里程,所有数据使用12864显示,附件里包含源码及仿真。

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载):




单片机源程序如下:
  1. #include<reg52.h>
  2. #include"lcd12864.h"
  3. #include"ds18b20b.h"
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. typedef unsigned char UINT8;
  7. typedef unsigned int  UINT16;
  8. #define GPIO_DIG P0
  9. sbit LSA=P2^2;
  10. sbit LSB=P2^3;
  11. sbit LSC=P2^4;

  12. //unsigned char code DIG_CODE[]={
  13. //0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  14. ////0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码
  15. unsigned char code licheng_CharCode[]="里程:";
  16. unsigned char code jine_CharCode[]="金额:";
  17. unsigned char code qibujia_CharCode[]="起步价:";
  18. unsigned char code shijian_CharCode[]="时间:";
  19. unsigned char code shizi_CharCode[]="0123456789";
  20. unsigned char code wuyuan_CharCode[]="元";
  21. unsigned char code fen_CharCode[]="分";
  22. unsigned char code mi_CharCode[]="米";
  23. unsigned char code qianmi_CharCode[]="千米";
  24. unsigned char code dian_CharCode[]=".";
  25. unsigned char code error_CharCode[]="无法显示";
  26. unsigned char code erdianwu_CharCode[]="二点六千";
  27. unsigned char code liuyuan_CharCode[]="六";
  28. unsigned char code wu_CharCode[]="五";
  29. unsigned char code shi_CharCode[]="十一";
  30. unsigned char code shiwu_CharCode[]="十五";
  31. uint num,num2,_10ms,_1s,_1m,_1h,flag,quan,quan2,distancex,distancex2,distancex3;

  32. void    delayms(unsigned int n)            //延时10×n毫秒程序
  33.                    {
  34.                       unsigned int i,j;
  35.                       for(i=0;i<n;i++)
  36.                          for(j=0;j<10;j++);
  37.                    }

  38. /*******************************************************************************
  39. * 函 数 名         : TimerConfiguration
  40. * 函数功能                   : 定时器初始化
  41. * 输    入         : 无
  42. * 输    出         : 无
  43. *******************************************************************************/
  44. void TimerConfiguration()
  45. {
  46.         TMOD=0x51;//选择为定时器0模式,工作方式2,仅用TRX打开启动。

  47.                 TH0=0XD8;        //给定时器赋初值,定时100us
  48.         TL0=0XF0;       
  49.         ET0=1;//打开定时器0中断允许
  50.         EA=1;//打开总中断
  51.         TR0=1;//打开定时器                       
  52. }

  53. /*******************************************************************************
  54. * 函 数 名         : DigDisplay
  55. * 函数功能                   : 使用数码管显示
  56. * 输    入         : 无
  57. * 输    出         : 无
  58. *******************************************************************************/
  59. //void DigDisplay(uchar wei,uchar duan)
  60. //{
  61. //        unsigned char i,j;
  62. ////        for(i=0;i<8;i++)
  63. ////        {
  64. ////                GPIO_DIG=0x00;//消隐
  65. //                switch(wei)         //位选,选择点亮的数码管,
  66. //                {
  67. //                        case(0):
  68. //                                LSA=0;LSB=0;LSC=0; break;
  69. //                        case(1):
  70. //                                LSA=1;LSB=0;LSC=0; break;
  71. //                        case(2):
  72. //                                LSA=0;LSB=1;LSC=0; break;
  73. //                        case(3):
  74. //                                LSA=1;LSB=1;LSC=0; break;
  75. //                        case(4):
  76. //                                LSA=0;LSB=0;LSC=1; break;
  77. //                        case(5):
  78. //                                LSA=1;LSB=0;LSC=1; break;
  79. //                        case(6):
  80. //                                LSA=0;LSB=1;LSC=1; break;
  81. //                        case(7):
  82. //                                LSA=1;LSB=1;LSC=1; break;       
  83. //                }
  84. //                GPIO_DIG=DIG_CODE[duan];
  85. ////                duan++;
  86. //                if(duan>7)
  87. //                        duan=0;
  88. ////                j=10;                                                 //扫描间隔时间设定
  89. ////                while(j--)
  90. ////                        Delay50us();       
  91. ////                GPIO_DIG=0x00;//消隐
  92. ////        }
  93. //}

  94. void exit_init()
  95. {
  96.         TMOD=0x50;
  97.         TH1=0;
  98.         TL1=0;
  99.         TR1=1;
  100. }

  101. uint read()
  102. {
  103.         uchar t1,th1,th2;
  104.         uint val;
  105.         while(1)
  106.         {
  107.         th1=TH1;
  108.         t1=TL1;
  109.         th2=TH1;
  110.         if(th1==th2)  break;
  111.         }
  112.         val=th1*256+t1;
  113.         return val;
  114. }

  115. void time_display()
  116. {
  117.         uint a=0,b,c,price,find_price;          
  118.           LCD12864_SetWindow(3, 6);
  119.         LCD12864_WriteData(shizi_CharCode[_1s/10]);
  120.         LCD12864_SetWindow(3, 7);
  121.         LCD12864_WriteData(shizi_CharCode[_1s%10]);
  122.         LCD12864_SetWindow(3, 3);
  123.         LCD12864_WriteData(shizi_CharCode[_1m/10]);
  124.         LCD12864_SetWindow(3, 4);
  125.         LCD12864_WriteData(shizi_CharCode[_1m%10]);
  126.                 LCD12864_SetWindow(3, 5);
  127.                 while(fen_CharCode[a]!='\0')
  128.                 {
  129.                         LCD12864_WriteData(fen_CharCode[a]);
  130.                         a++;
  131.                 }
  132.                          if(distancex<10000)
  133.                          {
  134.                                 LCD12864_SetWindow(0, 3);
  135.                                 LCD12864_WriteData(shizi_CharCode[distancex/1000]);
  136.                                 LCD12864_SetWindow(0, 4);
  137.                                 LCD12864_WriteData(shizi_CharCode[distancex%1000/100]);
  138.                                 LCD12864_SetWindow(0, 5);
  139.                                 LCD12864_WriteData(shizi_CharCode[distancex%1000%100/10]);
  140.                                 LCD12864_SetWindow(0, 6);
  141.                                 LCD12864_WriteData(shizi_CharCode[distancex%1000%100%10]);
  142.                                 LCD12864_SetWindow(0, 7);
  143.                                 while(mi_CharCode[b]!='\0')
  144.                                 {
  145.                                         LCD12864_WriteData(mi_CharCode[b]);
  146.                                         b++;
  147.                                 }
  148.                          }
  149.                          else
  150.                         {
  151.                                 LCD12864_SetWindow(0, 3);
  152.                                 while(error_CharCode[c]!='\0')
  153.                                 {
  154.                                         LCD12864_WriteData(error_CharCode[c]);
  155.                                         c++;
  156.                                 }
  157.                         }
  158.                
  159.                 if(distancex<=5)
  160.                 {
  161.                         LCD12864_SetWindow(1, 3);
  162.                         LCD12864_WriteData(shizi_CharCode[0]);       
  163.                         LCD12864_SetWindow(1, 4);
  164.                         LCD12864_WriteData(shizi_CharCode[0]);       
  165.                         LCD12864_SetWindow(1, 5);
  166.                         LCD12864_WriteData(shizi_CharCode[2]);       
  167.                 }
  168.                 else
  169.                         {
  170.                                 price=distancex-5;
  171.                                 price=price/10;
  172.                                 find_price=1*price+2;
  173.                                 LCD12864_SetWindow(1, 5);
  174.                                 LCD12864_WriteData(shizi_CharCode[find_price%100%10]);       
  175.                                 LCD12864_SetWindow(1, 4);
  176.                                 LCD12864_WriteData(shizi_CharCode[find_price%100/10]);       
  177.                                 LCD12864_SetWindow(1, 3);
  178.                                 LCD12864_WriteData(shizi_CharCode[find_price/100]);       
  179.                         }
  180.                         if(        distancex>9999)
  181.                         {
  182.                                 LCD12864_SetWindow(0, 3);
  183.                                 while(error_CharCode[c]!='\0')
  184.                                 {
  185.                                         LCD12864_WriteData(error_CharCode[c]);
  186.                                         c++;
  187.                                 }
  188.                         }

  189.                
  190.        



  191. //        LCD12864_SetWindow(3, 5);
  192. //        LCD12864_WriteData(shizi_CharCode[_1s%10]);
  193. //        LCD12864_SetWindow(3, 5);
  194. //        LCD12864_WriteData(shizi_CharCode[_1s%10]);

  195. }

  196. void distance()
  197. {
  198.         distancex=quan*0.222+quan2*65535*0.222;
  199.        
  200. }

  201. void main()
  202. {
  203.         unsigned char i,j,k,l,m,p,q,r,s,t,u;
  204.        
  205.          exit_init();
  206.          TimerConfiguration();
  207.         LCD12864_Init();
  208.                 LCD12864_SetWindow(0, 0);
  209. //                LCD12864_WriteData(licheng_CharCode[i]);
  210.                 while(licheng_CharCode[i]!='\0')
  211.                 {
  212.                         LCD12864_WriteData(licheng_CharCode[i]);
  213.                         i++;
  214.                 }
  215.                 LCD12864_SetWindow(1, 0);
  216.                 while(jine_CharCode[j]!='\0')
  217.                 {
  218.                         LCD12864_WriteData(jine_CharCode[j]);
  219.                         j++;
  220.                 }
  221.                 LCD12864_SetWindow(2, 0);
  222.                 while(qibujia_CharCode[k]!='\0')
  223.                 {
  224.                         LCD12864_WriteData(qibujia_CharCode[k]);
  225.                         k++;
  226.                 }
  227.                 LCD12864_SetWindow(2, 5);
  228.                 LCD12864_WriteData(shizi_CharCode[5]);
  229.                 LCD12864_SetWindow(2, 4);
  230.                 LCD12864_WriteData(shizi_CharCode[0]);
  231.                 LCD12864_SetWindow(2, 6);
  232.                 while(wuyuan_CharCode[m]!='\0')
  233.                 {
  234.                         LCD12864_WriteData(wuyuan_CharCode[m]);
  235.                         m++;
  236.                 }
  237.                         LCD12864_SetWindow(1, 6);
  238.                 while(wuyuan_CharCode[p]!='\0')
  239.                 {
  240.                         LCD12864_WriteData(wuyuan_CharCode[p]);
  241.                         p++;
  242.                 }
  243.        

  244.                 LCD12864_SetWindow(3, 0);
  245.                 while(shijian_CharCode[l]!='\0')
  246.                 {
  247.                         LCD12864_WriteData(shijian_CharCode[l]);
  248.                         l++;
  249.                 }

  250.                         LCD12864_SetWindow(0, 3);
  251.                 while(erdianwu_CharCode[q]!='\0')
  252.                 {
  253.                         LCD12864_WriteData(erdianwu_CharCode[q]);
  254.                         q++;
  255.                 }
  256. ……………………

  257. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
12864计程计费.zip (1.02 MB, 下载次数: 81)


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

使用道具 举报

沙发
ID:143986 发表于 2017-10-7 17:54 | 只看该作者
哪个引脚接电机计数原件
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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