找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1568|回复: 1
收起左侧

基于51单片机超声波测距防近视台灯程序

[复制链接]
ID:843475 发表于 2020-12-2 18:25 | 显示全部楼层 |阅读模式
程序代码 51hei浏览器截图2020120.png

仿真图
51hei浏览器截图20201202181224.png

单片机源程序如下:
  1. #include<reg52.h>
  2. #include<intrins.h>

  3. /*********************宏定义************************/
  4. #define uchar unsigned char
  5. #define uint unsigned int

  6. /************位定义*****************************/
  7. sbit Trig=P3^7; //超声波模块触发位
  8. sbit LEDRED=P1^0;
  9. sbit LEDGREEN=P1^2;
  10. sbit speaker=P1^7;
  11. sbit person=P1^6;
  12. sbit TLED= P1^5;
  13. /************全局变量声明***********************/
  14. uint H,T;  //定义全局变量,H--距离,T--时间

  15. /***********共阴数码管段码表********************/
  16. uchar a_code[]={                                          //共阴数码管编码0~9
  17. 0x3f,0x06,0x5b,0x4f,0x66,
  18. 0x6d,0x7d,0x07,0x7f,0x6f,
  19. /*0x77,0x7c,0x39,0x5e,0x79,
  20. 0x71*/};

  21. /***************延时函数************************/
  22. void delay(uint z)                                   //*1ms延时函数
  23. {
  24.         uint x,y;
  25.         for(x=z;x>0;x--)
  26.                 for(y=110;y>0;y--);
  27. }

  28. /*************超声波模块启动函数**************/
  29. void start()
  30. {
  31.         
  32.         Trig=1; //拉高触发信号,启动超声波模块发射超声波
  33.         _nop_();  //延时10us
  34.         _nop_();
  35.         _nop_();
  36.         _nop_();
  37.         _nop_();
  38.         _nop_();
  39.         _nop_();
  40.         _nop_();
  41.         _nop_();
  42.         _nop_();
  43.         _nop_();
  44.         _nop_();
  45.         _nop_();
  46.         _nop_();
  47.         Trig=0;  //拉低触发信号
  48. }


  49. /*****************数码管显示函数*****************/
  50. void  display(unsigned int a,unsigned int b,unsigned int c,unsigned int d)
  51. {
  52.     P2=0xfe;
  53.     P0=a_code[a];
  54.     delay(5);
  55.     P2=0xfd;
  56.     P0=a_code[b];
  57.     delay(5);
  58.         P2=0xfb;
  59.     P0=a_code[c];
  60.     delay(5);
  61.         P2=0xf7;
  62.     P0=a_code[d];
  63.     delay(5);

  64. }


  65. /*****************主函数*************************/
  66. void main()
  67. {
  68.           Trig=0;
  69.          LEDRED=1;
  70.          LEDGREEN=1;
  71.          speaker=0;
  72.      EA=1;
  73. TMOD=0x19;//定时器0工作模式:
  74.                /*GATE=1(由外部中断0引脚及TR0共同启动定时器0)
  75.                C/T=0(定时模式)
  76.                                 M1M0=01(16位定时)*/
  77.         TH1=64580/256;
  78.         TL1=65480%256;
  79.         ET1=1;
  80.         TR0=1;        //启动定时器0
  81.         EX0=1;        //开外部中断0
  82.         IT0=1;        //外部中断0设置为下降沿触发方式
  83.         while(1)
  84. {
  85. start();   //调用超声波模块启动函数
  86. display(H/1000,H%1000/100,H%1000%100/10,H%10); //调用数码管显示函数
  87. if(person==1)  
  88.          {
  89.                 TLED=1;
  90.                 if(H<=25)
  91.                 {
  92.                         LEDRED=0;
  93.                         LEDGREEN=1;
  94.                         TR1=1;
  95.                 }
  96.                 else
  97.                 {
  98.                         LEDRED=1;
  99.                         LEDGREEN=0;
  100.                         TR1=0;
  101.                 }
  102.         }
  103.         else
  104.         {
  105.                 TLED=0;
  106.                 LEDRED=1;
  107.                 LEDGREEN=1;
  108.                 TR1=0;
  109.         }
  110. }
  111. }

  112. /***************外部中断0函数************************
  113. 回响输出端高电平宽度测量(上升沿到来时启动定时器0开始计时,
  114. 下降沿到来进入外部中断,关闭定时器0,停止计时,计算距离
  115. ********************************************************/
  116. void int0() interrupt 0         
  117. {
  118.          TR0=0;                //关闭定时器0
  119.         EX0=0;                //关闭外部中断0
  120.         T=(TH0*256+TL0);//计算超声波传输时间,CPU采用12M时钟,则计算的单位为us
  121.          TH0=0;                        //定时器清0
  122.          TL0=0;
  123.          H=T*0.017;         //计算距离,单位cm(注意:不能用H=(T*17)/1000,这样变成取整了)
  124.          H=H+2;
  125.         TR0=1;                //开启定时器0
  126.         EX0=1;                //开启外部中断0        
  127. }
  128. void time1() interrupt 3
  129. {
  130.         TR1=0;
  131.         TH1=65480/256;
  132.         TL1=65480%256;
  133.         speaker=~speaker;
  134.         TR1=1;
  135. }
复制代码




回复

使用道具 举报

ID:841148 发表于 2020-12-8 16:26 | 显示全部楼层
有没有文件呢?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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