编写stc89c52单片机控制ds1302,lcd1602显示当前系统时间
时间: 2023-07-30 07:04:41 浏览: 130
好的,以下是基于STC89C52单片机控制DS1302和LCD1602显示系统时间的程序:
```
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit SCLK = P3^6;
sbit DSIO = P3^4;
sbit RST = P3^5;
sbit RS = P2^6;
sbit RW = P2^5;
sbit EN = P2^7;
uchar code table[] = "0123456789";
// DS1302时钟寄存器地址
uchar code RTC_ADDR[] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};
// DS1302初始化函数
void DS1302Init()
{
RST = 0;
_nop_();
_nop_();
RST = 1;
_nop_();
_nop_();
DSIO = 0;
SCLK = 0;
}
// DS1302写入一个字节
void DS1302WriteByte(uchar dat)
{
uchar i;
for (i = 0; i < 8; i++)
{
DSIO = dat & 0x01;
dat >>= 1;
SCLK = 1;
_nop_();
_nop_();
SCLK = 0;
}
}
// DS1302读取一个字节
uchar DS1302ReadByte()
{
uchar i, dat = 0;
for (i = 0; i < 8; i++)
{
dat >>= 1;
if (DSIO)
{
dat |= 0x80;
}
SCLK = 1;
_nop_();
_nop_();
SCLK = 0;
}
return dat;
}
// DS1302写入时间
void DS1302WriteTime(uchar *time)
{
uchar i;
DS1302WriteByte(0x8e);
for (i = 0; i < 7; i++)
{
DS1302WriteByte(time[i]);
}
}
// DS1302读取时间
void DS1302ReadTime(uchar *time)
{
uchar i;
DS1302WriteByte(0xbe);
for (i = 0; i < 7; i++)
{
time[i] = DS1302ReadByte();
}
}
// LCD1602写入命令
void LCD1602WriteCmd(uchar cmd)
{
RS = 0;
RW = 0;
P0 = cmd;
EN = 1;
_nop_();
_nop_();
EN = 0;
}
// LCD1602写入数据
void LCD1602WriteData(uchar dat)
{
RS = 1;
RW = 0;
P0 = dat;
EN = 1;
_nop_();
_nop_();
EN = 0;
}
// LCD1602初始化函数
void LCD1602Init()
{
LCD1602WriteCmd(0x38);
LCD1602WriteCmd(0x0c);
LCD1602WriteCmd(0x06);
LCD1602WriteCmd(0x01);
}
// 在LCD1602上显示时间
void LCD1602ShowTime(uchar *time)
{
uchar i;
LCD1602WriteCmd(0x80);
for (i = 2; i < 7; i++)
{
if (i == 4)
{
LCD1602WriteData(':');
}
LCD1602WriteData(table[time[i] >> 4]);
LCD1602WriteData(table[time[i] & 0x0f]);
}
}
// 主函数
void main()
{
uchar time[7];
DS1302Init();
LCD1602Init();
while (1)
{
DS1302ReadTime(time);
LCD1602ShowTime(time);
}
}
```
这个程序会不断地从DS1302读取当前时间,然后在LCD1602上显示出来。其中,`DS1302Init()`函数用于初始化DS1302,`DS1302WriteByte()`和`DS1302ReadByte()`函数用于向DS1302写入和读取数据,`DS1302WriteTime()`和`DS1302ReadTime()`函数用于写入和读取时间。`LCD1602Init()`函数用于初始化LCD1602,`LCD1602WriteCmd()`和`LCD1602WriteData()`函数用于向LCD1602写入命令和数据,`LCD1602ShowTime()`函数用于在LCD1602上显示时间。
阅读全文