找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1313|回复: 1
打印 上一主题 下一主题
收起左侧

STC12C5a32s2单片机超声波模块HY-SRF05程序,数码管 注释详细显示

[复制链接]
跳转到指定楼层
楼主
ID:699637 发表于 2020-3-11 13:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. /**************************************************************
  2. 功能:超声波模块HY-SRF05,数码管显示
  3. 说明:
  4. 硬件:stc12c5a32s2,晶振12MHz
  5.          4组共阳数码管
  6.          HY-SRF05超声波模块
  7. **************************************************************/
  8. #include<stc12c5a60s2.h>

  9. #define uchar unsigned char
  10. #define uint  unsigned int

  11. #define Num P2                                 //P2口接数码管其余脚
  12. #define Seg_Place P3                 //P3口高位来控制哪个管显示数字

  13. sbit Trig = P0^0;                         //超声波模块触发
  14. sbit Echo = P0^1;                         //超声波模块回响

  15. //点亮第几位数码管
  16. uint code Seg[]={0x10,0x20,0x40,0x80};

  17. //数码管0~9数字
  18. uint code Table[]={
  19. 0x03,0x9f,0x25,0x0d,0x99,
  20. 0x49,0x41,0x1f,0x01,0x09};

  21. void Timer0Init(void)               
  22. {
  23.         TMOD = 0x01;                //设置定时器模式
  24.         TH0 = 0;
  25.         TL0 = 0;
  26. }


  27. /***********************************************
  28. 函数作用:  延时
  29. 说明:          时间不精确,i=1为1毫秒
  30. *************************************************/

  31. void Delay_Ms(uint i)
  32. {
  33.         uint j;
  34.         for(i;i>0;i--)
  35.         {
  36.             for(j=0;j<1002;j++);  
  37.         }  
  38. }

  39. /***********************************************
  40. 函数作用:  数码管显示的数字
  41. 说明:         
  42. *************************************************/

  43. void Display_Seg_Num(uchar i)
  44. {
  45.      Num = Table[i];
  46. }

  47. /***********************************************
  48. 函数作用:  显示第几位数码管
  49. 说明:         
  50. *************************************************/

  51. void Display_Seg(uchar i)
  52. {
  53.      Seg_Place = Seg[i];
  54. }


  55. /***********************************************
  56. 函数作用:  超声波触发
  57. 说明:          拉高电平至少10us
  58. *************************************************/
  59. void Trig_Init()
  60. {
  61.          Trig = 0;
  62.          Trig = 1;
  63.          Delay_Ms(1);
  64.          Trig = 0;
  65. }

  66. /***********************************************
  67. 函数作用:  接收超声波并计算距离
  68. 说明:          一个机器周期为1us,12个时钟周期为1个机器周期
  69. 注意:          如果这样写:time = time * 12 /12 ; time * 12可能会溢出,导致结果出错
  70. *************************************************/
  71. uint Distance()
  72. {
  73.         uint time,distance;
  74.         Trig_Init();                           //初始化超声波触发
  75.         
  76.         while(Echo == 0);                   //当回响为高电平,打开定时器0
  77.         TR0 = 1;
  78.         while(Echo == 1);                   //当回响为低电平,计算时间
  79.         TR0 = 0;
  80.         time = TH0*256 + TL0;           
  81.         time = time /12 * 12;           //time是us级别(实际时间 = 时间 / 晶振频率 ×12个时钟周期)
  82.         TH0 = 0;
  83.         TL0 = 0;
  84.         distance = 0.017 * time;          //距离=速度×时间;(厘米 = 0.017厘米/微秒 × 微秒)
  85.         return distance;                   //返回值 距离
  86. }


  87. /***********************************************
  88. 函数作用:  数码管显示的数字
  89. 说明:         
  90. *************************************************/

  91. void main()
  92. {
  93.      uint distance;
  94.         uchar i;
  95.         P3M0 = 0Xf0;
  96.         P3M1 = 0X00;           //P3口推挽输出,增加电流大小

  97.         Timer0Init();           //初始化定时器0

  98.         while(1)
  99.         {
  100.                 distance = Distance();                                  //将读出的距离赋值给distance

  101.                 for(i=0;i<50;i++)                                          //显示距离一段时间
  102.                 {
  103.                         Display_Seg(0);                                  //点亮第一个数码管
  104.                         Display_Seg_Num(distance/100);          //显示厘米的百位
  105.                         Delay_Ms(5);                                          //短延时

  106.                         Display_Seg(1);                                  //点亮第二个数码管
  107.                         Display_Seg_Num(distance/10%10);          //显示厘米的十位
  108.                         Delay_Ms(3);                                          //短延时

  109.                         Display_Seg(2);                                  //点亮第三个数码管
  110.                         Display_Seg_Num(distance%10);                  //显示厘米的个位
  111.                         Delay_Ms(3);                                          //短延时
  112.                 }
  113.         }
  114. }
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:316613 发表于 2020-10-27 15:42 | 只看该作者
没评论吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表