51单片机学习篇

您所在的位置:网站首页 hcsr04中文资料 51单片机学习篇

51单片机学习篇

2024-07-15 03:01| 来源: 网络整理| 查看: 265

开篇先说一句废话···· 本旺名字叫萨摩耶,,Please 叫我旺财,,,哈哈,招财进宝嘛!

开篇

本单片机购买的时候带的超声波模块是HC-SR04,根据好多材料都说用这个的原因是便宜,,,不过没关系,刚开始学不在乎,重在学习原理,为了以后的开发增加经验。

超声波模块

**超声波长啥样?**同样,直接上图 在这里插入图片描述 在这里插入图片描述它有4个接口,VCC,Trig,Echo,GND。VCC和GND用来供电,Trig用来发送一个高电平,Echo用来等待接收Trig发送的高电平。 超声波咋用? 因为它有四个引脚,首先就是要与单片机连接,我这边是VCC和GND正常连接外,Trig连接P2 ^1,Echo连接P2 ^0;连接好就是要开始调试程序。 阅读数据手册,发现引脚说明外还有时序图。直接上图 在这里插入图片描述除了时序图外,还要注意的就是,因为计算距离S=时间 * 高电平时间 /2,需要记录高电平时间,首先就是定时器0,但是因为要不断测距,不能只发一次,而是要按频率不断的发送信号,来采集时间,所以还要用到一个定时器1来启动超声波模块。

步骤:

1.初始化两个定时器

//定时器初始化 void TimeInit(){ TMOD=0x11; TH0=0; TL0=0; TH1=0xf8; //2ms TL1=0x30; EA=1; ET1=1; ET0=1; TR1=1; TR0=0; }

2.定时器0的中断处理,定时器0的作用用来计高电平的时间,所以注意定时器0的溢出,如果溢出要重新归零。

void Time0() interrupt 1{ flag=1; }

3.定时器1的中断处理,定时器1的功能就是按一定频率启动超声波和显示数码管,

void Time1() interrupt 3{ TH1=0xf8; TL1=0x30; Showsmg(); tt++; if(tt>=100){ tt=0; Trig=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); Trig=0; } }

4.时间统计出来就要计算距离了,距离有之前的公式,要注意就是如果距离太远或者时间太长导致定时器0溢出,要让数码管提示错误

//计算函数 void count(){ time=TH0*256+TL0; TH0=0; TL0=0; dist=(long)(time*0.17); if((dist>=4000) || (flag==1)){ flag=0; DisPlay[0]=0x40; DisPlay[1]=0x40; DisPlay[2]=0x40; DisPlay[3]=0x40; } else{ DisPlay[0]=smgduan[dist/1000]; DisPlay[1]=smgduan[dist%1000/100] |0x80; //显示小数点 DisPlay[2]=smgduan[dist%100/10]; DisPlay[3]=smgduan[dist%10]; } }

5.发现还缺Echo引脚接受数据(主函数)

void main(){ TimeInit(); while(1){ while(!Echo); TR0=1; while(Echo); TR0=0; count(); } } 超声波测距–数码管显示(完整代码) #include "reg52.h" #include "intrins.h" #define u8 unsigned char #define u16 unsigned int unsigned long dist; u16 time; u16 tt,flag; u8 DisPlay[6]; u8 smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; sbit LSA=P2^2; sbit LSB=P2^3; sbit LSC=P2^4; sbit Trig=P2^1; sbit Echo=P2^0; void Delay(u16 z) //11.0592MHz 1ms { u8 i,j; for(i=z;i>0;i--) for(j=110;j>0;j--); } //数码管显示 void Showsmg(){ u8 i; for(i=0;i=4000) || (flag==1)){ flag=0; DisPlay[0]=0x40; DisPlay[1]=0x40; DisPlay[2]=0x40; DisPlay[3]=0x40; } else{ DisPlay[0]=smgduan[dist/1000]; DisPlay[1]=smgduan[dist%1000/100] |0x80; DisPlay[2]=smgduan[dist%100/10]; DisPlay[3]=smgduan[dist%10]; } } //定时器初始化 void TimeInit(){ TMOD=0x11; TH0=0; TL0=0; TH1=0xf8; //2ms TL1=0x30; EA=1; ET1=1; ET0=1; TR1=1; TR0=0; } void Time0() interrupt 1{ flag=1; } void Time1() interrupt 3{ TH1=0xf8; TL1=0x30; Showsmg(); tt++; if(tt>=100){ tt=0; Trig=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); Trig=0; } } void main(){ TimeInit(); while(1){ while(!Echo); TR0=1; while(Echo); TR0=0; count(); } }


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3