51单片机学习篇 |
您所在的位置:网站首页 › hcsr04中文资料 › 51单片机学习篇 |
开篇先说一句废话···· 本旺名字叫萨摩耶,,Please 叫我旺财,,,哈哈,招财进宝嘛! 开篇本单片机购买的时候带的超声波模块是HC-SR04,根据好多材料都说用这个的原因是便宜,,,不过没关系,刚开始学不在乎,重在学习原理,为了以后的开发增加经验。 超声波模块**超声波长啥样?**同样,直接上图 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 |