标题:
单片机出租车计价器程序
[打印本页]
作者:
gd123456
时间:
2023-11-13 12:38
标题:
单片机出租车计价器程序
在本次设计中电路键盘用到了P1口,其中P1.0口到P1.3口作为键盘的输入,显示电路用到了P0口和P2口,P2口为液晶的数据口,P3.7口作为AD的输入端。
单片机源程序如下:
#include <reg51.h>
#include <LCD1602.h>
#include "XPT2046.h"
#define uchar unsigned char
#define uint unsigned int
unsigned char Command,Speed;
sbit key_start =P3^1; //开始/结束计价
sbit key_wait =P3^0; //等待
sbit key_set =P1^2; //设置
sbit key_dn =P3^2; //控制白天晚上
sbit key_fuwei =P3^3; //复位
/************************——变量定义***********************/
uint start_price=70; //起步价88
uint white_price=18; //白天的单价 超过3公里每公里6元66
uint black_price=20; //夜晚的单价 超过3公里每公里8元88
uint Wait_price=100; //等待价钱100
bit dnc=0; //白天晚上的转换标志
bit qiting; //起 停标志位
uint price1,price2; //总价钱、等待价钱
uint mil; //里程数
uint mil2;
uchar shi,fen,miao;
uchar moshi,moshi2,ms,set_f; //模式mos=0初始界面,=1改价页面,=2等待页面
//set_f设置标志=1设置初始,=2设置等待价,=3设置晚上单价,=4设置白天单价
void delay(uchar ms) //延时函数
{
uchar j;
while(ms--)
{
for(j=0;j<130;j++);
}
}
void key() //按键函数
{
if(key_dn==0)
{
delay(5); //延时去抖
if(key_dn==0)
{
while(!key_dn);
dnc=~dnc;
}
}
if(key_start==0)
{
delay(5);
if(key_start==0)
{
while(!key_start); //检测按键是否松开
qiting=~qiting; //起 停 转换
if(qiting==0)
{
moshi=0;
}
TR0=qiting; //定时器0打开/关闭
set_f=0;
}
}
if(key_fuwei==0) //复位
{
delay(5);
if(key_fuwei==0)
{
while(!key_fuwei);
miao=0;fen=0;shi=0;
price1=0;price2=0; mil=0;moshi=0;
}
}
if(key_wait==0)
{
delay(5);
if(key_wait==0)
{
while(!key_wait);
miao=0;fen=0;shi=0;
moshi=2;
}
}
if(qiting==0) //结束计价后才能设置
{
if(key_set==0)
{
delay(5);
if(key_set==0)
{
while(!key_set);
set_f++;
moshi=1;
if(set_f==5){moshi=0;set_f=0;}
}
}
}
}
void xianshi()
{
if(moshi!=moshi2)
{
lcd_wcmd(0x01); //清显示屏
moshi2=moshi;
}
if(moshi==0)
{
lcd_wcmd(0x80);
lcd_data('N');
lcd_data('J');
lcd_data(':');
lcd_data(ASCII[black_price%1000/100]);
lcd_data(ASCII[black_price%100/10]);
lcd_data('.');
lcd_data(ASCII[black_price%10]);
// lcd_wcmd(0x80);
// lcd_data('D');
// lcd_data('J');
// lcd_data(':');
// lcd_data(ASCII[white_price%1000/100]);
// lcd_data(ASCII[white_price%100/10]);
// lcd_data('.');
// lcd_data(ASCII[white_price%10]);
// lcd_data('Y');
mil=XPT2046_ReadAD(XPT2046_XP);
lcd_data('G');
lcd_data(':');
lcd_data(ASCII[mil%1000/100]);
lcd_data(ASCII[mil%100/10]);
lcd_data('.');
lcd_data(ASCII[mil%10]);
lcd_data('K');
lcd_data('M');
lcd_wcmd(0x80+0x40);
lcd_data('D');
lcd_data('J');
lcd_data(':');
lcd_data(ASCII[white_price%1000/100]);
lcd_data(ASCII[white_price%100/10]);
lcd_data('.');
lcd_data(ASCII[white_price%10]);
lcd_data('Y');
lcd_data('Y');
lcd_data('Q');
lcd_data(':');
lcd_data(ASCII[price1%1000/100]);
lcd_data(ASCII[price1%100/10]);
lcd_data('.');
lcd_data(ASCII[price1%10]);
lcd_data('O');
lcd_data('Y');
}
if(moshi==1) //改价页面
{
lcd_wcmd(0x80);
lcd_data('S');
lcd_data('J');
lcd_data(ASCII[start_price%1000/100]);
lcd_data(ASCII[start_price%100/10]);
lcd_data('.');
lcd_data(ASCII[start_price%10]);
lcd_data('Y');
lcd_data(' ');
lcd_data('P');
lcd_data('T');
lcd_data(ASCII[Wait_price%1000/100]);
lcd_data(ASCII[Wait_price%100/10]);
lcd_data('.');
lcd_data(ASCII[Wait_price%10]);
lcd_data('Y');
lcd_wcmd(0x80+0x40);
lcd_data('N');
lcd_data('J');
lcd_data(ASCII[black_price%1000/100]);
lcd_data(ASCII[black_price%100/10]);
lcd_data('.');
lcd_data(ASCII[black_price%10]);
lcd_data('Y');
lcd_data(' ');
lcd_data('D');
lcd_data('J');
lcd_data(ASCII[white_price%1000/100]);
lcd_data(ASCII[white_price%100/10]);
lcd_data('.');
lcd_data(ASCII[white_price%10]);
lcd_data('Y');
}
if(moshi==2) //等待页面
{
lcd_wcmd(0x80);
lcd_data('W');
lcd_data('a');
lcd_data('i');
lcd_data('t');
lcd_data(':');
lcd_data(' ');
lcd_data(' ');
lcd_data(ASCII[shi%100/10]);
lcd_data(ASCII[shi%10]);
lcd_data(':');
lcd_data(ASCII[fen%100/10]);
lcd_data(ASCII[fen%10]);
lcd_data(':');
lcd_data(ASCII[miao%100/10]);
lcd_data(ASCII[miao%10]);
lcd_wcmd(0x80+0x40);
lcd_data('D');
lcd_data('D');
lcd_data('M');
lcd_data(':');
// lcd_data(ASCII[(white_price/2)%100/10]);
lcd_data(ASCII[price2%1000/100]);
lcd_data(ASCII[price2%100/10]);
lcd_data('.');
lcd_data(ASCII[price2%10]);
//lcd_data(ASCII[(white_price/2)%10]);
lcd_data(' ');
lcd_data('Y');
}
}
void jiaqianjisuan() //计算价钱
{
if(dnc==0) //白天价钱
{
if(mil>25)
{
price1=(white_price*(((mil-25)/10)+1));
price1=price1+start_price+price2;
}
else
price1=start_price+price2;
}
else //晚上价钱
{
if(mil>25)
{
price1=(black_price*(((mil-25)/10)+1));
price1=price1+start_price+price2;
}
else
price1=start_price+price2;
}
}
void T0_init() //定时器0初始化
{
EA=1; //开总中断
ET0=1; //定时器T0中断允许
TMOD=0x01; //使用定时器T0的模式1
TH0=(65536-50000)/256; //定时器T0的高8位赋初值
TL0=(65536-50000)%256; //定时器T0的低8位赋初值
TR0=0; //关闭定时器0
EX0=1; //外部中断0允许位
IT0=1; //下降沿触发外部中断
}
void main()
{
lcd_init(); //LCD1602初始化
T0_init(); //定时器0初始化
while(1) //死循环
{
jiaqianjisuan();
key(); //按键检测处理
xianshi();
}
}
void timer0() interrupt 1 //定时器0中断函数
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256; //定50ms
ms++;
if(ms>=20)
{
ms=0;
miao++;
if(moshi==0)
{
if(miao>=3)
{
moshi=2;
miao=0;
}
}
if(moshi==2)
{
if(miao>=60)
{
miao=0;
fen++;
if(fen>=60)
{
fen=0;
shi++;
}
if(moshi==2){if(fen>=1)price2=fen*50; }
}
}
}
}
void inn0() interrupt 0 //外部中断0中断子函数
{
if(qiting==1)
{
mil2++;
if(moshi==2) moshi=0;
if(moshi==0) miao=0;
if(mil2==10)
{
mil2=0;
mil++;
}
}
}
复制代码
原理图: 无
仿真: 无
代码:
程序.7z
(728.2 KB, 下载次数: 4)
2023-11-15 23:11 上传
点击文件名下载附件
1
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1