历史上的今天
返回首页

历史上的今天

今天是:2024年12月16日(星期一)

正在发生

2020年12月16日 | 基于单片机控制的出租车计价器

2020-12-16 来源:51hei

本次出租车计价器设计以AT89C52单片机为中心,采用AMPIRE28*64液晶屏显示出租车计价单价、里程数和金额;采用时钟芯片DS1302来显示时间和在系统需要时进行计时。其中有三个按键代表“开始/暂停”、“清零”和设置“白天/黑夜”。

实验要求

基本功能

1)显示: 可以显示 单价、里程、总金额

2)停车计费功能:中途因故停车超过5分钟后每分钟按当时单价的50%收费

3)自动分时计费功能:白天和夜间应能自动更换单价

4)性能  里程误差小于2%

扩展功能

1)可增加时钟功能

2)可增加数据掉电保护功能

已完成显示、分时计费、时钟三个功能,另外增添了暂停和清零功能。


AMPIRE128*64液晶显示屏

单片机1.png?imageView2/2/w/550

按键电路的设计

单片机2.png?imageView2/2/w/550

#include

#include

#include"lcd12864.c"

#include"code.h"

#include"ds1302.c"

#include"display.c"

sbit P34=P3^4;        //按钮

sbit P33=P3^3;        //按钮

sbit P12=P1^2;        //灯

float p,price,distance_km,money;   //路程,金额

unsigned int b,n;

bit flag=1;

voidmain(void)     //主函数

{

       init_lcd();               //液晶显示屏

       clearscreen(0);        //清屏

       setline(0);               //起始行

       TMOD=0x01;         //方式1 定时功能

       TH0=0x3c;             //00111100

       TL0=0xaf;              //10101111      50ms计数一次

       IE=0x87;

       IT0=1;

       IP=0x01;

       distance_km=0;        //路程=0

       Init_DS1302();       //时钟芯片

       while(1)

       {

       if(flag)

       {

              TR0=0;

              P12=1;

              price=p;

              display(price);

              display1(distance_km);   //显示路程

              display2(money);          //显示金额

       }

       else

       {

              TR0=1;     //T0中断

              P12=0;      //灯亮

              price=p;

              display(price);

              display1(distance_km);   //显示路程

              display2(money);          //显示金额

       }

              displayc(1,0,0*16,dan);          //显示“单”

              displayc(1,0,1*16,jia);       //显示“价”

              displaye(1,0,4*8,num,15);       //显示“:”

              displayc(1,3,0*16,li);        //显示“里”

              displayc(1,3,1*16,chen);    //显示“程”

              displayc(1,3,2*16,shu);          //显示“数”

              displaye(1,3,6*8,num,15);       //显示“:”

              displayc(1,6,0*16,jin);           //显示“金”

              displayc(1,6,1*16,e);        //显示“额”

              displaye(1,6,4*8,num,15);       //显示“:”              

       }

}

void timer1(void)interrupt 1               //定时器0中断

{

       TH0=0x3c;             //00111100

       TL0=0xaf;              //10101111      50ms计数一次

       b++;

       if(b==10)

       {

              if(P34==1)

              {

                     p=1.5;

                     distance_km+=0.1;                //路程+0.1

                     if(distance_km<=3)money=5;        //小于3km,计价5元

                            elsemoney=4.9+(distance_km-3)*p;    //大于3km部分1.5元每km

                     b=0;

              }

              else

              {

                     p=2;

                     distance_km+=0.1;                //路程+0.1

                     if(distance_km<=3)money=6;        //小于3km,计价6元

                     elsemoney=5.9+(distance_km-3)*p;    //大于3km部分2元每km

                     b=0;

              }

       }

}

void timer0(void)interrupt 0           //外部中断0  按键1

{

       flag=~flag;

}     

void timer2(void)interrupt 2                //外部中断1  按键2

{

       distance_km=0;        //路程=0

       money=0;

       price=p;

}     

LCD12864.C

#include

#include

#define uchar unsigned char

#define uint unsigned int

sbit cs1=P2^0;

sbit cs2=P2^1;

sbit EN=P2^2;

sbit RW=P2^3;

sbit RS=P2^4;

void delay(uchar i)

{

       while(i--);              //延时

}

void readbusy()         //忙碌

{

       P0=0x00;   //00000000

       RS=0;      

       RW=1;      //读出忙标志(BF)及地址记数器(AC)的状态

       EN=1;       //读写使能,下降沿锁定数据

       while(P0&0x80);     //当BF=0,while(0),当BF=1,while(1)

       EN=0;            //EN=1-0,配合RW写数据或指令

}

void lcd_wcmd(uchar cmd)

{

       readbusy();       //判断忙碌

       RS=0;

       RW=0;            //MPU写指令到指令暂存器

       P0=cmd;         

       EN=1;             //配合RS进行读数据或指令

       _nop_();    //延时2个指令周期

       _nop_();

       EN=0;             //EN=1-0,配合RW写数据或指令

}

void lcd_wdat(uchar dat)

{

       readbusy();            //判断忙碌

       RS=1;

       RW=0;            //MPU写数据到数据暂存器

       P0=dat;

       EN=1;             //配合RS进行读数据或指令

       _nop_();    //延时2个指令周期

       _nop_();

       EN=0;             //EN=1-0,配合RW写数据或指令

}

void setpage(uchar page)

{

       page=0xb8|page;    //起始页         10111000

       lcd_wcmd(page);       //写指令

}

void setline(uchar line)

{

                                                         

       line=line&0x3f;        //最终行  00000111

       line=line|0xc0;    //起始行    11000000

       lcd_wcmd(line);        //写指令

}

void setcolumn(uchar column)

{

       column=column&0x3f;   //最终列       00111111

       column=column|0x40;   //起始列         01000000

       lcd_wcmd(column);        //写指令

}

void setonoff(uchar onoff)

{

       onoff=0x3e|onoff;   //00111110

       lcd_wcmd(onoff);    //写指令

}

void selectscreen(uchar screen)            //选择屏幕

{

       switch(screen)

{

       case0:cs1=0;delay(2);cs2=0;delay(2);break;        //全屏

       case1:cs1=0;delay(2);cs2=1;delay(2);break;        //左屏

       case2:cs1=1;delay(2);cs2=0;delay(2);break;        //右屏

       default:break;

}

}

void clearscreen(uchar screen)        //清屏

{

       uchari,j;

       selectscreen(screen);               //选屏

推荐阅读

史海拾趣

台湾肯尼威(CANNYWELL)公司的发展小趣事

台湾肯尼威公司成立于1986年,其创始人李明(化名)是一位对电子技术充满热情的工程师。在当时的台湾,电子制造业正处于蓬勃发展的阶段。李明看到电源滤波器在电子设备中的重要性,于是决定专注于这一领域的研发和生产。他带领一支小团队,经过无数次的试验和改进,终于成功研发出CW系列单相电源滤波器,为公司的发展奠定了坚实的技术基础。

台湾凯励(Carli)公司的发展小趣事

凯励公司始终将技术创新作为发展的核心驱动力。公司不断投入研发资金,加强与高校和研究机构的合作,不断推出具有竞争力的新产品。例如,公司成功研发出了MPX、MTF、MTB等多个系列的金属膜电容器,这些产品不仅具有优异的性能和稳定性,还广泛应用于新能源、工业控制、通信等领域。此外,凯励公司还致力于产品升级和工艺改进,不断提高产品的可靠性和使用寿命。

ELEKTRO-PLAST NASIELSK公司的发展小趣事

随着公司规模的扩大和市场竞争的加剧,ELEKTRO-PLAST NASIELSK公司意识到必须实施全球化战略以拓展市场。公司开始在国际市场寻找合作伙伴,建立生产基地和销售网络。通过与国际知名企业的合作,公司不仅提升了技术水平,还获得了更多的市场份额。同时,公司还积极参与国际行业标准的制定和推广工作,提升了在国际市场上的影响力。

Analogic Corporation公司的发展小趣事

进入新世纪后,电子行业发展迅速,对电子元器件的性能要求也越来越高。ELEKTRO-PLAST NASIELSK公司紧跟行业趋势,投入大量资源进行技术创新。公司研发团队成功开发出一种新型塑料材料,不仅具有优异的绝缘性能和耐高温性能,还具有良好的可加工性。这一技术突破使得公司的产品在市场上脱颖而出,赢得了众多客户的青睐。

ANOVA公司的发展小趣事

面对日益复杂多变的电子市场环境,ANOVA公司始终保持着清醒的头脑和敏锐的洞察力。无论是疫情带来的供应链挑战,还是技术更新换代带来的竞争压力,ANOVA都能迅速应对,不断调整策略,确保公司的稳健发展。同时,ANOVA也积极展望未来,不断探索新的业务领域和技术方向,以期在电子行业中继续保持领先地位。

这五个故事只是ANOVA公司发展过程中的冰山一角,但它们足以展现出ANOVA公司如何在电子行业中逐步崛起,成为一支不可忽视的力量。ANOVA以其卓越的技术实力、全球化的布局和紧密的合作伙伴关系,不断推动着电子行业的发展和进步。

Circuit Assembly公司的发展小趣事

ANOVA公司的成功并非偶然,它始终站在技术创新的前沿。公司积极推动新通信技术、电池寿命和移动应用等方面的创新,不断推动电子行业的发展。ANOVA的研发团队不断探索新技术,致力于为客户提供最先进的解决方案,帮助客户在激烈的市场竞争中保持领先地位。

问答坊 | AI 解惑

整理中的传感器部分清单

传感器接近开关10-36VDC/200mA/4mmLJ18A3-4-Z/BX 乐清市新欧传感器有限公司1传感器接近开关10-36VDC/200mA/8mmLJ18A3-8-Z/BX 乐清市新欧传感器有限公司1传感器接近开关黄色/塑料/大   1传感器光电二极管发射管EL-1KL3  2传感器光电三极管接 ...…

查看全部问答>

WinCE6.0中Catalog Item没有CISCO Aironet 340/350 PCMCIA WLAN Card网卡驱动选项

我要加一个CISCO Aironet 350 PCMCIA 无线网卡,查看Windows Embedded CE6.0帮助文件,有CISCO Aironet 340/350 PCMCIA WLAN Card驱动可以用,位于Device Drivers\\Networking\\下。可是我的Wince6.0却找不到这个驱动,不知道怎么回事?…

查看全部问答>

三星2440 IIC驱动的问题

因为要控温,所以要不停的通过IIC接口向从机写数据,就出问题了,有时写不进去,查了一下是因为IICCON[4]中断位没有清0,不知为什么,哪位高手遇到过这个问题,怎么解决的? void WrIIC(__u8 slvAddr, __u8 cmd, __u16 data) {     &n ...…

查看全部问答>

求救,对makefile中的3句代码无法理解,

# Flags: CFLAGS =  -Wall -g -I$(INC_PATH) CFLAGS += -c -mcpu=arm9tdmi -mlittle-endian CFLAGS += -O -D ARM_GCC 其中INC_PATH = ./Include 这3句代码有什么特别的意义吗?可以去掉或者忽略吗?谁能详细解释下,谢谢…

查看全部问答>

暑期学习

a)        暑期嵌入式特色强化培训课程 i.        嵌入式Linux驱动与内核强化培训班 1.        课程目标 ◆ 掌握Linux操作系统及内核; ◆ 掌握ARM体系结构; ◆ 掌握嵌入式技术 ...…

查看全部问答>

PDA开发的的问题:高手要是不来看看这世上又要多一个疯子拉!

小女只是单片机初学者,应用过MCS-51设计过简单的课程设计,电路还不是特别明白,现在在一家公司上班,老大儿却让我用ARM7开发一个无线的PDA设备,给我一个系统的大致流程图,还不能叫做流程图,就叫功能与操作描述吧,然后问我这些能不能做出这个P ...…

查看全部问答>

关于非接触式体温计

谁知道那个飞接触式体温计用什么传感器好,还有要用什么AD转换器。。。    OTP-538 非接触式红外温度传感器  这个传感器的温度补偿电路参数是怎么样的  谢谢。…

查看全部问答>

你想怎么学launchpad?

看到很多朋友希望能有一个学习launchpad的教程,大家想怎样学呢?以实验为主体,或者先介绍各模块结构,再辅以试验?或者大家有什么想法?…

查看全部问答>

c2000launchpad仿真器成功连接28030开发板

[ 本帖最后由 sw0605 于 2013-5-28 14:35 编辑 ]…

查看全部问答>