找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机出租车计价器程序,仅供大家参考

[复制链接]
ID:677954 发表于 2019-12-31 22:03 | 显示全部楼层 |阅读模式
/*   开关的作用:P02 -----计价器启动开关   (K3=0 跑马 ;K3=1 计价器清0)
                P03 -----汽车启动计价开关  (K4=0 计价器开实时计价;K4=1显示总价和总时间)
                P04 -----清0键             (K5=0 回到跑马;K5=1 全部清0 )
     程序的功能:车子在启动前显示P型跑马,汽车启动后显示价格0,按下开关K4开始实
                 时计价,前两位显示时间,后四位显示价格;2秒以内按3元计价,以后
                每增加2秒,价格增加0.7,当超过6秒时,按每增加1秒价格增加1元,以
                “元”作为计价单位,以小数点隔开元和角。按下中断键时示显故障提示
                “STOP"且响铃,再次按中断键时,故障排除,恢复程序正常的工作。
*/
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
  sbit P02=P0^2;                  //启动开关
  sbit P03=P0^3;                  //显示最终价格
  sbit P04=P0^4;
  sbit P32=P3^2;
  sbit P37=P3^7;                  //清零开关
  uchar code
table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //0~9不带小数点
  uchar codetable2[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//0~9
             带小数点
  void delay(uint z);
  uchar a,fen,miao,shu;            //定义时间参数
  uchar a=0;
  unsigned char temp;
  int m,i;                         //m表示价钱
  uint temp1,temp2;
  timer1() interrupt 0             //外部中断,显示STOP
   {
     P37=0;
    {
     P1=0x01;
     P2=0x6d;
     delay(5);
     P1=0x02;
     P2=0x31;
     delay(5);
     P1=0x04;
     P2=0x3f;
     delay(5);
     P1=0x08;
     P2=0x73;
     delay(5);
     P37=~P37;                      //响铃
     }
    }
void main()                         //主程序
{uchar k;uint i;
TMOD=0x01;
TH0=(65536-50000)/256;             //定时50MS
TL0=(65536-50000)%256;
EA=1;                              //开中断总控开关
IT0=0;                             //INT0零电平触发
EX0=1;                             //开INT0中断
TR0=1;                             //T0开始计时
ET0=1;                             //开T0中断
  while(1)
ag: { TR0=0;
   if(P02==0)                      //启动跑马开关,开始跑马
   { P1=0x01;
   P2=0x73;
   for(k=0;k<6;k++)
   {
   for(i=0;i<20000;i++);
   P1<<=1;                        //跑马程序
    }
}
if(P02==1)                       //车子启动,全部归零,准备计时计价
{
P2=0x3f;
P1=0xff;
delay(2);
P1=0x00;
delay(2);
}                                //设置T0定时器
/*if(P02==0)                     //启动跑马开关
{ P1=0x01;
   P2=0x73;
   for(k=0;k<6;k++)
   {
   for(i=0;i<20000;i++);
   P1<<=1;                       //跑马程序
    }
}
if(P02==1)
{
P1=0xff;
P2=0x3f;
delay(2);
P1=0x00;
delay(2);
} */
if(P03==1)                    //启动计时计价
{TR0=1;
temp1=shu;temp2=m;
P1=0x01;
P2=table[shu/10];
delay(2);//延时5毫秒
P1=0x00;
delay(2);                     //显示时间
P1=0x02;
P2=table[shu%10];
delay(2);//延时5毫秒
P1=0x00;
delay(2);                     //显示时间
P1=0x04;
P2=0X3f;
delay(2);
P1=0x00;
delay(2);                    //显示价格(百位)
if(0<shu<=2)
m=30;
else if(shu==3)
m=30;
if(shu==4)
m=37;
if(shu==5)
m=37;
if(shu==6)
m=44;
if(shu>6)
m=10*shu-16;                //价格计算程序
P2=table[m/100];
P1=0x08;
//P2=table[m/100];
delay(2);
P1=0x00;
delay(2);                   //显示价格(十位)
P2=table2[(m%100)/10];
P1=0x10;
//P2=table2[(m%100)/10];
delay(2);
P1=0x00;
delay(2);                   //显示价格(个位)
P2=table[m%10];
P1=0x20;
//P2=table[m%10];
delay(2);
P1=0x00;
delay(2);                   //显示价格(角位)
if(P04==1)
{
m=0;shu=0;temp1=0;temp2=0;
P1=0xff;
P2=0x3f;                    //清零程序
}
while(P03==0)                // 显示最终价格和时间
{
P2=table[temp1/10];
P1=0x01;
//P2=table[temp1/10];
delay(1);
P1=0x00;
delay(1);
P2=table[temp1%10];
P1=0x02;
//P2=table[temp1%10];
delay(1);
P1=0x00;
delay(1);
P1=0x04;
P2=0X3f;
delay(1);
P1=0x00;
delay(1);
P2=table[temp2/100];
P1=0x08;
//P2=table[temp2/100];
delay(1);
P1=0x00;
delay(1);
P2=table2[(temp2%100)/10];
P1=0x10;
//P2=table2[(temp2%100)/10];
delay(1);
P1=0x00;
delay(1);
P2=table[temp2%10];
P1=0x20;
//P2=table[temp2%10];
delay(1);
P1=0x00;
delay(1);
  if(P04==1)
{
/*m=0;shu=0;temp1=0;temp2=0;   */
P1=0xff;
P2=0x3f;
  for(i=0;i<2000;i++);
goto ag;                           //清零时,所有开关全零
}
}
}
/*if(P04==1)
{ for(i=0;i<200;i++);
m=0;shu=0;temp1=0;temp2=0;
P1=0xff;
P2=0x3f;
goto ag;
} */
}
}
void timer0() interrupt1                //设置定时器初值
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;                   //0.05s溢出
a++;
if(a==20)
{
a=0;
shu++;
if(shu==99)
shu=0;
}
}
void delay(uint z)                       //延迟函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=80;y>0;y--);
}
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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