欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3414|回復: 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++);
}





回復

使用道具 舉報

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 單片機教程網

快速回復 返回頂部 返回列表