用51单片机实现HC-SR04超声波测距程序.docxVIP

用51单片机实现HC-SR04超声波测距程序.docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
精品 精品 #include reg52.h //包括一个 52 标准内核的头文件 #define uchar unsigned char // 定义一下方便使用 #define uint unsigned int #define ulong unsigned long sbit Trig = P1A0; // sbit Echo =卩3人2; // sbit test = P1A1; // 产生脉冲引脚 回波引脚 测试用引脚 uchar SEG7[10]={~0xC0,~0xF9,~0xA4,~0xB0,~0x99,~0x92,~0x82,~0xF8,~0x80,~0x90};// 0-9 uint distance[4]; // 测距接收缓冲区 uchar ge,shi,bai,temp,flag,outcomeH,outcomeL,i; // 自定义寄存器 bit succeed_flag; // 测量成功标志 //******** 函数声明 void conversion(uint temp_data); void delay_20us(); code 数码管 void main(void) // 主程序 { uint distance_data,a,b; uchar CONT_1; i=0; flag=0; Trig=0; // 首先拉低脉冲输入引脚 TMOD=0x11; // 定时器 0,定时器 1,16位工作 TR0=1; // 启动定时器 0 IT0=0; // 由高电平变低电平,触发外部中断 ET0=1; // 打开定时器 0 中断 EX0=0; // 关闭外部中断 EA=1; // 打开总中断 0 test =0; 程序循环 // while(1) { EA=0; Trig=1; delay_20us(); Trig=0; // 产生一个 20us 的脉冲,在 Trig 引脚 while(Echo==0); // 等待 Echo 回波引脚变高电平 succeed_flag=0; // 清测量成功标志 EX0=1; // 打开外部中断 TH1=0; // 定时器 1 清零 TL1=0; // 定时器 1 清零 TF1=0; // TR1=1; // 启动定时器 1 EA=1; while(TH1 30);// TR1=0; // EX0=0; // 等待测量的结果,周期 65.535 毫秒(可用中断实现) 关闭定时器 1 关闭外部中断 if(succeed_flag==1) { distance_data=outcomeH*256+outcomeL; distance_data= (distance_data*1.87)/100; } // 秒*344 ) /2 // X 秒=0.0058*Y 米==》厘米=微秒/58 if(succeed_flag==0) { distance_data=0; // test = !test; // 为什么除以58等于厘米, Y米=(X 秒 =( 2*Y 米) /344 == 》 X 没有回波则清零 测试灯变化 ****************************************** 每循环 3 次就显示结果一次 ******************************************* a=distance_data; if(b==a) CONT_1=0; if(b!=a) CONT_1++; if(CONT_1=3) { CONT_1=0; b=a; conversion(b); } } } //*************************************************************** // 外部中断 0,用做判断回波电平 INTO_() interrupt 0 // { outcomeH =TH1; // outcomeL =TL1; // succeed_flag=1; // EX0=0; // 外部中断是 0 号 取出定时器的值 取出定时器的值 至成功测量的标志 关闭外部中断 } //**************************************************************** // 定时器 0中断, 用做显示 timer0() interrupt 1 // 定时器 0 中断是 1 号 { TH0=0xfd; // 写入定时器 0 初始值 TL0=0x77; switch(flag) {case 0x00:P0=ge; P2=0xfe;flag++;break; case 0x01:P0=shi;P2=0xfd;flag++;break; case 0x02:P0=ba

文档评论(0)

dingfulaowang + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档