找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2245|回复: 0
收起左侧

单片机出租车计价器的设计+Proteus仿真+keil程序

[复制链接]
ID:1080848 发表于 2023-5-31 10:15 | 显示全部楼层 |阅读模式
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
51hei.gif Dingtalk_20230531101152.jpg
本设计的是一个基于单片机AT89C51的出租车自动设计,附有复位电路,时钟电路,键盘电路等。复位电路是单片机的初始化操作,除了正常的初始化外,为摆脱困境,通过复位电路可以重新开始。时钟电路采用12MHz的晶振,作为系统的时钟源,具有较高的准确性。
在上电时四位共阳极74EG-MPX4-CA数码管显示最初的起步价,里程,汽车行驶时间,通过按键可以切换起步价,里程,汽车行驶时间。通过按键模拟出租车的运行,暂停,停止。在74EG-MPX4-CA液晶上可以显示运行的时间,运行时暂停的时间,以及所用的。在这里主要是以AT89C51单片机为核心控制器,P3口接74EG-MPX4-CA液晶显示模块,P0口接按键的,通过按键输入。

传感器知识面广,如果在实践技能的锻炼上下功夫,单凭课堂理论课学习,势必出现理论与实践脱节的局面。任随书本上把单片机技术介绍得多么重要、多么实用多么好用,同学们仍然会感到那只是空中楼阁,离自己十分遥远,或者会感到对它失去兴趣,或者会感到它高深莫测无从下手,这些情况都会令课堂教学的效果大打折扣。

本次设计的目的就是让我们在理论学习的基础上,通过完成一个传感品器件的设计,使我们学生不但能够将课堂上学到的理论知识与实际应用结合起来,而且能够对电子电路、电子元器件、印制电路板等方面的知识进一步加深认识,同时在软件编程、排版调试、焊接技术、相关仪器设备的使用技能等方面得到较全面的锻炼和提高。

出租车计价器是出租车营运的专用智能化仪表,随着电子技术的发展,出租车计价器技术也在不断进步和提高。国内出租车计价器已经经历了4 个阶段的发展。从传统的全部由机械元器件组成的机械式,到半电子式即用电子线路代替部分机械元器件的出租车计价器;再从集成电路式到目前的单片机系统设计的出租车计价器。出租车计价器是否准确、出租车司机是否作弊才是乘客最关心的问题,而计价器营运数据的管理是否方便才是出租车司机最关注的。因此怎样设计出一种既能有效防止司机作弊又能方便司机的计价器尤为重要。因此, 本文以单片机A T89C51 为核心设计一款多功能出租车计价器,该计价器能实现按时间和里程综合计算车价,能显示时间、总车价等相关信息显示。它比市场上的一些计价器使用更方便,功能更全,还具有有效防止司机作弊和系统稳定性好的优点。


2  系统设计简介

2.1出租车计价器简介

以单片机AT89C51为核心设计一款多功能出租车计价器,该计价器能实现按时间和里程综合计算车价,能显示时间、总车价等相关信息显示。它比市场上的一些计价器使用更方便,功能更全,还具有有效防止司机作弊和系统稳定性好的优点。
2.2 设计要求

基于单片机的出租车计价器系统设计,基本实现出租车计价器的部分功能。
2.3 设计方案论证

根据系统的设计要求,用时间模拟路程设计出租车计价器,选择单片机AT89C51为测控系统的核心来完成数据采集、处理、显示等功能。选用时间模拟路程省却了采样/保持电路、运放、数/模转换电路以及进行长距离传输时的串/并转换电路,简化了电路,缩短了系统的工作时间,降低了系统的硬件成本。
该系统的总体设计思路如下:将设计好的时间间隔发送到单片机上,经过51单片机处理,将把时间和价在显示电路上显示,本系统显示器用4位共阳LED数码管以动态扫描法实现。
按照系统设计功能的要求,确定系统由5个模块组成:主控制器、时钟电路,复位电路,振荡电路和显示电路。
本课题以是AT89C51单片机为核心设计的一种出租车计价器,系统整体硬件电路包括,时钟电路,复位电路,振荡电路和显示电路,单片机主板电路等组成。

系统框图主要由主控制器、单片机复位、时钟振荡、LED显示、总体电路结构框图如图2.3所示。





                图2.3  出租车计价器总体电路结构框图

2.4 硬件设计电路
本设计电路图如图2.4所示。本系统控制器使用单片机AT89C51,显示器用4位共阳LED数码管以动态扫描法实现。
图2.4  出租车计价器总电路图

3  设计语言及软件介绍
3.1 C语言介绍
C语言是一种计算机程序设计语言,它既具有高级语言的特点,又具有汇编语言的特点。它由美国贝尔研究所的D.M.Ritchie于1972年推出,1978年后,C语言已先后被移植到大、中、小及微型机上,它可以作为工作系统设计语言,编写系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。它的应用范围广泛,具备很强的数据处理能力,不仅仅是在软件开发上,而且各类科研都需要用到C语言,适于编写系统软件,三维,二维图形和动画,具体应用比如单片机以及嵌入式系统开发。
3.2 Keil uVision4软件介绍
Keil uVision4是一款与51系列兼容单片机汇编和C语言的软件开发系统,该软件提供了丰富的库函数和功能强大的集成开发调试工具,全Windows界面。它的集成开发环境集成了一个项目管理器和一个功能丰富 有错误提示的编辑器,以及设置选项,生成工具,在线帮助等功能。利用Keil uVision4可以编译C、汇编、C和汇编的混合编程源程序,并把它们组织到一个能确定的目标应用的项目中去。Keil uVision4会自动编译,汇编,连接嵌入式应用,并为你的开发提供一个单一的焦点。
4  系统软件设计
4.1 概述
整个系统的功能是由硬件电路配合软件来实现的,当硬件基本定型后,软件的功能也就基本定下来了。从软件的功能不同可分为两大类:一是监控软件(主程序),它是整个控制系统的核心,专门用来协调各执行模块和操作者的关系。二是执行软件(子程序),它是用来完成各种实质性的功能如测量、计算、显示、通讯等。每一个执行软件是一个小的功能执行模块。这里将各执行模块一一列出,并为每一个执行模块进行功能定义和接口定义。各执行模块规划好后,就可以规划监控程序了。首先要根据系统的总体功能选择一种最合适的监控程序结构,然后根据实时性的要求,合理地安排监控软件和各执行模块之间地调度关系。用C语言完成对设计的软件编程,程序开始首先定义几个函数,以及几个初值;然后通过延时程序连接显示电路和AT89C51,然后编写价程序和时间程序,同时设计一个中断程序,还有体现按键功能的程序写入及读取数据子程序,之后再经过数据转换,由数码管显示出来,不断循环。

4.2 系统程序设计模块
系统程序主要包括主程序,延时子子程序,键盘扫描子程序,价计算显示子程序和时间显示子程序,中断子程序等。
4.2.1主程序
主程序的主要功能是实现整个计价器系统的实时显示,时间价的转换,按键控制功能。主程序流程图如图4.2.1所示。
图4.2.1  主程序流程图
4.2.2延时子程序
延时程序的主要功能是对单片机和显示数码管之间的延时转换,以及按键和数码管之间的延时作用。延时子程序流程图如图4.2.2所示。
图4.2.2  延时子程序流程图
4.2.3键盘扫描子程序
键盘扫描子程序主要是对暂停播放,时间价的转换和清零键的控制。键盘扫描子程序图4.2.3所示。

      

                                                     

图4.2.3  键盘扫描子程序流程图

4.2.4价计算显示子程序
价计算显示子程序将对出租车行驶的价计算和数码管对价的显示。其流程图如图4.2.4所示。






图4.2.4  价计算显示子程序图

4.2.5时间显示子程序

时间显示子程序主要是对出租车行驶中时间的显示操作。时间显示子程序流程图如图4.2.5所示。
图4.2.5 时间显示子程序图

4.2.6中断子程序
     中断子程序主要是对出租车系统中每个中断环节的控制盒实现。中断子程序流程图如图4.2.6所示。

图4.2.6 中断示子程序图

4.3 控制源C语言程序
#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int
sbit p00=P0^0 ;
sbit p01=P0^1 ;
sbit p02=P0^2 ;
sbit p37=P3^7 ;
uint i,j;
uint code Seg[19]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x80};
//数码管译码表:   { 0  , 1 , 2 , 3 , 4  ,5    6     7   8    9    0    . }       P}
uchar jps,ks,key_do;//键盘缓存,上次有按键按下标志位,按键已处理标志位
uint count_10ms=0,second=0;
float cost;    //
void delay(uint tt)  //延时函数
{
  uint i;
  for(;tt>0;tt--)
    for(i=0;i<200;i++);
}

void LED(uint d1,uint d2)
{
       if(d1==1)  P0=(P0|0xf0)&0x1f;
       if(d1==2)  P0=(P0|0xf0)&0x2f;
       if(d1==3)  P0=(P0|0xf0)&0x4f;
       if(d1==4)  P0=(P0|0xf0)&0x8f;
       P0=P0|0x0f;
       P1=Seg[d2];
}
int keyscan()     //键盘扫描函数
{
  int t=0;
  if(p00==0) { t=1; jps=1;}
  if(p01==0) { t=1; jps=2;}
  if(p02==0) { t=1; jps=3;}
  return(t);  
}
void money()    //价计算
{
  count_10ms++;
  if(count_10ms==100)
     {count_10ms=0;second++;}
  if(second<=3) cost=5.0;
       else if(second>3) cost=5.0+0.7*(second-3);
}
void ledshow()
{  
       while(j%2==0)   //  价显示
              {
                      LED(1,(int) (cost/10) );
                      delay(5);
               LED(2,(int) cost%10 );
                      delay(5);
                      LED(3,(int) (cost*10)%10 );
                      delay(5);
                      LED(4,(int) (cost*100)%10 );
                      delay(5);
                      LED(2,11);
                      delay(5);
              }

       while(j%2==1)   //    时间显示   
       {
                     LED(1,second/10);
                    delay(5);
                     LED(2,second%10);
                     delay(5);
                     LED(3,count_10ms/10);
                     delay(5);
                     LED(4,count_10ms%10);
                     delay(5);
                     LED(2,11);
                     delay(5);            
          }

}
void Time_fun() interrupt 1    //10ms中断函数
{
  uint k;
  if(k==15) { k=0; p37=1; }
    else k++;
  TH0=(0xffff-10000)/256;  //10ms
  TL0=(0xffff-10000)%256;  //10ms

  if(i%2==1) money();     //   暂停/播放
  if((ks==1)&&(keyscan()==1)&&(key_do==0))
        {                                    
              k=0;
              p37=0;   //按键提示音
              key_do=1;
              if(jps==1) i++;  //   暂停/播放键
              if(jps==2) j++; //    时间价显示转换
              if(jps==3)  //   清零键
                     {
                       count_10ms=0;
                       second=0;
                       cost=0;
                     }
        }  
  ks=keyscan();
  if(ks==0)  key_do=0;

}

main()
{  
       TMOD=0x01;     //Time0为16计数器
       TH0=(0xffff-10000)/256;
       TL0=(0xffff-10000)%256;
       TR0=1;    //打开定时器
       IE=0x82;  //EA=1  ET0=1  打开中断

       while(1)
    {
              ledshow();

    }
}
;

4. 4 调试及仿真
经软件调试-仿真器proteus调试通过,并烧录芯片,得到所要求的设计结果。如下图,试验成功。
图4.4.1价(一)
图4.4.2时间(一)

图4.4.3价(二)
图4.4.4时间(二)

图4.4.5价(三)
图4.4.6时间(三)

图4.4.7价(四)
图4.4.8时间(四)

图4.4.9价(五)
图4.4.10时间(五)

结 论
本文介绍了基于AT89C51单片机的数字温度计控制系统的设计,对整个硬件电和软件程序设计做了分析,文中介绍了数字温度计的现状及发展,介绍了仿真软件Proteus及Keil的基本知识,一个月来,经过我们的努力,基本上完成了设计要求的内容,在系统可行性分析、原理图设计等方面都作了许多实际工作,取得了一些成绩,也遇到了一些问题,存在一些不足。经过这一个月的学习,我们在理论知识方面还是在动手能力方面都有了不小的进步,受益匪浅。这次设计很好的把以前学到的理论知识应用于实践,使我们认识到理论知识与实践之间有一定的差距,只有通过不断的努力学习和实践才能很好的把理论知识应用到实践当中,也只有通过不断的实践才能对理论知识的理解。
通过这次设计不仅学会了如何去查找相关资料,更重要的是通过查找资料和翻阅书籍学到了不少知识,扩大了知识面,提高了知识水平。经过单元设计和系统设计巩固了以前所学的专业知识,真正认识到理论联系实际的重要性,为以后的学习和工作提供了很多有价值的经验。通过这次设计不仅增强了动脑能力和动手能力,也提高了我们思考问题、分析问题、解决问题的能力,更重要的是学会用工程化的思想来解决问题。
这次设计使我们认识到完整、严谨、科学分析问题、解决问题的思想是多么的重要,只有拥有了科学的态度才能设计出有用的产品。另外通过本次设计,也使我们认识到自己理论知识的应用能力有很大的欠缺,需要在以后的学习中进一步提高。
51hei.png
Keil代码与Proteus仿真下载(注意要先按暂停后再按转换): 出租车计价器.7z (502.72 KB, 下载次数: 68)

评分

参与人数 1黑币 +50 收起 理由
admin + 50

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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