超声波测距按键设置警报距离

超声波测距模块加上矩阵按键,矩阵按键移植上周期计算器内容,对矩阵键盘进行操作

for(i=0;i<4;i++)

  {   
P1=key[i]; 
temp=P1;  
temp=temp<<4|0x0f; 
for(j=0;j<4;j++) 
{    
if(key1[j]==temp)  
{    

number=i*4+j;//对按键扫扫描结果进行记录

...........

如上操作可以对矩阵键盘进行较为简洁的扫描。

程序运行理念:

超神波不断测距 并进行数据的显示(lcd),在不断显示的同时,进行按键扫描。在此过程中增加了多个传值变量如下程序:

void doing()
{
   
  res=measure();//
 res0=res;/有两个值获得超神波测距结果 res   res0     res0 用于报警判断   res 用于测距显示
do{  
    k++;
   res1=res1/10;
 }while(res1);


                          keysure();//
  warn=b;/使用变量warn 储存按键积累数值 并保存下来用于警报判断

if(l-k>0)
{  
k=0;
l=0;
wcmd(0x01,0);
w=4;
flagx=0;
wcmd(0x04,1);//
wcmd(0xcf,1);
do
{
wdat(0x30+warn1%10);//warn1=warn1/10;
delay_50us(100);
}while(warn1);
}
   else{
    k=0;
l=0; 
             }
 
if(res!=0)
{
wcmd(0x04,1);//
wcmd(0x8f,1);
do
{
wdat(0x30+res%10);//
l++;
res=res/10;
delay_50us(100);
}while(res);
}

if(res0>warn)//警报判断
{
do {
beep=~beep;
delay_20us(20);
flag++;
if(flag>300)
{
flag=0;
warn=0;
}
}while(warn);

}

程序封装 :

利用函数定义与函数调用 对程序中使用到的函数进行封装   主函数封装如下:

 void main()//主函数
 {   
init1();//lcd初始化
   while(1)
{
doing();//函数调用
   }
 }
 体会:

程序完成过程中,需要使用较多变量和标志位,在使用时,采用显示用后定义,有时还需要清零 分清内部联系与变量运行所在的函数。

例程:(功能:超神波测距,按键设置警报距离)

/********************************************************
***********¾ØÕó°´¼üÍê³É»ù±¾¼ÆËãÆ÷¹¦ÄÜͬʱ¼æÓб¨´í¹¦ÄÜ****
********************************************************/
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char 
#define uint unsigned int
#define ulong unsigned long
#define BF 0x80 //ÓÃÓÚ¼ì²âæÐźÅ


sbit rs=P2^6;// 1602
sbit rw=P2^5;// ʹÄÜ
sbit e=P2^7;//  ¿ØÖƶË
sbit Tr=P3^4;   //³ö·¢¿ØÖÆÐźÅÊäÈë
sbit Ec=P3^5;   //»ØÏìÐźÅÊä³ö
bit TimeUp=0;   //¶¨Ê±Æ÷¿ªÊ¼¼Æʱ±ê־λ
sbit beep=P1^5;//·äÃùÆ÷
int w=4;//lcdͨ¹ý±äÁ¿ÒÆλ
uint flagx=0;//¾àÀëλÊý±ä»¯
int warn1=0;
int k=0,l=0;// l µ±Ç°²âÁ¿¾àÀëµÄλÊý k ÉÏÒ»²âÁ¿¾àÀëµÄλÊý
uint flags=0;
uint flag=0;
int res1=0;//²âÁ¿½á¹û
uint res;//²âÁ¿½á¹û
uint res0=0;//½á¹ûÖмä±äÁ¿ 
uint warn=0;//°²È«¾àÀëÖмä±äÁ¿
uchar code tab1[]={'c',0,'=','+',1,2,3,'-',4,5,6,'*',7,8,9,'/'};//°´¼ü¶ÔÓ¦µÄ¼üÖµ  ֻʹÓÃÊý×Öλ
ulong b=0;//´¢´æ¼üÖµ±äÁ¿ 
uchar number;//°´¼ü±êºÅ
uchar code key[]={0xef,0xdf,0xbf,0x7f};//ÐÐɨÃè°´¼ü
uchar code key1[]={0x7f,0xbf,0xdf,0xef};//ÁÐɨÃè°´¼ü
long th0,tl0; //´¢´æ¶¨Ê±Æ÷µÄÖµ
ulong timer0=0; //´ú±í¶¨Ê±Æ÷¶¨Ê±½á¹û
uint Mersureresult=0;//²âÁ¿Ê®½øÖÆÊý±äÁ¿


void delay_50us(uchar t)           //ÑÓʱº¯Êý
{
   uint i;
for(t;t>0;t--)
for(i=1;i<6245;i--);
}


void delay_20us(uchar i)  //¶ÌÔÝÑÓʱº¯Êý 
{
  while(i--);
}


void delay(uint z) //ÑÓʱº¯Êý

uint x,y; 
for(x=z;x>0;x--)  
for(y=115;y>0;y--); 



uchar busy()  //æ¼ì²âº¯Êý

rs=0;
rw=1; 
e=1;  
delay(1) ; 
while(P0&BF);  //¼ì²âÊý¾Ýλ×î¸ßλµÄÊÇ·ñΪ0(ÔÊÐíдÈë)
e=0; 
return P0; 



void wdat(uchar dat) //дÊý¾Ýº¯Êý
{  
P0=dat; 
busy(); 
rs=1; 
rw=0; 
delay(5);
e=1; 
delay(5); 
e=0;



void wcmd(uchar cmd,uchar BFC) //дÃüÁÊý(²¿·ÖÃüÁî²»ÐèÒª¼ì²â±ê־λ)ÈçÇåÆÁÃüÁî
{
P0=cmd; 
if(BFC)
busy();                                                                                                                                                                       
rs=0; 
rw=0;
delay(5); 
e=1;  
delay(5);
e=0; 
}


void init1() //³õʼ»¯º¯Êý 
{  
  e=0;  
wcmd(0x38,0);//2*16 ÏÔʾ 5*7 ÏÔʾ 8λÊý¾Ý
wcmd(0x38,0); 
wcmd(0x38,0); 
wcmd(0x38,1);  
wcmd(0x01,1); //ÇåÆÁ
wcmd(0x06,1); //µØÖ·×Ô¶¯¼ÓÒ»
wcmd(0x0c,1); //¿ªÏÔʾÆÁ ÎÞ¹â±ê 
  wcmd(0x01,1); //ÇåÆÁ



int measure()   //¶¨Òå²âÁ¿º¯Êý
{
   uchar Rxback=1;   //³¬Éù²¨·µ»Ø±ê־λ
TMOD=0X01;   //´ò¿ª¶¨Ê±Æ÷¿ª¹Ø
Tr=0;       //³¬Éù²¨Âö³åÒý½ÅÀ­µÍ
th0=0;     //³õʼ»¯ 
tl0=0;
TimeUp=0;   
EA=1;     //´ò¿ªÖжÏ×Ü¿ª¹Ø
ET0=1;    //´ò¿ª¼ÆʱÆ÷¿ª¹Ø

TR0=0;   //´ò¿ªÖжϿª¹Ø
TH0=0;
TL0=0;
Tr=1;    //³¬Éù²¨Âö³åÒý½ÅÀ­¸ß
delay_20us(100);
Tr=0;    //³¬Éù²¨Âö³åÒý½ÅÀ­µÍ²úÉúÂö³å
while(Ec==0);//µÈ´ý»Ø²¨Öøߵçƽ1
     TH0=0;
TL0=0;
TR0=1;
  while(Rxback) //ʹÓÃÈí¼þ²éѯ·½Ê½£¬¼ì²â³¬Éù²¨»Ø²¦Òý½Å£¬ÅжÏÊÇ·ñÓÐÉù²¨·µ»Ø
{
        if(Ec==0||TimeUp==1)
{
TR0=0;
  th0=TH0;
  tl0=TL0;
  TR0=1;
  Rxback=0;
     }
}
while(!TimeUp);  //µÈ´ý¶¨Ê±Æ÷Òç³ö
timer0=(th0*256+tl0);  //È¡³ö¶¨Ê±Æ÷Öµ
Mersureresult=((unsigned long)(340)*timer0)/2000;  //²âÁ¿½á¹ûµ¥Î»mm
if(Mersureresult<20||Mersureresult>4000)
{
      Mersureresult=0;
 }
        return Mersureresult;
}


void ankey() //È¡°´¼üÊäÈëÖµnumber

uchar i,j,temp;
for(i=0;i<4;i++)
  {   
P1=key[i]; 
temp=P1;  
temp=temp<<4|0x0f; 
for(j=0;j<4;j++) 
{    
if(key1[j]==temp)  
{    
number=i*4+j;
switch(number)
{     
case 0:{wcmd(0x01,1);b=0;w=4;} break; //Çå³ý°´¼ü
case 4://1     Êýֵλ
case 5://2
case 6://3
case 8://4  
case 9://5 
case 10://6   
case 12://7  
case 13://8
case 14://9
  case 1: //0
b=b*10+tab1[number]; //µÚ¶þ¸öÊýÖµµÃת»»
wcmd(0xcb+w,0);
w--;
wdat(0x30+tab1[number]);//0x30¶ÔÓ¦ACIIÂëΪ0  number¿ÉÄÜΪ 0 1 4  5 6  8 9 10 12 13 14 
break;  
default:break;   
}  
    }  
while((key[i]!=P1)&&(key1[j]!=P1))
P1=key[i]; 
              P1=key1[j];
              delay(3);
    }
   }  
}


void keysure()//ÑÓʱÏû¶¶

P1=0x0f;
if((P1&0x0f)!=0x0f)
{  
delay(10); 
if((P1&0x0f)!=0x0f) 
ankey(); //È¡°´¼üÊäÈëÖµnumber
}



void doing()
{
   
res=measure();//¾àÀë»ñÖµ
//   res1=res;
  res0=res;//½á¹û´æÖµ
do{  
    k++;
res1=res1/10;
}while(res1);


        keysure();//ÑÓʱÏû¶¶ °²È«¾àÀë»ñÖµ
//      warn1=b;
  warn=b;//°²È«¾àÀë´æÖµ

if(l-k>0)
{  
k=0;
l=0;
wcmd(0x01,0);
w=4;
flagx=0;
wcmd(0x04,1);//Ö¸Õë¼õÒ»
wcmd(0xcf,1);
do
{
wdat(0x30+warn1%10);//¾àÀëÏÔʾ
warn1=warn1/10;
delay_50us(100);
}while(warn1);
}
   else{
    k=0;
l=0; 
             }
 
if(res!=0)
{
wcmd(0x04,1);//Ö¸Õë¼õÒ»
wcmd(0x8f,1);
do
{
wdat(0x30+res%10);//¾àÀëÏÔʾ
l++;
res=res/10;
delay_50us(100);
}while(res);
}

if(res0>warn)//¾¯±¨ÅжÏ
{
do {
beep=~beep;
delay_20us(20);
flag++;
if(flag>300)
{
flag=0;
warn=0;
}
}while(warn);

}

 void main()//Ö÷º¯Êý
 {   


init1();//LED³õʼ»¯
   while(1)
{
doing();
   }
 }
 
void inter0() interrupt 1
 {   
  TimeUp=1;
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值