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

本文介绍了使用STC89S51单片机,结合DS1302实时时钟模块,将时间显示在LCD液晶屏幕上的过程。内容包括根据时序图编写读写程序,DS1302的初始化和数据读取,以及LCD液晶显示器的相关代码。程序中包含main函数,并提供了展示视频。
摘要由CSDN通过智能技术生成

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;
		SCLK = 1;//
		_nop_();
		SCLK = 0;
		_nop_();//
	}
	_nop_();
	for(n=0; n<8; n++)//
	{
		dat1 = DSIO;
		dat = (dat>>1) | (dat1<<7);
		SCLK = 1;
		_nop_();
		SCLK = 0;//
		_nop_();
	}

	RST = 0;
	_nop_();
	//
	SCLK = 1;
	_nop_();
	DSIO = 0;
	_nop_();
	DSIO = 1;
	_nop_();
	return dat;	
}

2. DS1302初始化函数和读取DS1302里面的数据 第一个是程序需要的一些量

#include "clock.h"
#define LCD1602_DATAPINS P0
uchar i,j;
uchar date[16]="date:20  :  :   ";
uchar time2[16]="time:  :  :     ";

sbit LCD1602_E=P2^7;
sbit LCD1602_RW=P2^5;
sbit LCD1602_RS=P2^6;
uchar code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d}; 
uchar code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};
uchar TIME[7] = {0, 0x33, 0x11, 0x30, 0x03, 0x06, 0x23};
unsigned char dis_code[]={0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f};
sbit DSIO=P3^4;
sbit RST=P3^5;
sbit SCLK=P3^6;
void Ds1302Init()//初始化
{
	uchar n;
	ds1302write(0x8E,0x00);		//禁止写保护
	for (n=0; n<7; n++)//
	{
		ds1302write(WRITE_RTC_ADDR[n],TIME[n]);//写入一个初始时间 可以自己定
	}
	ds1302write(0x8E,0x80);		//´打开写保护
}

void Ds1302ReadTime()
{
	uchar n;
	for (n=0; n<7; n++)
	{
		TIME[n] = ds1302read(READ_RTC_ADDR[n]);//把读到的数据放到TIME里面
	}	
}

3. DS1302基本完毕 再是关于LCD液晶显示器相关代码

代码注释都乱码了 具体的可以百度lcd如何写

void LcdInit()						  
{
 	LcdWriteCom(0x38);//设置 8 位格式,2 行,5x7 
   LcdWriteCom(0x0c);//整体显示,关光标,不闪烁
   LcdWriteCom(0x06);//设定输入方式,增量不移位
   LcdWriteCom(0x01);//清除屏幕显示
}

void LcdcheckBuzy()//检查LCD是否忙
{
	uchar sta;
	do{
	LCD1602_DATAPINS=0xff;
	LCD1602_E=0;
	LCD1602_RS=0;
	LCD1602_RW=1;
	LCD1602_E=1;
	sta=LCD1602_DATAPINS;
	}while(sta&0x80);
	LCD1602_E=0;
}

void LcdWriteData(uchar dat)		
{
	LcdcheckBuzy();
	LCD1602_E = 0;	//
	LCD1602_RS = 1;	//
	LCD1602_RW = 0;	//

	LCD1602_DATAPINS = dat; //
 
	LCD1602_E = 1;  //
  _nop_();	
	LCD1602_E = 0;
}

void LcdWriteCom(uchar com)
{
	LcdcheckBuzy();
	LCD1602_E = 0; //
	LCD1602_RS = 0;	  //
	LCD1602_RW = 0;	//
	LCD1602_DATAPINS = com;//
	LCD1602_E = 1;	      //
	nop_();	
	LCD1602_E = 0;
}

void string(uchar ad, uchar *s)
{
	LcdWriteCom(ad);
	while(*s>0)
	{
		LcdWriteData(*s++);
	}
}

4.void main主函数

void main()
{
	LcdInit();//³õʼ»¯Ê±lcd
	Ds1302Init();//³õʼ»¯Ê±ÖÓ
	while(1)
	{
		Ds1302ReadTime();//读取时间
		showTimeandDate();//显示时间到lcd
	}
}

void showTimeandDate()
{
	date[7]=((TIME[6]/16)+'0');//
	date[8]=((TIME[6]&0x0f)%10+'0');//
	date[10]=((TIME[4]/16)+'0');//
	date[11]=((TIME[4]&0x0f)%10+'0');//
	date[13]=((TIME[3]/16)+'0');//
	date[14]=((TIME[3]&0x0f)%10+'0');//
	time2[5]=TIME[2]/16+'0';//
	time2[6]=(TIME[2]&0x0f)%10+'0';//
	time2[8]=TIME[1]/16+'0';//
	time2[9]=(TIME[1]&0x0f)%10+'0';//
	time2[11]=TIME[0]/16+'0';//
	time2[12]=(TIME[0]&0x0f)%10+'0';//
	string(0x80,date);
	string(0xc0,time2);
}

5.展示视频

VID_20230411_173807

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值