亿加合和智能车制作

标题: 51超声波测距 [打印本页]

作者: 自己人    时间: 2010-4-1 16:50
标题: 51超声波测距
#include <REG2051.H>
#define k1 P3_4
#define csbout    P3_5    //超声波发送
#define csbint    P3_7    //超声波接收
#define bg  P3_3
#define LED P1
#define LED1 P3_0 //LED控制
#define LED2 P3_1 //LED控制
#define LED3 P3_2 //LED控制
#define csbc=0.0347
unsigned char cl,mqzd,csbs,csbds,buffer[3],xm1,xm2,xm0,jpjs;//显示标识
unsigned char convert[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//0~9段码
unsigned int s,t,i,xx,j,sj1,sj2,sj3,mqs,sx1;
   
void csbcj();
void delay(j);     //延时函数
void scanLED();     //显示函数
void timeToBuffer();   //显示转换函数
void keyscan();
void k1cl();
void k2cl();
void k3cl();
void k4cl();
void offmsd();
void main()     //主函数
{
EA=1;        //开中断
   TMOD=0x11;     //设定时器0为计数,设定时器1定时
ET0=1;      //定时器0中断允许
ET1=1;      //定时器1中断允许
TH0=0x00;
TL0=0x00;
TH1=0x9E;
TL1=0x57;
csbds=0;
csbout=1;
cl=0;
csbs=8;
jpjs=0;
sj1=50;
sj2=200;
sj3=580;
k4cl();
TR1=1;     //设定时值1为20ms
while(1)
   {
  keyscan();
  if(jpjs<1)
  {
   csbcj();  //调用超声波测距程序
   if(s>sj3)  //大于时显示“CCC”
   {
    buffer[2]=0xC6;
    buffer[1]=0xC6;
    buffer[0]=0xC6;
   }
   else if(s<sj1) //小于时显示“- - -”
   {
    buffer[2]=0xBF;
    buffer[1]=0xBF;
    buffer[0]=0xBF;
   }
   else timeToBuffer();
  }
  else timeToBuffer();  //将值转换成LED段码
  offmsd();
    scanLED();   //显示函数
  if(s<sj2)
  bg=0;
  bg=1;
}
}
void scanLED()        //显示功能模块
{
  LED=buffer[0];
LED3=0;
delay(200);
LED3=1;
LED=buffer[1];
LED2=0;
delay(200);
LED2=1;

LED=buffer[2];
LED1=0;
delay(200);
LED1=1;
}
void timeToBuffer()      //转换段码功能模块
{
xm0=s/100;
xm1=(s-100*xm0)/10;
xm2=s-100*xm0-10*xm1;
buffer[2]=convert[xm2];
buffer[1]=convert[xm1];
buffer[0]=convert[xm0];
}
void delay(i)     
{
    while(--i);
}
void timer1int (void)  interrupt 3  using 2
{
TH1=0x9E;
TL1=0x57;
csbds++;
if(csbds>=40)
{
  csbds=0;
  cl=1;
}  
}
void csbcj()
{
if(cl==1)
{
     TR1=0;
  TH0=0x00;
  TL0=0x00;
  i=csbs;
  while(i--)
  {
   csbout=!csbout;
  }
  TR0=1;   
     i=mqs;     //盲区
  while(i--)
  {
  }
  i=0;
  while(csbint)
  {
   i++;
   if(i>=4000)   //上限值
   csbint=0;
  }
  TR0=0;
  TH1=0x9E;
  TL1=0x57;
  t=TH0;
  t=t*256+TL0;
  t=t-29;  
  s=t*csbc/2;
  TR1=1;
  cl=0;
  csbint=1;
  if(s<sj1)
  {
   if(csbs>6)
   {
    csbs=csbs-2;
    sj1=40;
   }
   sj1=sj1+2;
   k4cl();
  }
  else if(s>=sj3)
  {
   if(csbs<32)
   {
    csbs=csbs+2;
    sj1=sj1+10;
    k4cl();
   }
  }
}
}
void keyscan()    //健盘处理函数
{
xx=0;
if(k1!=1)     // 判断开关是否按下
{
  delay(100);    //延时去抖动
  if(k1!=1)     // 判断开关是否按下
  {  
   while(!k1)
   {
    delay(25);
    xx++;
   }
   if(xx>1000)  
   {
    jpjs++;
    if(jpjs>3)
    {
     k4cl();
     jpjs=0;
    }
   }
   xx=0;
   switch(jpjs)
   {
    case 1: k1cl();break;  
    case 2: k2cl();break;
    case 3: k3cl();break;
   }
  }
}
}
void k1cl()
{
sj1=sj1+1;
if(sj1>100)
sj1=50;
s=sj1;
}
void k2cl()
{
sj2=sj2+5;
if(sj2>500)
sj2=40;
s=sj2;
}
void k3cl()
{
sj3=sj3+10;
if(sj3>600)
sj3=600;
s=sj3;
}
void k4cl()
{
sx1=sj1-1;
sx1=sx1/csbc;
mqs=sx1/4.5;
}
void offmsd()           //小时数十位为0判断模块
{
    if (buffer[0] == 0xC0)        //如果值为零时小数十位不显示
    buffer[0] = 0xFF;
}
作者: machuan20082006    时间: 2010-12-27 10:37
看看
作者: 无与仑比    时间: 2011-1-9 20:16
嗯  嗯 嗯 不错不错!!!顶一下!!!!
作者: gagoo    时间: 2011-2-7 16:01
你去年做电子设计的程序??
作者: 春芽ing    时间: 2011-3-20 09:40
看看……………………………………………………
作者: lijng23    时间: 2012-8-3 10:56

作者: 774960834    时间: 2012-8-31 20:49
mark
作者: nxw_xw2008    时间: 2012-10-14 10:44
仔细看看
作者: 1434636181    时间: 2012-11-26 14:54
#include <REG2051.H>

大哥,有没有STC51单片机的程序啊???
作者: yfkling    时间: 2012-12-3 11:17
顶下
作者: binniri    时间: 2013-11-24 15:06
大哥,可不可以附加一个原理图?
作者: 涛子    时间: 2013-12-19 00:30

作者: haiking    时间: 2013-12-24 15:25
mark一下
作者: IGer    时间: 2013-12-30 23:07
有点复杂哇!超声波测距用到这么多知识?!
作者: IGer    时间: 2013-12-30 23:08
#include<reg52.h>
#define  uchar unsigned char
#define  uint unsigned int
uchar code table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uint count=0;
uchar i=0;
uint distant=0;
uint x;
//******************************************
//超声波接口的初始化设定
sbit TRIG=P1^0;//触发控制信号输出端口
sbit ECHO=P3^2;//回响信号接收端口
//******************************************
//定时器0的初始化
void time0_int(void)
{
        TMOD=0x00;//工作方式0
        TH0=0xff;//高八位赋值,使之延时为1us
        TL0=0x1f;//低八位赋值
        ET0=1;//T0开中断
        EA=1;//开总中断
        TR0=1;//启动定时器
}
//******************************************
//外部中断初始化
void outside_int(void)
{
        EA=1;//开总中断
        EX0=1;//开外部中断0
        IT0=0;//低电平触发方式
}
//******************************************
//定时器0中断程序
void time0() interrupt 1
{
        TH0=0xff;//高八位赋值
        TL0=0x1f;//低八位赋值
        count++;
}

//******************************************
//延时函数
void delay(x)
{
        time0_int();
        if(count==x)
                         return;
}
//******************************************
//主函数
void main(void)
{
time0_int();
ECHO=0;
outside_int();//外部中断0初始化
while(1)
{
P2=0xfe;
        while(ECHO)//计算高电平持续时间,以ms为单位
        {
                time0_int();//定时器0初始化
                if(count==1000)//当定时器自加1000us时,给i增加1ms
                {
                        count=0;
                        i++;
                }
                distant=340*i/1000;//距离的计算公式
                P0=table[i%10];
        }
}
}
//******************************************
//外部中断0程序
void outside_intrrupt() interrupt 0 using 1
{
        TRIG=0;
        TRIG=1;//触发信号置位,使模块内部发射8个40khz脉冲
        delay(15);//根据时序图延时20us
        TRIG=0;
        //while(1);//等待回响电平为高电平
        if(ECHO==1) return;
}
作者: 竹音清影    时间: 2014-3-16 16:47
跟淘宝卖的程序是一样的。

作者: 小邵    时间: 2014-3-30 09:06
顶一下
作者: yarnn    时间: 2014-8-9 12:20
作个记号,下次再仔细看看




欢迎光临 亿加合和智能车制作 (http://dns.znczz.com/) Powered by Discuz! X3.2