|
本設(shè)計(jì)的是一個(gè)基于單片機(jī)AT89C51的出租車自動(dòng)計(jì)費(fèi)設(shè)計(jì),附有復(fù)位電路,時(shí)鐘電路,鍵盤電路等。復(fù)位電路是單片機(jī)的初始化操作,除了正常的初始化外,為擺脫困境,通過復(fù)位電路可以重新開始。時(shí)鐘電路采用12MHz的晶振,作為系統(tǒng)的時(shí)鐘源,具有較高的準(zhǔn)確性。
在上電時(shí)四位共陽極74EG-MPX4-CA數(shù)碼管顯示最初的起步價(jià),里程收費(fèi),汽車行駛時(shí)間,通過按鍵可以切換起步價(jià),里程收費(fèi),汽車行駛時(shí)間。通過按鍵模擬出租車的運(yùn)行,暫停,停止。在74EG-MPX4-CA液晶上可以顯示運(yùn)行的時(shí)間,運(yùn)行時(shí)暫停的時(shí)間,以及所用的費(fèi)用。在這里主要是以AT89C51單片機(jī)為核心控制器,P3口接74EG-MPX4-CA液晶顯示模塊,P0口接按鍵的,通過按鍵輸入。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.gif (202.04 KB, 下載次數(shù): 33)
下載附件
2022-10-16 17:53 上傳
下載 (1).png (249.37 KB, 下載次數(shù): 27)
下載附件
2022-10-16 11:19 上傳
計(jì)價(jià)規(guī)則:
用時(shí)間模擬路程,前三秒以內(nèi)8.00元,若超出3秒
每增加一秒,價(jià)格增加1元。用數(shù)碼管顯示價(jià)錢和
時(shí)間(用一個(gè)按鍵控制顯示時(shí)間或價(jià)錢)
單片機(jī)源代碼
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit p00=P0^0 ;
sbit p01=P0^1 ;
sbit p02=P0^2 ;
sbit p37=P3^7 ;
uint i,j;
uint code Seg[19]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x80};
//數(shù)碼管譯碼表: { 0 , 1 , 2 , 3 , 4 ,5 6 7 8 9 0 . } P}
uchar jps,ks,key_do;//鍵盤緩存,上次有按鍵按下標(biāo)志位,按鍵已處理標(biāo)志位
uint count_10ms=0,second=0;
float cost; //價(jià)錢
void delay(uint tt) //延時(shí)函數(shù)
{
uint i;
for(;tt>0;tt--)
for(i=0;i<200;i++);
}
void LED(uint d1,uint d2)
{
if(d1==1) P0=(P0|0xf0)&0x1f;
if(d1==2) P0=(P0|0xf0)&0x2f;
if(d1==3) P0=(P0|0xf0)&0x4f;
if(d1==4) P0=(P0|0xf0)&0x8f;
P0=P0|0x0f;
P1=Seg[d2];
}
int keyscan() //鍵盤掃描函數(shù)
{
int t=0;
if(p00==0) { t=1; jps=1;}
if(p01==0) { t=1; jps=2;}
if(p02==0) { t=1; jps=3;}
return(t);
}
void money() //價(jià)錢計(jì)算
{
count_10ms++;
if(count_10ms==100)
{count_10ms=0;second++;}
if(second<=3) cost=8.0;
else if(second>3) cost=8.0+1.0*(second-3);
}
void ledshow()
{
while(j%2==0) // 價(jià)錢顯示
{
LED(1,(int) (cost/10) );
delay(5);
LED(2,(int) cost%10 );
delay(5);
LED(3,(int) (cost*10)%10 );
delay(5);
LED(4,(int) (cost*100)%10 );
delay(5);
LED(2,11);
delay(5);
}
while(j%2==1) // 時(shí)間顯示
{
LED(1,second/10);
delay(5);
LED(2,second%10);
delay(5);
LED(3,count_10ms/10);
delay(5);
LED(4,count_10ms%10);
delay(5);
LED(2,11);
delay(5);
}
}
void Time_fun() interrupt 1 //10ms中斷函數(shù)
{
uint k;
if(k==15) { k=0; p37=1; }
else k++;
TH0=(0xffff-10000)/256; //10ms
TL0=(0xffff-10000)%256; //10ms
if(i%2==1) money(); // 暫停/播放
if((ks==1)&&(keyscan()==1)&&(key_do==0))
{
k=0;
p37=0; //按鍵提示音
key_do=1;
if(jps==1) i++; // 暫停/播放鍵
if(jps==2) j++; // 時(shí)間價(jià)錢顯示轉(zhuǎn)換
if(jps==3) // 清零鍵
{
count_10ms=0;
second=0;
cost=0;
}
}
ks=keyscan();
if(ks==0) key_do=0;
}
main()
{
TMOD=0x01; //Time0為16計(jì)數(shù)器
TH0=(0xffff-10000)/256;
TL0=(0xffff-10000)%256;
TR0=1; //打開定時(shí)器
IE=0x82; //EA=1 ET0=1 打開中斷
while(1)
{
ledshow();
}
}
1665890393231.png (184.67 KB, 下載次數(shù): 31)
下載附件
2022-10-16 11:20 上傳
下載.png (56.77 KB, 下載次數(shù): 25)
下載附件
2022-10-16 11:19 上傳
Keil代碼和Proteus8.8仿真word文檔下載:
出租車計(jì)價(jià)器.zip
(546.1 KB, 下載次數(shù): 71)
2022-10-16 11:15 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|