#include <REG52.h>
#include<stdio.h>
#define uchar unsigned char
#define uint unsigned int
extern char *itoa(int i)
uint code SEG7[16]={0x28,0x7e,0xa2,0x62,0x74,0x61,0x21,0x7a,0x20,0x60,
0x30,0x25,0xa9,0x26,0xa1,0xb1}//坦粗0 1 2 3 4 5 6 7 8 9 A-E
uchar code ACT[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}//数码管显示位置
uchar dis[4]
sbit trig=P1^0
sbit echo=P1^1
void delay(uint k)
{
uint i,j
for(i=0i<ki++)
{
for(j=0j<121j++)
{}
}
}
void display(uint dis)
{
P0=SEG7[dis%10]
P2=ACT[3]
delay(1)
P0=SEG7[(dis/10)%10]
P2=ACT[2]
delay(1)
P0=SEG7[(dis/100)%10]
P2=ACT[1]
delay(1)
P0=SEG7[dis/1000]
P2=ACT[0]
delay(1)
}
void display2(uint Hi,uint Low)
{
P0=SEG7[Hi%10]
P2=ACT[3]
delay(1)
P0=SEG7[(Hi/10)%10]
P2=ACT[2]
delay(1)
P0=SEG7[(Hi/100)%10]
P2=ACT[1]
delay(1)
/* P0=SEG7[Hi/1000]
P2=ACT[0]
delay(1)
*/
//Low
P0=SEG7[Low%10]
P2=ACT[7]
delay(1)
P0=SEG7[(Low/10)%10]
P2=ACT[6]
delay(1)
P0=SEG7[(Low/100)%10]
P2=ACT[5]
delay(1)
/* P0=SEG7[Low/1000]
P2=ACT[4]
delay(1) */
}
void delay10us()
{
uchar i
for(i=11i>闷渗0i--)
}
void init()
{
TMOD=0x21//模式1
TH1=0xf3//4800bps fosc=12M
TL1=0xf3
TR0=0
trig=0
echo=0
TH0=0
TL0=0
TCON=0x00
SCON=0x50//SM0=0 SM1=1 SM2=0 REN=1 TB8=0 R8=0 TI=0 RI=0
PCON=0x80//SMOD=1
TR1=1
ES=1
EA=1
}
uint getDistance()
{
uint i=29412//5m来回需要的时间(us) (5*2/340)*1000000
TR0=0
TH0=0
TL0=0
//接收信号端让罩镇置0
echo=0
//开始触发
trig=1
//延时10微秒
delay10us()
//停止触发
trig=0
//没有信号返回并且在5米障碍物信号返回需要的时间前则等待 (无信号即时返回,防止死循环,阻碍其它程序的执行)
while(!echo&&i>0)
{
i--
}
if(i>0)//小于5米,说明有信号返回
{
TR0=1//开始计时
while(echo)//持续高电平则计时,转为低电平则退出
TR0=0//停止计时
return (uint)((TH0*256+TL0)*0.170)//单位:mm //340000/1000000/2=0.17 mm/us
}
//display2(TH0,TL0)
return 0//大于5米则返回0
}
void SendChar(uchar ch)
{
SBUF=ch
while(!TI)
TI=0
}
void SendCmd(uchar *cmd,uchar sz)
{
uchar i=0
SendChar('$')
for(i=0i<szi++)
{
SendChar(*(cmd+i))
}
SendChar('@')
}
void main()
{
uint distance=0
init()
while(1)
{
//测距
distance=getDistance()
//sprintf(dis,"%4d",distance)
//SendCmd(dis,4)
display(distance)
/* if(TF0)
{
TF0=0
TH0=0
TL0=0
} */
}
}
void serial_serve(void) interrupt 4
{
}
1、HC-SR04使用方法:给触发端子trig一个10us以上的高电平即可触发,触发后echo端子将接受到高电平,高电平的持续时间就是测距的往返时间。
2、例程:
#include<reg52.h>#define uchar unsigned char
#define uint unsigned int
/*位定义*/
sbit CHUFA=P0^1 //位定义超声波触发端(10us以上高电平触发)
sbit JIESHOU=P0^3 //接收端(接受高电平)
sbit BEEP=P2^0 //蜂鸣器
sbit OUT0=P3^2 //外部中断0
uchar JS_FLAG //接收标志
uint CF_TIME,t0,t1,shu
/*函数声明*/
void timer0()
void int0()
void display(uint)
main(){
CHUFA=0 //初始化拉低触发端和接收端电平
JIESHOU=0
JS_FLAG=0
CF_TIME=15 //初始化触发时间(大于10us)
TMOD=0x11 //定时器方式选择
EA=1 //开总中断
ET0=1 //开定时器0中断
EX0=1 陆仔 //开外部中断0
IT0=0 //外部中断选择下降沿触发
//JIESHOU=1
while(1){
OUT0=JIESHOU //外部中断0被赋值为接收端信号,当出现下降沿是触发外部中断0
掘枯 if(JS_FLAG==0){ //如果没有接收到高电平则触发
CHUFA=1
while(CF_TIME--) //10us以上高电平触发传感器
}
if(JIESHOU==1){
TR0=1 //如果接收端收到高电平则启动定时器
JS_FLAG=1 //并且标志位置1
BEEP=0 //蜂鸣器响
}
display(t1) //显示测量时间(秒)
}
}
/*定时器0中断程序*/
void timer0() interrupt 1{
TH0=(65536-10000)/256 //装初值 10ms
TL0=(65536-10000)%256
t0++ //每进入一次中断t0加1
}
/*外部中断0中断程序*/
void int0() interrupt 0{
TR0=0 //一旦早散汪进入外部中断0,说明接收端收到下降沿信号。关闭定时器0
JS_FLAG=0 //接收标志位置0
BEEP=1 //关闭蜂鸣器
t1=t0*10/1000 //测量时间为 进入定时器中断次数t0乘以每次时间10ms,除以1000化为秒为单位
t0=0 //t0清零
}
/*数码管显数函数*/
void display(uint shu){
//数码管显示函数
}
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit DU=P2^6
sbit WE=P2^7
sbit RS=P1^0
sbit RW=P1^1
sbit EN=P2^5
sbit RX=P3^2
sbit TX=P1^5
uint time=0
unsigned long S=0
bit flag=0
uchar disdat[]={0,0,0,0}
void delay(uint xms)
{
uint x,y
for(x=xmsx>巧卖0x--)
for(y=112y>0y--)
}
void write_com(uchar com)
{
RS=0
RW=0
P0=com
delay(5)
EN=1
delay(5)
EN=0
}
void write_dat(uchar dat)
{
RS=1
RW=0
P0=dat
delay(5)
EN=1
delay(5)
EN=0
}
void write_1602(uchar add,uchar dat2)
{
write_com(0x80+0x40+add)
write_dat(dat2)
}
void ZIFU(uchar *ch)
{
首宽携者伏 while(*ch!=0)
{
write_dat(*ch++)
delay(20)
}
}
void init()
{
DU=0
WE=0
EN=0
write_com(0x38)
delay(2)
write_com(0x0f)
write_com(0x06)
write_com(0x80)
write_com(0x01)
ZIFU(" From JM Xiao")
}
void count()
{
time=TH0*256+TL0//计时时间
TH0=0
TL0=0
S=time/58
disdat[0]=S%1000/100
disdat[1]=S%1000%100/10
disdat[2]=S%1000%10%10
write_1602(1,'D')
write_1602(2,'i')
write_1602(3,'s')
write_1602(4,'t')
write_1602(5,'a')
write_1602(6,'n')
write_1602(7,'c')
write_1602(8,'e')
write_1602(9,':')
write_1602(10,disdat[0]+0x30)
write_1602(11,disdat[1]+0x30)
write_1602(12,disdat[2]+0x30)
write_1602(13,'C')
write_1602(14,'M')
}
void start()
{
TX=1
_nop_() _nop_()
_nop_() _nop_()
_nop_() _nop_()
_nop_() _nop_()
_nop_() _nop_()
_nop_() _nop_()
_nop_() _nop_()
_nop_() _nop_()
TX=0
}
void timer0() interrupt 1
{
flag=1
}
void main()
{
delay(400)
init()
TMOD=0x01
TH0=0
TL0=0
EA=1
ET0=1
while(1)
{
start()
while(!RX)
TR0=1
while(RX)
TR0=0
count()
delay(20)
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)