#include<STC15.H>
#include<intrins.H>
sbit TX = P1^0 ;
sbit RX = P1^1 ;
unsigned char tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF};
unsigned char DigCom=0;
unsigned char DigBuf[8] = {10,10,10,10,10,10,10,10};
unsigned int LCM_tt = 0 ;
bit LCM_Ref = 0 ;
unsigned int LCM = 0 ;
unsigned int LCM_Time = 0 ;
void ALL_Init(void);
void Delay_MS(unsigned int MS);
void KeyScan(void);
void Timer0Init(void); //1毫秒@11.0592MHz
void Send_wave(void);
void Timer1Init(void);
void main(void)
{
ALL_Init();
Timer0Init();
Timer1Init();
EA=1;ET0=1;
while(1)
{
if(LCM_Ref==1)
{
LCM_Ref = 0 ;
Send_wave();
TR1 = 1;
while((RX == 1)&&(TF1 == 0));
TR1 = 0;
if(TF1 == 1)
{
TF1 = 0 ;
LCM = 9999 ;
}
else
{
LCM_Time = TH1 ;
LCM_Time <<= 8 ;
LCM_Time |= TL1 ;
LCM = (unsigned int)(LCM_Time*17/921.6); // 1/11059200/12= 1/921600 LCM_Time*17000 * (1/921600)
//LCM = (unsigned int)(LCM_Time*0.017);
}
TL1 = 0x00; //设置定时初始值
TH1 = 0x00; //设置定时初始值
}
DigBuf[5] = LCM/100;
DigBuf[6] = LCM%100/10;
DigBuf[7] = LCM%10;
}
}
void Timer1Init(void) //0毫秒@11.0592MHz
{
AUXR &= 0xBF; //定时器时钟12T模式
TMOD &= 0x0F; //设置定时器模式
TL1 = 0x00; //设置定时初始值
TH1 = 0x00; //设置定时初始值
TF1 = 0; //清除TF1标志
// TR1 = 1; //定时器1开始计时
}
void Delay14us() //@11.0592MHz
{
unsigned char i;
_nop_();
i = 45;
while (--i);
}
void Send_wave(void)
{
unsigned char i = 8 ;
do
{
TX = 1 ; Delay14us();
TX = 0 ; Delay14us();
}
while(i--);
}
void Timer0(void) interrupt 1
{
P0=0X00;
P2|=0XC0; // P2=P2|0XC0; XXXX XXXX | 1100 0000 = 11XX XXXX
P2&=0XDF; // P2=P2&0XDF; 11XX XXXX & 1101 1111 = 110X XXXX
P2&=0X1F; //关闭所有的74HC573锁存器
P0=tab[DigBuf[DigCom]];
P2|=0XE0; // P2=P2|0XE0; XXXX XXXX | 1110 0000 = 111X XXXX
P2&=0XFF; // P2=P2&0XDF; 11XX XXXX & 1101 1111 = 110X XXXX
P2&=0X1F; //关闭所有的74HC573锁存器
P0=(0X01<<DigCom); //然后选中第一个数码管
P2|=0XC0; // P2=P2|0XC0; XXXX XXXX | 1100 0000 = 11XX XXXX
P2&=0XDF; // P2=P2&0XDF; 11XX XXXX & 1101 1111 = 110X XXXX
P2&=0X1F; //关闭所有的74HC573锁存器
if(++DigCom == 8)DigCom = 0 ;
if(++LCM_tt==300){LCM_tt = 0 ; LCM_Ref = 1 ;}
// XXX_tt++;
// if(++XXX_tt==NNN){XXX_tt=0;XXX_Ref=1;}
}
void Timer0Init(void) //1毫秒@11.0592MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xCD; //设置定时初始值
TH0 = 0xD4; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}
void Delay_MS(unsigned int MS)
{
unsigned i,j;
for(i=0;i<MS;i++)
for(j=853;j>0;j--); //STC15单片机设置为853; STC8H单片机修改为1109;STC32G单片机修改为427;
}
void ALL_Init(void)
{
P0 =0X00; //先设置关闭蜂鸣器继电器的P0输出值(全关)
P2|=0XA0; // 将P27 P25 设置为1 其他位保持不变
P2&=0XBF; // 将P26设置为0 其他位保持不变
P2&=0X1F; //关闭所有的74HC573锁存器
P0 =0XFF; //先设置关闭所有的LED的P0输出值(全关)
P2|=0X80; // 将P27设置为1 其他位保持不变
P2&=0X9F; // 将P26 P25设置为0 其他位保持不变
P2&=0X1F; //关闭所有的74HC573锁存器
P0 =0X00; //先设置选择数码管位选的P0输出值(全不选)
P2|=0XC0; // 将P27 P26 设置为1 其他位保持不变
P2&=0XDF; // 将P26设置为0 其他位保持不变
P2&=0X1F; //关闭所有的74HC573锁存器
}
09超声波测距
最新推荐文章于 2024-06-14 10:54:17 发布