超声波的话,是这样的,就是用定时器1用于计数,而定时器0用于定时,每200ms读一下是否接收到超声波
超声波程序在考场上是需要自己写的
以下程序在板子上测试过了,成功运行
#include<stc15f2k60s2.h>
#include<intrins.h>//这个是为了正常使用_nop_();
#define uint unsigned int//为了简化书写
#define uchar unsigned char
#define somenop {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}//十个—_nop_();就够了
uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
void display1(uchar yi,uchar er);
void display2(uchar san,uchar si);
void display3(uchar wu,uchar liu);
void display4(uchar qi,uchar ba);
uchar yi,er,san,si,wu,liu,qi,ba;
void delayms(int ms);
void send_wave(void);
void Timer0Init(void);
void Timer1Init(void);
void allinit();
uchar flag;
uint tt;
uint distance;
uint t;
sbit TX=P1^0;
sbit RX=P1^1;
void main()
{
allinit();
Timer0Init();
Timer1Init();
yi=10;er=10;san=10;si=10;wu=10;liu=10;qi=10;ba=10;
EA=1;
ET0=1;//打开定时器中断0
while(1)
{
if(flag)
{
flag=0;
send_wave();//发出探射波
TR1=1;//打开计时器1
while((RX==1)&&(TF1==0));//RX在没接收到数据的时候,为1;TF1未溢出的时候为0;此语句为等待
TR1=0;//有接收到了,就关掉计时器1
if(TF1==1)
{
TF1=0;//为下一次做准备
distance=999;//就是无限的距离
}
else//不然的话,就处理数据
{
t=TH1;
t<<=8;
t|=TL1;
distance=(uint)(t*0.017);
distance=distance/12;
}
TH1=0;
TL1=0;//清0为下一次准备
}
liu=distance/100;
qi=distance/10%10;
ba=distance%10;
display1(yi,er);
display2(san,si);
display3(wu,liu);
display4(qi,ba);
}
}
void send_wave()
{
uchar i=8;
do
{
TX=1;
somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;//10个_nop_();
TX=0;
somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;//10个_nop_();
}while(i--);
}
void timr () interrupt 1//定时器0中断,200ms扫描一次
{
TL0=0x9A;
TH0=0xA9;
if(++tt==100)
{
tt=0;
flag=1;
}
}
void allinit()
{
P2=0x80;
P0=0xff;//初始化LED灯为全灭
P2=0xa0;
P0=0x00;//初始化继电器和蜂鸣器全关
P2=0xc0;
P0=0xff;
P2=0xff;
P0=0xff;//初始化数码管
}
void Timer0Init()
{
AUXR|=0x80;
TMOD&=0xF0;
TL0=0x9A;
TH0=0xA9;
TF0=0;
TR0=1;
}
void Timer1Init(void)
{
AUXR|=0x40;
TMOD&=0x0F;
}
void delayms(int ms)
{
uint i,j;
for(i=ms;i>0;i--)
for(j=845;j>0;j--);
}
void display1(uchar yi,uchar er)
{
P2=0xc0;
P0=0x01;
P2=0xff;
P0=tab[yi];
delayms(1);
P2=0xc0;
P0=0x01;
P2=0xff;
P0=tab[er];
delayms(1);
}
void display2(uchar san,uchar si)
{
P2=0xc0;
P0=0x04;
P2=0xff;
P0=tab[san];
delayms(1);
P2=0xc0;
P0=0x08;
P2=0xff;
P0=tab[si];
delayms(1);
}
void display3(uchar wu,uchar liu)
{
P2=0xc0;
P0=0x10;
P2=0xff;
P0=tab[wu];
delayms(1);
P2=0xc0;
P0=0x20;
P2=0xff;
P0=tab[liu];
delayms(1);
}
void display4(uchar qi,uchar ba)
{
P2=0xc0;
P0=0x40;
P2=0xff;
P0=tab[qi];
delayms(1);
P2=0xc0;
P0=0x80;
P2=0xff;
P0=tab[ba];
delayms(1);
}