单片机
返回首页

51单片机超声波模块数码管程序编写

2021-02-04 来源:eefocus

超声波原理简单测距准确,应用广泛下面贴一个自己写的数码管程序,显示部分需要改,写的是我使用的是慧净开发板,共阴数码管。

//超声波模块程序


//Trig = P2^0


//Echo = P3^2


#include


#define uchar unsigned char


#define uint unsigned int


unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,


0x6d,0x7d,0x07,0x7f,0x6f}; //0-9的码表


uinttime = 0;


uintTImeH = 0;


uintTImeL = 0;


uint succeed_flag;


sbit dula=P2^0; //段选信号的锁存器控制


sbit wela=P2^1; //位选信号的锁存器控制


sbit Trig = P2^2;


sbit Echo = P3^2;


//


void delay(uint z)


{


uint x,y;


for(x=z;x》0;x--)


for(y=125;y》0;y--);


}


//


void delay_20us()


{


uchar a ;


for(a=0;a《100;a++);


}


//***************************************************************


//显示数据转换程序


void display(uinttemp)


{


uchar qian,ge,shi,bai;


qian = temp/1000;


bai=temp/100%10;


shi=temp%100/10;


ge=temp%10;


wela=1;


//P0=0xf7;


P0 = 0xfe;


wela=0;


dula=1;


P0=table[qian];


dula=0;


delay(5);


wela=1;


//P0=0xf7;


P0 = 0xfd;


wela=0;


dula=1;


P0=table[bai];


dula=0;


delay(5);


dula=1;


P0=0x00; //关位码


dula=0;


wela=1;


//P0=0xef;


P0 = 0xfb;


wela=0;


dula=1;


P0=table[shi];


dula=0;


delay(5);


dula=1;


P0=0x00; //关位码


dula=0;


dula=1;


P0=table[ge];


dula=0;


wela=1;


//P0=0xdf;


P0 = 0xf7;


wela=0;


delay(5);


dula=1;


P0=0x00; //关位码


dula=0;


}


//***************************************************************


void main()


{


uint distance;


uint test =0;


Trig=0; //首先拉低脉冲输入引脚


EA=1; //打开总中断0


TMOD=0x10; //定时器1,16位工作方式


while(1)


{


EA=0; //关总中断


Trig=1; //超声波输入端


delay_20us(); //延时20us


Trig=0; //产生一个20us的脉冲


while(Echo==0); //等待Echo回波引脚变高电平


succeed_flag=0; //清测量成功标志


EA=1;


EX0=1; //打开外部中断0


TH1=0; //定时器1清零


TL1=0; //定时器1清零


TF1=0; //计数溢出标志


TR1=1; //启动定时器1


delay(20); //等待测量的结果


TR1=0; //关闭定时器1


EX0=0; //关闭外部中断0


if(succeed_flag==1)


{


TIme=TImeH*256+timeL;


distance=time*0.172; //厘米


display(distance);


}


if(succeed_flag==0)


{


distance=0; //没有回波则清零


test = !test; //测试灯变化


}


}


}


//***************************************************************


//外部中断0,用做判断回波电平


void exter() interrupt 0 // 外部中断0是0号


{


timeH =TH1; //取出定时器的值


timeL =TL1; //取出定时器的值


succeed_flag=1;//至成功测量的标志


EX0=0; //关闭外部中断


}


//****************************************************************


//定时器1中断,用做超声波测距计时


void timer1() interrupt 3 //


{


TH1=0;


TL1=0;


}


进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 光控音效发生器电路

  • 基于IC555的可变PWM振荡器电路

  • 如何使用LED驱动器LM3915制作振动计

  • 一个简单的立体声平衡指示器电路

  • 电谐波图形均衡器示意图

  • 一种构建12V和230V双直流电源的简单方法

    相关电子头条文章