以下是一个简单的51单片机的超声波测距,并使用74HC595驱动数码管显示超声波测距距离的程序示例:
```c
#include
sbit TRIG = P3^4; // 超声波发射引脚
sbit ECHO = P3^5; // 超声波接收引脚
sbit SRCLK = P1^0; // 74HC595的时钟引脚
sbit RCLK = P1^1; // 74HC595的存储锁存引脚
sbit SER = P1^2; // 74HC595的数据引脚
void delay(unsigned int count) {
unsigned int i, j;
for (i = 0; i < count; i++) {
for (j = 0; j < 112; j++);
}
}
void hc595SendByte(unsigned char dat) {
unsigned char a;
SRCLK = 0;
RCLK = 0;
for (a = 0; a < 8; a++) {
SER = dat >> 7;
dat <<= 1;
SRCLK = 1;
SRCLK = 0;
}
RCLK = 1;
RCLK = 0;
}
void displayDistance(unsigned int distance) {
unsigned char digit[10] = {
0x3F, // 0
0x06, // 1
0x5B, // 2
0x4F, // 3
0x66, // 4
0x6D, // 5
0x7D, // 6
0x07, // 7
0x7F, // 8
0x67 // 9
};
unsigned char high, low;
high = distance / 10;
low = distance % 10;
hc595SendByte(digit[high]);
delay(1);
hc595SendByte(digit[low]);
delay(1);
}
void delayMicroseconds(unsigned int us) {
while (us--) {
unsigned char a, b;
for (b = 1; b > 0; b--)
for (a = 2; a > 0; a--);
}
}
unsigned int ultrasonicMeasure(void) {
unsigned int distance;
TRIG = 0;
delayMicroseconds(2);
TRIG = 1;
delayMicroseconds(10);
TRIG = 0;
while (!ECHO);
TH0 = 0;
TL0 = 0;
while (ECHO);
TR0 = 1;
while (ECHO);
TR0 = 0;
distance = (TH0 << 8) | TL0;
distance = distance / 58.0;
return distance;
}
void main(void) {
unsigned int distance;
TMOD = 0x01; // 16位定时器模式
EA = 1; // 启用全局中断
ET0 = 1; // 启用定时器0中断
while (1) {
distance = ultrasonicMeasure();
displayDistance(distance);
delay(20);
}
}
void timer0Int() interrupt 1 {
TH0 = 0;
TL0 = 0;
}
```
希望以上程序能够帮助到你!如果有其他问题,请随时提问。
以下是一个简单的51单片机的超声波测距,并使用74HC595驱动数码管显示超声波测距距离的程序示例:
```c
#include
sbit TRIG = P3^4; // 超声波发射引脚
sbit ECHO = P3^5; // 超声波接收引脚
sbit SRCLK = P1^0; // 74HC595的时钟引脚
sbit RCLK = P1^1; // 74HC595的存储锁存引脚
sbit SER = P1^2; // 74HC595的数据引脚
void delay(unsigned int count) {
unsigned int i, j;
for (i = 0; i < count; i++) {
for (j = 0; j < 112; j++);
}
}
void hc595SendByte(unsigned char dat) {
unsigned char a;
SRCLK = 0;
RCLK = 0;
for (a = 0; a < 8; a++) {
SER = dat >> 7;
dat <<= 1;
SRCLK = 1;
SRCLK = 0;
}
RCLK = 1;
RCLK = 0;
}
void displayDistance(unsigned int distance) {
unsigned char digit[10] = {
0x3F, // 0
0x06, // 1
0x5B, // 2
0x4F, // 3
0x66, // 4
0x6D, // 5
0x7D, // 6
0x07, // 7
0x7F, // 8
0x67 // 9
};
unsigned char high, low;
high = distance / 10;
low = distance % 10;
hc595SendByte(digit[high]);
delay(1);
hc595SendByte(digit[low]);
delay(1);
}
void delayMicroseconds(unsigned int us) {
while (us--) {
unsigned char a, b;
for (b = 1; b > 0; b--)
for (a = 2; a > 0; a--);
}
}
unsigned int ultrasonicMeasure(void) {
unsigned int distance;
TRIG = 0;
delayMicroseconds(2);
TRIG = 1;
delayMicroseconds(10);
TRIG = 0;
while (!ECHO);
TH0 = 0;
TL0 = 0;
while (ECHO);
TR0 = 1;
while (ECHO);
TR0 = 0;
distance = (TH0 << 8) | TL0;
distance = distance / 58.0;
return distance;
}
void main(void) {
unsigned int distance;
TMOD = 0x01; // 16位定时器模式
EA = 1; // 启用全局中断
ET0 = 1; // 启用定时器0中断
while (1) {
distance = ultrasonicMeasure();
displayDistance(distance);
delay(20);
}
}
void timer0Int() interrupt 1 {
TH0 = 0;
TL0 = 0;
}
```
希望以上程序能够帮助到你!如果有其他问题,请随时提问。
1
1
举报