STC89S51单片机 DS1302时钟显示在LCD液晶屏幕上

STC89S51单片机 DS1302时钟显示在LCD液晶屏幕上

1.根据时序图和单字节读写 写读写程序

在这里插入图片描述
在这里插入图片描述

void ds1302write(uchar addr, uchar dat)//写入函数
{
   
   //要读2次 一次读地址 一次读数据
	uchar n;
	RST = 0;//可以看到CE先置0 延时一会后再置1
	_nop_();
	SCLK = 0;//开始先置0
	_nop_();
	RST = 1; //
	_nop_();
   //读地址
	for (n=0; n<8; n++)//
	{
   
      //下降沿时  ds1302会自动把数据放到IO口上
		DSIO = addr & 0x01;//取最低位 然后右移 8次 读取8位
		addr >>= 1;
		SCLK = 1;//然后产生时钟信号开始读取
		_nop_();
		SCLK = 0;
		_nop_();
	}
   //读数据
	for (n=0; n<8; n++)//
	{
   
		DSIO = dat & 0x01;//同上
		dat >>= 1;
		SCLK = 1;//
		_nop_();
		SCLK = 0;
		_nop_();	
	}	
	//最后置0
	RST = 0;
	_nop_();
}
//从keli复制过来是注释是乱码 就不重新写了 同上
unsigned char ds1302read(unsigned char addr)8//读函数
{
   
	uchar n,dat,dat1;
	RST = 0;
	_nop_();

	SCLK = 0_nop_();
	RST = 1;//
	_nop_();

	for(n=0; n<8; n++)//
	{
   
		DSIO = addr & 0x01;//
		addr >>= 1
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,以下是基于STC89C52单片机控制DS1302LCD1602显示系统时间的程序: ``` #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上显示时间。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值