/* 開關的作用:P02 -----計價器啟動開關 (K3=0 跑馬 ;K3=1 計價器清0)
P03 -----汽車啟動計價開關 (K4=0 計價器開實時計價;K4=1顯示總價和總時間)
P04 -----清0鍵 (K5=0 回到跑馬;K5=1 全部清0 )
程序的功能:車子在啟動前顯示P型跑馬,汽車啟動后顯示價格0,按下開關K4開始實
時計價,前兩位顯示時間,后四位顯示價格;2秒以內按3元計價,以后
每增加2秒,價格增加0.7,當超過6秒時,按每增加1秒價格增加1元,以
“元”作為計價單位,以小數點隔開元和角。按下中斷鍵時示顯故障提示
“STOP"且響鈴,再次按中斷鍵時,故障排除,恢復程序正常的工作。
*/
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit P02=P0^2; //啟動開關
sbit P03=P0^3; //顯示最終價格
sbit P04=P0^4;
sbit P32=P3^2;
sbit P37=P3^7; //清零開關
uchar code
table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //0~9不帶小數點
uchar codetable2[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//0~9
帶小數點
void delay(uint z);
uchar a,fen,miao,shu; //定義時間參數
uchar a=0;
unsigned char temp;
int m,i; //m表示價錢
uint temp1,temp2;
timer1() interrupt 0 //外部中斷,顯示STOP
{
P37=0;
{
P1=0x01;
P2=0x6d;
delay(5);
P1=0x02;
P2=0x31;
delay(5);
P1=0x04;
P2=0x3f;
delay(5);
P1=0x08;
P2=0x73;
delay(5);
P37=~P37; //響鈴
}
}
void main() //主程序
{uchar k;uint i;
TMOD=0x01;
TH0=(65536-50000)/256; //定時50MS
TL0=(65536-50000)%256;
EA=1; //開中斷總控開關
IT0=0; //INT0零電平觸發
EX0=1; //開INT0中斷
TR0=1; //T0開始計時
ET0=1; //開T0中斷
while(1)
ag: { TR0=0;
if(P02==0) //啟動跑馬開關,開始跑馬
{ P1=0x01;
P2=0x73;
for(k=0;k<6;k++)
{
for(i=0;i<20000;i++);
P1<<=1; //跑馬程序
}
}
if(P02==1) //車子啟動,全部歸零,準備計時計價
{
P2=0x3f;
P1=0xff;
delay(2);
P1=0x00;
delay(2);
} //設置T0定時器
/*if(P02==0) //啟動跑馬開關
{ P1=0x01;
P2=0x73;
for(k=0;k<6;k++)
{
for(i=0;i<20000;i++);
P1<<=1; //跑馬程序
}
}
if(P02==1)
{
P1=0xff;
P2=0x3f;
delay(2);
P1=0x00;
delay(2);
} */
if(P03==1) //啟動計時計價
{TR0=1;
temp1=shu;temp2=m;
P1=0x01;
P2=table[shu/10];
delay(2);//延時5毫秒
P1=0x00;
delay(2); //顯示時間
P1=0x02;
P2=table[shu%10];
delay(2);//延時5毫秒
P1=0x00;
delay(2); //顯示時間
P1=0x04;
P2=0X3f;
delay(2);
P1=0x00;
delay(2); //顯示價格(百位)
if(0<shu<=2)
m=30;
else if(shu==3)
m=30;
if(shu==4)
m=37;
if(shu==5)
m=37;
if(shu==6)
m=44;
if(shu>6)
m=10*shu-16; //價格計算程序
P2=table[m/100];
P1=0x08;
//P2=table[m/100];
delay(2);
P1=0x00;
delay(2); //顯示價格(十位)
P2=table2[(m%100)/10];
P1=0x10;
//P2=table2[(m%100)/10];
delay(2);
P1=0x00;
delay(2); //顯示價格(個位)
P2=table[m%10];
P1=0x20;
//P2=table[m%10];
delay(2);
P1=0x00;
delay(2); //顯示價格(角位)
if(P04==1)
{
m=0;shu=0;temp1=0;temp2=0;
P1=0xff;
P2=0x3f; //清零程序
}
while(P03==0) // 顯示最終價格和時間
{
P2=table[temp1/10];
P1=0x01;
//P2=table[temp1/10];
delay(1);
P1=0x00;
delay(1);
P2=table[temp1%10];
P1=0x02;
//P2=table[temp1%10];
delay(1);
P1=0x00;
delay(1);
P1=0x04;
P2=0X3f;
delay(1);
P1=0x00;
delay(1);
P2=table[temp2/100];
P1=0x08;
//P2=table[temp2/100];
delay(1);
P1=0x00;
delay(1);
P2=table2[(temp2%100)/10];
P1=0x10;
//P2=table2[(temp2%100)/10];
delay(1);
P1=0x00;
delay(1);
P2=table[temp2%10];
P1=0x20;
//P2=table[temp2%10];
delay(1);
P1=0x00;
delay(1);
if(P04==1)
{
/*m=0;shu=0;temp1=0;temp2=0; */
P1=0xff;
P2=0x3f;
for(i=0;i<2000;i++);
goto ag; //清零時,所有開關全零
}
}
}
/*if(P04==1)
{ for(i=0;i<200;i++);
m=0;shu=0;temp1=0;temp2=0;
P1=0xff;
P2=0x3f;
goto ag;
} */
}
}
void timer0() interrupt1 //設置定時器初值
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256; //0.05s溢出
a++;
if(a==20)
{
a=0;
shu++;
if(shu==99)
shu=0;
}
}
void delay(uint z) //延遲函數
{
uint x,y;
for(x=z;x>0;x--)
for(y=80;y>0;y--);
}
|