|
1)通過超聲波傳感器采集距離數(shù)據(jù),距離值保留整數(shù)。
2)通過數(shù)碼管顯示距離顯示界面和參數(shù)顯示界面,界面可以通過按鍵進(jìn)行切換。
3)通過按鍵設(shè)置與調(diào)整距離參數(shù)。
4)通過串口向PC端發(fā)送當(dāng)前距離數(shù)據(jù)。
5)通過LED指示燈進(jìn)行報警功能。
3.2 數(shù)碼管顯示
1)距離顯示界面
圖2 距離顯示界面(155cm)
2)參數(shù)顯示界面
圖3 參數(shù)顯示界面(155cm)
3.3 按鍵功能
1)按鍵S4定義為“切換”按鍵,按下S4按鍵,能夠切換“距離顯示界面”、“參數(shù)顯示界面”。
圖4 按鍵S4‘切換’
2)按鍵S8定義為“參數(shù)”按鍵,在“距離顯示界面”時,按下S8按鍵,可將當(dāng)前距離數(shù)據(jù)設(shè)置為距離參數(shù)。
3)按鍵S12定義為“加”按鍵,在“參數(shù)顯示界面”時,按下S12按鍵,當(dāng)前距離參數(shù)加10cm。
圖5 按鍵S12‘加’
4)按鍵S16定義為“減”按鍵,在“距離參數(shù)界面”時,按下S16按鍵,當(dāng)前距離參數(shù)減10cm,參數(shù)值減到0為止。
圖6 按鍵S16‘減’
5)按鍵S9定義為“發(fā)送”按鍵,每次按下,串口將當(dāng)前檢測的距離數(shù)據(jù)發(fā)送給PC端的串口調(diào)試工具。
注意:
(1)按鍵S12和按鍵S16僅在“距離參數(shù)界面”時有效
(2)按鍵S8僅在“距離顯示界面”時有效,當(dāng)按鍵S8按下后,參數(shù)顯示界面參數(shù)值隨之變化,但不會發(fā)生界面跳轉(zhuǎn)。
(3)判斷按鍵是否按下時,需進(jìn)行消抖操作,避免單次按鍵操作,觸發(fā)多次結(jié)果。
3.4 串口功能
串口發(fā)送格式
注意:
(1)D為大寫字母,其余均為小寫字母。
(2)距離數(shù)據(jù)保留整數(shù)。
3.5 LED指示燈功能
1)當(dāng)前界面處于距離顯示界面時,L1指示燈點亮,否則熄滅。
2)當(dāng)前界面處于參數(shù)顯示界面時,L2指示燈點亮,否則熄滅。
3)當(dāng)實時距離超過距離參數(shù)時,L3指示燈以0.2s的時間間隔亮、滅,否則熄滅。
4)指示燈L4-L8處于常熄滅狀態(tài)。
3.6 初始化
1)上電數(shù)碼管處于距離顯示界面。
2)距離參數(shù)值為30cm。
單片機(jī)源程序如下:
#include"reg52.h"
#include"intrins.h"
sfr AUXR=0x8e;
sfr P4=0xc0;
sbit TX=P1^0;
sbit RX=P1^1;
sbit R1=P3^0;
sbit R2=P3^1;
sbit R3=P3^2;
sbit R4=P3^3;
sbit C1=P3^4;
sbit C2=P3^5;
sbit C3=P4^2;
sbit C4=P4^4;
unsigned char code SMG[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff,0xc1};
unsigned int time;
unsigned char set_temp=30;
unsigned char disp_mode=0,dis_nu,commend,now_temp;
void Delay12us() //@11.0592MHz
{
unsigned char i;
_nop_();
_nop_();
_nop_();
i = 30;
while(--i);
}
void select573(unsigned char n)
{
switch(n)
{
case 4:P2=(P2&0x1f)|0x80;break;
case 5:P2=(P2&0x1f)|0xa0;break;
case 6:P2=(P2&0x1f)|0xc0;break;
case 7:P2=(P2&0x1f)|0xe0;break;
case 0:P2=(P2&0x1f)|0x00;break;
}
}
void disply_SMG(unsigned char pos,value)
{
select573(6);
P0=0x01<<pos;
select573(6);
P0=value;
}
void init_buzz()
{
select573(4);
P0=0xff;
select573(5);
P0=0x00;
select573(0);
}
void init()
{
TMOD = 0x02;
TH0=0xfd;
TL0=0xfd;
TR0=1;
SCON = 0x50;
ES=1;
EA=1;
AUXR=0x00;
}
void revice() interrupt 4
{
if(RI == 1)
{
commend = SBUF;
RI=0;
}
}
void sendbyte(unsigned char date)
{
SBUF = date;
while(TI == 0);
TI = 0;
}
void sendstring(unsigned char *str)
{
while(*str != '\0')
{
sendbyte(*str++);
}
}
void wave_send()
{
unsigned i;
for(i=0;i<8;i++)
{
TX=1;
Delay12us();
TX=0;
Delay12us();
}
}
unsigned char wave_co()
{
TMOD&=0x0f;
TH1=TL1=0;
wave_send();
TR1=1;
while((RX==1)&&(TF1==0));
TR1=0;
if(TF1==0)
{
time=TH1<<8|TL1;
return(time*0.017);
}
else
TF1=0;
return 0;
}
void wave() interrupt 3
{
now_temp=wave_co();
}
void scankey()
{
unsigned char i;
for(i=0;i<4;i++)
{
switch(i)
{
case 0:R1=0;R2=R3=R4=1;
if(C1==0)
dis_nu=0;
else if(C2==0)
dis_nu=1;
else if(C3==0)
dis_nu=2;
else if(C4==0)
dis_nu=3;
break;
case 1:R2=0;R1=R3=R4=1;
if(C1==0)
dis_nu=4;
else if(C2==0)
dis_nu=5;
else if(C3==0)
dis_nu=6;
else if(C4==0)
dis_nu=7;
break;
case 2:R3=0;R2=R1=R4=1;
if(C1==0)
dis_nu=8;
else if(C2==0)
{
sendstring("Distance:\n\r");
sendbyte(time);
}
else if(C3==0)
dis_nu=9;
else if(C4==0)
dis_nu=0;
break;
case 3:R4=0;R2=R3=R1=1;
if(C1==0)
{
disp_mode=~disp_mode;
}
else if(C2==0)
{
set_temp=now_temp;
}
else if(C3==0)
{
set_temp=(set_temp+10);
}
else if(C4==0)
{
set_temp=(set_temp-10);
if(set_temp<0)
set_temp=0;
}
break;
}
}
if(i>4)i=0;
}
void Delay500us() //@11.0592MHz
{
unsigned char i, j;
_nop_();
_nop_();
i = 60;
j = 934;
do
{
while (--j);
} while (--i);
}
void show_SMG()
{
if(disp_mode==0)
{
disply_SMG(0,SMG[12]);
Delay500us();
disply_SMG(1,SMG[1]);
Delay500us();
disply_SMG(2,SMG[11]);
Delay500us();
disply_SMG(3,SMG[11]);
Delay500us();
disply_SMG(4,SMG[11]);
Delay500us();
disply_SMG(5,SMG[now_temp/100]);
Delay500us();
disply_SMG(6,SMG[now_temp%100/100]);
Delay500us();
disply_SMG(7,SMG[now_temp%10]);
Delay500us();
}
if(disp_mode==1)
{
disply_SMG(0,SMG[12]);
Delay500us();
disply_SMG(1,SMG[2]);
Delay500us();
disply_SMG(2,SMG[11]);
Delay500us();
disply_SMG(3,SMG[11]);
Delay500us();
disply_SMG(4,SMG[11]);
Delay500us();
disply_SMG(5,SMG[set_temp/100]);
Delay500us();
disply_SMG(6,SMG[set_temp%100/100]);
Delay500us();
disply_SMG(7,SMG[set_temp%10]);
Delay500us();
}
}
void main()
{
init_buzz();
wave_co();
init();
while(1)
{
scankey();
show_SMG();
}
}
|
|