📄 01.c
字号:
/*2012.1.8 编写完毕 BY:CMY*/
#include "reg51.h"
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
sbit transfer=P1^0;
sbit receiver=P3^2;
sbit speak =P2^0;
/*数码管位选控制*/
sbit ledwei0=P2^4;
sbit ledwei1=P2^5;
sbit ledwei2=P2^6;
sbit ledwei3=P2^7;
sbit m=P1^5;
sbit n=P1^6;
uchar TimerH,TimerL,temp,a,b;
ulong realTimer; //存放真测量时间
ulong real_dis; //存放测量距离
uint dis_flag; //距离计算标志位
uint wei0,wei1,wei2,wei3;
uchar ledflag=0; //数码管标志位,用于刷新
uchar send_flag=0;
uchar count=0; //定时器T0计数
uchar ledcode[11]={
0x18,/*0*/
0x7B,/*1*/
0x2C,/*2*/
0x29,/*3*/
0x4B,/*4*/
0x89,/*5*/
0x88,/*6*/
0x3B,/*7*/
0x08,/*8*/
0x09,/*9*/};
/*延时函数*/
void delay(uint count)
{
while(count--);
}
/*超声波发送函数--40KHZ*/
void CLK40K()
{
uchar i=4; //发送的波形数量=(i/2)
TR0=1; //START TIME0,同时发送40KHZ方波
do
{
transfer=~transfer;
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
}
while(--i);
}
/*距离测量函数*/
void distance(void)
{
realTimer=TimerH*256+TimerL;
real_dis=realTimer*164/10000; //单位cm
wei0=real_dis%10;
wei1=(real_dis/10)%10;
wei2=(real_dis/100)%10;
wei3=real_dis/1000;
}
/*显示刷新函数函数*/
void display(void)
{
switch(ledflag)
{
case 0:P0=ledcode[wei0];ledwei0=0;ledwei1=1;ledwei2=1;ledwei3=1;break;
case 1:P0=ledcode[wei1];ledwei0=1;ledwei1=0;ledwei2=1;ledwei3=1;break;
case 2:P0=ledcode[wei2];ledwei0=1;ledwei1=1;ledwei2=0;ledwei3=1;break;
case 3:P0=ledcode[wei3];ledwei0=1;ledwei1=1;ledwei2=1;ledwei3=0;break;
}
ledflag++;
if(ledflag==4)
ledflag=0;
// delay(0x80);//768us=0.768ms//520次
}
/*报警处理函数*/
void alarm(void)
{
long int i;
if(real_dis>=100)
for(i=1;i<800;i++)
{
if(i<400)
{m=1;n=0;}
if(i>400)
{m=0;n=1;}
P0=0xff;
speak^=1;
delay(500);
}
else
{
speak=1;
}
}
/*系统初始化程序*/
void init()//系统初始化
{
temp=0xff;
P1=temp;
TMOD=0X11; //初始化定时器T0,T1用于产生40hz发射波
TH0=0x00;
TL0=0x00;
TH1=0x00;
TL1=0x00;
TF1=0;
PX0=1;
ET1=1;
EA=1;
TR1=1; //启动定时器1
IT0=0; //外部低电平触发方式
}
void int0(void) interrupt 0 //关闭计数器,存计数值,置标志
{
EA=0; //关闭中断
EX0=0; //关外部中断
TimerL=TL0; //读取数值
TimerH=TH0;
TR0=0; //关闭定时器0
TH0=0x00;
TL0=0x00;
dis_flag=1; //距离计算标志
}
void time1(void) interrupt 3
{
TF1=0;
TH0=0x00;
TL0=0x00;
TH1=0x00;
TL1=0x00;
send_flag=1; //开启接收回波中断
}
/*系统主函数*/
void main()
{
// unsigned int i,j;
init(); //系统初始化
real_dis=90; //y预设初值,防止开机未发射超声波,电机锁死
delay(0x40);
while(1)
{
if(send_flag==1)
{
send_flag=0;
CLK40K();
delay(0x40); //延时,避开发射的直达声波信号,可以调节测量的最小距离
EX0=1;
}
if(dis_flag==1)
{
dis_flag=0;
distance();
EA=1;
}
display(); //调用显示函数
if(real_dis>=100)
delay(300);
display(); //调用显示函数
alarm();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -