这是超声波测距。1602显示。
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]="Distance";
sbit lcden=P3^4;
sbit lcdrs=P3^5;
sbit lcdrw=P3^6;
sbit dula=P2^6;
sbit wela=P2^7;
sbit trig=P2^0;
sbit echo=P3^2;
uchar num;
bit flag =0;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com)/*写指令*/
{
lcdrs=0;
lcdrw=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_data(uchar date)/*写数据*/
{
lcdrs=1;
lcdrw=0;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void lcd_init() /*初始化*/
{
dula=0;
wela=0;
lcden=0;
write_com(0x38);
write_com(0x0f);
write_com(0x06);
write_com(0x01);
write_com(0x80);
}
//***定时器Timer0初始化***
void Timer0init(void)
{
TMOD&=0xF0; //将TMOD的低4位定时器0控制部分清零
TMOD|=0x01; //设置定时器0为方式1
TL0=0; //设置定时器0初值低8位
TH0=0; //设置定时器0初值高8位
ET0=1; //Timer0中断允许
EA=1; //开全局中断
}
//名称: 主函数
void main(void)
{
long S;
int L;
lcd_init(); //调用1602液晶初始化函数
Timer0init() ; //调用定时器0初始化函数
for(num=0;num<11;num++)
{
write_data(table[num]);
}
while(1)
{ trig=1; //发一个脉冲触发信号
delay(10); //信号至少要维持10微妙以上
trig=0; //撤销触发信号
TL0=0; //设置定时器0初值低8位为0
TH0=0; //设置定时器0初值高8位为0
while(!echo); //等待回响高电平
TR0=1; //回响高电平来后启动定时器
while(echo); //等待回响高电平结束后
TR0=0; //关闭定时器
S=(TH0*256+TL0)*1.7/100; //22.1184MHz
L=(int)S;
if(flag==0&&S<=400)
{
write_com(0x80+0x40);
write_data(L/100);
write_data(L/10%10);
write_data(L%10);
write_data('C');
write_data('M');
}
else //超出测量范围显示“-”
{
write_com(0x80+0x40);
write_data('-');
write_data('-');
write_data('-');
write_data('C');
write_data('M');
}
for(S=0;S<40000;S++); //每两次测距需要有个必要的间隔
}
}
|