51单片机串口在lcd1602上制秒表的keil5方程,实现串口输入字符1开始计时2昨天计时3清零
时间: 2024-05-05 16:21:50 浏览: 114
以下是基于Keil5的51单片机串口在LCD1602上制作秒表的代码:
```c
#include <reg52.h>
#include <stdio.h>
#include <string.h>
#define LCD1602_DB P0 //定义LCD1602数据口
sbit LCD1602_RS = P2^6; //定义LCD1602命令口
sbit LCD1602_RW = P2^5; //定义LCD1602读写口
sbit LCD1602_EN = P2^7; //定义LCD1602使能口
#define MAX_LEN 10 //定义接收字符数组的最大长度
char input[MAX_LEN]; //接收字符数组
unsigned int time_count = 0; //计时器计数器
unsigned char is_timing = 0; //是否在计时的标志位
void LCD1602_write_cmd(unsigned char cmd) //写命令到LCD1602
{
LCD1602_RS = 0; //选择命令模式
LCD1602_RW = 0; //选择写模式
LCD1602_EN = 1; //使能
LCD1602_DB = cmd; //写入命令
LCD1602_EN = 0; //关闭使能
}
void LCD1602_write_data(unsigned char dat) //写数据到LCD1602
{
LCD1602_RS = 1; //选择数据模式
LCD1602_RW = 0; //选择写模式
LCD1602_EN = 1; //使能
LCD1602_DB = dat; //写入数据
LCD1602_EN = 0; //关闭使能
}
void LCD1602_init() //LCD1602初始化
{
LCD1602_write_cmd(0x38); //设置显示模式为两行、5*7点阵
LCD1602_write_cmd(0x0c); //设置显示模式为开、不显示光标、不闪烁
LCD1602_write_cmd(0x06); //设置文字显示模式为移动光标、不移动屏幕
LCD1602_write_cmd(0x01); //清屏
}
void LCD1602_display_str(unsigned char x, unsigned char y, char *str) //在LCD1602指定位置显示字符串
{
unsigned char i;
if (x == 0) //设置显示地址为第一行
{
LCD1602_write_cmd(0x80 + y);
}
else //设置显示地址为第二行
{
LCD1602_write_cmd(0xc0 + y);
}
for (i = 0; i < strlen(str); i++) //逐个显示字符
{
LCD1602_write_data(str[i]);
}
}
void timer_init() //计时器初始化
{
TMOD |= 0x01; //设置计时器0为模式1
TH0 = 0xfc; //设置计时器0初值
TL0 = 0x18;
EA = 1; //开启总中断
ET0 = 1; //开启计时器0中断
TR0 = 1; //开启计时器0
}
void timer_isr() interrupt 1 //计时器0中断服务函数
{
TH0 = 0xfc; //重新设置计时器0初值
TL0 = 0x18;
time_count++; //计时器计数器加1
}
void main()
{
LCD1602_init(); //LCD1602初始化
timer_init(); //计时器初始化
while (1)
{
if (RI) //有数据接收
{
RI = 0;
if (!is_timing) //没有在计时
{
switch (SBUF) //判断输入字符
{
case '1': //开始计时
is_timing = 1; //标志位置1
break;
case '2': //暂停计时
break;
case '3': //清零计时
time_count = 0; //计时器计数器清零
is_timing = 0; //标志位置0
break;
default:
break;
}
}
}
if (is_timing) //正在计时
{
sprintf(input, "Time: %d s", time_count); //将计数器的值转为字符串
LCD1602_display_str(1, 0, input); //在第二行显示计时
}
}
}
```
注:上述代码假设串口已经初始化完成。串口的初始化代码可以参考以下代码:
```c
void uart_init() //串口初始化
{
TMOD |= 0x20; //设置计时器1为模式2
TH1 = 0xfd; //设置计时器1初值
TL1 = 0xfd;
SCON = 0x50; //设置串口为模式1、允许接收
EA = 1; //开启总中断
ES = 1; //开启串口中断
TR1 = 1; //开启计时器1
}
void uart_isr() interrupt 4 //串口中断服务函数
{
if (RI) //有数据接收
{
RI = 0;
//处理接收到的数据
}
if (TI) //可以发送数据
{
TI = 0;
//发送数据
}
}
```
阅读全文