51单片机超声波测距 1602液晶屏显示 按键设置报警

180it 2022-04-08 PM 617℃ 0条

代码不错,值得学习借鉴

#include <reg52.h>
#include <intrins.H>
#include "LCD1602.H"

#define uint   unsigned int
#define uchar  unsigned char

sbit KEY1=P2^4;
sbit KEY2=P2^5;
sbit KEY3=P2^6;
sbit BEEP=P1^0;

sbit Trig=P3^3;
sbit Echo=P3^2;

float distance;
uint R_distance;
uint time;
uint SetH;
uint SetL;
uint temp_DATA[5];
uchar flag_yichu;

code uchar tab_A[]={'0','1','2','3','4','5','6','7','8','9',' ',};

unsigned char  Dist_data[4]={' ',' ',' ',};

unsigned char SetHL[]={'L',':',' ',' ',' ','C','M',' ',' ','H',':',' ',' ',' ','C','M',};

/********************************************************/
void Conut(void)
{
        time=TH0*256+TL0;
        TH0=0;
        TL0=0;
        distance=time*0.017;     //算出来是CM
        R_distance=distance;
}
/***********************启动超声波*********************************/
void  StartModule()                          //
{
        Trig=1;          //超声波触发端每次触发高电平持续时间大于10us                         
        _nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
        Trig=0;
}
/*定时器0中断子程序*/
void tm0_isr() interrupt 1 using 1
{
        flag_yichu=1;
}


void SetH_count(void)
{
        BEEP=0;
        if(SetH>=100)
        {
                SetHL[11]=tab_A[SetH/100];
                SetHL[12]=tab_A[(SetH/10)%10];
                SetHL[13]=tab_A[SetH%10];
        }
        else if((SetH>=10)&&(SetH<100))
        {
                SetHL[11]=tab_A[10];
                SetHL[12]=tab_A[(SetH/10)%10];
                SetHL[13]=tab_A[SetH%10];       
        }
        else if(SetH<10)
        {
                SetHL[11]=tab_A[10];
                SetHL[12]=tab_A[10];
                SetHL[13]=tab_A[SetH%10];       
        }

        LCD1602_PutStr(0,1,SetHL);
        halMcuWaitUs(2000);
        BEEP=1;       
}
void SetL_count(void)
{

        BEEP=0;
        if(SetL>=100)
        {
                SetHL[2]=tab_A[SetL/100];
                SetHL[3]=tab_A[(SetL/10)%10];
                SetHL[4]=tab_A[SetL%10];
        }
        else if((SetL>=10)&&(SetL<100))
        {
                SetHL[2]=tab_A[10];
                SetHL[3]=tab_A[(SetL/10)%10];
                SetHL[4]=tab_A[SetL%10];       
        }
        else if(SetL<10)
        {
                SetHL[2]=tab_A[10];
                SetHL[3]=tab_A[10];
                SetHL[4]=tab_A[SetL%10];       
        }

        LCD1602_PutStr(0,1,SetHL);
        halMcuWaitUs(2000);
        BEEP=1;
}
void Dist_data_count(void)
{
        if(R_distance>=100)
        {
                Dist_data[0]=tab_A[(R_distance/100)%10];
                Dist_data[1]=tab_A[(R_distance/10)%10];
                Dist_data[2]=tab_A[R_distance%10];
        }
        else if((R_distance>=10)&&(R_distance<100))
        {
                Dist_data[0]=tab_A[10];
                Dist_data[1]=tab_A[(R_distance/10)%10];
                Dist_data[2]=tab_A[R_distance%10];       
        }
        else if(R_distance<10)
        {
                Dist_data[0]=tab_A[10];
                Dist_data[1]=tab_A[10];
                Dist_data[2]=tab_A[R_distance%10];       
        }

    LCD1602_PutStr(8,0,Dist_data);
        halMcuWaitUs(2000);
}
void main(void)
{

        uint i,k;
        uchar flag;
       
        flag=1;
        SetH=200;
        SetL=10;
        BEEP=0;
        //while(1);
    halMcuWaitUs(5000);
        BEEP=1;

        P1=0Xff;
        P2=0Xff;

    TMOD = 0x01;            //定时器0设置为16为手动赋值模式
    TL0 = 0;                //初始化定时器0初值低八位
    TH0 = 0;                //初始化定时器0高八位
    TR0 = 0;                //关闭定时器0
    ET0 = 1;                //允许定时器0产生中断
    EA = 1;                 //开启全局中断
    //count = 0;            //初始化计数器

        LCD1602_Init();   //初始化LCD1602   

    LCD1602_PutStr(0,0,"  Dista:   CM   ");
    LCD1602_PutStr(0,1,"L:       H:     ");

    halMcuWaitUs(1000);


        SetL_count();
        SetH_count();

        while(1)
        {               

                        StartModule();
                        while(!Echo);                //当Echo为零时等待
                        TR0=1;                            //开启计时
                        while(Echo);                //当Echo为高电平计数并等待
                        TR0=0;                                //关闭计时
                        Conut();                        //计算距离
                    halMcuWaitUs(50);                
                                       
                        Dist_data_count();
                                                            

                        for(k=0;k<20;k++)
                        {
                                if(distance>SetH)
                                {
                                        BEEP=0;
                                }
                                else if(distance<SetL)
                                {
                                    BEEP=0;
                                }
                                else
                                {
                                        BEEP=1;
                                }
                               
                                if(KEY1==0)
                                {
                                        halMcuWaitUs(50);
                                        if(KEY1==0)
                                        {
                                                flag=~flag;
                                                BEEP=0;
                                                halMcuWaitUs(2000);
                                                BEEP=1;
                                        }       
                                        while(KEY1==0);
                                }
                               
                                if(flag>10)
                                {
                                        if(KEY2==0)
                                        {
                                                halMcuWaitUs(50);
                                                if(KEY2==0)
                                                {
                                                        if(SetH<900)  SetH++;
                                                        else         SetH=900;
                                                        SetH_count();
                                                }       
                                                i=0;
                                                do
                                                {       
                                                        i++;
                                                    halMcuWaitUs(2000);
                                                        if(i>50)
                                                    {       
                                                                if(SetH<900)  SetH++;
                                                                else         SetH=900;
                                                                SetH_count();
                                                        }
                                                }
                                                while(KEY2==0);
                                                while(KEY2==0);
                                        }
                                        else if(KEY3==0)
                                         {
                                                halMcuWaitUs(50);
                                                if(KEY3==0)
                                                {
                                                        if(SetH>0)   SetH--;
                                                        else         SetH=0 ;
                                                        SetH_count();
                                                }
                                                i=0;
                                                do
                                                {       
                                                        i++;
                                                    halMcuWaitUs(2000);
                                                        if(i>50)
                                                    {       
                                                                if(SetH>0)   SetH--;
                                                                else         SetH=0 ;
                                                                SetH_count();
                                                        }
                                                }
                                                while(KEY3==0);                                                       
                                                while(KEY3==0);
                                        }
                                }
                                else
                                {
                                        if(KEY2==0)
                                        {
                                                halMcuWaitUs(50);
                                                if(KEY2==0)
                                                {
                                                        if(SetL<900)  SetL++;
                                                        else         SetL=900;
                                                        SetL_count();
                                                }
                                               
                                                 i=0;
                                                do
                                                {       
                                                        i++;
                                                    halMcuWaitUs(2000);
                                                        if(i>50)
                                                    {       
                                                                i=51;
                                                                if(SetL<900)  SetL++;
                                                                else         SetL=900;
                                                                SetL_count();
                                                        }
                                                }
                                                while(KEY2==0);       
                                                while(KEY2==0);
                                        }
                                        else if(KEY3==0)
                                         {
                                                halMcuWaitUs(50);
                                                if(KEY3==0)
                                                {
                                                        if(SetL>0)   SetL--;
                                                        else         SetL=0 ;
                                                        SetL_count();
                                                }

                                                 i=0;
                                                do
                                                {       
                                                        i++;
                                                    halMcuWaitUs(2000);
                                                        if(i>50)
                                                    {       
                                                                i=51;
                                                                if(SetL>0)   SetL--;
                                                                else         SetL=0 ;
                                                                BEEP=0;
                                                                SetL_count();
                                                        }
                                                }
                                                while(KEY3==0);                                                               
                                                while(KEY3==0);
                                        }                               
                                }          
                        }                                                           
        }
}

来源:http://dayatubbs.com/thread-13938-1-1.html

支付宝打赏支付宝打赏 微信打赏微信打赏

如果文章或资源对您有帮助,欢迎打赏作者。一路走来,感谢有您!

标签: none

51单片机超声波测距 1602液晶屏显示 按键设置报警