标题: 超声模的测距程序,参数自调,亲测可用。 [打印本页]

作者: 西服牛仔    时间: 2019-4-5 09:53
标题: 超声模的测距程序,参数自调,亲测可用。
            
#include <STC15F2K60S2.H>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char

sbit reseve=P1^0; //数据传回
sbit trade=P1^1; //使能信号
sbit RS=P3^5;        //数据、命令选择
sbit RW=P3^6;        //读、写选择
sbit EN =P3^7;        //使能信号
uint time=0;
unsigned int distance=0;
uchar SS;
uint ge,shi,bai,a,b;

void display();
void JISUAN();
void delay(unsigned int x);

void delay(unsigned int x)           
  {
   uchar j,k,l;
   for(j=0;j<x;j++)
    {
          for(k=0;k<60;k++)
          for(l=0;l<11;l++);
        }
  }

void check()   //液晶屏查忙
        {
           RS=0;
           RW=1;
           EN=1;
           SS=P0;  //液晶屏数据传输用的是P0口
           EN=0;
           RW=0;
           RS=1;
        }
void write_com(uchar com)  //向液晶屏写入命令
        {
           check();
           RS=0;
           RW=0;
           EN=1;
           P0=com;
           delay(5);
           EN=0;
           RW=1;
        }
void write_data(uchar dat)        //向液晶屏写入数据
        {
           check();
           RS=1;
           RW=0;
           EN=1;
           P0=dat;
           delay(5);
           EN=0;
           RW=1;
        }
void init()                   //液晶屏的初始化
{
   RS=0;
   write_com(0x38);delay(5); //不检测查忙信号
   write_com(0x38);delay(5);
   write_com(0x38);delay(5);
   write_com(0x38);delay(5);
   write_com(0x08);delay(5);//显示关闭
   write_com(0x01);delay(5);//显示清屏
   write_com(0x06);delay(5);//显示光标移动
   write_com(0x0c);delay(5);//显示光标设置
}

void vioce_inin()          //T0定时器初始化
  {  
    TMOD|=0x01;                //16位计时   
        TH0=0;
        TL0=0;         
        ET0=1;          //T0中断打开                             
        EA=1;                        //总中断打开
  }          
void voice_data()
         {
             trade=1;        //触发测距,给至少 10us 的高电平信号                              
             delay(50);
             trade=0;
                 while(!reseve);//高电平持续的时间就是超声波从发射到返回的时间               
                 TR0=1;                            
                 while(reseve);
                 TR0=0;                       
             time = TH0;
             time <<= 8;
             time |= TL0;         //  计算时间
                 TH0=0;
             TL0=0;  
             distance = (unsigned int)(time*0.017)*1.15; //计算距离
             if((distance>=900)||(TF0==1))         //如果超出距离就显示999
             {         
                  TF0=0;
                  ge=9;
                  shi=9;
                  bai=9;
             }               
          else                                         //否则按实际距离显示
          {
                 bai=distance/100;
                 shi=distance/10%10;
                 ge=distance%10;
          }               
         }
void display()                         //在液晶屏上显示
{
     write_com(0x83);delay(5);
     write_data(0x30+bai);delay(5);
     write_data(0x30+shi);delay(5);
     write_data(0x30+ge);delay(5);
         write_data(0x43);delay(5);
         write_data(0x4d);delay(5);          
}
void main()
{
   init();           //液晶屏的初始化
   vioce_inin(); //T0定时器初始化
   while(1)
    {
           voice_data();   //测距
           display();          //显示
        }

}                 


作者: 西服牛仔    时间: 2019-4-5 09:54
需要的可自提




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1