基于c51单片机实现通过电脑串口向LCD1602发送时间并可以设置闹钟 的代码
时间: 2023-06-27 14:05:55 浏览: 102
LCD1602液晶显示DS1302时钟实验例程C51单片机KEIL工程源码文件.zip
5星 · 资源好评率100%
以下是基于C51单片机实现通过电脑串口向LCD1602发送时间并可以设置闹钟的代码。
```c
#include <REGX52.H>
#include <stdio.h>
#define LCD1602_DB P0
sbit LCD1602_RS = P2^6;
sbit LCD1602_RW = P2^5;
sbit LCD1602_E = P2^7;
unsigned char RecvData; // 串口接收数据
unsigned char RecvFlag; // 数据接收完成标志
unsigned char Hour, Min; // 时分
unsigned char HourSet, MinSet; // 时分设定值
unsigned char AlarmFlag; // 闹钟标志
void delay(unsigned int n) // 延时函数
{
unsigned int i;
while(n--)
{
for(i = 0; i < 114; i++);
}
}
void LCD1602_WriteCmd(unsigned char cmd) // 写指令函数
{
LCD1602_RS = 0;
LCD1602_RW = 0;
LCD1602_DB = cmd;
LCD1602_E = 1;
delay(5);
LCD1602_E = 0;
}
void LCD1602_WriteData(unsigned char dat) // 写数据函数
{
LCD1602_RS = 1;
LCD1602_RW = 0;
LCD1602_DB = dat;
LCD1602_E = 1;
delay(5);
LCD1602_E = 0;
}
void LCD1602_Init() // 初始化函数
{
LCD1602_WriteCmd(0x38);
delay(5);
LCD1602_WriteCmd(0x38);
delay(5);
LCD1602_WriteCmd(0x38);
delay(5);
LCD1602_WriteCmd(0x0C);
delay(5);
LCD1602_WriteCmd(0x06);
delay(5);
LCD1602_WriteCmd(0x01);
delay(5);
}
void LCD1602_ShowTime() // 显示时间函数
{
unsigned char str[16];
sprintf(str, "Time: %02d:%02d", Hour, Min);
LCD1602_WriteCmd(0x80);
for(int i = 0; i < 12; i++)
{
LCD1602_WriteData(str[i]);
}
}
void Serial_Init() // 串口初始化函数
{
TMOD = 0x20;
TH1 = 0xFD;
TL1 = 0xFD;
TR1 = 1;
SM0 = 0;
SM1 = 1;
REN = 1;
EA = 1;
ES = 1;
}
void Serial_ISR() interrupt 4 using 1 // 串口中断函数
{
if(RI == 1)
{
RI = 0;
RecvData = SBUF;
RecvFlag = 1;
}
}
void main()
{
LCD1602_Init();
Serial_Init();
Hour = 0;
Min = 0;
AlarmFlag = 0;
while(1)
{
if(RecvFlag == 1) // 接收到数据
{
RecvFlag = 0;
if(RecvData == 'A') // 设定闹钟
{
AlarmFlag = 1;
}
else if(RecvData == 'H') // 设定小时
{
while(1)
{
LCD1602_WriteCmd(0x80);
LCD1602_WriteData('S');
LCD1602_WriteData('e');
LCD1602_WriteData('t');
LCD1602_WriteData(' ');
LCD1602_WriteData('H');
LCD1602_WriteData('o');
LCD1602_WriteData('u');
LCD1602_WriteData('r');
LCD1602_WriteData(':');
LCD1602_WriteData(HourSet / 10 + '0');
LCD1602_WriteData(HourSet % 10 + '0');
if(RecvFlag == 1)
{
RecvFlag = 0;
if(RecvData >= '0' && RecvData <= '9')
{
HourSet = (HourSet % 10) * 10 + RecvData - '0';
LCD1602_WriteData(HourSet % 10 + '0');
}
else if(RecvData == '\r') // 回车键确认
{
Hour = HourSet;
break;
}
}
}
}
else if(RecvData == 'M') // 设定分钟
{
while(1)
{
LCD1602_WriteCmd(0x80);
LCD1602_WriteData('S');
LCD1602_WriteData('e');
LCD1602_WriteData('t');
LCD1602_WriteData(' ');
LCD1602_WriteData('M');
LCD1602_WriteData('i');
LCD1602_WriteData('n');
LCD1602_WriteData(':');
LCD1602_WriteData(MinSet / 10 + '0');
LCD1602_WriteData(MinSet % 10 + '0');
if(RecvFlag == 1)
{
RecvFlag = 0;
if(RecvData >= '0' && RecvData <= '9')
{
MinSet = (MinSet % 10) * 10 + RecvData - '0';
LCD1602_WriteData(MinSet % 10 + '0');
}
else if(RecvData == '\r') // 回车键确认
{
Min = MinSet;
break;
}
}
}
}
}
if(AlarmFlag == 1 && Hour == HourSet && Min == MinSet) // 到达设定时间
{
LCD1602_WriteCmd(0xC0);
LCD1602_WriteData('A');
LCD1602_WriteData('l');
LCD1602_WriteData('a');
LCD1602_WriteData('r');
LCD1602_WriteData('m');
LCD1602_WriteData('!');
while(1); // 停止程序
}
LCD1602_ShowTime(); // 显示时间
delay(500);
Min++;
if(Min == 60)
{
Min = 0;
Hour++;
if(Hour == 24)
{
Hour = 0;
}
}
}
}
```
以上代码实现了通过电脑串口向LCD1602发送时间,并可以设置闹钟。具体实现过程如下:
1. 定义LCD1602相关的IO口和函数,包括写指令函数、写数据函数、初始化函数和显示时间函数。
2. 定义串口相关的变量和函数,包括串口接收数据、数据接收完成标志、串口初始化函数和串口中断函数。
3. 在主函数中初始化LCD1602和串口,并设置当前时间为0点0分,闹钟标志为0。
4. 进入主循环,判断是否接收到串口数据。如果接收到'A',则设定闹钟标志为1;如果接收到'H',则进入设定小时的循环,通过串口输入小时值并确认后更新当前时间的小时值;如果接收到'M',则进入设定分钟的循环,通过串口输入分钟值并确认后更新当前时间的分钟值。
5. 每次循环中判断当前时间是否到达设定的闹钟时间,如果到达则在LCD1602上显示警报信息,停止程序。
6. 每次循环中显示当前时间,并延时500ms。每经过60个循环,分钟值加1,如果分钟值为60则小时值加1,如果小时值为24则小时值归0。
阅读全文