#include "STC15F2K60S2.h"
#include "intrins.h"
#define TX P10
#define RX P11
#define u8 unsigned char
#define somenop {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}
u8 code smg_duan[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00};
u8 code smg_wei[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
void send_wave()
{
TX=1;
somenop;somenop;somenop;somenop;somenop;
somenop;somenop;somenop;somenop;somenop;
TX=0;
}
unsigned int get_distance(void)
{
unsigned int dis;
TR1=1;
send_wave();
while((TF1==0)&&(RX==1));
TR1=0;
if(TF1==1)
{
TF1=0;
dis=999;
}
else
{
dis=(TH1<<8)|TL1;
dis*=0.017;
}
TH1=TL1=0;
return dis;
}
void Timer0Init(void) //1毫秒@11.0592MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xCD; //设置定时初值
TH0 = 0xD4; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1;
EA = 1;
}
void Timer1Init(void) //1毫秒@11.0592MHz sonic
{
TMOD &= 0x0F; //设置定时器模式
TL1 = 0xCD; //设置定时初值
TH1 = 0xD4; //设置定时初值
TF1 = 0; //清除TF1标志
TR1 = 1; //定时器1开始计时
}
bit sonic_flag;
unsigned int distance;
u8 dis_table[8];
void main()
{
P2=0x80;P0=0xff;P2=0;
P2=0xa0;P0=0;P2=0;
Timer0Init();
Timer1Init();
while(1)
{
if(sonic_flag)
{
sonic_flag=0;
distance=get_distance();
dis_table[5]=smg_duan[distance/100];
dis_table[6]=smg_duan[distance%100/10];
dis_table[7]=smg_duan[distance%10];
}
}
}
void timer0() interrupt 1
{
static unsigned int key_count=0,smg_count=0,i=0,sonic_count=0;
smg_count++;
sonic_count++;
if(sonic_count==200)
{
sonic_count=0;
sonic_flag=1;
}
if(smg_count==3)
{
smg_count=0;
P2=0xc0;P0=0;P2=0;
P2=0xe0;P0=~dis_table[i];P2=0;
P2=0xc0;P0=smg_wei[i];P2=0;
i++;
if(i==8)i=0;
}
}
CT107D单片机超声波代码
最新推荐文章于 2024-04-12 05:46:00 发布