#include<reg51.h>
//---重定义关键词---//
#define uchar unsigned char
#define uint unsigned int
typedef unsigned char uint8;
typedef unsigned int uint16;
sbit rs=P3^5; // 数据命令选择
sbit rw=P3^6; //读写选择
sbit e=P3^4; //使能
void Lcd1602_Delay1ms(uint16 i);
void LcdWriteCom(uchar com);
void LcdWriteData(uchar dat);
void LcdInit();
void LCDWrite_String(uchar x, uchar y, uchar *s);
void LCD_set_xy(uchar x, uchar y);
sbit Baffle=P3^2; //传感器接口
sbit K2=P3^3;
sbit K3=P3^0; //乘客上车后按一下启动
sbit K4=P3^1; //乘客下车后按一下清除
float danjia=1.5;
uchar ext=0;
float zongjia=0,wait;
uchar keren_state=0;
int Time=0,sec,min;
char sensor;
uchar int0_time=0;
float distance=0; //单位m
void init();
void jisuan();
void Delay10ms(unsigned int c)
{
unsigned char a,b;
for(;c>0;c--)
for(b=38;b>0;b--)
for(a=130;a>0;a--);
}
void main()
{
init();
LcdInit();
LCDWrite_String(0, 0,"L:");
LcdWriteCom(0xc0);
LcdWriteData(36);
LcdWriteData(':');
while(1)
{
if(K2==0)
{
Delay10ms(1);
if(K2==0)
{
while(K2==0);
sensor=!sensor;
}
}
if(sensor==0)
{
danjia=1.5;
LcdWriteCom(0x80+13);
LcdWriteData('0'+(int)danjia%10);
LcdWriteData('.');
LcdWriteData('0'+(int)(danjia*10)%10);
LCDWrite_String(11, 1," Day");
}
else
{
danjia=2.0;
LcdWriteCom(0x80+13);
LcdWriteData('0'+(int)danjia%10);
LcdWriteData('.');
LcdWriteData('0'+(int)(danjia*10)%10);
LCDWrite_String(11, 1,"Night");
}
jisuan();
if(K3==0) //启动
{
while(K3==0);
keren_state=1;
distance=0;
min=0;
sec=0;
Time=0;
}
if(K4==0)
{
while(K4==0);
keren_state=0;
}
}
}
//定时器0和外部中断0的初始化
void init()
{
EA=1;
EX0=1;//打开INT0的中断允许。
IT0=1;//跳变沿出发方式(下降沿)
TMOD = 0x11; //选择工作方式1
TH0 = 0x3c;
TL0 = 0xb0;
ET0=1;//开启定时器0中断
TR0=1;//开启定时器0
}
void Int0() interrupt 0 //外部中断0的中断函数
{
if(keren_state==1)
{
distance=distance+0.3;
}
Time=0;
}
void timer0() interrupt 1
{
TH0 = 0x3c;
TL0 = 0xb0;
if(keren_state==1)
Time++;
if(Time>=20)
{
Time=0;
sec++;
if(sec>=60)
{
sec=0;
min=min+1;
}
}
}
void jisuan()
{
if(min>5)
{
wait=(danjia/2)*(min-5);
}
else
{
wait=0;
}
zongjia=danjia*distance+wait;
//显示路程
LcdWriteCom(0x80+2);
LcdWriteData('0'+(long int)(distance/1000)%10);
LcdWriteData('0'+(long int)(distance/100)%10);
LcdWriteData('0'+(long int)(distance/10)%10);
LcdWriteData('0'+(long int)distance%10);
LcdWriteData('.');
LcdWriteData('0'+(long int)(distance*10)%10);
LcdWriteData('K');
LcdWriteData('m');
//显示总价钱
LcdWriteCom(0xc0+2); //定位显示位置为第二行第一位
LcdWriteData('0'+(int)(zongjia/100)%10); //显示速度百位
LcdWriteData('0'+(int)(zongjia/10)%10); //显示速度十位
LcdWriteData('0'+(int)zongjia%10); //显示速度个位
LcdWriteData('.');
LcdWriteData('0'+(long int)(zongjia*10.0)%10); //显示小数点后一位
}
void LCDWrite_String(uchar x, uchar y, uchar *s) //x 0~15 , y 0,1
{
LCD_set_xy(x,y);
while(*s)
{
LcdWriteData(*s);
s++;
}
}
void LCD_set_xy(uchar x,uchar y)
{
if(y==0)
{
LcdWriteCom(0x80+x);
}
if(y==1)
{
LcdWriteCom(0xc0+x);
}
}
void Lcd1602_Delay1ms(uint16 i)
{
while(i--);
}
void LcdWriteCom(uint8 c) //写命令
{
Lcd1602_Delay1ms(1000);
rs=0;
rw=0;
e=0;
P0=c;
e=1;
Lcd1602_Delay1ms(10);
e=0;
}
void LcdWriteData(uint8 dat) //写数据
{
Lcd1602_Delay1ms(1000);
rs=1;
rw=0;
e=0;
P0=dat;
e=1;
Lcd1602_Delay1ms(10);
e=0;
rs=0;
}
void LcdInit()
{
Lcd1602_Delay1ms(1000);
LcdWriteCom(0x38);
LcdWriteCom(0x38);
LcdWriteCom(0x38);
LcdWriteCom(0x06);
LcdWriteCom(0x0c);
LcdWriteCom(0x01);
}
基于单片机控制的出租车计价器
需积分: 0 200 浏览量
2022-12-29
12:51:33
上传
评论 3
收藏 118KB ZIP 举报
m0_66300039
- 粉丝: 1
- 资源: 5
最新资源
- 2022NOC软件创意编程赛项真题python小学高年级-决赛(有解析)
- mathml转换latex需要的xsl文件
- 2022NOC软件创意编程赛项真题图形化小学高年级-决赛赛(有解析)
- gbase驱动下载gbase-connector-java-8.3.81.53驱动下载
- 2022NOC软件创意编程赛项真题图形化小学低年级-决赛赛(有解析)
- InsightFace从青铜到王者,超大规模人脸识别的优雅解法
- python后端开发spider框架详解
- 基于 STM32 与 ESP8266 的智能家居系统源码.zip
- 毕业设计:基于SSM的mysql-个性化点餐配送系统(源码 + 数据库 + 说明文档)
- 基于matlab的鱼苗计数识别(GUI界面).zip代码57
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈