用51单片机的LCD1602显示小车每行驶一圈的圈数和此时的速度,写出代码并解释每一行代码的含义
时间: 2024-03-03 14:52:47 浏览: 18
好的,以下是用51单片机的LCD1602显示小车每行驶一圈的圈数和此时的速度的代码,以及每一行代码的解释:
```c
#include<reg52.h>
#include<intrins.h>
#include<stdio.h>
#include<math.h>
#include"lcd1602.h"
#define uchar unsigned char
#define uint unsigned int
uchar speed; //速度变量
uint count; //计数变量
void main()
{
InitLcd1602(); //初始化LCD1602
TMOD=0x05; //设置定时器0为工作方式1,定时器1为工作方式2
TH0=0; //定时器0初始值为0
TL0=0;
TH1=0; //定时器1初始值为0
TL1=0;
ET0=1; //使能定时器0的中断
EA=1; //开总中断
TR0=1; //启动定时器0
while(1)
{
WriteLcd1602(0x80,0); //显示第一行
printf("count:%d ",count); //显示圈数
WriteLcd1602(0x8F,0); //光标移动到第一行最后一个字符
printf("V=%d.%d km/h",speed/10,speed%10); //显示速度
}
}
void isr_t0() interrupt 1
{
count++; //计数器加1
TH0=(65536-50000)/256; //定时器0赋初值
TL0=(65536-50000)%256;
speed=65536/(TH1*256+TL1); //计算速度
TH1=0; //定时器1赋初值
TL1=0;
}
```
代码解释:
1. `#include<reg52.h>`:头文件,包含单片机寄存器定义等信息。
2. `#include<intrins.h>`:头文件,包含一些汇编指令的函数,如 `_nop_()`。
3. `#include<stdio.h>`:头文件,包含输入输出函数的定义。
4. `#include<math.h>`:头文件,包含数学函数的定义。
5. `#include"lcd1602.h"`:头文件,包含LCD1602的初始化函数等自定义函数的定义。
6. `#define uchar unsigned char`:宏定义,将 `uchar` 替换为 `unsigned char`。
7. `#define uint unsigned int`:宏定义,将 `uint` 替换为 `unsigned int`。
8. `uchar speed;`:定义变量 `speed`,用于保存速度。
9. `uint count;`:定义变量 `count`,用于保存计数器的值。
10. `void main()`:主函数。
11. `InitLcd1602();`:调用初始化函数,初始化LCD1602。
12. `TMOD=0x05;`:设置定时器0为工作方式1,定时器1为工作方式2。
13. `TH0=0; TL0=0; TH1=0; TL1=0;`:定时器0和定时器1的初始值都为0。
14. `ET0=1; EA=1;`:使能定时器0的中断和总中断。
15. `TR0=1;`:启动定时器0。
16. `while(1)`:死循环,程序将在此处一直循环执行。
17. `WriteLcd1602(0x80,0);`:将光标移动到第一行第一个字符的位置。
18. `printf("count:%d ",count);`:在LCD上显示当前圈数。
19. `WriteLcd1602(0x8F,0);`:将光标移动到第一行最后一个字符的位置。
20. `printf("V=%d.%d km/h",speed/10,speed%10);`:在LCD上显示当前速度。
21. `void isr_t0() interrupt 1`:定时器0的中断服务函数。
22. `count++;`:计数器加1。
23. `TH0=(65536-50000)/256; TL0=(65536-50000)%256;`:定时器0赋初值,使其每隔50ms中断一次。
24. `speed=65536/(TH1*256+TL1);`:计算速度,公式为速度=轮子周长/时间间隔,这里采用定时器1的时间间隔来计算速度。
25. `TH1=0; TL1=0;`:定时器1赋初值,使其每隔一段时间计算一次速度。