本帖最后由 crow23 于 2021-6-27 08:48 編輯
P32腳接入外部脈沖,運用外部脈沖輸入模擬車輪,計算里程,低于10HZ進入等待計費。
使用了DS1302可以設置時間,單價分不同時段,帶停車等待計價功能。計算價錢方式以下
在6:00---23:00期間,起步費6元,可運營3公里,超過3公里后每公里3.00元。
在23:00---到次日6:00期間,起步費6元,可運營3公里,超過3公里后每公里4.00元。
出租車平時每等候10秒按0.1元計算。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.gif (144.21 KB, 下載次數: 54)
下載附件
2021-6-27 01:53 上傳
原理圖:
下載y.png (133.54 KB, 下載次數: 47)
下載附件
2021-6-26 14:18 上傳
pcb:
下載.ppng.png (293.15 KB, 下載次數: 54)
下載附件
2021-6-26 14:18 上傳
單片機源程序如下:- #include<reg51.h>
- #include<type.h>
- #include<intrins.h>
- #include<lcddisp.h>
- #include<ds1302.h>
- uchar code univalent[2] = {2,4}; //???????,[0]-???????,[1]-???????
- uchar code time_pos[7] = {4,-1,7,10,4,7,10}; //????????????
- uchar code money_pos[4] = {4,7,4,7}; //????????????????
- bit config_ok = 0; //0-?????,1-????
- bit state = 0; //?????????,0-??(???),1-??(???)
- bit pause = 0; //???????,0-????,1-????
- uint pulse_count = 0; //?????
- uint pulse_count_tmp = 0;
- uint time_count = -300; //?????????,????,5???,10s-1km-1.5?
- uint mileage_count_new = 0,mileage_count_old = 0; //???????,??????????,???km,1km-3?,
- uchar idata time[7] = {0x12,0x5,0x12,0x22,0x0,0x0,0x0}; //???????
- uint money[2]={5,0}; //???????,[0]-???,[1]-???
- uchar first_3_km = 0;
- unsigned long money_temp=600;
- uint idata DayMoney=180,NightMoney=200,WaitMoney=150;
- void INT0_init(void);
- void INT1_init(void);
- void Delay(uint);
- void System_init(void);
- void Time_Show(uchar time_data[7]);
- void Run_Show_Time(uchar time_data[7]);
- void Money_Show(uint money[2]);
- void Show_Wait_Time(uint);
- void Show_Mileage(void);
- void Run_BackGround(void); //?????,??LCD??????
- void Run_BackGround(void)
- {
- WriteChar('/', 3,0);
- WriteChar(':',10,0);
- WriteChar(':',13,0);
- WriteChar('.',3,1);
- WriteChar('Y',6,1);
- }
- void Show_Mileage(void)
- {
- WriteDecimal(pulse_count / 200,0,12,1);
- WriteInt(pulse_count % 200 / 10,0,0,13,1);
- WriteChar('.',12,1);
- WriteString("km",14,1);
- }
- void Show_Wait_Time(uint time_count)
- {
- WriteChar('s',15,1);
- WriteChar(' ', 10,1);
- WriteInt(time_count,1,4,11,1);
- }
- void Money_Show(uint money[2])
- {
- WriteDecimal(money[0],0,3,1);
- WriteDecimal(money[1],1,3,1);
- }
- void Run_Show_Time(uchar time_data[7])
- {
- WriteInt(BcdToInt(time_data[2]),1,2, 1,0);
- WriteInt(BcdToInt(time_data[3]),1,2, 4,0);
- WriteInt(BcdToInt(time_data[4]),1,2, 8,0);
- WriteInt(BcdToInt(time_data[5]),1,2,11,0);
- WriteInt(BcdToInt(time_data[6]),1,2,14,0);
- }
- void Time_Show(uchar time_data[7])
- {
- WriteChar('/',6,0);
- WriteChar('/',9,0);
- WriteChar(':',6,1);
- WriteChar(':',9,1);
-
- WriteInt(BcdToInt(time_data[0]),1,2, 4,0);
- WriteInt(BcdToInt(time_data[2]),1,2, 7,0);
- WriteInt(BcdToInt(time_data[3]),1,2,10,0);
- WriteInt(BcdToInt(time_data[4]),1,2, 4,1);
- WriteInt(BcdToInt(time_data[5]),1,2, 7,1);
- WriteInt(BcdToInt(time_data[6]),1,2,10,1);
- }
- void System_init(void)
- {
- RstLcd();
- ClrLcd();
- P1 = 0x00;
-
- config_ok = 0;
- Time_Show(time);
- LcdPos(5,0);
- SetCur(3);
- INT1_init();
- while(config_ok == 0); //??????????
- ClrLcd();
- SetCur(1);
- WriteString("Set time OK...",0,0);
- Delay(60000);
- ClrLcd();
- Run_BackGround();
- P1= 0xff;
- //money[0]=6;money[1]=0;
- if((time[4]>6)&&(time[4]<23)) ///////////////////
- {
- money[0]=5;
- money[1]=0;
- money_temp=600;
- }
- else
- {
- money[0]=5;
- money[1]=0;
- money_temp=600;
- }
- Money_Show(money);
- //P2=P2|0x0f;
- }
- void Delay(uint dtime)
- {
- uint temp;
- for(temp=0;temp<dtime;temp++);
- }
- void INT0_init(void)
- {
- EA = 0;
- IT0 = 1;
- EX0 = 1;
- EA = 1;
- }
- void INT1_init(void)
- {
- EA = 0;
- IT1 = 1;
- EX1 = 1;
- EA = 1;
- }
- void main()
- {
- uchar time_tmp[7],i;
- System_init();
- DS1302_GetData(time);
- pulse_count_tmp = pulse_count;
- mileage_count_new = mileage_count_old = 0;
- Money_Show(money);
- Run_Show_Time(time);
- Show_Mileage();
- while(1)
- {
- if(config_ok == 0) //????????
- System_init();
- DS1302_GetData(time_tmp);
-
- if(!(P1 & 0x04))
- {
- P1 &= 0xfe;
- P1 |= 0x02;
- pause = 0;
- if(time[6] != time_tmp[6])
- {
- Run_Show_Time(time_tmp);
- for(i = 0;i < 7;i++)
- time[i] = time_tmp[i];
- }
- first_3_km = 0;
-
- mileage_count_new = mileage_count_old = 0;
- WriteString(" ",0,1);
- WriteString(" ",9,1);
- //money_temp=600;
- time_count = 0;
- //WriteDecimal(6,0,3,1);
- //money[0]=6; money[1]=0;
- if((time[4]>6)&&(time[4]<23)) ///////////////////
- {
- money[0]=5;
- money[1]=0;
- money_temp=600;
- }
- else
- {
- money[0]=5;
- money[1]=0;
- money_temp=600;
- }
- DayMoney=180;NightMoney=200;
- //WriteDecimal(0,1,3,1);//
- Money_Show(money);
- pulse_count = 0;
- Show_Mileage();
- time_count = 0;
- }
- else if(pause == 0)
- {
- INT0_init();
- if(time[6] != time_tmp[6])
- {
- Run_Show_Time(time_tmp);
- for(i = 0;i < 7;i++)
- time[i] = time_tmp[i];
-
- if(pulse_count - pulse_count_tmp < 10) //?????????(??),????,?????????????10,?????
- {
- state = 1;
- P1 &= 0xfe;
- P1 |= 0x02;
- time_count ++; //?????1
- if( time_count>0)
- {
- if((time_tmp[4]>6)&&(time_tmp[4]<23)) ///////////////////
- {
- WaitMoney=150;
- }
- else WaitMoney=150;
- if(time_count % 10 == 0 && first_3_km > 2)//????,10s???1.5?
- {
- money_temp+=WaitMoney;
- money[0]=money_temp/100;
- money[1] = money_temp%100;
- Money_Show(money);
- }
- else if(time_count % 10 == 0 && first_3_km <= 2)
- first_3_km ++;
- else;
- }
- else
- money[0]=money_temp/100;
- money[1] = money_temp%100;
- mileage_count_old = mileage_count_new;
- Show_Wait_Time(time_count);
- }
- else //?????????(???)
- {
- state = 0;
- P1 &= 0xfd;
- P1 |= 0x01;
- //time_count = 0; //?????,??????0
- }
- pulse_count_tmp = pulse_count;
- }
- if(state == 0)
- {
- mileage_count_new = pulse_count / 200;
- if(mileage_count_new>10)
- {
- DayMoney=300;
- NightMoney=400;
- }
- if(mileage_count_new != mileage_count_old && first_3_km > 2)
- {
- Show_Mileage();
- for(i = mileage_count_old;i < mileage_count_new;i++)
- {
-
- if((time_tmp[4]>6)&&(time_tmp[4]<23)) ///////////////////
- {
- money_temp+=DayMoney;
- money[0]=money_temp/100;
- money[1] = money_temp%100;
- Money_Show(money);
- }
-
- {
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
仿真工程與hex下載:
仿真.rar
(23.33 KB, 下載次數: 46)
2021-6-26 14:03 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
源代碼(剛剛忘記發了。。。)已補全:
源代碼.zip
(98.89 KB, 下載次數: 37)
2021-6-27 08:48 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
有問題聯系我
|