c51寫的測轉(zhuǎn)速源程序
#include
#include
#include
#define ucharunsignedchar
#defineuintunsignedint
#defineulongunsignedlong
sbitkey0=P3^0;//按鍵0
sbitkey1=P3^1;//按鍵1
sbitkey2=P3^3;//按鍵2
sbitkey3=P3^4;//按鍵3
sbitled0=P1^0;//數(shù)碼管0
sbitled1=P1^1;//數(shù)碼管1
sbitled2=P1^2;//數(shù)碼管2
sbitled3=P1^3;//數(shù)碼管3
sbitscl=P1^6;//24c02scl端
sbitsda=P1^5;//24c02scd端
sbitout=P1^7;//輸出端
sbitin=P3^2;//輸入
codeucharascled[12]={
0x3f,0x06,0x5b,0x4f,0x66,//0,1,2,3,4
0x6d,0x7d,0x07,0x7f,0x6f,//5,6,7,8,9
0x71,0x00};//F,''
/*****************函數(shù)列表**********************/
ucharx24c02_read(ucharaddr);//從24c02的地址addr中讀取一個字節(jié)數(shù)據(jù)
voidx24c02_write(ucharaddr,ucharinfo);//向24c02的addr地址中寫入一字節(jié)數(shù)據(jù)info
voidx24c02_init();//24c02初始化子程序
voiddelay(ucharx);//延時子程序ms
voidflash();//24c02延時子程序nop
voidstart();//24c02ic開始
voidstop();//24c02ic停止
voidack();//24c02ic應答
voidnack();//24c02ic不應答
voidwritex(ucharj);//24c02ic寫1byte數(shù)據(jù)
voiddsp();//顯示子程序
voiddelay(uchari);//us延時
voiddelay1(uchari);//us延時
ucharreadx();//24c02ic讀1byte數(shù)據(jù)
/****************全局變量定義*******************/
ucharktemp;
uchardisp[4];
uintcount;//預設報警值
uintzs;//轉(zhuǎn)速值
uinttime0;//
uinttime1;//記時器
bitbegin1;//T1開始啟動標志
ucharltj=1;//高低速
uintjs;//脈沖計數(shù)器
ulongt0;
ulongt1;
bitkey_set;//設置標志
uchardisp_i[4];//顯示閃動標志
uintdisp_c;//閃動顯示計數(shù)器//借用time0
uintdisp_j;//閃動顯示定時//借用time1
bitss=0;//閃動標志
uintbj;//報警輸出信號定時
biten_bj=0;//允許報警標志
bitbjing=0;//報警中
//m:菜單級數(shù)mi:參數(shù)標號bh:檢測保護時間1-10
ucharbh=0;
ucharm=0,mi=0;//借用zs,js
ucharbhtm=0;//保護檢測
//bitcmi=0;//參數(shù)設置改變標志//借用bjing
/**********************************************/
voidint_ex0()interrupt0using0
{
/*外部中斷0*/
delay1(20);
if(key_set==0){///0非設置狀態(tài)
if(in==0){
if(ltj==1)
{
js++;
EA=0;
TR0=0;
TL0=0xaf;//50ms
TH0=0x3c;/*計數(shù)初值重裝*/
if(begin1==0)
{//開始記數(shù)
begin1=1;
js=0;
TR1=0;
TL1=0xaf;//50ms
TH1=0x3c;/*計數(shù)初值重裝*/
TR1=1;/*啟動T1*/
}
/*啟動T0*/
TR0=1;
time0=0;
EA=1;
}
else
{
if(begin1==0)
{
begin1=1;
EA=0;
TR0=0;
zs=0;
/*啟動T0*/
TL0=0xaf;//50ms
TH0=0x3c;/*計數(shù)初值重裝*/
TR0=1;
time0=0;
EA=1;
}
else
{
EA=0;
TR0=0;
begin1=0;
if(time0==0)
{
zs=0;
}
else
{//計算轉(zhuǎn)速
t0=(time0*50000+(TH0*256+TL0)-0x3caf);
if(t0>0){zs=60000000/t0;}
}
if(zs
if(en_bj==1)
{
out=1;
bjing=1;//報警
}
}
disp[3]=(zs%10000)/1000;//顯示轉(zhuǎn)速
disp[2]=(zs%1000)/100;
disp[1]=(zs%100)/10;
disp[0]=zs%10;
TL0=0xaf;//50ms
TH0=0x3c;/*計數(shù)初值重裝*/
TR0=1;
time0=0;
EA=1;
}
}
}
//
}///0
}
voidtimer0(void)interrupt1using0//記時定時中斷
{uchart;
//////
if(key_set==0){///0非設置狀態(tài)
time0++;
TL0=0xaf;//50ms
TH0=0x3c;/*計數(shù)初值重裝*/
TR0=1;
/*啟動T1*/
t=time0%20;
if(t==0){en_bj=0;}
if(time0>1200)//超時
{
time0=0;
disp[3]=0;
disp[2]=0;
disp[1]=0;
disp[0]=0;
zs=0;
if(en_bj==1)
{
out=1;
bjing=1;//報警
}
}
}///0
}
voidtimer1(void)interrupt3using0//1s記時定時中斷
{
/*T1中斷服務程序入口*/
//////
if(key_set==0){///0非設置狀態(tài)
time1++;
if(time1==20)//1s
{EA=0;
TR1=0;
//計算轉(zhuǎn)速
///////////////////
t0=time0*50000+(TH0*256+TL0)-0x3caf;
t1=1000000-t0;
t0=60*js*t0;
zs=60*js+t0/t1;
if(zs>6000){zs=0;}
if(zs
if(en_bj==1)
{
if(bhtm>=bh)
{
out=1;
bjing=1;//報警
}
bhtm++;
}
}
else
{
bhtm=0;
}
if(zs==0)
{///////
///////
disp[3]=0;
disp[2]=0;
disp[1]=0;
disp[0]=0;
}
else
{
disp[3]=zs/1000;//顯示轉(zhuǎn)速
disp[2]=(zs%1000)/100;
disp[1]=(zs%100)/10;
disp[0]=zs%10;
}
begin1=0;
js=0;
time0=0;
time1=0;
en_bj=0;//非保護狀態(tài)
}
//////
TL1=0xaf;//50ms
TH1=0x3c;/*計數(shù)初值重裝*/
TR1=1;/*啟動T1*/
EA=1;
}///0
}
voiddelay(uchari)
{ucharj;
for(j=0;j<=i;j++);
}
voiddelay1(uchari)
{ucharj;
for(j=0;j<=i;j++);
}
voidflash()
{
_nop_();
_nop_();
_nop_();
//_nop_();
//_nop_();
}
voidx24c02_init()
{
scl=1;
flash();
sda=1;
flash();
}
voidstart()
{
sda=1;
flash();
scl=1;
flash();
sda=0;
flash();
scl=0;
flash();
}
voidstop()
{
sda=0;
flash();
scl=1;
flash();
sda=1;
flash();
}
voidack()
{
sda=0;
flash();
scl=1;
flash();
scl=0;
flash();
}
voidnack()
{
sda=1;
flash();
scl=1;
flash();
scl=0;
flash();
}
voidwritex(ucharj)
{
uchari,temp;
temp=j;
for(i=0;i<8;i++){
temp=temp<<1;
scl=0;
flash();
sda=CY;
flash();
scl=1;
flash();
}
scl=0;
flash();
sda=1;
flash();
}
ucharreadx()
{
uchari,j,k=0;
scl=0;
flash();
sda=1;
for(i=0;i<8;i++){
flash();
scl=1;
flash();
if(sda==1)j=1;
elsej=0;
k=(k<<1)│j;
scl=0;
flash();
}
return(k);
}
ucharx24c02_read(ucharaddr)
{
uchari;
start();
writex(0xa0);
ack();
writex(addr);
ack();
start();
writex(0xa1);
ack();
i=readx();
nack();
stop();
delay(10);
return(i);
}
voidx24c02_write(ucharaddr,ucharinfo)
{
//EA=0;//中斷總禁止
start();
writex(0xa0);
ack();
writex(addr);
ack();
writex(info);
ack();
stop();
//EA=1;//中斷開//設置狀態(tài)禁止所有外部中斷
}
voidgetdate(void)
{ucharda5,da4,da3,da2,da1,da0;
x24c02_init();
da0=(x24c02_read(0x00)%10);
da1=(x24c02_read(0x01)%10);
da2=(x24c02_read(0x02)%10);
da3=(x24c02_read(0x03)%10);
da4=(x24c02_read(0x04)%10);
da5=(x24c02_read(0x05)%10);
ltj=(x24c02_read(0x06)%10);
count=da3*1000+da2*100+da1*10+da0;
bh=da5*10+da4;
if(bh>99){bh=0;}
if(count>6000){count=6000;}
if(ltj>1){ltj=1;}
}
voidsavedate(void)
{ucharda5,da4,da3,da2,da1,da0;
da5=bh/10;
da4=bh%10;
da3=count/1000;
da2=(count%1000)/100;
da1=(count%100)/10;
da0=count%10;
dsp();
x24c02_init();
x24c02_write(0x00,da0);
x24c02_write(0x00,da0);
dsp();
x24c02_write(0x01,da1);
x24c02_write(0x01,da1);
dsp();
x24c02_write(0x02,da2);
x24c02_write(0x02,da2);
dsp();
x24c02_write(0x03,da3);
x24c02_write(0x03,da3);
dsp();
x24c02_write(0x04,da4);
x24c02_write(0x04,da4);
dsp();
x24c02_write(0x05,da5);
x24c02_write(0x05,da5);
dsp();
x24c02_write(0x06,ltj);
x24c02_write(0x06,ltj);
dsp();
}
//動態(tài)顯示
voiddsp(void)
{
P2=ascled[disp[0]];led0=0;delay(50);led0=1;//led0=0顯示,=1不顯示
P2=ascled[disp[1]];led1=0;delay(50);led1=1;
P2=ascled[disp[2]];led2=0;delay(50);led2=1;
P2=ascled[disp[3]];led3=0;delay(50);led3=1;
}
//閃爍動態(tài)顯示有效
voiden_dsp(void)
{disp_j=0;
disp_i[0]=0x0;//顯示閃動標志0顯示
disp_i[1]=0x0;
disp_i[2]=0x0;
disp_i[3]=0x0;
}
//閃爍動態(tài)顯示
voiddsp_flash(void)
{
disp_j++;
if(disp_j>240)
{disp_j=0;
disp_i[disp_c]=!(disp_i[disp_c]&0x01);
}
P2=ascled[disp[0]];led0=disp_i[0];delay(50);led0=1;//led0=0顯示,=1不顯示
P2=ascled[disp[1]];led1=disp_i[1];delay(50);led1=1;
P2=ascled[disp[2]];led2=disp_i[2];delay(50);led2=1;
P2=ascled[disp[3]];led3=disp_i[3];delay(50);led3=1;
}
voiddisplay(void)
{
//設定狀態(tài)時如果有鍵按下就不閃爍
if((ss==0)││(ktemp!=0x1b))
{
dsp();
}
else
{
dsp_flash();
}
}
voidkbscan(void)//鍵盤掃描
{uchartemp,i;//0
temp=P3;
ktemp=temp&0x1b;//檢查key0,key1,key2,key300011011
if(ktemp!=0x1b)
{//1
for(i=0;i<250;i++){display();}
temp=P3;
if(ktemp==(temp&ktemp))
{//2
//keyval=ktemp;//記錄鍵值
if(key_set==1)
{//3
switch(ktemp){
case0x1a://key0
{
/////////////////
m++;
if(m>2){m=1;}
switch(m){
case1:////顯示參數(shù)名稱
ss=0;disp_c=0;en_dsp();
switch(mi){
case0:
disp[3]=11;////顯示設定參數(shù)mi=0顯示預設報警值,1顯示保護檢測時間
disp[2]=11;
disp[1]=10;
disp[0]=1;
dsp();
break;
case1:
disp[3]=11;////顯示設定參數(shù)mi=0顯示預設報警值,1顯示保護檢測時間
disp[2]=11;
disp[1]=10;
disp[0]=2;
dsp();
break;
case2:
disp[3]=11;////顯示設定參數(shù)mi=0顯示預設報警值,1顯示保護檢測時間,2顯示高低轉(zhuǎn)速測量
disp[2]=11;
disp[1]=10;
disp[0]=3;
dsp();
break;
}
break;
case2:////顯示參數(shù)
ss=1;en_dsp();
switch(mi){//顯示設定參數(shù)mi=0顯示預設報警值,1顯示保護檢測時間
case0:
disp[3]=count/1000;
disp[2]=(count%1000)/100;
disp[1]=(count%100)/10;
disp[0]=count%10;
for(i=0;i<150;i++){dsp();}
break;
case1:
disp[3]=11;
disp[2]=11;
disp[1]=bh/10;
disp[0]=bh%10;
for(i=0;i<150;i++){dsp();}
break;
case2:
disp[3]=11;
disp[2]=11;
disp[1]=11;
disp[0]=ltj;
for(i=0;i<150;i++){dsp();}
break;
}
break;
}
/////////////////
}
case0x19://key1
{
break;
}
case0x13://key2
{
//閃動位移
if(ss==1)
{
switch(mi){
case0:
en_dsp();////預設轉(zhuǎn)速4位顯示
disp_c++;
if(disp_c>3){disp_c=0;}
break;
case1:
en_dsp();////輸出保護時間2位顯示
disp_c++;
if(disp_c>1){disp_c=0;}
break;
case2:
break;
}
}
if(m==1)
{//保存數(shù)據(jù)退出設置狀態(tài)
savedate();
//借用后恢復
//bjing=0;
m=0;
mi=0;
key_set=0;
ss=0;
en_dsp();
disp[0]=0;
disp[1]=0;
disp[2]=0;
disp[3]=0;
for(i=0;i<150;i++){dsp();}
if(ltj==1)
{
TMOD=0x11;TL0=0xaf;TH0=0x3c;TL1=0xaf;TH1=0x3c;ET0=1;ET1=1;TR0=1;TR1=1;
}
EA=1;//數(shù)據(jù)保存允許中斷
}
break;
}
case0x0b://key3
{
/////////////////
if(m==1)
{disp_c=0;
mi++;if(mi>2){mi=0;}
switch(mi){
case0:
disp[3]=11;////顯示設定參數(shù)mi=0顯示預設報警值,1顯示保護檢測時間
disp[2]=11;
disp[1]=10;
disp[0]=1;
dsp();
break;
case1:
disp[3]=11;////顯示設定參數(shù)mi=0顯示預設報警值,1顯示保護檢測時間
disp[2]=11;
disp[1]=10;
disp[0]=2;
dsp();
break;
case2:
disp[3]=11;////顯示設定參數(shù)mi=0顯示預設報警值,1顯示保護檢測時間
disp[2]=11;
disp[1]=10;
disp[0]=3;
dsp();
break;
}
}
else
{
m=0;
switch(mi){
case0:
disp[disp_c]++;
if(disp[disp_c]>9){disp[disp_c]=0;}
if((disp[3]*1000+disp[2]*100+disp[1]*10+disp[0])>6000)
{//如果超出設定范圍
disp[3]=0;disp[2]=0;disp[1]=0;disp[0]=0;
}
count=disp[3]*1000+disp[2]*100+disp[1]*10+disp[0];
dsp_flash();
break;
case1:
disp[disp_c]++;
if(disp[disp_c]>9){disp[disp_c]=0;}
bh=disp[1]*10+disp[0];
dsp_flash();
break;
case2:
disp[disp_c]++;
if(disp[disp_c]>1){disp[disp_c]=0;}
ltj=disp[0];
dsp_flash();
break;
}
}
break;
}
}
}//3
else
{//4
switch(ktemp){
case0x1a://key0
{
////////////////
//禁止測轉(zhuǎn)速
EA=0;
key_set=1;
en_bj=0;//如果設定狀態(tài)允許報警標志0
out=0;//
/////
//bjing=0;
///disp_c=0;//time0
/////
m=1;
disp[3]=11;////顯示設定參數(shù)mi=0顯示預設報警值,1顯示保護檢測時間
disp[2]=11;
disp[1]=10;
disp[0]=1;
for(i=0;i<150;i++){dsp();}
break;
}
case0x19://key1
{
//允許報警
en_bj=1;
break;
}
}
}//4
}//2
}//1
}//0
main()
{uchari;
out=0;
key_set=0;
disp[0]=0;
disp[1]=0;
disp[2]=0;
disp[3]=0;
for(i=0;i<250;i++)display();
getdate();
en_dsp();
//////
time0=0;time1=0;zs=0;bj=0;js=0;begin1=0;bjing=0;
EA=0;EX0=1;IT0=1;PT1=1;//CPU關(guān)中斷,INT0請求中斷,設定INT0觸發(fā)方式
if(ltj==1)
{
TMOD=0x11;TL0=0xaf;TH0=0x3c;TL1=0xaf;TH1=0x3c;ET0=1;ET1=1;TR0=1;TR1=1;/*50ms,T1T0工作在定時器方式1,T1開中斷,啟動T1*/
}
else
{
TMOD=0x11;TL0=0xaf;TH0=0x3c;ET0=1;TR0=1;
}
EA=1;
//////
begin:
if(bjing==1)
{
bj++;
if(bj>500)
{
bjing=0;out=0;//清除報警
bj=0;bhtm=0;
}
}
else
{
bj=0;
}
display();
kbscan();
gotobegin;
}
評論