单片机出租车计价器

二、基本功能要求
1 )使用 LCD12864 显示行驶里程( mile )和费用( cost )。上一行显示出租车行驶
里程数,里程范围为 0 ~ 999 千米(例: mile 5km )。下一行显示应收取费用,费用金
额范围为 0~9999 元(例: cost 9yuan )。
2 )按键 S1 按下后,出租车起步,开始计费。按键 S1 再次按下时,本次服务结 束,出租车计费结束。费用收取标准为:
计价包括 起步价、行车里程计费 两部分。
当里程 ≤ 3 km (公里)时,按起步价 6 元计费;
里程 > 3 km (公里)时,按 1.2 / km 计费。
3 )里程计算方法:车轮周长为 1 米,车轮转一圈产生一个脉冲,即脉冲数达到
1000 时,行驶里程为 1km 。采用单片机的定时器 2 产生 4kHz (周期 250 μ s )的方波脉
冲信号,来代替实际的脉冲产生。
三、发挥要求
1 )制作一个能够调速的电机,模仿车轮转动。利用电位器输入,通过 A/D 转换
来调节电机转速。使用光电传感器输入计价器。
2 LCD12864 模块实时显示时间,时间由 DS1302 模块产生,时间只显示小时和分
钟(例 time 12:13 ),时间数字与当前时间一致,设置校正时间功能建。
3 )道路会出现堵车等情况,为了减轻出租车运营成本,出租车费用增加 等待时
间收费 。按键 S2 按下后,代表出租车开始处于静止等待状态。按键 S2 再次按下时,出
租车结束静止状态。显示出租车等待时间(例 delay 13min )。
费用收取标准为:
计价包括 起步价、等待时间计费、行车里程计费 三部分。
当里程 ≤ 3 km (公里)时,按起步价 6 元计算费用;
里程 > 3 km (公里)时,按 1.2 / km 计费。
等待累计时间 > 5 min (分钟)时,按 1.0 /5 min 计费。(实际设计时,用 1
代替 5 分钟,以节省演示时间。)
4 )按下按键 S3 ,采用分时计费模式。
费用收取标准位:计价包括 起步价、等待时间计费、行车里程计费 三部分。
时段 1 (指 6 点之后到晚上 22 点之前)起步价为 6.0 元,
时段 2 (晚上 22 点之后到第二天 6 点之前)起步价为 7.0 元。
按下按键 S4 ,用于切换时段 1 2 ,( 7 00 23 00
话不多说上程序

#include<public.h>
#include<LCD12864.h>
#include<DS1302.h>
#include<key.h>
#include<XPT2046.h>
sbit PWM=P2^4;
u1 code a[]={"CZCJJQ"};
u1 code b[]={"0302"} ;
u1 code c[]={"mile"};
u1 code d[]={"cost"};
u1 code e[]={"delay:"};
u1 gduty;
u2 miao;
u2 miao1,miao2;
u2 money,mile;
u1 flag;
u1 mode1,wait_time;
u1 key_value,time_cnt,time_mode,money_mode=1;
u1 qi_money;


void ad_data()
{
    u2 adc_value;
    float adc_vol;
    adc_value=xpt2046_read_adc_value(0x94);
    adc_vol=5.0*adc_value/4096;
    adc_value=adc_vol*10;
    gduty=adc_value*2;
    LCD12864_write_com(0x80);
    LCD12864_write_dat(gduty/10+0x30);
    LCD12864_write_dat(gduty%10+0x30);
    LCD12864_write_dat('%');
}
void LCD12864_XS()
{
    u1 i;
    if(mode1==1)
    {
        if(mile<=30)
        {
            if(wait_time<5)
            {    
                money=qi_money*100;
            }
            else
            {
                money=qi_money*100+wait_time/5*100;
            }
        }
        else
        {
            if(wait_time<5)
            {
                money=qi_money*100+(mile-30)/10*100+(mile-30)%10*12;
            }
            else
            {
                money=qi_money*100+(mile-30)/10*100+(mile-30)%10*12+wait_time/5*100;    
            }
        }
    }
    if(mode1==3)
    {
        money=0;
        mile=0;
        wait_time=0;
    }
    
    if(time_cnt==1)
    {
        ds1302_inti();
        if(key_value==6)
        {
            time_mode++;
            if(time_mode==3)
            {
                time_mode=0;
            }
        }
        
        if(time_mode==0||time_mode==1||time_mode==2)
        {
            if(key_value==7)
            {
                TIME[time_mode]++;
                if((TIME[time_mode]&0x0f)>9)
                {
                    TIME[time_mode]=TIME[time_mode]+6;    
                }
                if(TIME[time_mode]>=0x60&&time_mode<2)
                {
                    TIME[time_mode]=0;    
                }
                if(TIME[time_mode]>=0x24&&time_mode==2)
                {
                    TIME[time_mode]=0;    
                }    
            }
            if(key_value==8)
            {
                TIME[time_mode]--;
                if((TIME[time_mode]&0x0f)>9)
                {
                    TIME[time_mode]=TIME[time_mode]+6;    
                }
                if(TIME[time_mode]<=0x00&&time_mode<2)
                {
                    TIME[time_mode]=0x59;    
                }
                if(TIME[time_mode]<=0x00&&time_mode==2)
                {
                    TIME[time_mode]=0x24;    
                }    
            }
        }
    }
    LCD12864_write_com(0x98+7);
    LCD12864_write_dat(time_mode%10+0x30);
    if(time_cnt==0)
    {
        ds1302_read_time();
    }
        LCD12864_write_com(0x80+2);
        LCD12864_write_dat(TIME[2]/16+0x30);
        LCD12864_write_dat(TIME[2]%16+0x30);
        LCD12864_write_dat('-');
        LCD12864_write_dat(TIME[1]/16+0x30);
        LCD12864_write_dat(TIME[1]%16+0x30);
           LCD12864_write_dat('-');
        LCD12864_write_dat(TIME[0]/16+0x30);
        LCD12864_write_dat(TIME[0]%16+0x30);
            LCD12864_write_com(0x90);
            for(i=0;i<4;i++)
            {
                LCD12864_write_dat(c[i]);
            }
            LCD12864_write_dat(':');
            LCD12864_write_dat(mile/1000+0x30);
            LCD12864_write_dat(mile%1000/100+0x30);
            LCD12864_write_dat(mile%1000%100/10+0x30);
               LCD12864_write_dat('.');
            LCD12864_write_dat(mile%10+0x30);
            LCD12864_write_dat('k');
            LCD12864_write_dat('m');
              LCD12864_write_com(0x88);
            for(i=0;i<4;i++)
            {
                LCD12864_write_dat(d[i]);
            }
            LCD12864_write_dat(':');
            LCD12864_write_dat(money/1000+0x30);
            LCD12864_write_dat(money%1000/100+0x30);
            LCD12864_write_dat('.');
            LCD12864_write_dat(money%1000%100/10+0x30);
            LCD12864_write_dat(money%10+0x30);
            LCD12864_write_dat('y');
            LCD12864_write_dat('u');
            LCD12864_write_dat('a');
            LCD12864_write_dat('n');
            LCD12864_write_com(0x98);
            for(i=0;i<6;i++)
            {
                LCD12864_write_dat(e[i]);
            }
            LCD12864_write_dat(wait_time/100+0x30);
            LCD12864_write_dat(wait_time%100/10+0x30);
            LCD12864_write_dat(wait_time%10+0x30);
            LCD12864_write_dat('m');
            LCD12864_write_dat('i');
            LCD12864_write_dat('n');
}
void time_pro()
{
    key_value=key_scan();
    if(key_value==1)
    {
        mode1++;
        if(mode1==4)
        mode1=1;    
    }    
    if(mode1==1)
    {
        TR0=1;
    }
    else if(mode1==2)
    {
        TR0=0;
        flag=0;
    } 
    if(key_value==2)
    {
        flag++;
        if(flag==2)
        flag=0;
    }
    if(flag==1)
    {
        TR0=0;
    }
    else if(flag==0&&mode1==1)
    {
        TR0=1;
    }
    if(key_value==5)
    {
        time_cnt++;
        if(time_cnt==2)
        time_cnt=0;
    }
    if(key_value==4)
    {
        money_mode++;
        if(money_mode==3)
        money_mode=1;
    }
    if(money_mode==1)
    {
        qi_money=6;
    }
    if(money_mode==2)
    {
        qi_money=7;    
    }
    LCD12864_write_com(0x80+7);
    LCD12864_write_dat(money_mode+0x30);
}
void main()
{
    u1 i;
    LCD12864_inti();
    time0_inti();
    time1_inti();
       ds1302_inti();
    while(miao<=3)
    {
        LCD12864_write_com(0x1c);
        LCD12864_write_com(0x80);
        for(i=0;i<6;i++)
        {
            LCD12864_write_dat(a[i]);
        }
        LCD12864_write_com(0x90);
        for(i=0;i<4;i++)
        {
            LCD12864_write_dat(b[i]);
        }
        delay1ms(600);
    
    }
    LCD12864_write_com(0x01);
    while(1)
    {
        time_pro();
        LCD12864_XS();    
        ad_data();
        temp_data();
    }
}
void inti0() interrupt 1
{
    static u2 i;
    TH0=0xfc;
    TL0=0x18;
    i++;
    if(i==1000)
    {
        i=0;
        mile++;
    }    
}
void inti1() interrupt 3
{
    static u2 i;
    static u2 time;
    TH1=0xfc;
    TL1=0x18;
    i++;
    time++;
    if(i==1000)
    {
        i=0;
        miao++;
        if(miao>=3)
        {
            miao=4;
        }
        if(flag==1)
        {
            wait_time++;
        }
    
    }
    if(time>100)
    time=0;
    if(time<=gduty)
    PWM=1;
    else
    PWM=0;    
}

  • 8
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 19
    评论
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值