下面只是主函数的一些程序。
完整项目地址:单片机-毕业设计-出租车计费系统-单片机文档类资源-CSDN下载
/*
系统操作简介:
上电系统为实时时钟显示,精确度为秒,规定0x01,0x02,0x04,0x08分别为1,2,3,4四个按键。
按键1为状态切换按键,该按键负责自由状态和计价状态的切换和设置状态时初始价格和初始里程设置选择的按键
按键2为自由状态时的设置初始价格、初始里程按键(设置值和保存值(保存到EEPROM里,可掉电查询))和在计费状态时模拟公里计数按键(开始公里计数和停止公里计数)
按键3为设置状态时加按键(初始价格或初始公里加1)和计费状态且停止公里计数后的费用清零按键,保证下次继续计费
按键4为设置状态时减按键(初始价格或初始公里减1)
数码管不同状态时的显示:
自由状态时显示实时时钟
设置状态时:前三位显示初始费用,后三位显示初始里程
计费状态时:前三位显示实时费用,后三位显示实时里程
*/
#include <STC15F2K60S2.h>
#include "ds1302.h"
#include "iic.h"
#include "intrins.h"sbit buzzer = P0^6;
sbit relay = P0^4;
typedef unsigned char u8;u8 code t_display[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x40,0x00};
u8 code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
u8 show_table[8];
u8 set_table[8];
u8 mil_table[8];
u8 t0,t1,key_flag,shi,fen,miao,state,buzzer_state,relay_state,set_basic_flag,close_buzzer,run_flag;
u8 set_flag,mil_flag,price;
float t2;//1S表示1公里
u8 mil_now,basic_price,mileage;
void init(void)
{
P2 = 0xa0; P0 = 0x00; P2 = 0x00;
P2 = 0x80; P0 = 0xff; P2 = 0x00;
EA = 1;
ET0 = 1;
price = 2;//初始单价为2元每公里,可根据实际情况修改
}
void Delay3ms() //@11.0592MHz
{
unsigned char i, j;_nop_();
_nop_();
i = 33;
j = 66;
do
{
while (--j);
} while (--i);
}
void Timer0Init(void) //1毫秒@11.0592MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xCD; //设置定时初值
TH0 = 0xD4; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}#define keyport P3//键盘按键扫描
u8 Trg,Cont;
void KeyScan()
{
u8 ReadData = keyport ^ 0xff;
Trg = ReadData & (ReadData ^ Cont);
Cont = ReadData;
}
void main(void)
{
init();
Timer0Init();
basic_price = 6;
mileage = 2;
set_sfm(8,30,0);
write_adc(0x03);//初始里程掉电保存地址
write_adc(0x25);//初始掉电价格保存地址
while(1)
{
EA = 0;
shi = Ds1302_Single_Byte_Read(0x85);
fen = Ds1302_Single_Byte_Read(0x83);
miao = Ds1302_Single_Byte_Read(0x81);
if(run_flag == 1)
{
mileage = read_at24c02(0x03);
basic_price = read_at24c02(0x25);
}
EA = 1;//上电为时钟计时
show_table[0] = shi /16;
show_table[1] = shi %16;
show_table[2] = 10;
show_table[3] = fen /16;
show_table[4] = fen %16;
show_table[5] = 10;
show_table[6] = miao / 16;
show_table[7] = miao % 16;
//键盘按键检测
if(key_flag == 1)
{
key_flag = 0;
KeyScan();
if(Trg & 0x01)//启动与停止按键
{
state = !state;
}
//停止状态
if(!state)
{
if(Trg & 0x02)//进入设置初始价格和里程页面
{
set_basic_flag = 1;
}
while(set_basic_flag == 1)
{
set_table[0] = basic_price / 100;
set_table[1] = basic_price / 10 % 10;
set_table[2] = basic_price % 10;
set_table[3] = 10;
set_table[4] = 10;
set_table[5] = mileage / 100;
set_table[6] = mileage / 10 % 10;
set_table[7] = mileage % 10;
if(key_flag == 1)
{
key_flag = 0;
KeyScan();
if(Trg & 0x01)//初始为设置初始价格,按下后为设置初始里程,依次循环
{
set_flag = !set_flag;
}
if(Trg & 0x02)//保存设置
{
write_at24c02(0x25,basic_price);
Delay3ms();
write_at24c02(0x03,mileage);
set_basic_flag = 0;
run_flag = 1;
set_flag = 0;//每次设置从初始价格开始设置
}
if(Trg & 0x04)//加
{
if(!set_flag)
{
basic_price++;//初始价格加1
}
else
{
mileage++;//初始里程加1
}
}
if(Trg & 0x08)//减
{
if(!set_flag)
{
basic_price--;
}
else
{
mileage--;
}
}
}
}
}
//计价工作状态
else
{
while(state)
{
if(mil_now < mileage)
{
mil_table[0] = basic_price / 100;
mil_table[1] = basic_price / 10 % 10;
mil_table[2] = basic_price % 10;
mil_table[3] = 10;
mil_table[4] = 10;
mil_table[5] = mileage / 100;
mil_table[6] = mileage / 10 % 10;
mil_table[7] = mileage % 10;
}
else
{
//总价 = 起步价 + 单价 * (总里程 - 起步里程)
mil_table[0] = (basic_price + price *(mil_now - mileage)) / 100;
mil_table[1] = (basic_price + price *(mil_now - mileage)) / 10 % 10;
mil_table[2] = (basic_price + price *(mil_now - mileage)) % 10;
mil_table[3] = 10;
mil_table[4] = 10;
mil_table[5] = mil_now / 100;
mil_table[6] = mil_now / 10 % 10;
mil_table[7] = mil_now % 10;
}
//键盘按键检测
if(key_flag == 1)
{
key_flag = 0;
KeyScan();
if(Trg & 0x01 && !mil_flag)//未计价时按下为退出计价模式
{
state = !state;
//退出自动清零
t2 = 0;
mil_now = 0;
}
if(Trg & 0x02)//按下为开始里程计数,再按下为退出计数,依次循环
{
mil_flag = !mil_flag;
}
if(Trg & 0x04 && !mil_flag)//清零里程和价格
{
t2 = 0;
mil_now = 0;
}
}
}
}
}
}
}void timer0() interrupt 1
{
t0++;t1++;
if(t0 == 10)
{
key_flag = 1;
t0 = 0;
}
if(mil_flag == 1)
{
t2++;
if(t2 == 1000)
{
t2 = 0;
mil_now++;
}
}
if(t1 == 1)
{
u8 i;
if(set_basic_flag == 0 && !state)
P2 = 0xe0; P0 = ~t_display[show_table[i]]; P2 = 0x00;
if(set_basic_flag == 1)
P2 = 0xe0; P0 = ~t_display[set_table[i]]; P2 = 0x00;
if(state)
P2 = 0xe0; P0 = ~t_display[mil_table[i]]; P2 = 0x00;
P2 = 0xc0; P0 = T_COM[i]; P2 = 0x00;
i++;
if(i == 8)
i = 0;
t1 = 0;
}
}