找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2849|回复: 1
打印 上一主题 下一主题
收起左侧

单片机超声波测距程序 稳定版

[复制链接]
跳转到指定楼层
楼主
ID:75263 发表于 2015-3-24 23:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这个电脑USB接口害人不浅,供电能力也太弱了,终于找到问题所在了,USB接口供电不足,导致驱动超声波模块的时候电压不稳,芯片程序就容易跑飞,害的我折腾了这么久。这次的程序在上一次的基础上增加了一些东西,例如看门狗。探测的最远距离我设置的是三米,因为在没有考虑温度的情况下,三米内还是比较准确的,当探测距离超过三米时,数码管会显示999.9,好了,程序来了!!
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int

unsigned char code wei[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};  //位码
unsigned char code duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};          //不带小数点 段码
unsigned char code duan1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//带小数点段码
unsigned char display[8];
sbit MOSIO=P2^2;
sbit R_CL=P2^3;
sbit S_CL=P2^4;          
sbit TRIG=P1^0;
sbit ECHO=P1^1;
sfr WDT_CONTR=0xe1;
bit flag;

float s;                                                               
int n;
int m;
int y;
int k=0;
void send595();//数据输入
void out595(void);//数据输出
void fashechaoshengbo();
void jisuan();

void delay();
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int

unsigned char code wei[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};  //位码
unsigned char code duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};          //不带小数点 段码
unsigned char code duan1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//带小数点段码
unsigned char display[8];
sbit MOSIO=P2^2;
sbit R_CL=P2^3;
sbit S_CL=P2^4;          
sbit TRIG=P1^0;
sbit ECHO=P1^1;
sfr WDT_CONTR=0xe1;
bit flag;

float s;                                                               
int n;
int m;
int y;
int k=0;
void send595();//数据输入
void out595(void);//数据输出
void fashechaoshengbo();
void jisuan();

void delay();





void main()
{ WDT_CONTR=0x33;          //看门狗

ECHO=0;
TRIG=0;
TMOD=0x11;         //设置计时器
TH0=0;          //装定时器0初值
TL0=0;
EA=1;          //开总中断
TH1=(65535-5000)/256;
TL1=(65535-5000)%256;
ET0=1;//开定T0中断
TR1=1;        //启动定时器0
ET1=1;          //开T1中断


while(1)
{

while(!ECHO);
TR0=1;
while(ECHO);
TR0=0;
jisuan();
WDT_CONTR=0x33;                 //喂狗

}

}


void send595()           //数据输入
{
unsigned char a,b,c;
if(a==0)
  {a++;
  c=wei[m];
  for(b=0;b<8;b++)
  {       
  MOSIO=c&0x80;          
  c<<=1;
  S_CL=0;
  S_CL=1;}
  }
if(a==1)
   {
   a--;
   if(m==1)
   {c=duan1[display[m]];}

   else {c=duan[display[m]];}
for(b=0;b<8;b++)
  {
    MOSIO=c&0x80;
        c<<=1;
        S_CL=0;
        S_CL=1;}

   }
   m++;
if(m==y)
   m=0;


}
void out595(void)                        //数据输出
{
R_CL=0;
delay();
R_CL=1;
}
          

void fashechaoshengbo()
{
TRIG=1;//发射
delay();
TRIG=0;

}



void jisuan()
{long r;
r=TH0*256+TL0;
TH0=0;
TL0=0;
r=r*1.09;
s=0.017*r;

if(s>400||flag==1)
{
s=999.9;
flag=0;
}
n=s*10;
display[3]=n/1000;
display[2]=(n%1000)/100;
display[1]=((n%1000)%100)/10;
display[0]=((n%1000)%100)%10;
if(s<10)y=2;
if(s>10&&s<100)y=3;
if(s>100&&s<1000)y=4;
}
void T1_time()interrupt 3
{  
TH1=(65535-5000)/256;
TL0=(65535-5000)%256;
send595();
out595();
k++;
if(k==30)             //150ms发射一次
{
k=0;
fashechaoshengbo();
}
}
void T0_time()interrupt 1
{
flag=1;            //T0中断溢出标志位
}


void delay()
{int i;
for(i=0;i<10;i++);
}





分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:75263 发表于 2015-3-24 23:15 | 只看该作者
        超声波测距(不稳定版)
捣鼓了一天多,总算是弄出来了一些东西,别人晒老婆孩子,我晒代码,,是不是有点屌丝啊~~~这次写出来的超声波测距并数码管显示程序还不太稳定,容易乱码,但是短时间内运行还是可以的,50cm以内测距比较准确,不废话了,上代码!!
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char code wei[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};  //位码
unsigned char code duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};         //不带小数点 段码
unsigned char code duan1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//带小数点段码
unsigned char display[4];
sbit MOSIO=P2^2;
sbit R_CL=P2^3;
sbit S_CL=P2^4;          
sbit TRIG=P1^0;
sbit ECHO=P1^1;
bit flag;

long s;       
int n;
int m;
int y;
int k=0;
void send595();//数据输入
void out595(void);//数据输出
void fashechaoshengbo();
void jisuan();

void delay();





void main()
{
//ECHO=0;
TRIG=0;
TMOD=0x11;
TH0=0;         //装定时器1初值
TL0=0;
EA=1;         //开总中断
TH1=(65535-9174)/256;
TL1=(65535-9174)%256;
ET0=1;//开定T0中断
TR1=1;        //启动定时器0
ET1=1;         //开T1中断


while(1)
{



while(!ECHO);
TR0=1;  //启动定时器1
while(ECHO);
TR0=0;
jisuan();



}

}


void send595()          //数据输入
{
unsigned char a,b,c;
if(a==0)
  {a++;
  c=wei[m];
  for(b=0;b<8;b++)
  {       
  MOSIO=c&0x80;         
  c<<=1;
  S_CL=0;
  S_CL=1;}
  }
if(a==1)
   {
   a--;
   if(m==1)
   {c=duan1[display[m]];}

   else {c=duan[display[m]];}
for(b=0;b<8;b++)
  {
    MOSIO=c&0x80;
c<<=1;
S_CL=0;
S_CL=1;}

   }
   m++;
if(m==y)
   m=0;
  
  
}
void out595(void)        //数据输出
{
R_CL=0;
delay();
R_CL=1;
}

void fashechaoshengbo()
{
TRIG=1;        //发送高电平
delay();
TRIG=0;
}


void jisuan()
{ long r;
r=TH0*256+TL0;
TH0=0;
TL0=0;
r=r*1.09;
s=0.017*r;
n=s*10;
if((s>400)||flag==1)
{
s=999.9;
flag=0;
}
display[3]=n/1000;
display[2]=(n%1000)/100;
display[1]=((n%1000)%100)/10;
display[0]=((n%1000)%100)%10;
if(s<10)y=2;
if(s>10&&s<100)y=3;
if(s>100&&s<1000)y=4;
}

void T1_time() interrupt 3
{
TH1=(65535-9174)/256;
TL1=(65535-9174)%256;
k++;
send595();
out595();

if(k==80)
{
fashechaoshengbo();
k=0;
}
}         
void T0_time() interrupt 1
{
flag=1;
}


void delay()
{int i;
for(i=0;i<10;i++);
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表