51单片机当中DS1302读取和写入的函数

一、图解

 

二、代码部分

引脚定义

#include <REGX52.H>

//引脚定义
sbit DS1302_SCLK=P3^6;
sbit DS1302_IO=P3^4;
sbit DS1302_CE=P3^5;

函数部分

void DS1302_Init(void)
{
	DS1302_CE=0;    //根据上面的时序图得知可以先同时置为0
	DS1302_SCLK=0;
}

/**
  * @brief  DS1302写一个字节
  * @param  Command 命令字/地址
  * @param  Data 要写入的数据
  * @retval 无
  */
void DS1302_WriteByte(unsigned char Command,Data)
{
	unsigned char i;
	DS1302_CE=1;
	for(i=0;i<8;i++)
	{
		DS1302_IO=Command&(0x01<<i);
		DS1302_SCLK=1;
		DS1302_SCLK=0;
	}
	for(i=0;i<8;i++)
	{
		DS1302_IO=Data&(0x01<<i);
		DS1302_SCLK=1;
		DS1302_SCLK=0;
	}
	DS1302_CE=0;
}

/**
  * @brief  DS1302读一个字节
  * @param  Command 命令字/地址
  * @retval 读出的数据
  */
unsigned char DS1302_ReadByte(unsigned char Command)
{
	unsigned char i,Data=0x00;
	Command|=0x01;	//将指令转换为读指令
	DS1302_CE=1;
	for(i=0;i<8;i++)
	{
		DS1302_IO=Command&(0x01<<i);
		DS1302_SCLK=0;
		DS1302_SCLK=1;
	}
	for(i=0;i<8;i++)
	{
		DS1302_SCLK=1;
		DS1302_SCLK=0;
		if(DS1302_IO){Data|=(0x01<<i);}    //在这里很难理解,但是需要记住,当DS1302_IO为0的时候,那么就DATA这一位保持为0,如果不为0,那么就为1,所以就向寄存器当中写入了数据啦
	}
	DS1302_CE=0;·
	DS1302_IO=0;	//读取后将IO设置为0,否则读出的数据会出错
	return Data;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
51单片机可以通过与LCD1602液晶模块和DS1302实时时钟模块的连接来实现显示和时间功能。下面是一个简单的示例代码: ```c #include <reg52.h> #include <intrins.h> #define LCD1602_DB P0 sbit LCD1602_RS = P2^0; sbit LCD1602_RW = P2^1; sbit LCD1602_E = P2^2; void delay(unsigned int t) { while(t--); } void LCD1602_WriteCmd(unsigned char cmd) { LCD1602_RS = 0; LCD1602_RW = 0; LCD1602_DB = cmd; LCD1602_E = 1; _nop_(); _nop_(); LCD1602_E = 0; delay(100); } void LCD1602_WriteData(unsigned char dat) { LCD1602_RS = 1; LCD1602_RW = 0; LCD1602_DB = dat; LCD1602_E = 1; _nop_(); _nop_(); LCD1602_E = 0; delay(100); } void LCD1602_Init() { LCD1602_WriteCmd(0x38); // 设置显示模式为2行,5x7点阵 LCD1602_WriteCmd(0x0C); // 显示开,光标关闭 LCD1602_WriteCmd(0x06); // 光标右移,不移动显示 LCD1602_WriteCmd(0x01); // 清屏 } void LCD1602_DisplayString(unsigned char x, unsigned char y, unsigned char *str) { unsigned char addr; if (y == 0) addr = 0x80 + x; else addr = 0xC0 + x; LCD1602_WriteCmd(addr); while (*str != '\0') { LCD1602_WriteData(*str); str++; } } void DS1302_WriteByte(unsigned char dat) { unsigned char i; for (i = 0; i < 8; i++) { P2 = 0x00; P0 = dat & 0x01; P2 = 0x01; dat >>= 1; } } unsigned char DS1302_ReadByte() { unsigned char i, dat = 0; for (i = 0; i < 8; i++) { P2 = 0x00; _nop_(); _nop_(); dat >>= 1; if (P0 & 0x01) dat |= 0x80; P2 = 0x01; } return dat; } void DS1302_Write(unsigned char addr, unsigned char dat) { P2 = 0x80; DS1302_WriteByte(addr); DS1302_WriteByte(dat); P2 = 0x00; } unsigned char DS1302_Read(unsigned char addr) { unsigned char dat; P2 = 0x80; DS1302_WriteByte(addr); dat = DS1302_ReadByte(); P2 = 0x00; return dat; } void DS1302_SetTime(unsigned char year, unsigned char month, unsigned char day, unsigned char hour, unsigned char minute, unsigned char second) { DS1302_Write(0x8E, 0x00); // 关闭写保护 DS1302_Write(0x80, second); DS1302_Write(0x82, minute); DS1302_Write(0x84, hour); DS1302_Write(0x86, day); DS1302_Write(0x88, month); DS1302_Write(0x8C, year); DS1302_Write(0x8E, 0x80); // 打开写保护 } void DS1302_GetTime(unsigned char *year, unsigned char *month, unsigned char *day, unsigned char *hour, unsigned char *minute, unsigned char *second) { *second = DS1302_Read(0x81); *minute = DS1302_Read(0x83); *hour = DS1302_Read(0x85); *day = DS1302_Read(0x87); *month = DS1302_Read(0x89); *year = DS1302_Read(0x8D); } void main() { unsigned char year, month, day, hour, minute, second; unsigned char str[17]; LCD1602_Init(); DS1302_SetTime(21, 6, 1, 12, 0, 0); // 设置时间为2021年6月1日12时0分0秒 while (1) { DS1302_GetTime(&year, &month, &day, &hour, &minute, &second); sprintf(str, "%02x-%02x-%02x", year, month, day); LCD1602_DisplayString(0, 0, str); sprintf(str, "%02x:%02x:%02x", hour, minute, second); LCD1602_DisplayString(0, 1, str); delay(1000); } } ``` 这段代码实现了51单片机与LCD1602液晶模块和DS1302实时时钟模块的连接和操作。其中,LCD1602_WriteCmd和LCD1602_WriteData函数用于向LCD1602发送指令和数据,LCD1602_Init函数用于初始化LCD1602,LCD1602_DisplayString函数用于在LCD1602上显示字符串。DS1302_WriteByte和DS1302_ReadByte函数用于向DS1302写入字节和读取字节,DS1302_Write和DS1302_Read函数用于向DS1302写入数据读取数据DS1302_SetTime和DS1302_GetTime函数用于设置和获取DS1302的时间。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值