📄 carcacuprice.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 + -