|
2.0.png (33.59 KB, 下載次數(shù): 64)
下載附件
2021-10-27 17:45 上傳
1.png (29.98 KB, 下載次數(shù): 70)
下載附件
2021-10-27 17:44 上傳
1. 用前4位數(shù)碼管實(shí)時(shí)顯示里程數(shù)(Z),單位為公里,最后一位為小數(shù)位;用后4位數(shù)碼管時(shí)時(shí)顯示金額數(shù)(J),單位為元,最后一位為小數(shù)位。
2. 規(guī)定出租車單程價(jià)格為2元/公里,往返則價(jià)格為1.5元/公里;單程/往返分別由“單程” 按鍵和“往返” 按鍵設(shè)定。
3. 車速<5公里/小時(shí)的時(shí)間累積為總等待時(shí)間T(分鐘),每5分鐘等待時(shí)間相當(dāng)于里程數(shù)增加1公里。
4. 起步公里數(shù)為3公里,價(jià)格為8元;若實(shí)際運(yùn)行大于3公里, 按“設(shè)計(jì)任務(wù)2”計(jì)算價(jià)格。
5. 必須充分利用比賽指定的硬件平臺(tái)上的資源進(jìn)行設(shè)計(jì)。
6. 用單片機(jī)控制電機(jī)轉(zhuǎn)動(dòng),并用光電傳感器檢測轉(zhuǎn)盤轉(zhuǎn)動(dòng)模擬車速,車速與轉(zhuǎn)盤轉(zhuǎn)速成正比。轉(zhuǎn)盤轉(zhuǎn)速為5轉(zhuǎn)/秒對應(yīng)車速為5公里/小時(shí),轉(zhuǎn)盤轉(zhuǎn)速為50轉(zhuǎn)/秒對應(yīng)車速為50公里/小時(shí),依此類推。
7. 要求公里數(shù)檢測誤差不超過±10%。
8. 到達(dá)目的地后,按“暫! 鍵,計(jì)價(jià)器可暫停計(jì)價(jià)。
9. 按“清除” 鍵,計(jì)價(jià)器能將記錄數(shù)據(jù)(里程、等待時(shí)間與價(jià)格等)自動(dòng)清0。
10.按“查詢”鍵,能自動(dòng)顯示總等待時(shí)間T,再按下該鍵回到顯示里程數(shù)、金額狀態(tài)。
1.2系統(tǒng)工作原理及其組成
出租車計(jì)價(jià)是根據(jù)車所行駛的路程以及乘客乘車的方式綜合決定的。出租車行駛總路程可以通過車輪的周長乘車輪旋轉(zhuǎn)圈數(shù)得到。即可計(jì)算得到車輪旋轉(zhuǎn)幾周出租車能行駛一公里的路程。因此,使用槽型光耦的目的就是方便地計(jì)量車輪旋轉(zhuǎn)的圈數(shù)?稍谲囕嗈D(zhuǎn)軸涂上白色條紋,其余部分涂成黑色,發(fā)光管照射轉(zhuǎn)軸。當(dāng)轉(zhuǎn)軸轉(zhuǎn)動(dòng)時(shí),反光與不反光交替出現(xiàn),所以槽型光耦間斷地接收光的反射信號,輸出電脈沖。再經(jīng)過整形電路,輸出標(biāo)準(zhǔn)TTL信號。輸出的脈沖信號被接入到STC89C52單片機(jī)系統(tǒng)中,通過計(jì)算接收到的脈沖個(gè)數(shù),計(jì)算出當(dāng)前所行駛的路程。同時(shí),根據(jù)不同的收費(fèi)標(biāo)準(zhǔn),選擇相應(yīng)的起步價(jià)、單價(jià)等收費(fèi)標(biāo)準(zhǔn)進(jìn)行計(jì)算。HD 7279管理鍵盤和數(shù)碼顯示,通過鍵盤能夠?qū)崿F(xiàn)啟動(dòng)、暫停、停止計(jì)價(jià)器、切換顯示當(dāng)前的行駛里程和需支付的車費(fèi)。
出租車計(jì)價(jià)器用于記錄里程、等待時(shí)間、是否往返、起步公里數(shù)與價(jià)格的關(guān)系,它能有效地避免司機(jī)與乘客間的矛盾,保障雙方的利益。
模擬出租車計(jì)價(jià)器能根據(jù)總里程數(shù)、總等待時(shí)間長短、是否往返、起步公里數(shù)的情況作出相應(yīng)報(bào)價(jià)等。當(dāng)然實(shí)際的出租車計(jì)價(jià)器還具有能打印出車票等功能
1 單片機(jī)最小系統(tǒng)單元主控機(jī)系統(tǒng)采用了Atmel 公司生產(chǎn)的 STC89C52單片機(jī),它含有256 字節(jié)數(shù)據(jù)存儲(chǔ)器,內(nèi)置8K 的電可擦除FLASH ROM,可重復(fù)編程,大小滿足主控機(jī)軟件系統(tǒng)設(shè)計(jì),所以不必再擴(kuò)展程序存儲(chǔ)器。復(fù)位電路和晶振電路是STC89C52 工作所需的最簡外圍電路。單片機(jī)最小系統(tǒng)電路圖如圖2.1所示。
主控機(jī)系統(tǒng)采用了Atmel 公司生產(chǎn)的 STC89C52單片機(jī),它含有256 字節(jié)數(shù)據(jù)存儲(chǔ)器,內(nèi)置8K 的電可擦除FLASH ROM,可重復(fù)編程,大小滿足主控機(jī)軟件系統(tǒng)設(shè)計(jì),所以不必再擴(kuò)展程序存儲(chǔ)器。復(fù)位電路和晶振電路是STC89C52 工作所需的最簡外圍電路。單片機(jī)最小系統(tǒng)電路圖如圖2.1所示。
file:///C:/Users/WF/AppData/Local/Temp/msohtmlclip1/01/clip_image002.gif
圖2.1 單片機(jī)最小系統(tǒng)圖
STC89C52的復(fù)位端是一個(gè)史密特觸發(fā)輸入,高電平有效。RST端若由低電平上升到高電平并持續(xù)2個(gè)周期,系統(tǒng)將實(shí)現(xiàn)一次復(fù)位操作。在復(fù)位電路中,按一下復(fù)位開關(guān)就使在RST端出現(xiàn)一段時(shí)間的高電平,外接11.0592M 晶振和兩個(gè)30pF 電容組成系統(tǒng)的內(nèi)部時(shí)鐘電路
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
/*7279指令*/
#define com_read 0x15 //讀鍵盤數(shù)據(jù)指令
/*變量及I/O口定義 */
sbit cs= P1^0; //cs 連接于 P1.0,低電平有效
sbit clk=P1^1; //clk 連接于 P1.1
sbit key=P1^3; //dat 連接于 P1.2
sbit dat=P1^2; //key 連接于 P1.3,低電平有效
/*函數(shù)原型聲明 */
voidwrite7279(uchar,uchar); //寫入到HD7279
uchar read7279(uchar); //從HD7279讀出
void send_byte(uchar); //發(fā)送一個(gè)字節(jié)
ucharreceive_byte(void); //接收一個(gè)字節(jié)
void short_delay(void); //延時(shí)約8us
void long_delay(void); //延時(shí)約50us
void delay_10ms(uchartimes); //延時(shí)約times*10ms
void delay_1ms(uchar times); //延時(shí)約times*1ms
void Init_date();
ucharqianwei,baiwei,shiwei,gewei;
uint tt,aa,aaa,wait,dengdai,gongli,jiage,jg;
bit flag0,flag1,flag2,flag3;
uchar led[]={0x1c,0x1d,0x1e,0x1f,0x14,0x15,0x16,0x17,
0x0c,0x0d,0x0e,0x0f,0x04,0x05,0x06,0x07}; //鍵值編碼s0-s15
/*發(fā)送字節(jié)函數(shù) 發(fā)送的字節(jié)為out_byte*/
void send_byte(ucharout_byte)
{
uchar i;
cs=0;
long_delay();
for(i=0;i<8;i++)
{
if(out_byte&0x80)
dat=1;
else
dat=0;
clk=1;
short_delay();
clk=0;
short_delay();
out_byte=out_byte*2; //左移一位
}
dat=0;
}
/*接收字節(jié)函數(shù) 接收的字節(jié)in_byte*/
uchar receive_byte(void)
{
uchar i,in_byte;
dat=1;
long_delay();
for(i=0;i<8;i++)
{
clk=1;
short_delay();
in_byte=in_byte*2;
if(dat)
in_byte=in_byte|0x01;
clk=0;
short_delay();
}
dat=0;
return(in_byte);
}
/*發(fā)送帶數(shù)據(jù)指令函數(shù)*/
void write7279(ucharcommond,uchar date)
{
send_byte(commond);
send_byte(date);
}
/*讀指令函數(shù)*/
uchar read7279(ucharcommond)
{
send_byte(commond);
return(receive_byte());
}
/*短延時(shí)函數(shù)1*/
void short_delay(void) //延時(shí)約8us
{
uchar i;
for(i=0;i<2;i++);
}
/*短延時(shí)函數(shù)2*/
void long_delay(void) //延時(shí)約50us
{
uchar i;
for(i=0;i<12;i++);
}
void zting() //停止子程序
{
flag1=!flag1;
if(flag1)
{
EX0=0; //關(guān)閉中斷 定時(shí)器
TR0=0;
}
else
{
EX0=1;
TR0=1;
}
}
uchar read_key_code(void) //讀鍵值
{
uchar i_code;
if(!key)
{
i_code=read7279(0x15);
while(!key); //消除鍵盤抖動(dòng)
return i_code; //讀鍵盤值
}
else
return 0xff; //無鍵盤按下
}
uchar read_key_number(void) //讀鍵盤號
{
uchar l_o;
uchar i;
l_o=read_key_code();
if(l_o!=0xff) //判斷是否有鍵盤按下
{
for(i=0;i!=l_o;i++);
return i;
}
else return 0xff;
}
void keyscan()
{
uchar k_p;
k_p=read_key_number(); //讀鍵值號 選擇相應(yīng)的操作
switch(k_p)
{
case 12: flag0=!flag0;break; //顯示金額 公里 等待時(shí)間T 脈沖數(shù)
case 13: Init_date();break; //數(shù)據(jù)初始化函數(shù)
case 14: zting();break; //暫停
case 15: flag2=1;break; //單程
case 11: flag2=0;break; //往返
default :break;
}
}
void jisuan() //計(jì)算數(shù)據(jù)處理
{
if(0<=aaa<=180)
{
gongli=aaa/6+dengdai/3000;
jiage=60; //60角
}
if(!flag2) jg=20; //單程價(jià)格
jg=15; //往返價(jià)格
if(aaa>180)
{
gongli=aaa/6+dengdai/3000;
jiage=jg*(gongli-30)/10+60;
}
wait=dengdai/100;
}
void fenli(uint temp,uchardd,uchar ee,uchar ff,uchar gg) //數(shù)據(jù)的分離處理
{
if(temp>=9999) temp=9999;
qianwei=temp/1000;
baiwei=temp/100%10;
shiwei=temp%100/10|0x80;
gewei=temp%10;
write7279(dd,qianwei);
write7279(ee,baiwei);
write7279(ff,shiwei);
write7279(gg,gewei);
}
void display() //7279顯示程序
{
if(flag0)
{
write7279(0x98,0xff);
fenli(wait,0x87,0x86,0x85,0x84);
fenli(aaa,0x83,0x82,0x81,0x80); //顯示脈沖數(shù)
}
else
{
write7279(0x98,0xff);
fenli(gongli,0x87,0x86,0x85,0x84);
fenli(jiage,0x83,0x82,0x81,0x80);
}}
void Init_date() //數(shù)據(jù)初始化
{
aaa=0;
tt=0;
wait=0;
dengdai=0;
gongli=0;
jiage=0;
flag0=0;
flag1=0;
flag2=0;
flag3=0;
}
void init() //定時(shí)器初始化
{
TMOD=0x01;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
IE=0x83;
IT0=1; //外部邊沿觸發(fā)方式
TR0=1;
}
void main() //主程序
{
Init_date(); //調(diào)用數(shù)據(jù)初始數(shù)據(jù)
init(); //定時(shí)器初始化
send_byte(0xa4); //初始化7279
while(1)
{
keyscan(); //鍵盤掃描
jisuan(); //數(shù)據(jù)處理
display(); //顯示
}
}
/**********中斷***********/
void zd() interrupt 0 //中斷0
{
aa++;
if(flag3) aaa++; //進(jìn)入中途等待計(jì)價(jià)
}
/*********定時(shí)器********/
void time0() interrupt 1 //定時(shí)0
{
TH0=(65536-10000)/256; //10ms
TL0=(65536-10000)%256;
tt++;
if(tt>=100) //1s采樣
{
tt=0;
aa=aa/5; //速度(n*圈/s)
if(aa<=5) flag3=0;
else flag3=1;
aa=0;
}
if(!flag3)
{ dengdai++;
}
}
|
|