51单片机超声波测距在lcd1602上显示时间和距离代码(要求不能用printf函数)
时间: 2023-12-14 13:03:20 浏览: 105
以下是使用51单片机和超声波传感器实现测距,并在LCD1602上显示时间和距离的代码,不使用printf函数:
```c
#include <reg51.h>
#define LCD_DATA P0
sbit RS = P2^0;
sbit EN = P2^1;
sbit trig = P3^0;
sbit echo = P3^1;
void delay(unsigned int count) {
unsigned int i, j;
for (i = 0; i < count; i++)
for (j = 0; j < 10; j++);
}
void lcd_command(unsigned char command) {
RS = 0; // RS为0表示发送命令
LCD_DATA = command;
EN = 1; // 使能信号置高
delay(5);
EN = 0; // 使能信号置低
}
void lcd_data(unsigned char data) {
RS = 1; // RS为1表示发送数据
LCD_DATA = data;
EN = 1; // 使能信号置高
delay(5);
EN = 0; // 使能信号置低
}
void lcd_init() {
lcd_command(0x38); // 初始化16×2显示模式
lcd_command(0x0C); // 打开显示,关闭光标
lcd_command(0x06); // 显示光标移动设置
lcd_command(0x01); // 清屏
}
void lcd_display_time_distance(unsigned int time, unsigned int distance) {
unsigned char str[16];
lcd_command(0x80); // 设置显示位置为第一行第一列
// 将时间转换为字符串
str[0] = 'T';
str[1] = 'i';
str[2] = 'm';
str[3] = 'e';
str[4] = ':';
str[5] = '0' + (time / 10000) % 10;
str[6] = '0' + (time / 1000) % 10;
str[7] = '0' + (time / 100) % 10;
str[8] = '0' + (time / 10) % 10;
str[9] = '0' + time % 10;
// 将距离转换为字符串
str[10] = ' ';
str[11] = 'D';
str[12] = 'i';
str[13] = 's';
str[14] = 't';
str[15] = ':';
str[16] = '0' + (distance / 1000) % 10;
str[17] = '0' + (distance / 100) % 10;
str[18] = '0' + (distance / 10) % 10;
str[19] = '0' + distance % 10;
for (int i = 0; i < 20; i++) {
lcd_data(str[i]);
}
}
void ultrasonic_init() {
TMOD = 0x01; // 设置定时器0为工作方式1
TH0 = 0;
TL0 = 0;
}
unsigned int ultrasonic_measure() {
unsigned int time;
trig = 1; // 发送触发信号
delay(10);
trig = 0;
while (!echo); // 等待接收到回波信号
TR0 = 1; // 启动定时器0
while (echo); // 等待回波信号结束
TR0 = 0; // 停止定时器0
time = ((unsigned int)TH0 << 8) | TL0; // 计算时间
return (time * 17) / 100; // 计算距离(单位:厘米)
}
void main() {
unsigned int distance;
unsigned int time;
lcd_init();
ultrasonic_init();
while(1) {
distance = ultrasonic_measure(); // 测量距离
time = (TH0 << 8) + TL0; // 记录时间
lcd_display_time_distance(time, distance); // 显示时间和距离
delay(500); // 延时500ms
lcd_command(0x01); // 清屏
delay(500); // 延时500ms
}
}
```
这段代码中,我们使用了一个字符数组 `str` 来存储时间和距离的字符串,并通过 `lcd_data` 函数逐个字符地在LCD上显示。请注意,LCD1602的显示需要相应的驱动程序支持,这里假设已经提供了相应的库函数。
希望以上代码能满足你的要求!如果还有其他问题,请随时提问。
阅读全文