⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 carcacuprice.c

📁 出租车计价器程序
💻 C
字号:
//出租车计价器程序
//2007/4/19
/*---------------------------------------------------
利用单片机串口模式0发送数据,经164串并转换驱动数码管
计价器显示内容有两组164驱动,共14个数码管,分别显示
单价(2个),总额(4个),里程(4个),时间(4个)
计价器通过T1口对外部脉冲进行计数,转换为具体的里程和价格
计价器计价规则:前4公里10元,4公里后每公里1.5元,凌晨0点
到6点为每公里2元。 
---------------------------------------------------*/

#include	"reg51.h"
#define uchar unsigned char
#define uint  unsigned int

#define  segport P1	  //数码管段选择



uint Counter1;		  //计数值变量
uchar overflow_count; //定时器溢出次数变量
uchar hour,minute,second;  //时间变量
uint  distance;
uint  price;
uchar per_price;

bit halfsec_fg;   //半秒标志

sbit key1=P3^2;
sbit key2=P3^4;

sbit key3=P3^3;

sbit P1_0=P1^0;
sbit P1_2=P1^2;
sbit P1_1=P1^1;

uchar group0[8],group1[8],group2[8];
uchar code Tab1[11]={		  //数码管代码
        0x03,/*0*/
        0x9F,/*1*/
        0x25,/*2*/
        0x0D,/*3*/
        0x99,/*4*/
        0x49,/*5*/
        0x41,/*6*/
        0x1F,/*7*/
        0x01,/*8*/
        0x09,/*9*/

		0xff, /*no light*/

		};

unsigned char code Tab2[11]={	 //数码管带小数点代码
        0x02,/*0*/
        0x9e,/*1*/
        0x24,/*2*/
        0x0c,/*3*/
        0x98,/*4*/
        0x48,/*5*/
        0x40,/*6*/
        0x1e,/*7*/
        0x00,/*8*/
        0x08,/*9*/

		0xff, /*no light*/

		};
unsigned char code Tab3[11]={	  //时间数码管代码
        0x03,/*0*/
        0x7B,/*1*/
        0x46,/*2*/
        0x4A,/*3*/
        0x3A,/*4*/
        0x8A,/*5*/
        0x82,/*6*/
        0x6B,/*7*/
        0x02,/*8*/
        0x0A,/*9*/	 
		0xff, /*no light*/ 
		};

/*-------------------------
    系统初始化程序
---------------------------*/
void systeminit(void)
{
   
   SCON=0x00;
   TMOD = 0x51;
   ET0 = 1;                      //开启定时器0中断
 //  ET1 = 1;
   TR0 = 1;                      //开启定时器0计数
 //  TR1 =1 ;
   EA = 1;                       //开启全局中断
   TH0=0x3c;					 //定时器0赋初值
   TL0=0xb7;					 
   Counter1=0;					 //计数值清零

   hour=0x0c;
   minute=0x00;
   second=0x00;
   distance=0x00;
   price=0x00;
   per_price=15;

 }

/*-------------------------
    定时器0中断处理程序
---------------------------*/
void timer0_ISR (void) interrupt 1	using 2  //定时器0中断处理程序
{
    TH0=0x3c;
    TL0=0xb7;
    overflow_count++;   

  if(overflow_count==10|overflow_count==20)
  {
    halfsec_fg=!halfsec_fg;
	 
    if(overflow_count==20)
    {
     overflow_count=0;
    // Counter1=TH1*256+TL1;
	// TH1=0;
    // TL1=0;
     
      second++;
	  if(second==60)	//时钟处理程序
	   {
       second=0;
	   minute++;
	   }
	  if(minute==60)
	   {
       minute=0;
	   hour++;
	   }
      if(hour==24)
	   {
	    hour=0;
	   }	  

     }
	}
}


void DelayMs(unsigned char no)		   //延时毫秒程序
{
	unsigned char i,j;
	for(i=0;i<no;i++)
	{
	  for(j=0;j<164;j++);
	  for(j=0;j<164;j++);
	 }
}
/*-------------------------
    显示处理程序
---------------------------*/
void display(void)			 //数码管显示
{
   uchar segdata;		   // 数码管段选择数据存储变量
   uchar i;
   uchar sendtemp;


 	  segdata=0x7f;
 for(i=0;i<8;i++)
	 {
	 segport=0xff;			 //全灭

       
	  if(i==2)
	   {
	    SBUF=Tab2[group0[i]];	  //里程带小数点
	    while(TI==0) ;
	    TI=0;
	   }
	   else	if(i==0|i==1|i==3)
	   {
	    SBUF=Tab1[group0[i]];	  //不带小数点
	    while(TI==0) ;
	    TI=0;
	   } 
	   else
	   {
	   	if(halfsec_fg)
		{
         sendtemp=Tab3[group0[i]]&0xfd;	//时钟中间秒点
		 }
		else
		{
		 sendtemp=Tab3[group0[i]];
		 }

	    SBUF=sendtemp;  //Tab3[group0[i]];	  //时钟
	    while(TI==0) ;
	    TI=0;
	   } 	   


	 if(i==0|i==4)
	  {
	  SBUF=Tab2[group1[i]];		//带小数点
	  while(TI==0) ;
	  TI=0;
	  } 

     else
	 {
	  SBUF=Tab1[group1[i]];	 //发送第1组数据不带小数点
	  while(TI==0) ;
	  TI=0;
	 }

      segport=segdata	;	 //选择对应组数码管

	  DelayMs(1);
	  segdata=(segdata>>1)+0x80;
     }

     segport=0xff;		   //全灭

}
/*-------------------------------
    调时处理程序
------------------------------*/
void timekeydetect()
{
   if(key1==0)
   {
	 DelayMs(5);
	 if(key1==0)
	 {
	  hour++;
	  if(hour==24)
	  {
	   hour=0;
       }
	  while(key1==0)
	  {
	   display();
	   }
	  }
	}

   if(key2==0)
   {
	 DelayMs(5);
	 if(key2==0)
	 {
	  minute++;
	  if(minute==60)
	  {
	   minute=0;
       }
	  while(key2==0)
	  {
	   display();
	   }
	  }
	}
	 
}
/*-------------------------------
    拆分数据处理程序
------------------------------*/
void  getdata()			  //获取数据
{
   if(hour>=0&hour<=6)
	{
	per_price=20;
	 }
	else
	 {
	 per_price=15;
	 }

	distance=(TH1*256+TL1)/64;

	if(distance<=40)
	{
	 price=100;
	 }
	else
	{
	 price=((distance-30)/10*per_price)+100;
	 }

   group0[4]=hour/10;			 //拆分时间数据
   group0[5]=hour%10;
   group0[6]=minute/10;
   group0[7]=minute%10;

   group0[0]=distance/1000;		  //拆分里程数据
   if(group0[0]==0)
    {
	 group0[0]=10;
	}    
   group0[1]=distance%1000/100;
    if(group0[0]==10&&group0[1]==0)
    {
	 group0[1]=10;
	}  
   group0[2]=distance%100/10;
   group0[3]=distance%10; 

   group1[0]=per_price/10;
   group1[1]=per_price%10;

   group1[2]=price/1000;	//拆分金额数据
   if(group1[2]==0)
    {
	 group1[2]=10;
	}
   group1[3]=price%1000/100;
   group1[4]=price%100/10;
   group1[5]=price%10;
}

/*-------------------------
    主程序
---------------------------*/
void	main()
{
	uchar i;


	systeminit();

    for(i=0;i<8;i++)
	  group0[i]=i;
	for(i=0;i<8;i++)
	  group1[i]=i;


	while(1)
	{
	if(key3==1)		   //是否启动计价
	{
	 distance=0;		 //无计价
	 TH1=0;
	 TL1=0;
     TR1=0;
	 }
	 else
	 {
	 TR1=1;			   //开始计价
	 }
	getdata();
	display();
	timekeydetect();  //调整时间按键检测
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -