关于51单片机超声波测距的若干问题,后半部分后贴上来..
#include<reg52.h>#include<intrins.h>#defineuintunsignedint#defineucharunsignedcharsbi...
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit DU=P2^6;
sbit WE=P2^7;
sbit RS=P1^0;
sbit RW=P1^1;
sbit EN=P2^5;
sbit RX=P3^2;
sbit TX=P1^5;
sbit FM=P2^3;
uint time=0;
unsigned long S=0;
bit flag=0; //为什么是bit?sbit和bit有什么区别?
uchar disdat[]={0,0,0,0};
void delay(uint xms)
{
uint x,y;
for(x=xms;x>0;x--)
for(y=112;y>0;y--);
}
void write_com(uchar com)
{
RS=0;
RW=0;
P0=com;
delay(5);
EN=1;
delay(5);
EN=0;
}
void write_dat(uchar dat)
{
RS=1;
RW=0;
P0=dat;
delay(5);
EN=1;
delay(5);
EN=0;
}
void write_1602(uchar add,uchar dat2)
{
write_com(0x80+0x40+add);
write_dat(dat2);
}
void ZIFU(uchar *ch)
{
while(*ch!=0)
{
write_dat(*ch++);
delay(20);
}
}
void init()
{
DU=0;
WE=0;
EN=0;
write_com(0x38);
delay(2);
write_com(0x0f);
write_com(0x06);
write_com(0x80);
write_com(0x01);
ZIFU(" UltraSonic");
}
void count()
{
time=TH0*256+TL0; //为什么时间等于TH0*256+TL0?
TH0=0;
TL0=0;
S=time/58;
if(S>100)
{
FM=0;
}
else
{
FM=1;
}
disdat[0]=S%1000/100;
disdat[1]=S%1000%100/10;
disdat[2]=S%1000%10%10;
write_1602(1,'D');
write_1602(2,'i');
write_1602(3,'s');
write_1602(4,'t');
write_1602(5,'a');
write_1602(6,'n');
write_1602(7,'c');
write_1602(8,'e');
write_1602(9,':'); //这里可以用数组方式实现吗?
write_1602(10,disdat[0]+0x30);
write_1602(11,disdat[1]+0x30);
write_1602(12,disdat[2]+0x30);
write_1602(13,'C');
write_1602(14,'M');
}
void timer0() interrupt 1
{
flag=1; //flag置一有什么作用?
} 展开
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit DU=P2^6;
sbit WE=P2^7;
sbit RS=P1^0;
sbit RW=P1^1;
sbit EN=P2^5;
sbit RX=P3^2;
sbit TX=P1^5;
sbit FM=P2^3;
uint time=0;
unsigned long S=0;
bit flag=0; //为什么是bit?sbit和bit有什么区别?
uchar disdat[]={0,0,0,0};
void delay(uint xms)
{
uint x,y;
for(x=xms;x>0;x--)
for(y=112;y>0;y--);
}
void write_com(uchar com)
{
RS=0;
RW=0;
P0=com;
delay(5);
EN=1;
delay(5);
EN=0;
}
void write_dat(uchar dat)
{
RS=1;
RW=0;
P0=dat;
delay(5);
EN=1;
delay(5);
EN=0;
}
void write_1602(uchar add,uchar dat2)
{
write_com(0x80+0x40+add);
write_dat(dat2);
}
void ZIFU(uchar *ch)
{
while(*ch!=0)
{
write_dat(*ch++);
delay(20);
}
}
void init()
{
DU=0;
WE=0;
EN=0;
write_com(0x38);
delay(2);
write_com(0x0f);
write_com(0x06);
write_com(0x80);
write_com(0x01);
ZIFU(" UltraSonic");
}
void count()
{
time=TH0*256+TL0; //为什么时间等于TH0*256+TL0?
TH0=0;
TL0=0;
S=time/58;
if(S>100)
{
FM=0;
}
else
{
FM=1;
}
disdat[0]=S%1000/100;
disdat[1]=S%1000%100/10;
disdat[2]=S%1000%10%10;
write_1602(1,'D');
write_1602(2,'i');
write_1602(3,'s');
write_1602(4,'t');
write_1602(5,'a');
write_1602(6,'n');
write_1602(7,'c');
write_1602(8,'e');
write_1602(9,':'); //这里可以用数组方式实现吗?
write_1602(10,disdat[0]+0x30);
write_1602(11,disdat[1]+0x30);
write_1602(12,disdat[2]+0x30);
write_1602(13,'C');
write_1602(14,'M');
}
void timer0() interrupt 1
{
flag=1; //flag置一有什么作用?
} 展开
1个回答
展开全部
Sbit是特殊寄存器用的通常是用在端口上,bit是说可以作位处理,编译后会以51内的可位元定址的空间来替代。
时间为什么是要乘256这个是因为定时器处在16位的功能由TH0,TL0来组成,TH0*256等于位移8个在加上TL0就是完整的
至于数组,完全可以替代
flag一定是程序里面哪里有用到
时间为什么是要乘256这个是因为定时器处在16位的功能由TH0,TL0来组成,TH0*256等于位移8个在加上TL0就是完整的
至于数组,完全可以替代
flag一定是程序里面哪里有用到
追问
void main()
{
delay(400);
init();
TMOD=0x01;
TH0=0;
TL0=0;
EA=1;
ET0=1;
while(1)
{
start();
while(!RX);
TR0=1;
while(RX); //两个while()的作用是什么?
TR0=0;
count();
delay(20);
}
}
“TH0*256等于位移8个在加上TL0就是完整的”这句话不太理解
追答
那个while是要来启动定时器的,定时器再去看下吧,定时器溢位产生中断
艾因蒂克
2024-11-28 广告
2024-11-28 广告
超声阵列探头是艾因蒂克科技(上海)有限公司在超声检测领域的一项重要技术产品。它采用先进的阵列设计,能够显著提高超声检测的精度和效率。该探头通过多个超声传感器的协同工作,实现对被检测物体的全方位、多角度扫描,从而更准确地发现物体内部的缺陷和问...
点击进入详情页
本回答由艾因蒂克提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询