用51单片机的LCD1602显示小车每行驶一圈的圈数和此时的速度,写出代码并解释每一行代码的含义
时间: 2024-02-15 22:02:01 浏览: 80
好的,以下是基于51单片机的LCD1602显示小车圈数和速度的代码:
```c
#include <reg52.h>
#include <intrins.h>
/* 定义LCD引脚 */
sbit RS = P2^6; // RS引脚
sbit EN = P2^7; // EN引脚
sbit RW = P2^5; // RW引脚
sbit LCD1602_BUSY = P2^7; // LCD1602忙碌标志
/* 定义全局变量 */
unsigned char speed = 0; // 速度计数器
unsigned char circle = 0; // 圈数计数器
unsigned char flag = 0; // 标志位,用于判断是否为一圈结束
/* 延时函数 */
void delay(unsigned int ms)
{
unsigned int i, j;
for(i = 0; i < ms; i++)
{
for(j = 0; j < 125; j++)
{
_nop_();
}
}
}
/* 写命令 */
void write_command(unsigned char command)
{
while(LCD1602_BUSY); // 等待忙碌状态结束
RW = 0; // 写入命令
RS = 0; // 选择命令寄存器
P0 = command; // 写入命令
EN = 1; // 使能
delay(5); // 延时
EN = 0; // 失能
}
/* 写数据 */
void write_data(unsigned char data)
{
while(LCD1602_BUSY); // 等待忙碌状态结束
RW = 0; // 写入数据
RS = 1; // 选择数据寄存器
P0 = data; // 写入数据
EN = 1; // 使能
delay(5); // 延时
EN = 0; // 失能
}
/* 初始化LCD1602 */
void init_LCD1602()
{
write_command(0x38); // 显示模式设置
write_command(0x0c); // 开启显示不显示光标
write_command(0x06); // 输入方式设置
write_command(0x01); // 清屏
}
/* 显示速度和圈数 */
void display_speed_circle()
{
unsigned char i, temp;
write_command(0x80); // 光标移动到第一行
write_data('S');
write_data('p');
write_data('e');
write_data('e');
write_data('d');
write_data(':');
write_data(speed / 10 + '0');
write_data(speed % 10 + '0');
write_data(' ');
write_data(' ');
write_data(' ');
write_data('C');
write_data('i');
write_data('r');
write_data('c');
write_data('l');
write_data('e');
write_data(':');
write_data(circle / 100 + '0');
temp = circle % 100;
write_data(temp / 10 + '0');
write_data(temp % 10 + '0');
}
/* 计时器0中断服务程序 */
void timer0() interrupt 1
{
TH0 = (65536 - 50000) / 256; // 定时50ms
TL0 = (65536 - 50000) % 256;
speed++; // 速度计数器加1
if(speed == 200) // 速度计数器达到200
{
speed = 0; // 归零
flag = 1; // 标志位置1
}
}
/* 外部中断0服务程序 */
void ext0() interrupt 0
{
if(flag) // 一圈结束
{
circle++; // 圈数计数器加1
flag = 0; // 标志位清0
}
}
/* 主函数 */
void main()
{
/* 初始化 */
init_LCD1602();
TMOD |= 0x01; // 定时器0工作方式1
TH0 = (65536 - 50000) / 256; // 定时50ms
TL0 = (65536 - 50000) % 256;
ET0 = 1; // 开启定时器0中断
TR0 = 1; // 启动定时器0
EX0 = 1; // 开启外部中断0
IT0 = 1; // 下降沿触发
EA = 1; // 开启总中断
while(1)
{
display_speed_circle(); // 显示速度和圈数
}
}
```
代码注释如下:
1. `#include <reg52.h>`:头文件,包含了51单片机的基本定义和常数等。
2. `sbit`:定义LCD1602的引脚。
3. `unsigned char`:定义无符号字符型变量。
4. `void delay(unsigned int ms)`:延时函数,用于等待一定时间。
5. `void write_command(unsigned char command)`:写命令函数,用于向LCD1602写入指令。
6. `void write_data(unsigned char data)`:写数据函数,用于向LCD1602写入数据。
7. `void init_LCD1602()`:初始化LCD1602,设置显示模式、输入方式、清屏等。
8. `void display_speed_circle()`:显示速度和圈数。
9. `void timer0() interrupt 1`:定时器0中断服务程序,定时50ms。
10. `void ext0() interrupt 0`:外部中断0服务程序,用于检测小车每行驶一圈。
11. `void main()`:主函数,包含了初始化、定时器、外部中断、显示等。
总体流程如下:
1. 初始化LCD1602、定时器、外部中断等。
2. 定时器0中断服务程序,在计时器到达50ms时,速度计数器加1。
3. 外部中断0服务程序,在小车每行驶一圈时,圈数计数器加1。
4. 显示速度和圈数,不断更新。
希望能够帮到你!
阅读全文