×
单片机 > 单片机程序设计 > 详情

基于51单片机超声波测距防近视台灯程序

发布时间:2023-08-24 发布时间:
|

程序代码

仿真图

单片机源程序如下:

#include

#include


/*********************宏定义************************/

#define uchar unsigned char

#define uint unsigned int


/************位定义*****************************/

sbit Trig=P3^7; //超声波模块触发位

sbit LEDRED=P1^0;

sbit LEDGREEN=P1^2;

sbit speaker=P1^7;

sbit person=P1^6;

sbit TLED= P1^5;

/************全局变量声明***********************/

uint H,T; //定义全局变量,H--距离,T--时间


/***********共阴数码管段码表********************/

uchar a_code[]={ //共阴数码管编码0~9

0x3f,0x06,0x5b,0x4f,0x66,

0x6d,0x7d,0x07,0x7f,0x6f,

/*0x77,0x7c,0x39,0x5e,0x79,

0x71*/};


/***************延时函数************************/

void delay(uint z) //*1ms延时函数

{

uint x,y;

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

for(y=110;y>0;y--);

}


/*************超声波模块启动函数**************/

void start()

{

Trig=1; //拉高触发信号,启动超声波模块发射超声波

_nop_(); //延时10us

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

Trig=0; //拉低触发信号

}



/*****************数码管显示函数*****************/

void display(unsigned int a,unsigned int b,unsigned int c,unsigned int d)

{

P2=0xfe;

P0=a_code[a];

delay(5);

P2=0xfd;

P0=a_code[b];

delay(5);

P2=0xfb;

P0=a_code[c];

delay(5);

P2=0xf7;

P0=a_code[d];

delay(5);


}



/*****************主函数*************************/

void main()

{

Trig=0;

LEDRED=1;

LEDGREEN=1;

speaker=0;

EA=1;

TMOD=0x19;//定时器0工作模式:

/*GATE=1(由外部中断0引脚及TR0共同启动定时器0)

C/T=0(定时模式)

M1M0=01(16位定时)*/

TH1=64580/256;

TL1=65480%256;

ET1=1;

TR0=1; //启动定时器0

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

IT0=1; //外部中断0设置为下降沿触发方式

while(1)

{

start(); //调用超声波模块启动函数

display(H/1000,H%1000/100,H%1000%100/10,H%10); //调用数码管显示函数

if(person==1)

{

TLED=1;

if(H<=25)

{

LEDRED=0;

LEDGREEN=1;

TR1=1;

}

else

{

LEDRED=1;

LEDGREEN=0;

TR1=0;

}

}

else

{

TLED=0;

LEDRED=1;

LEDGREEN=1;

TR1=0;

}

}

}


/***************外部中断0函数************************

回响输出端高电平宽度测量(上升沿到来时启动定时器0开始计时,

下降沿到来进入外部中断,关闭定时器0,停止计时,计算距离

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

void int0() interrupt 0

{

TR0=0; //关闭定时器0

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

T=(TH0*256+TL0);//计算超声波传输时间,CPU采用12M时钟,则计算的单位为us

TH0=0; //定时器清0

TL0=0;

H=T*0.017; //计算距离,单位cm(注意:不能用H=(T*17)/1000,这样变成取整了)

H=H+2;

TR0=1; //开启定时器0

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

}

void time1() interrupt 3

{

TR1=0;

TH1=65480/256;

TL1=65480%256;

speaker=~speaker;

TR1=1;

}



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
8051单片机的函数发生器的设计