出租车计费
/* 十三、出租车计费系统设计设计内容:1、用一个独立按键控制汽车前进档位变化,根据按下次数不同,分别是1档→2档→3档→4档→1档…..,档位不同体现在直流电机的转速变化,档位值显示数显管;(40分)2、根据档位值,以及运行时期,实时将里程数显示在数显管上;(30分)3、有暂定功能;当暂停按钮按下,直流电机停转,里程数静止不变;(20分)4、具有里程清零功能;清零时,里程表显示为0;(10分) */#include sbit KEY1 = P3^2;sbit KEY2 = P3^3;sbit KEY3 = P3^4;sbit PWM = P1^0;unsigned char CYCLE; //定义周期 该数字X基准定时时间 如果是10 则周期是10 x 0.1msunsigned char PWM_ON ;//定义高电平时间unsigned char table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};unsigned char tab_P2[8] = {0,1,2,3,4,5,6,7};unsigned char tab_P0[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};unsigned char ii=0,jj=0; unsigned int sum=0;void delay(unsigned int cnt){while(--cnt);}main(){unsigned char PWM_TEP,temp,PWM_Num;//定义档位 TMOD |=0x01;//定时器设置 1ms in 12M crystalTH0=(65536-1000)/256; TL0=(65536-1000)%256;//定时1mS TH1=(65536-5000)/256; TL1=(65536-5000)%256;IE=0x8a; //打开中断 TR0=1; TR1=1;CYCLE = 10;// 时间可以调整 这个是10步调整 周期10ms 8位PWM就是256步 while(1){if(KEY1==0 || KEY2==0 || KEY3==0) {delay(50); if(KEY1==0 || KEY2==0 || KEY3==0){ if(KEY1 == 0) { PWM_Num++;if(PWM_Num==4)PWM_Num=0;switch(PWM_Num){case 0:tab_P0[0]=0x06;PWM_ON=2;break;//高电平时长:10-PWM_ONcase 1:tab_P0[0]=0x5B;PWM_ON=4;break;case 2:tab_P0[0]=0x4F;PWM_ON=6;break;case 3:tab_P0[0]=0x66;PWM_ON=8;break;default:break;} }else if(KEY2 == 0){ sum=0;}else if(KEY3==0){ if(PWM_ON==10){tab_P0[0]=temp;PWM_ON=PWM_TEP;}else {temp=tab_P0[0]; tab_P0[0]=0x09;PWM_TEP=PWM_ON;PWM_ON=10;} } }} delay(5000); }}/********************************//* 定时中断 *//********************************/void tim(void) interrupt 1 using 1{static unsigned char count;static unsigned int countsum; //TH0=(65536-1000)/256; TL0=(65536-1000)%256;//定时1mS if (count==PWM_ON){PWM = 1; //电机转动 }count++;if(count == CYCLE){count=0;if(PWM_ON!=0) //如果左右时间是0 保持原来状态 PWM = 0;//电机不转 }if(countsum==1000){countsum=0; sum=sum+(10-PWM_ON)/2;} else countsum++;}void time1(void) interrupt 3 using 3{ unsigned int ge,shi,bai,qian,wan;TH1=(65536-5000)/256; TL1=(65536-5000)%256;ge=sum%10;shi=sum/10%10;bai=sum/100%10;qian=sum/1000%10;wan=sum/10000%10;tab_P0[7]=table[ge];tab_P0[6]=table[shi];tab_P0[5]=table[bai
];tab_P0[4]=table[qian];tab_P0[3]=table[wan]; P0= tab_P0[ii]; // i 值的 个位数P2=tab_P2[jj]; //点亮第一位数码管jj++;ii++;if(jj == 8) //利用 j 值的变化,来控制数码管数值变化间隔的时间{jj = 0;ii = 0;}}