51单片机实现出租车计价器

 

#include <reg51.h>//头文件声明
sbit K1=P3^2;//按键的位声明
sbit d1=P3^7;//wei 12 的声明
sbit d2=P3^6;//wei 11 的声明
sbit d3=P3^5;//wei 10 的声明
sbit d4=P3^4;//wei 9 的声明
unsigned char LED[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//实现LED依次流水
unsigned char duan[]={0x88,0xaf,0x19,0x29,0x2e,0x68,0x48,0xad,0x08,0x28};//无小数点段码
unsigned char duan3[]={0x80,0xa7,0x11,0x21,0x26,0x60,0x40,0xa5,0x00,0x20};//有小数点段码
unsigned char wei1[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};//位

unsigned int ms;//毫秒

unsigned int k;//米

unsigned char i;//刷新数码管用的

unsigned int m;//秒
unsigned int f;//分
unsigned char h;//十分
unsigned char g;//小时
unsigned char v=0x01;
unsigned int km;//千米
    
unsigned int l;//显示费用用的
unsigned int o;
unsigned int q;
unsigned int w;
unsigned int n;
unsigned char y;
unsigned int r;
unsigned int a;
unsigned char c;

void shumaguan();//数码管的显示
void shijiandanwei();//时间单位判断
void tingzhi();

void main()
{
    TMOD&=0xf0;
    TMOD|=0x01;
    TH0=64535/256;
    TL0=64535%256;
    TR0=1;
    EA=1;
    ET0=1;
    PT0=1;//
    IT1=1;
    EX1=1;
    IT0=1;
    EX0=0;//打开外部中断和定时器中断
    while(1)
    {
        
        if(K1==1)//
        {
            P1=LED[c];
            if(c>=8)
            {
                c=0;
            }
        }
        else if(K1==0)//
        {
            P1=0xff;
            tingzhi();
        }
        shumaguan();
        shijiandanwei();
    }
}
void zhongduan() interrupt 1 //定时器1中断
{
    TF0=0;
    TH0=64535/256;
    TL0=64535%256;
    if(K1==1)
    {
        ms++;
        a++;
    }
    else
    {
        ms=0;
        a=0;
    }
    if(ms<=500)
    {
        wei1[8]=duan[f%10];
        wei1[9]=duan[h%6];
        wei1[10]=duan3[g%10];
        wei1[11]=duan[g/10%10];
    }
    else if(ms>=500)
    {
            
        wei1[8]=duan[f%10];
        wei1[9]=duan[h%6];
        wei1[10]=duan[g%10];
        wei1[11]=duan[g/10%10];    
    }

 if(a==500)
    {
        a=0;
        c++;
    }
    switch(i)//刷新数码管
    {
        // 尝试用来消除第三组的第1位的显示错误的方法,
        case 0:d1=0;d2=0;d3=0;d4=0;i++;break;
        case 1:P2=0x00;P0=0xff;i++;break;
        
        //刷新第1组数码管
        case 2:P2=0x08;P0=wei1[0];i++;break;
        case 3:P2=0x04;P0=wei1[1];i++;break;
        case 4:P2=0x02;P0=wei1[2];i++;break;
        case 5:P2=0x01;P0=wei1[3];i++;break;
        
            // 尝试用来消除第三组的第1位的显示错误的方法,
        case 6:P2=0x00;P0=0xff;i++;break;
        case 7:d1=0;d2=0;d3=0;d4=0;i++;break;
        
        //刷新第2组数码管
        case 8:P2=0x80;P0=wei1[4];i++;break;
        case 9:P2=0x40;P0=wei1[5];i++;break;
        case 10:P2=0x20;P0=wei1[6];i++;break;
        case 11:P2=0x10;P0=wei1[7];i++;break;
        
        // 尝试用来消除第三组的第1位的显示错误的方法,
        case 12:P2=0x00;P0=0xff;i++;break;
        case 13:d1=0;d2=0;d3=0;d4=0;i++;break;
        
            //刷新第3组数码管
        case 14:d1=1;d2=0;d3=0;d4=0;P0=wei1[8];i++;break;
        case 15:d1=0;d2=1;d3=0;d4=0;P0=wei1[9];i++;break;
        case 16:d1=0;d2=0;d3=1;d4=0;P0=wei1[10];i++;break;
        case 17:d1=0;d2=0;d3=0;d4=1;P0=wei1[11];i++;break;
        
        // 尝试用来消除第三组的第1位的显示错误的方法,
        case 18:P2=0x00;P0=0xff;i++;break;
        case 19:d1=0;d2=0;d3=0;d4=0;i=0;break;
    }

}
void zhongduan1() interrupt 2 //外部中断
{
    if(K1==1)
    {k++;} 
    else
    {k=0;}//米
}

void shumaguan()
{
    //第1组数码管的显示
        if(k>=100)//判断是否到了100米
        {
            k=0;
            km++;
            l++;
            w++;
            wei1[0]=duan[km%10];
            wei1[1]=duan3[km/10%10];
            wei1[2]=duan[km/100%10];
            wei1[3]=duan[km/1000%10];
        }
        else
        {
            wei1[0]=duan[km%10];
            wei1[1]=duan3[km/10%10];
            wei1[2]=duan[km/100%10];
            wei1[3]=duan[km/1000%10];
        }
    
    
    //第3组数码管的显示,显示时间。
        if(ms>=1000)
        {
            ms=0;
            m++;
            if(m>=60)
            {
                m=0;
                f++;
                wei1[8]=duan[f%10];
                wei1[9]=duan[h%6];
                wei1[10]=duan[g%10];
                wei1[11]=duan[g/10%10];
            }
        }
        else
        {
            wei1[8]=duan[f%10];
            wei1[9]=duan[h%6];
            wei1[10]=duan[g%10];
            wei1[11]=duan[g/10%10];
        }
    //小于三公里,第2组数码管的显示
        if(w<=30)
        {    
            o=1000;
            wei1[4]=duan[o%10];
            wei1[5]=duan[o/10%10];
            wei1[6]=duan3[o/100%10];
            wei1[7]=duan[o/1000%10];
        }
    
    
    //当大于3公里的时候,第2组数码管的显示
        if(l>=10&&w>=30)
        {    
            l=0;
            n++;
            r++;
            n+=220;
            q=n+1000;
            q=q-r;
            wei1[4]=duan[q%10];
            wei1[5]=duan[q/10%10];
            wei1[6]=duan3[q/100%10];
            wei1[7]=duan[q/1000%10];
        }
    
    
}
void shijiandanwei()
{
    if(f>=10)
        {
            f=0;
            h++;
            if(h>=6)
            {
                h=0;
                g++;
            }
        }
}

void tingzhi()
{
    if(K1==0)
    {
        if(w>=30&&km%10!=0)
        {
            if(km>=30)
            {
                q+220;
            wei1[4]=duan[q%10];
            wei1[5]=duan[q/10%10];
            wei1[6]=duan3[q/100%10];
            wei1[7]=duan[q/1000%10];
            }
        }    
        if(w<=30)
        {    
            o=1000;
            wei1[4]=duan[o%10];
            wei1[5]=duan[o/10%10];
            wei1[6]=duan3[o/100%10];
            wei1[7]=duan[o/1000%10];
        }
    
    
    //当大于3公里的时候,第2组数码管的显示
        if(l>=10&&w>=30)
        {    
            wei1[4]=duan[q%10];
            wei1[5]=duan[q/10%10];
            wei1[6]=duan3[q/100%10];
            wei1[7]=duan[q/1000%10];
        }
        wei1[8]=duan[f%10];
        wei1[9]=duan[h%6];
        wei1[10]=duan[g%10];
        wei1[11]=duan[g/10%10];
        wei1[0]=duan[km%10];
        wei1[1]=duan3[km/10%10];
        wei1[2]=duan[km/100%10];
        wei1[3]=duan[km/1000%10];
        while(K1==0);
        ms=0;
        k=0;
        i=0;
        m=0;
        f=0;
        h=0;
        g=0;
        km=0;
        l=0;
        o=0;
        q=0;
        w=0;
        n=0;
        y=0;
        r=0;
        a=0;
        c=0;
    }

}

  • 6
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值