已通過模擬測試
#include<reg52.h>
unsigned char cir_num,pwm_mach,temp,distance,wait_time,price,distance;
unsigned int a,t;
sbit pwm_mach=P1^0;
sbit key_clean=P3^0;//定義按鍵位置
sbit key_stop=P3^1;
sbit key_cheak=P3^2;
sbit key_oneway=P3^3;
sbit key_doubleway=P3^4;
unsigned char code led_buf[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
unsigned char code seg[]={0,1,2,3,4,5,6,7};//分別對應相應的數碼管點亮
/************初始化定時器0******************/
void init_timer0()
{
TMOD=0x01;
TH0=0x3C;
TL0=0xAF;//定時50MS
EA=1;
ET0=1;
TR0=1;
}
/************初始化定時器1******************/
void init_timer1()
{
TMOD=0x10;
TH0=0x00;
TL0=0x00;
EA=1;
ET1=1;
TR1=1;
}
/************初始化定時器2******************/
void init_timer2()
{
RCAP2H = (65536-50000)/256;// 50ms 自動重載
RCAP2L = (65536-50000)%256;
ET2=1;
EA=1;
TR2=1;
}
/************定時器0中斷******************/
void Timer0_isr(void) interrupt 1 using 1
{
TH0=0x3C;
TL0=0xAF;
if(a==20)//定時1s
{a=0;
if( cir_num<5)//檢測1S內圈數是否小于5
{t++;
if(t==300)//等待時間累加滿5分鐘里程加1
temp=1;
}
}
else cir_num++;
}
/************定時器1中斷******************/
void Timer1_isr(void) interrupt 3 using 1
{
TH1=0x00; /* Init value */
TL1=0x00;
distance=cir_num*28+temp;//里程
cir_num++;//測速
}
/************定時器2中斷******************/
void Timer2_isr(void) interrupt 5 using 1//定時器2中斷
{
TF2=0;
while(1)
{
pwm_mach=0;
delay(200);
pwm_mach=~pwm_mach;
delay(400);
}
}
/**************延時函數**************************/
void delay(unsigned int cnt)
{
while(--cnt);
}
/*********主函數******************/
void main()
{
init_time0();
init_time1();
init_time2();
while(1)
{
key_order();
dsp_data();
}
}
/**********按鍵控制****************/
void key_order()
{
if(!key_clean)
{distance=0;
cir_num=0;
t=0;
}
if(!key_stop)
{
ET0=0;
ET1=0;
TR0=0;
TR1=0;
ET2=0;
TR2=0;
}
if(!key_oneway)
{
flag=0;//去執行單程計價程序
}
if(!key_doubleway)
{
flag=1;//去執行往返計價程序
}
if(!key_cheak)
{
wait_time=1;//顯示等待時間
//dis_time();//等待時間顯示函數
}
}
/*********數據處理程序*****************/
void dsp_data()
{
switch(flag)
{
case 0:price=(cir_num-10714)*20;break;
case 1:price=(cir_num-10714)*15;break;
default:price=8; break;
}
switch(wait_time)
{
case 0:distance=cir_num*28+temp;//里程
price_display();//價格顯示函數
break;
case 1:time_display();
break;
}
}
/*********價格顯示函數***********/
void price_display()
{
led_buf[4]=price/1000;
led_buf[5]=price%1000/100;
led_buf[6]=price%100/10;
led_buf[7]=price%10;
led_buf[6]=0x80;
}
/*********里程顯示函數***********/
void distance_display()
{
led_buf[0]=distance/1000;
led_buf[1]=distance%1000/100;
led_buf[2]=distance%100/10;
led_buf[3]=distance%10;
led_buf[2]=0x80;
}
void time_display()
{
led_buf[0]=t/1000;
led_buf[1]=t%1000/100;
led_buf[2]=t%100/10;
led_buf[3]=t%10;
led_buf[4]=0x6d;
}