Snipaste_2021-05-18_15-40-04.png (77.4 KB, 下載次數: 70)
下載附件
2021-5-18 15:43 上傳
部分程序如下:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uint count,m,n;
unsigned long RPM;
long shangxian=10000;
long xiaxian=5000;
bit flag;
uchar code tab1[]={"H:00000 L:00000"}; //一行顯示的固定字符
uchar code tab2[]={" RV: r/min "}; //轉速顯示的固定字符
void delay(uint x)
{
uint i,j;
for(i=0;i<x;i++)
for(j=0;j<110;j++);
}
void init()
{
IT0=1; //INT0負跳變觸發
TMOD=0x01;//定時器工作于方式1
TH0=0xfc; //1ms
TL0=0x18;
EA=1; //CPU開中斷總允許
ET0=1;//開定時中斷
EX0=1;//開外部INTO中斷
TR0=1;//啟動定時
}
/********液晶寫入指令函數與寫入數據函數,以后可調用**************/
void write_1602com(uchar com)//****液晶寫入指令函數****
{
rs=0;//數據/指令選擇置為指令
P0=com;//送入數據
delay(1);
en=1;//拉高使能端,為制造有效的下降沿做準備
delay(1);
en=0;//en由高變低,產生下降沿,液晶執行命令
}
void write_1602dat(uchar dat)//***液晶寫入數據函數****
{
rs=1;//數據/指令選擇置為數據
P0=dat;//送入數據
delay(1);
en=1; //en置高電平,為制造下降沿做準備
delay(1);
en=0; //en由高變低,產生下降沿,液晶執行命令
}
void lcd_init()//***液晶初始化函數****
{
uchar a;
write_1602com(0x38);//設置液晶工作模式,意思:16*2行顯示,5*7點陣,8位數據
write_1602com(0x0c);//開顯示不顯示光標
write_1602com(0x06);//整屏不移動,光標自動右移
write_1602com(0x01);//清顯示
write_1602com(0x80);//顯示固定符號從第一行第1個位置之后開始顯示
for(a=0;a<16;a++)
{
write_1602dat(tab1[a]);//向液晶屏寫固定符號部分
}
write_1602com(0x80+0x40);//顯示固定符號寫入位置,從第2個位置后開始顯示
for(a=0;a<16;a++)
{
write_1602dat(tab2[a]);//寫顯示固定符號
}
}
void display()
{
uchar gw,sw,bw,qw,ww;
if(RPM<=99999) //范圍內時
{
ww=RPM/10000;
qw=RPM%10000/1000;
bw=RPM%1000/100;//取得百位
sw=RPM%100/10;//取得十位數字
gw=RPM%10;//取得個位數字
write_1602com(0x80+0x40+5);
if(ww==0)
write_1602dat(' ');
else
write_1602dat(0x30+ww);
if((ww+qw)==0)
write_1602dat(' ');
else
write_1602dat(0x30+qw);
if((ww+qw+bw)==0)
write_1602dat(' ');
else
write_1602dat(0x30+bw);
if((ww+qw+bw+sw)==0)
write_1602dat(' ');
else
write_1602dat(0x30+sw);
write_1602dat(0x30+gw);//數字+30得到該數字的LCD1602顯示碼
}
else //超過范圍時顯示-----
{
write_1602com(0x80+0x40+5);
write_1602dat('-');
write_1602dat('-');
write_1602dat('-');
write_1602dat('-');
write_1602dat('-');
}
}
void display_shangxian()
{
write_1602com(0x80+2);
if(shangxian/10000==0)
write_1602dat(' ');
else
write_1602dat(0x30+shangxian/10000);
if((shangxian/1000)==0)
write_1602dat(' ');
else
write_1602dat(0x30+shangxian%10000/1000);
if((shangxian/100)==0)
write_1602dat(' ');
else
write_1602dat(0x30+shangxian%10000%1000/100);
if((shangxian/10)==0)
write_1602dat(' ');
else
write_1602dat(0x30+shangxian%10000%1000%100/10);
write_1602dat(0x30+shangxian%10000%1000%100%10);//數字+30得到該數字的LCD1602顯示碼
write_1602com(0x80+11);
if(xiaxian/10000==0)
write_1602dat(' ');
else
write_1602dat(0x30+xiaxian/10000);
if((xiaxian/1000)==0)
write_1602dat(' ');
else
write_1602dat(0x30+xiaxian%10000/1000);
if((xiaxian/100)==0)
write_1602dat(' ');
else
write_1602dat(0x30+xiaxian%10000%1000/100);
if((xiaxian/10)==0)
write_1602dat(' ');
else
write_1602dat(0x30+xiaxian%10000%1000%100/10);
write_1602dat(0x30+xiaxian%10000%1000%100%10);//數字+30得到該數字的LCD1602顯示碼
}
void key()
{
uint key_press_num;
uchar p;
if(add_H==0)
{
delay(20);
if(add_H==0)
{
while(!add_H)
{
key_press_num++;
if(key_press_num>=20)
{
key_press_num=0;
while(!add_H)
{
shangxian=shangxian+10;
if(shangxian>20000)
shangxian=0;
// for(p=0;p<20;p++)
display_shangxian();
}
}
display();
delay(10);
}
if(key_press_num!=0)
{
key_press_num=0;
shangxian++;
if(shangxian>20000)
shangxian=0;
}
}
}
if(dec_H==0)
{
delay(20);
if(dec_H==0)
{
while(!dec_H)
{
key_press_num++;
if(key_press_num>=20)
{
key_press_num=0;
while(!dec_H)
{
shangxian=shangxian-10;
if(shangxian<=xiaxian+10)
shangxian=xiaxian+10;
// for(p=0;p<20;p++)
display_shangxian();
}
}
display();
delay(10);
}
if(key_press_num!=0)
{
key_press_num=0;
shangxian--;
if(shangxian<=xiaxian+10)
shangxian=xiaxian+10;
}
}
}
if(add_L==0)
{
delay(20);
if(add_L==0)
{
while(!add_L)
{
key_press_num++;
if(key_press_num>=20)
{
key_press_num=0;
while(!add_L)
{
xiaxian=xiaxian+10;
if(xiaxian>=shangxian-10)
xiaxian=shangxian-10;
// for(p=0;p<20;p++)
display_shangxian();
}
}
display();
delay(10);
}
if(key_press_num!=0)
{
key_press_num=0;
xiaxian++;
if(xiaxian>=shangxian-10)
xiaxian=shangxian-10;
}
}
}
if(dec_L==0)
{
delay(20);
if(dec_L==0)
{
while(!dec_L)
{
key_press_num++;
if(key_press_num>=20)
{
key_press_num=0;
while(!dec_L)
{
xiaxian=xiaxian-10;
if(xiaxian<=0)
xiaxian=0;
// for(p=0;p<20;p++)
display_shangxian();
}
}
display();
delay(10);
}
if(key_press_num!=0)
{
key_press_num=0;
xiaxian--;
if(xiaxian<=0)
xiaxian=0;
}
}
}
}
void alarm()
{
if(RPM>0)
{
if(RPM>=shangxian||RPM<=xiaxian)
BUZZ=0;
else
BUZZ=1;
if(RPM>=shangxian)
{
LED_H=0;
LED_L=1;
}
else if(RPM<=xiaxian)
{
LED_H=1;
LED_L=0;
}
else
{
LED_H=LED_L=1;
}
}
else
{
LED_H=LED_L=BUZZ=1;
}
}
void main()
{
init();
lcd_init();
while(1)
{
display();
display_shangxian();
key();
alarm();
}
}
void EXINT0() interrupt 0
{
count++;
flag=1;
n=0;
if(count>=10)
{
RPM=600000/m; //60*1000*10 RPM=個數*60*1000/m m單位為ms 所以乘以1000
m=0;
count=0;
}
}
void time0() interrupt 1
{
TH0=0xfc;
TL0=0x18; //1ms
if(flag==1)
{
n++; m++;
if(n==6000)
{
RPM=(60000*count)/m;
m=0;
n=0;
count=0;
flag=0;
}
}
if(flag==0&&count==0)
{
n++;
if(n==3000)
{
RPM=0;
n=0;
}
}
}
|