仿真圖proteus 7.8
程序編譯器:keil 4/keil 5
編程語言:C語言
設(shè)計編號:C0050
功能說明
51單片機 + 1302時鐘芯片準確計時 + LCD1602液晶顯示 + 24c02芯片可以掉電存儲數(shù)據(jù) + 3v直流電機模擬發(fā)動機工作。
1、當無乘客時液晶可以顯示時間(年月日時分秒),時間可以按鍵設(shè)置,此時電機不工作;
2、當有乘客時電機工作,可以通過按鍵開始計費系統(tǒng)工作,有清零鍵,收費可以修改(包括起價費、超過起價費每公里或分鐘收費、白天和夜晚收費標準);
3、可以切換白天和夜晚收費標準,可以按照分鐘或公里收費切換。
仿真圖
程序
//出租車計價器
//宏定義
#define uchar unsigned char
#define uint unsigned int
//頭函數(shù)聲明
#include <reg52.h>
#include "Lcd.h"
#include "Data.h"
#include "DS1302.h"
#include "AT24C02.h"
//鍵盤定義
sbit K1=P3^4; //模式切換
sbit K2=P3^6; //減按鍵
sbit K3=P3^5; //加按鍵
sbit K4=P3^7; //萬年歷模式時:設(shè)置時間信息。計價器模式時:設(shè)置單價
//模式0時鐘 1時鐘調(diào)整
uchar Mode=0;
//時鐘屏幕調(diào)整
uchar Wei=0;
uchar SS=0;
//價格調(diào)整
uchar JGWei=0;
//計價器參數(shù)
uint Day=0;
uint Night=0;
uint DanJia=0;
uint DJ_min=0;
uint ZJ=0;
unsigned long GL=0;
uint Time=0;
uint count=0;
uchar m=0;
//白天/晚上
uchar DN=0;
//公里/時間
uchar GT=0;
//初始化函數(shù)
void InitTimer0();
//寫初值
void SETS();
//讀初值
void READS();
//主函數(shù)
void main()
{
//初始化
Ds1302_Init();
Init_LCD();
initeeprom();
//SETS();
//讀取初始參數(shù)
READS();
//定時器初始化
InitTimer0();
//循環(huán)
while(1)
{
//時鐘模式
if(Mode==0)
{
//讀時間
if(Wei==0)
{
Ds1302_Read_Time();
//顯示時間
display_NYR(time_buf1,Wei,0);
}
}
else if(Mode==1)
{
if(time_buf1[4]>=23||time_buf1[4]<7)
DN=1;
else
DN=0;
//顯示計價器信息
display_S(Day,Night,DanJia,ZJ,GL/10,Time,GT,DN);
}
if(K4==0)
{
delay(100);
//調(diào)時
if(Mode==0)
{
Wei++;
if(Wei==1)
{
SS=1;
}
//閃爍
display_NYR(time_buf1,Wei,SS);
if(Wei==7)
{
Wei=0;
//保存時間
Ds1302_Write_Time();
Init_LCD();
}
}
else if(Mode==1)
{
JGWei++;
if(JGWei==1)
{
Mode=2;
//顯示計價器價格
Init_LCD_JGTZ();
display_D(Day,Night,DanJia,JGWei,DJ_min);
}
}
else if(Mode==2)
{
JGWei++;
display_D(Day,Night,DanJia,JGWei,DJ_min);
if(JGWei==5)
{
Mode=1;
JGWei=0;
//參數(shù)初始化
//保存
SETS();
//讀初值
READS();
ZJ=0;
GL=0;
Time=0;
//開啟定時器
TR0=1;
//顯示計價器
Init_LCD_JJQ();
}
}
while(K4==0);
}
//+
if(K3==0)
{
delay(100);
//調(diào)時
if(Mode==0)
{
//年
if(Wei==1)
{
time_buf1[1]++;
if(time_buf1[1]>=100)
time_buf1[1]=0;
}
//月
else if(Wei==2)
{
time_buf1[2]++;
if(time_buf1[2]>=13)
time_buf1[2]=1;
}
//日
else if(Wei==3)
{
time_buf1[3]++;
if(time_buf1[3]>=YDay(time_buf1[1],time_buf1[2])+1)
time_buf1[3]=1;
}
//時
else if(Wei==4)
{
time_buf1[4]++;
if(time_buf1[4]>=24)
time_buf1[4]=0;
}
//分
else if(Wei==5)
{
time_buf1[5]++;
if(time_buf1[5]>=60)
time_buf1[5]=0;
}
//秒
else if(Wei==6)
{
time_buf1[6]++;
if(time_buf1[6]>=60)
time_buf1[6]=0;
}
//顯示
if(Wei!=0)
display_NYR(time_buf1,Wei,SS);
}
//調(diào)價
else if(Mode==2)
{
//單價
if(JGWei==1)
{
DanJia++;
if(DanJia>999)
{
DanJia=1;
}
}
//等待時間單價
else if(JGWei==2)
{
DJ_min++;
if(DJ_min>999)
{
DJ_min=1;
}
}
//夜間
else if(JGWei==3)
{
Night++;
if(Night>999)
{
Night=1;
}
}
//白天
else if(JGWei==4)
{
Day++;
if(Day>999)
{
Day=1;
}
}
display_D(Day,Night,DanJia,JGWei,DJ_min);
}
while(K3==0);
}
//-
if(K2==0)
{
delay(100);
//調(diào)時
if(Mode==0)
{
//年
if(Wei==1)
{
time_buf1[1]--;
if(time_buf1[1]<0)
time_buf1[1]=99;
}
//月
else if(Wei==2)
{
time_buf1[2]--;
if(time_buf1[2]<=0)
time_buf1[2]=12;
}
//日
else if(Wei==3)
{
time_buf1[3]--;
if(time_buf1[3]<=0)
time_buf1[3]=YDay(time_buf1[1],time_buf1[2]);
}
//時
else if(Wei==4)
{
time_buf1[4]--;
if(time_buf1[4]<0)
time_buf1[4]=23;
}
//分
else if(Wei==5)
{
time_buf1[5]--;
if(time_buf1[5]<0)
time_buf1[5]=59;
}
//秒
else if(Wei==6)
{
time_buf1[6]--;
if(time_buf1[6]<0)
time_buf1[6]=59;
}
//顯示
if(Wei!=0)
display_NYR(time_buf1,Wei,SS);
}
//調(diào)價
else if(Mode==2)
{
//單價
if(JGWei==1)
{
DanJia--;
if(DanJia==0)
{
DanJia=999;
}
}
//等待時間單價
else if(JGWei==2)
{
DJ_min--;
if(DJ_min==0)
{
DJ_min=999;
}
}
//夜間
else if(JGWei==3)
{
Night--;
if(Night==0)
{
Night=999;
}
}
//白天
else if(JGWei==4)
{
Day--;
if(Day==0)
{
Day=999;
}
}
display_D(Day,Night,DanJia,JGWei,DJ_min);
}
while(K2==0);
}
//切換
if(K1==0)
{
delay(100);
//計價器模式
if(Mode==1)
{
Mode=0;
ZJ=0;
GL=0;
Time=0;
//開啟定時器
TR0=0;
EX0=0;
//顯示計價器
Init_LCD();
}
else if(Mode==0)
{
Mode=1;
//參數(shù)初始化
//讀初值
READS();
ZJ=0;
GL=0;
Time=0;
//開啟定時器
m=0;
TR0=1;
EX0=1;
//顯示計價器
Init_LCD_JJQ();
}
while(K1==0);
}
}
}
//初始化函數(shù)
void InitTimer0(void)
{
TMOD = 0x01;
TH0 = 0x3C;
TL0 = 0xB0; //10ms
EA = 1;
ET0 = 1;
TR0 = 1;
IT0=1; //INT0負跳變觸發(fā)
EX0=0;//開外部INTO中斷
}
//定時器0中斷10ms
void Timer0Interrupt(void) interrupt 1
{
TH0 = 0x3C;
TL0 = 0xB0; //賦初值
m++;
if(m>=20)
{
m=0;
if(count>=60)
{
GT=0;
GL=GL+count/10;
count=0;
}
else
{
count=0;
GT=1;
Time++; //時間++
}
}
//計算錢數(shù)
//公里數(shù)小于3
if(GL<=300)
{
if(DN==0)
{
if(Time>60)
ZJ=Day+Time/60*DJ_min;
else
ZJ=Day;
}
else
{
if(Time>60)
ZJ=Night+Time/60*DJ_min;
else
ZJ=Night;
}
}
else
{
if(DN==0)
{
if(Time>60)
ZJ=Day+(GL/10-20)/10*DanJia+Time/60*DJ_min;
else
ZJ=Day+(GL/10-20)/10*DanJia;
}
else
{
if(Time>60)
ZJ=Night+(GL/10-20)/10*DanJia+Time/60*DJ_min;
else
ZJ=Night+(GL/10-20)/10*DanJia;
}
}
}
void EXINT0() interrupt 0
{
count++;
}
//讀初值
void READS()
{
uchar SH=0,SL=0;
uint temp=0;
delay(10);
SL=read_add(0x01);
delay(10);
SH=read_add(0x02);
temp=SH;
temp=temp<<8;
temp=temp+SL;
Day=temp;
delay(10);
SL=read_add(0x03);
delay(10);
SH=read_add(0x04);
temp=SH;
temp=temp<<8;
temp=temp+SL;
Night=temp;
delay(10);
SL=read_add(0x05);
delay(10);
SH=read_add(0x06);
temp=SH;
temp=temp<<8;
temp=temp+SL;
DanJia=temp;
delay(10);
SL=read_add(0x07);
delay(10);
SH=read_add(0x08);
temp=SH;
temp=temp<<8;
temp=temp+SL;
DJ_min=temp;
}
//寫初值
void SETS()
{
uchar SH=0,SL=0;
uint temp=0;
temp=Day;
SL=temp&0x00ff;
SH=temp>>8;
delay(10);
write_add(0x01,SL);
delay(10);
write_add(0x02,SH);
temp=Night;
SL=temp&0x00ff;
SH=temp>>8;
delay(10);
write_add(0x03,SL);
delay(10);
write_add(0x04,SH);
temp=DanJia;
SL=temp&0x00ff;
SH=temp>>8;
delay(10);
write_add(0x05,SL);
delay(10);
write_add(0x06,SH);
temp=DJ_min;
SL=temp&0x00ff;
SH=temp>>8;
delay(10);
write_add(0x07,SL);
delay(10);
write_add(0x08,SH);
}
原理圖
設(shè)計說明書
摘要
? 出租車行業(yè)在我國是八十年代初興起的一項新興行業(yè),隨著我國國民經(jīng)濟的高速發(fā)展,出租汽車已成為城市公共交通的重要組成部分。多年來國內(nèi)普遍使用的計價器只具備單一的計量功能。目前全世界的計價器中有90%為臺灣所生產(chǎn)?,F(xiàn)在各個城市出租車行業(yè)都已普及,因此出租車計價器的技術(shù)已經(jīng)成熟,但是出租車計價器的市場還具有廣闊的前景。隨著城市建設(shè)的日益完善,關(guān)乎城市面貌的出租車行業(yè)也將迅速發(fā)展,出租車計價器的的大批量需求也是毫無疑問的,所以未來出租車計價器的市場還是有相當大的潛力。
? 本次出租車計價器設(shè)計可以分為六個模塊,主控模塊、計時模塊、存儲模塊、顯示模塊、按鍵模塊和電機驅(qū)動模塊。本設(shè)計采用STC89C52單片機作為主控模塊的主控芯片,結(jié)合單片機的外圍電路實現(xiàn)對整個系統(tǒng)的控制,DS1302時鐘芯片準確計時具有重新上電不用調(diào)時的功能,顯示部分采用LCD1602液晶顯示,24c02芯片可以掉電存儲設(shè)置的計費數(shù)據(jù),即使掉電也不會丟失設(shè)置的費用,3v直流電機模擬發(fā)動機工作,使整個設(shè)計更加逼真,當無乘客時液晶可以顯示時間(年月日時分秒),時間可以按鍵設(shè)置,此時電機不工作;當有乘客時電機工作,可以通過按鍵開始計費系統(tǒng)工作,有清零鍵,收費可以修改(包括起價費、超過起價費每公里或分鐘收費、白天和夜晚收費標準),可以切換白天和夜晚收費標準,可以按照分鐘或公里收費切換。汽車計價器是乘客與司機雙方的交易準則,它是出租車行業(yè)發(fā)展的重要標志,是出租車中最重要的工具。它關(guān)系著交易雙方的利益。具有良好性能的計價器無論是對廣大出租車司機朋友還是乘客來說都是很必要的。因此,汽車計價器的研究也是有一定的應用價值的。