程序代码
仿真图
单片机源程序如下:
- #include<reg52.h>
- #include<intrins.h>
- /*********************宏定义************************/
- #define uchar unsigned char
- #define uint unsigned int
- /************位定义*****************************/
- sbit Trig=P3^7; //超声波模块触发位
- sbit LEDRED=P1^0;
- sbit LEDGREEN=P1^2;
- sbit speaker=P1^7;
- sbit person=P1^6;
- sbit TLED= P1^5;
- /************全局变量声明***********************/
- uint H,T; //定义全局变量,H--距离,T--时间
- /***********共阴数码管段码表********************/
- uchar a_code[]={ //共阴数码管编码0~9
- 0x3f,0x06,0x5b,0x4f,0x66,
- 0x6d,0x7d,0x07,0x7f,0x6f,
- /*0x77,0x7c,0x39,0x5e,0x79,
- 0x71*/};
- /***************延时函数************************/
- void delay(uint z) //*1ms延时函数
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- /*************超声波模块启动函数**************/
- void start()
- {
-
- Trig=1; //拉高触发信号,启动超声波模块发射超声波
- _nop_(); //延时10us
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- Trig=0; //拉低触发信号
- }
- /*****************数码管显示函数*****************/
- void display(unsigned int a,unsigned int b,unsigned int c,unsigned int d)
- {
- P2=0xfe;
- P0=a_code[a];
- delay(5);
- P2=0xfd;
- P0=a_code[b];
- delay(5);
- P2=0xfb;
- P0=a_code[c];
- delay(5);
- P2=0xf7;
- P0=a_code[d];
- delay(5);
- }
- /*****************主函数*************************/
- void main()
- {
- Trig=0;
- LEDRED=1;
- LEDGREEN=1;
- speaker=0;
- EA=1;
- TMOD=0x19;//定时器0工作模式:
- /*GATE=1(由外部中断0引脚及TR0共同启动定时器0)
- C/T=0(定时模式)
- M1M0=01(16位定时)*/
- TH1=64580/256;
- TL1=65480%256;
- ET1=1;
- TR0=1; //启动定时器0
- EX0=1; //开外部中断0
- IT0=1; //外部中断0设置为下降沿触发方式
- while(1)
- {
- start(); //调用超声波模块启动函数
- display(H/1000,H%1000/100,H%1000%100/10,H%10); //调用数码管显示函数
- if(person==1)
- {
- TLED=1;
- if(H<=25)
- {
- LEDRED=0;
- LEDGREEN=1;
- TR1=1;
- }
- else
- {
- LEDRED=1;
- LEDGREEN=0;
- TR1=0;
- }
- }
- else
- {
- TLED=0;
- LEDRED=1;
- LEDGREEN=1;
- TR1=0;
- }
- }
- }
- /***************外部中断0函数************************
- 回响输出端高电平宽度测量(上升沿到来时启动定时器0开始计时,
- 下降沿到来进入外部中断,关闭定时器0,停止计时,计算距离
- ********************************************************/
- void int0() interrupt 0
- {
- TR0=0; //关闭定时器0
- EX0=0; //关闭外部中断0
- T=(TH0*256+TL0);//计算超声波传输时间,CPU采用12M时钟,则计算的单位为us
- TH0=0; //定时器清0
- TL0=0;
- H=T*0.017; //计算距离,单位cm(注意:不能用H=(T*17)/1000,这样变成取整了)
- H=H+2;
- TR0=1; //开启定时器0
- EX0=1; //开启外部中断0
- }
- void time1() interrupt 3
- {
- TR1=0;
- TH1=65480/256;
- TL1=65480%256;
- speaker=~speaker;
- TR1=1;
- }
复制代码
|