找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机出租车计价器Proteus仿真程序(霍尔测速)

  [复制链接]
跳转到指定楼层
楼主
出租车计价器(霍尔测速)
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. //电子时钟
  2. //宏定义
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. //头函数声明
  6. #include <reg52.h>
  7. #include "Lcd.h"
  8. #include "Data.h"
  9. #include "DS1302.h"
  10. #include "AT24C02.h"



  11. //键盘定义
  12. sbit K1=P3^4;        //模式切换
  13. sbit K2=P3^6;        //减按键
  14. sbit K3=P3^5;        //加按键
  15. sbit K4=P3^7;        //万年历模式时:设置时间信息。计价器模式时:设置单价

  16. //模式0时钟 1时钟调整                                                   
  17. uchar Mode=0;
  18. //时钟屏幕调整
  19. uchar Wei=0;
  20. uchar SS=0;
  21. //价格调整
  22. uchar JGWei=0;

  23. //计价器参数
  24. uint Day=0;
  25. uint Night=0;
  26. uint DanJia=0;
  27. uint DJ_min=0;
  28. uint  ZJ=0;
  29. unsigned long  GL=0;
  30. uint  Time=0;
  31. uint count=0;
  32. uchar m=0;
  33. //白天/晚上
  34. uchar DN=0;
  35. //公里/时间
  36. uchar GT=0;

  37. //初始化函数
  38. void InitTimer0();
  39. //写初值
  40. void SETS();
  41. //读初值
  42. void READS();

  43. //主函数
  44. void main()
  45. {
  46.         //初始化
  47.         Ds1302_Init();
  48.         Init_LCD();
  49.         initeeprom();
  50.         //SETS();
  51.         //读取初始参数
  52.         READS();
  53.         //定时器初始化
  54.         InitTimer0();
  55.         //循环
  56.         while(1)
  57.         {
  58.                 //时钟模式
  59.                 if(Mode==0)
  60.                 {
  61.                         //读时间
  62.                         if(Wei==0)
  63.                         {
  64.                                 Ds1302_Read_Time();
  65.                                 //显示时间
  66.                                 display_NYR(time_buf1,Wei,0);
  67.                         }
  68.                 }
  69.                 else if(Mode==1)
  70.                 {
  71.                         if(time_buf1[4]>=23||time_buf1[4]<7)  
  72.                         DN=1;
  73.                         else
  74.                         DN=0;
  75.                         //显示计价器信息
  76.                         
  77.                         display_S(Day,Night,DanJia,ZJ,GL/10,Time,GT,DN);
  78.                 }


  79.                 if(K4==0)
  80.                 {
  81.                         delay(100);
  82.                         //调时
  83.                         if(Mode==0)
  84.                         {
  85.                                 Wei++;
  86.                                 if(Wei==1)
  87.                                 {
  88.                                         SS=1;
  89.                                 }
  90.                                 //闪烁
  91.                                 display_NYR(time_buf1,Wei,SS);
  92.                                 if(Wei==7)
  93.                                 {
  94.                                         Wei=0;
  95.                                         //保存时间
  96.                                         Ds1302_Write_Time();
  97.                                         Init_LCD();
  98.                                 }
  99.                         }
  100.                         else if(Mode==1)
  101.                         {
  102.                                 JGWei++;
  103.                                 if(JGWei==1)
  104.                                 {
  105.                                         Mode=2;
  106.                                         //显示计价器价格
  107.                                         Init_LCD_JGTZ();
  108.                                         display_D(Day,Night,DanJia,JGWei,DJ_min);
  109.                                 }
  110.                         }
  111.                         else if(Mode==2)
  112.                         {        
  113.                                 JGWei++;        
  114.                                 display_D(Day,Night,DanJia,JGWei,DJ_min);
  115.                                 if(JGWei==5)
  116.                                 {
  117.                                         Mode=1;
  118.                                         JGWei=0;
  119.                                         //参数初始化
  120.                                         //保存
  121.                                         SETS();
  122.                                         //读初值
  123.                                         READS();
  124.         
  125.                                         ZJ=0;
  126.                                         GL=0;
  127.                                         Time=0;
  128.                                         //开启定时器
  129.                                         TR0=1;
  130.                                         //显示计价器
  131.                                         Init_LCD_JJQ();
  132.                                 }
  133.                         }
  134.                         while(K4==0);
  135.                 }
  136.                 //+
  137.                 if(K3==0)
  138.                 {
  139.                         delay(100);
  140.                         //调时
  141.                         if(Mode==0)
  142.                         {
  143.                                 //年
  144.                                 if(Wei==1)
  145.                                 {
  146.                                         time_buf1[1]++;
  147.                                         if(time_buf1[1]>=100)
  148.                                                 time_buf1[1]=0;
  149.                                 }
  150.                                 //月
  151.                                 else if(Wei==2)
  152.                                 {
  153.                                         time_buf1[2]++;
  154.                                         if(time_buf1[2]>=13)
  155.                                                 time_buf1[2]=1;
  156.                                 }
  157.                                 //日
  158.                                 else if(Wei==3)
  159.                                 {
  160.                                         time_buf1[3]++;
  161.                                         if(time_buf1[3]>=YDay(time_buf1[1],time_buf1[2])+1)
  162.                                                 time_buf1[3]=1;
  163.                                 }        
  164.                                 //时
  165.                                 else if(Wei==4)
  166.                                 {
  167.                                         time_buf1[4]++;
  168.                                         if(time_buf1[4]>=24)
  169.                                                 time_buf1[4]=0;
  170.                                 }        
  171.                                 //分
  172.                                 else if(Wei==5)
  173.                                 {
  174.                                         time_buf1[5]++;
  175.                                         if(time_buf1[5]>=60)
  176.                                                 time_buf1[5]=0;
  177.                                 }
  178.                                 //秒
  179.                                 else if(Wei==6)
  180.                                 {
  181.                                         time_buf1[6]++;
  182.                                         if(time_buf1[6]>=60)
  183.                                                 time_buf1[6]=0;
  184.                                 }
  185.                                 //显示
  186.                                 if(Wei!=0)
  187.                                         display_NYR(time_buf1,Wei,SS);                        
  188.                         }
  189.                         //调价
  190.                         else if(Mode==2)
  191.                         {
  192.                                 //单价
  193.                                 if(JGWei==1)
  194.                                 {
  195.                                         DanJia++;
  196.                                         if(DanJia>999)
  197.                                         {
  198.                                                 DanJia=1;
  199.                                         }
  200.                                 }
  201.                                 //等待时间单价
  202.                                 else if(JGWei==2)
  203.                                 {
  204.                                         DJ_min++;
  205.                                         if(DJ_min>999)
  206.                                         {
  207.                                                 DJ_min=1;
  208.                                         }
  209.                                 }
  210.                                 //夜间
  211.                                 else if(JGWei==3)
  212.                                 {
  213.                                         Night++;
  214.                                         if(Night>999)
  215.                                         {
  216.                                                 Night=1;
  217.                                         }
  218.                                 }
  219.                                 //白天
  220.                                 else if(JGWei==4)
  221.                                 {
  222.                                         Day++;
  223.                                         if(Day>999)
  224.                                         {
  225.                                                 Day=1;
  226.                                         }
  227.                                 }
  228.                                 display_D(Day,Night,DanJia,JGWei,DJ_min);
  229.                         }

  230.                         while(K3==0);
  231.                 }

  232.                 //-
  233.                 if(K2==0)
  234.                 {
  235.                         delay(100);
  236.                         //调时
  237.                         if(Mode==0)
  238.                         {
  239.                                 //年
  240.                                 if(Wei==1)
  241.                                 {
  242.                                         time_buf1[1]--;
  243.                                         if(time_buf1[1]<0)
  244.                                                 time_buf1[1]=99;
  245.                                 }
  246.                                 //月
  247.                                 else if(Wei==2)
  248.                                 {
  249.                                         time_buf1[2]--;
  250.                                         if(time_buf1[2]<=0)
  251.                                                 time_buf1[2]=12;
  252.                                 }
  253.                                 //日
  254.                                 else if(Wei==3)
  255.                                 {
  256.                                         time_buf1[3]--;
  257.                                         if(time_buf1[3]<=0)
  258.                                                 time_buf1[3]=YDay(time_buf1[1],time_buf1[2]);
  259.                                 }        
  260.                                 //时
  261.                                 else if(Wei==4)
  262.                                 {
  263.                                         time_buf1[4]--;
  264.                                         if(time_buf1[4]<0)
  265.                                                 time_buf1[4]=23;
  266.                                 }        
  267.                                 //分
  268.                                 else if(Wei==5)
  269.                                 {
  270.                                         time_buf1[5]--;
  271.                                         if(time_buf1[5]<0)
  272.                                                 time_buf1[5]=59;
  273.                                 }
  274.                                 //秒
  275.                                 else if(Wei==6)
  276.                                 {
  277.                                         time_buf1[6]--;
  278.                                         if(time_buf1[6]<0)
  279.                                                 time_buf1[6]=59;
  280.                                 }
  281.                                 //显示
  282.                                 if(Wei!=0)
  283.                                         display_NYR(time_buf1,Wei,SS);                        
  284.                         }
  285.                         //调价
  286.                         else if(Mode==2)
  287.                         {
  288.                                 //单价
  289.                                 if(JGWei==1)
  290.                                 {
  291.                                         DanJia--;
  292.                                         if(DanJia==0)
  293.                                         {
  294.                                                 DanJia=999;
  295.                                         }
  296.                                 }
  297.                                 //等待时间单价
  298.                                 else if(JGWei==2)
  299.                                 {
  300.                                         DJ_min--;
  301.                                         if(DJ_min==0)
  302.                                         {
  303.                                                 DJ_min=999;
  304.                                         }
  305.                                 }
  306.                                 //夜间
  307.                                 else if(JGWei==3)
  308.                                 {
  309.                                         Night--;
  310.                                         if(Night==0)
  311.                                         {
  312.                                                 Night=999;
  313.                                         }
  314.                                 }
  315.                                 //白天
  316.                                 else if(JGWei==4)
  317.                                 {
  318.                                         Day--;
  319.                                         if(Day==0)
  320.                                         {
  321.                                                 Day=999;
  322.                                         }
  323.                                 }
  324.                                 display_D(Day,Night,DanJia,JGWei,DJ_min);
  325.                         }
  326.                         while(K2==0);
  327.                 }        
  328.                 //切换
  329.                 if(K1==0)
  330.                 {
  331.                         delay(100);
  332.                         //计价器模式
  333.                         if(Mode==1)
  334.                         {
  335.                                 Mode=0;
  336.                                 ZJ=0;
  337.                                 GL=0;
  338.                                 Time=0;
  339.                                 //开启定时器
  340.                                 TR0=0;
  341.                                 EX0=0;
  342.                                 //显示计价器
  343.                                 Init_LCD();
  344.                         }
  345.                         else if(Mode==0)
  346.                         {
  347.                                 Mode=1;
  348.                                 //参数初始化
  349.                                 //读初值
  350.                                 READS();
  351.                                 ZJ=0;
  352.                                 GL=0;
  353.                                 Time=0;
  354.                                 //开启定时器
  355.                                 m=0;
  356.                                 TR0=1;
  357.                                 EX0=1;
  358.                                 //显示计价器
  359.                                 Init_LCD_JJQ();
  360.                         }
  361.                         while(K1==0);
  362.                 }
  363.         }
  364. }

  365. //初始化函数
  366. void InitTimer0(void)
  367. {
  368.     TMOD = 0x01;
  369.     TH0 = 0x3C;
  370.     TL0 = 0xB0;                //10ms
  371.     EA = 1;
  372.     ET0 = 1;
  373.     TR0 = 1;
  374.         IT0=1;        //INT0负跳变触发
  375.         EX0=0;//开外部INTO中断
  376. }

  377. //定时器0中断10ms
  378. void Timer0Interrupt(void) interrupt 1
  379. {
  380.     TH0 = 0x3C;
  381.     TL0 = 0xB0;   //赋初值
  382.         m++;
  383.         if(m>=20)
  384.         {
  385.                 m=0;
  386.                 if(count>=60)
  387.                 {
  388.                         GT=0;
  389.                         GL=GL+count/10;
  390.                         count=0;
  391.                 }
  392.                 else
  393.                 {
  394.                         count=0;
  395.                         GT=1;
  396.                         Time++;         //时间++
  397.                 }
  398.         }
  399.          //计算钱数
  400.          //公里数小于3
  401.          if(GL<=300)
  402.          {
  403.                 if(DN==0)
  404.                 {
  405.                         if(Time>60)
  406.                                 ZJ=Day+Time/60*DJ_min;
  407.                         else
  408.                                 ZJ=Day;
  409.                 }        
  410.                 else
  411.                 {
  412.                         if(Time>60)
  413.                                 ZJ=Night+Time/60*DJ_min;
  414.                         else
  415.                                 ZJ=Night;
  416.                 }
  417.          }
  418.          else
  419.          {
  420.                 if(DN==0)
  421.                 {
  422.                         if(Time>60)
  423.                                 ZJ=Day+(GL/10-20)/10*DanJia+Time/60*DJ_min;
  424.                         else
  425.                                 ZJ=Day+(GL/10-20)/10*DanJia;

  426.                 }        
  427.                 else
  428.                 {
  429.                         if(Time>60)
  430.                                 ZJ=Night+(GL/10-20)/10*DanJia+Time/60*DJ_min;
  431.                         else
  432.                                 ZJ=Night+(GL/10-20)/10*DanJia;
  433.                 }
  434.          }
  435. }
  436. void EXINT0() interrupt 0
  437. {
  438.         count++;
  439. }

  440. //读初值
  441. void READS()
  442. {
  443.         uchar SH=0,SL=0;
  444.         uint temp=0;

  445.         delay(10);
  446.         SL=read_add(0x01);
  447.         delay(10);
  448.         SH=read_add(0x02);
  449.         temp=SH;
  450.         temp=temp<<8;
  451.         temp=temp+SL;
  452.         Day=temp;

  453.         delay(10);
  454.         SL=read_add(0x03);
  455.         delay(10);
  456.         SH=read_add(0x04);
  457.         temp=SH;
  458.         temp=temp<<8;
  459.         temp=temp+SL;
  460.         Night=temp;

  461.         delay(10);
  462.         SL=read_add(0x05);
  463. ……………………

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

所有资料51hei提供下载:

c程序.zip

61.56 KB, 下载次数: 186, 下载积分: 黑币 -5

pcb图.zip

529.58 KB, 下载次数: 65, 下载积分: 黑币 -5

只有jpg图片

protus仿真.zip

49.45 KB, 下载次数: 200, 下载积分: 黑币 -5

原理图.zip

145.99 KB, 下载次数: 96, 下载积分: 黑币 -5

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

使用道具 举报

沙发
ID:642727 发表于 2020-3-27 16:26 | 只看该作者
1602不显示
回复

使用道具 举报

板凳
ID:391247 发表于 2020-4-4 16:48 | 只看该作者
不显示是怎么回事呢
回复

使用道具 举报

地板
ID:715062 发表于 2020-5-10 00:13 | 只看该作者
请问显示屏就亮  没有啥子显示  怎么处理
回复

使用道具 举报

5#
ID:438003 发表于 2020-12-1 19:03 | 只看该作者
1602仿真没有显示
回复

使用道具 举报

6#
ID:890989 发表于 2021-3-11 22:57 来自手机 | 只看该作者
是用proteus8.7画的仿真图嘛
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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