IIC总线设计⑥——时钟模块DS1302

2023-11-03

目录

一、模块介绍

(一)基本信息

(二)芯片信息及模块原理图

(1)芯片信息

(2)原理图

(三)指令格式及寄存器介绍

(1)指令格式

(2)寄存器介绍

(四)单字节传输时序(非突发模式)

二、程序控制

(一)ds1302.h

(二)ds1302.c

(1)GPIO初始化及DSIO管脚模式更改

(2)向DS1302指定寄存器写入一个字节数据

(3)从DS1302指定寄存器读一个字节数据

(4)设置时间

(5)读取时间,串口打印

(三)主函数

三、实验结果

(一)24小时制

(二)12小时制

四、开发过程遇到的问题

(一)时序问题

(二)DSIO数据管脚的模式问题


程序下载:

        32版本:https://pan.baidu.com/s/1kTgFImQ-TQM65AY-Gfns0w提取码:9534

        51版本:

一、模块介绍

(一)基本信息

①DS1302实时时钟能够计算2100年之前的秒、分、日、日期、星期、月、年,还有闰年的调整能力。

②内部含有31个字节静态RAM用于数据存储。

③采用串行数据传输方式,简单的SPI 3线接口

工作电压范围:2.0~5.5V

⑤工作电流:2.0V时,小于300nA。

⑥单字节或多字节(突发模式)读取或写入内存。

⑦采用主电源和备份电源双电源供应。备份电源可用电池供电。

⑧兼容DS1202 

DS1302 芯片包含一个实时时钟/日历和 31 字节的静态内存。它通过一个简单的串行接口与微处理器通信。实时时钟/日历提供秒、分钟、小时、星期、日期、月份和年份信息。自动调整少于 31 天的月份,包括闰年的更正。时钟带 AM/PM 指示器的 24 小时或 12 小时格式。使用同步串行通信简化了 DS1302 与微处理器的连接。与时钟/RAM 通信只需要三根线:(1) RST(复位),(2) I/O(数据线),(3) SCLK(串行时钟)。数据可以一次从RAM传输1个字节或最多 31 个字节,DS1302 旨在以极低功耗运行并保留数据和时钟信息。

(二)芯片信息及模块原理图

(1)芯片信息

引脚 功能
X1,X2 接32.768 kHz晶振
GND 电源地
RST

复位引脚,低电平有效

I/O 数据输入或输出
SCLK 串行时钟

Vcc1,Vcc2

Vcc1:备份电源,Vcc2:主要电源

RST管脚功能:

①打开控制逻辑,允许读写寄存器。

②可终止正在传输的数据。

(2)原理图

(三)指令格式及寄存器介绍

(1)指令格式

 Bit7:写保护位,为1时,芯片可写入数据;为0时,芯片不可写入数据。

 Bit6:为0时,指定对时钟/日历寄存器控制读写操作;为1时,RAM 区数据的控制读写操。

 Bit1~ Bit5:指定需要输入或输出的寄存器

 Bit0:读写控制,为0时,选择写,数据方向为输入;为1时,选择读,数据方向为输出。

(2)寄存器介绍

寄存器或RAM的地址及功能参考下图:

① 时钟/日历寄存器:上图第0~7个寄存器。

SEC寄存器:秒寄存器的位7被定义为时钟停止标志。当这个位被设置为逻辑1时,时钟振荡器停止,DS1302进入低功率待机模式,电流漏极小于100纳安。当此位被写入逻辑0时,时钟将启动。Bit4~Bit6存放秒数的十位,Bit0~Bit3存放秒数的个位。

HR寄存器:小时寄存器中的第7位被定义为12小时或24小时模式的选择位。当这个位被设置为逻辑1时,将选择12小时模式。在12小时模式下,Bit5是AM/PM位,逻辑高为PM,Bit0~Bit3存放小时数的个位,Bit5存放小时数的十位。在24小时模式下,Bit5是第二个10小时位(20-23小时),Bit0~Bit4存放0~19小时。

②CONTROL寄存器:控制寄存器,用作控制是否写保护。

③TRICKLE CHARGER

该寄存器控制着DS1302的涓流电荷特性。如下图简化原理图显示了滴流充电器的基本组件。

涓流充电器选择(TCS)位(位4-7)控制涓流充电器的选择。为了防止意外启用,只有1010的模式将启用涓流充电器。所有其他模式将禁用涓流充电器。DS1302开机时,禁用滴流充电器。二极管选择(DS)位(位2-3)选择在VCC2和VCC1之间是连接一个二极管还是两个二极管。如果DS为01,则选择一个二极管,或者如果DS为10,则选择两个二极管。如果DS为00或11,则涓流充电器将独立于TCS而被禁用。RS位(位0-1)选择连接在VCC2和VCC1之间的电阻器。电阻器选择(RS)位所选择的电阻器如下:

 如果RS为00,则将独立于TCS禁用涓流充电器

 ④CLOCK BURST或者RAM BURST寄存器

通过上图的CLOCK BURST或者RAM BURST两个寄存器来设置时钟寄存器的突发模式或者RAM寄存器的突发模式,当以突发模式写入时钟寄存器时,必须写入前八个寄存器,以便传输数据。但是,在以突发模式写入RAM时,不需要写入所有31个字节来传输数据。

(四)单字节传输时序(非突发模式)

 

 都是纳秒级的,写程序的时候我们微妙级延时就ok了。

二、程序控制

(一)ds1302.h

#ifndef __DS1302_H
#define	__DS1302_H

#include "stm32f10x.h"
#include "usart.h"
#include "delay.h"

#define DAY_AM 0x80 
#define DAY_PM 0xa0 


/*
程序修改说明:
	①若使用12小时制,请开启宏#define HOUR_12,关闭宏#define HOUR_24
			修改时间:需要注意的	
				DAY_AM:上午,DAY_PM:下午 0x11:11点
				#define HOUR	DAY_AM|0x11		//时,上午 | 11点
				#define HOUR	DAY_PM|0x11		//时,下午 | 11点
			
			若需要设置的时间为上午,请开启宏#define HOUR	DAY_AM|0x11,关闭宏#define HOUR	DAY_PM|0x11
			若需要设置的时间为下午,请开启宏#define HOUR	DAY_PM|0x11,关闭#define HOUR	DAY_AM|0x11
	②若使用24小时制,请开启宏#define HOUR_24,关闭宏#define HOUR_12
	
	程序编写:曾老师的熊同学
	完成时间:2022年-4月-26日
	程序功能:默认以24小时制读取时间数据
*/

//时间模式:12小时制、24小时制
//#define HOUR_12
#define HOUR_24

//新时间:2022年-4月-26日-23时-59分-55秒-星期2
//---存储格式是用BCD码---//
#define SEC		  0x55				//秒,55秒
#define MIN			0X59				//分,59分

#ifdef HOUR_12 //12小时制
	#define HOUR	DAY_AM|0x11		//时,上午 | 11点
//	#define HOUR	DAY_PM|0x11		//时,下午 | 11点
#endif

#ifdef HOUR_24 
#define HOUR		0X23				//时,24小时制,23点
#endif

#define DATE		0X26				//日,26日
#define MONTH		0X04				//月,4月
#define DAY			0X02				//星期,星期2
#define YEAR		0X22				//年,2022年


/* 定义SPI总线连接的GPIO端口*/
#define DS1302_GPIO_PORT	GPIOB										/* GPIO端口 */
#define DS1302_RCC_PORT 	RCC_APB2Periph_GPIOB		/* GPIO端口时钟 */
#define DS1302_DSIO_PIN		GPIO_Pin_5							/* 连接到DSIO时钟线的GPIO */
#define DS1302_RST_PIN		GPIO_Pin_6							/* 连接到RST数据线的GPIO */
#define DS1302_SCLK_PIN		GPIO_Pin_7							/* 连接到SCLK数据线的GPIO */

#define DS1302_DSIO_1()  GPIO_SetBits(DS1302_GPIO_PORT, DS1302_DSIO_PIN)		/* DSIO = 1 */
#define DS1302_DSIO_0()  GPIO_ResetBits(DS1302_GPIO_PORT, DS1302_DSIO_PIN)	/* DSIO = 0 */

#define DS1302_RST_1() 	 GPIO_SetBits(DS1302_GPIO_PORT, DS1302_RST_PIN)		/* RST = 1 */
#define DS1302_RST_0()   GPIO_ResetBits(DS1302_GPIO_PORT, DS1302_RST_PIN)	/* RST = 0 */

#define DS1302_SCLK_1()  GPIO_SetBits(DS1302_GPIO_PORT, DS1302_SCLK_PIN)		/* SCLK = 1 */
#define DS1302_SCLK_0()  GPIO_ResetBits(DS1302_GPIO_PORT, DS1302_SCLK_PIN)	/* SCLK = 0 */

#define DS1302_DSIO_READ()  GPIO_ReadInputDataBit(DS1302_GPIO_PORT, DS1302_DSIO_PIN)	/* 读DSIO口线状态 */

//时钟寄存器地址
#define SEC_REGISTER_ADDR		  0x80
#define MIN_REGISTER_ADDR			0x82
#define HR_REGISTER_ADDR			0x84
#define DATE_REGISTER_ADDR		0x86
#define MONTH_REGISTER_ADDR		0x88
#define DAY_REGISTER_ADDR			0x8a
#define YEAR_REGISTER_ADDR		0x8c
#define CONTROL_REGISTER_ADDR 0x8e


//存储时间数据
typedef struct
{
	uint8_t sec;			//秒
	uint8_t min;			//分
	uint8_t hour;			//时
	uint8_t date;			//日
	uint8_t mouth;		//月
	uint8_t week_day;	//星期
	uint16_t year;			//年
}DS1302_Data_TypeDef;
extern DS1302_Data_TypeDef DS1302_Source_Data;//源数据
extern DS1302_Data_TypeDef DS1302_Convert_Data;//转换后的数据

void DS1302_GPIO_Config(void);
void DS1302_Set_Time(void);
void DS1302_Read_Time(void);
#endif /* __DS1302_H */

(二)ds1302.c

(1)GPIO初始化及DSIO管脚模式更改

void DS1302_GPIO_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStruct;
	RCC_APB2PeriphClockCmd(DS1302_RCC_PORT,ENABLE);//使能B端口时钟
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
	GPIO_InitStruct.GPIO_Pin = DS1302_DSIO_PIN|DS1302_RST_PIN|DS1302_SCLK_PIN;//选择引脚
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz
	GPIO_Init(DS1302_GPIO_PORT,&GPIO_InitStruct);
	GPIO_SetBits(DS1302_GPIO_PORT,DS1302_DSIO_PIN|DS1302_RST_PIN|DS1302_SCLK_PIN);//初始化所有引脚为高电平
}

/*
 * 函数名:DS1302_Mode_IPU
 * 描述  :使DS1302_DSIO_PIN引脚变为上拉输入模式
 * 输入  :无
 * 输出  :无
 */
static void DS1302_Mode_IPU(void)
{
 	  GPIO_InitTypeDef GPIO_InitStructure;

	  	/*选择要控制的DS1302_PORT引脚*/	
	  GPIO_InitStructure.GPIO_Pin = DS1302_DSIO_PIN;

	   /*设置引脚模式为上拉输入模式*/ 
	  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU ; 

	  /*调用库函数,初始化DS1302_PORT*/
	  GPIO_Init(DS1302_GPIO_PORT, &GPIO_InitStructure);	 
}

/*
 * 函数名:DS1302_Mode_Out_PP
 * 描述  :使DS1302_DSIO_PIN引脚变为推挽输出模式
 * 输入  :无
 * 输出  :无
 */
static void DS1302_Mode_Out_PP(void)
{
 	GPIO_InitTypeDef GPIO_InitStructure;

	 	/*选择要控制的DS1302_PORT引脚*/															   
  	GPIO_InitStructure.GPIO_Pin = DS1302_DSIO_PIN;	

	/*设置引脚模式为通用推挽输出*/
  	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   

	/*设置引脚速率为50MHz */   
  	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

	/*调用库函数,初始化DS1302_PORT*/
  	GPIO_Init(DS1302_GPIO_PORT, &GPIO_InitStructure);	 	 
}

(2)向DS1302指定寄存器写入一个字节数据

/*
*********************************************************************************************************
*	函 数 名: DS1302_Write_Byte
*	功能说明: 向DS1302写入一个字节数据
*	形    参:addr:寄存器地址 dat:写入的数据
*	返 回 值: 无
*********************************************************************************************************
*/
static void DS1302_Write_Byte(uint8_t addr,uint8_t dat)
{
  uint8_t i;
	DS1302_RST_0();//复位管脚拉低
	DS1302_SCLK_0();//SCLK置低电平
	delay_us(10);
	DS1302_RST_1(); //然后将RST(CE)置高电平。
	delay_us(10);
	
	for (i=0; i<8; i++)
	{
		DS1302_SCLK_0();//数据在上升沿时,DS1302写入数据
		delay_us(10);
		if(addr & 0x01)DS1302_DSIO_1();//数据从低位开始传送			
		else DS1302_DSIO_0();			
		addr >>= 1;		
		DS1302_SCLK_1();//数据在上升沿时,DS1302读取数据
		delay_us(10);
	}
	
	for (i=0; i<8; i++)
	{
		DS1302_SCLK_0();//数据在上升沿时,DS1302写入数据
		delay_us(10);
		if(dat & 0x01)DS1302_DSIO_1();//数据从低位开始传送			
		else DS1302_DSIO_0();			
		dat >>= 1;		
		DS1302_SCLK_1();//数据在上升沿时,DS1302读取数据
		delay_us(10);
	}
	DS1302_SCLK_0();//SCLK置低电平
	delay_us(10);
	DS1302_RST_0();//复位管脚拉低,传送数据结束
	delay_us(10);
}

(3)从DS1302指定寄存器读一个字节数据

/*******************************************************************************
* 函 数 名         : DS1302_Read_Byte
* 函数功能         :读取一个地址的数据
* 输    入         : addr:寄存器地址
* 输    出         : dat:读取的数据
*******************************************************************************/
static uint8_t DS1302_Read_Byte(uint8_t addr)
{
	uint8_t i=0,dat=0,temp=0;
	
	DS1302_RST_0();//复位管脚拉低
	delay_us(10);
	DS1302_SCLK_0();//SCLK置低电平
	delay_us(10);
	DS1302_RST_1(); //然后将RST(CE)置高电平。
	delay_us(10);
		
	for (i=0; i<8; i++)
	{
		DS1302_SCLK_0();//数据在上升沿时,DS1302读取数据
		delay_us(10);
		if(addr & 0x01)DS1302_DSIO_1();//数据从低位开始传送			
		else DS1302_DSIO_0();			
		addr >>= 1;		
		DS1302_SCLK_1();//数据在上升沿时,DS1302写入数据
		delay_us(10);
	}
	DS1302_Mode_IPU();//将DS1302_DSIO管脚设置为上拉输入模式
	delay_us(10);

	for (i=0; i<8; i++)
	{	
		DS1302_SCLK_1();//在下降沿时,DS1302输出的数据
		delay_us(10);	
		DS1302_SCLK_0();//在下降沿时,DS1302输出的数据
		delay_us(10);
		temp = DS1302_DSIO_READ();//读取端口电平,从最低位开始接收		
		dat = (dat>>1) | (temp<<7);	
	}
	DS1302_Mode_Out_PP();//将DS1302_DSIO管脚设置为推挽输出模式
	DS1302_RST_0();//复位管脚拉低,传送数据结束.
	DS1302_SCLK_0();
	DS1302_DSIO_0();
	delay_us(10);
	return dat;	
}

(4)设置时间

/*******************************************************************************
* 函 数 名         : DS1302_Set_Time
* 函数功能		   	 	 : 设置DS1302时间
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void DS1302_Set_Time(void)
{
	DS1302_Write_Byte(CONTROL_REGISTER_ADDR,0X00);	//禁止写保护,就是关闭写保护功能
	DS1302_Write_Byte(SEC_REGISTER_ADDR,SEC);			//设置秒
	DS1302_Write_Byte(MIN_REGISTER_ADDR,MIN);			//设置分
	DS1302_Write_Byte(HR_REGISTER_ADDR,HOUR);			//设置时
	DS1302_Write_Byte(DATE_REGISTER_ADDR,DATE);		//设置日
	DS1302_Write_Byte(MONTH_REGISTER_ADDR,MONTH);	//设置月
	DS1302_Write_Byte(DAY_REGISTER_ADDR,DAY);			//设置星期
	DS1302_Write_Byte(YEAR_REGISTER_ADDR,YEAR);		//设置年
	DS1302_Write_Byte(CONTROL_REGISTER_ADDR,0x80);		 //打开写保护功能
	printf("DS1302 Set Time Success!");
}

(5)读取时间,串口打印

/*******************************************************************************
* 函 数 名         : DS1302_Read_Time
* 函数功能		   		 : 读取时钟信息
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void DS1302_Read_Time(void)
{
	DS1302_Source_Data.sec		=DS1302_Read_Byte(SEC_REGISTER_ADDR|0x01);			//秒
	DS1302_Source_Data.min		=DS1302_Read_Byte(MIN_REGISTER_ADDR|0x01);			//分
	DS1302_Source_Data.hour		=DS1302_Read_Byte(HR_REGISTER_ADDR|0x01); 				//时
	DS1302_Source_Data.date		=DS1302_Read_Byte(DATE_REGISTER_ADDR|0x01);			//日
	DS1302_Source_Data.mouth	=DS1302_Read_Byte(MONTH_REGISTER_ADDR|0x01);		//月
	DS1302_Source_Data.week_day		=DS1302_Read_Byte(DAY_REGISTER_ADDR|0x01);	//星期
	DS1302_Source_Data.year	= (uint16_t)DS1302_Read_Byte(YEAR_REGISTER_ADDR|0x01);			//年

	DS1302_Convert_Data.sec = ((DS1302_Source_Data.sec&0X70)>>4)*10+(DS1302_Source_Data.sec&0x0f);								//秒
	DS1302_Convert_Data.min = ((DS1302_Source_Data.min&0X70)>>4)*10+(DS1302_Source_Data.min&0x0f);                //分
	
#ifdef HOUR_24 
	DS1302_Convert_Data.hour = ((DS1302_Source_Data.hour&0X20)>>5)*20+(DS1302_Source_Data.hour&0x1f);             //24小时制
#endif
	
#ifdef HOUR_12 
	DS1302_Convert_Data.hour = ((DS1302_Source_Data.hour&0X10)>>4)*10+(DS1302_Source_Data.hour&0x0f);           //12小时制
#endif
	
	DS1302_Convert_Data.date = ((DS1302_Source_Data.date&0X70)>>4)*10+(DS1302_Source_Data.date&0x0f);             //日
	DS1302_Convert_Data.mouth = ((DS1302_Source_Data.mouth&0X70)>>4)*10+(DS1302_Source_Data.mouth&0x0f);          //月
	DS1302_Convert_Data.week_day = (DS1302_Source_Data.week_day&0x0f); //星期
	DS1302_Convert_Data.year = ((DS1302_Source_Data.year&0X70)>>4)*10+(DS1302_Source_Data.year&0x0f)+2000;             //年

#ifdef HOUR_24 
	printf("The time is: %d年 - %d月 - %d日 - %d时 - %d分 - %d秒 ,星期%d \r\n",DS1302_Convert_Data.year,\
																																	DS1302_Convert_Data.mouth,\
																																	DS1302_Convert_Data.date,\
																																	DS1302_Convert_Data.hour,\
																																	DS1302_Convert_Data.min,\
																																	DS1302_Convert_Data.sec,\
																																	DS1302_Convert_Data.week_day);
#endif
#ifdef HOUR_12
	if(DS1302_Source_Data.hour&0x20)
		printf("The time is: %d年 - %d月 - %d日 - PM: %d时 - %d分 - %d秒 ,星期%d \r\n", DS1302_Convert_Data.year,\
																																											DS1302_Convert_Data.mouth,\
																																											DS1302_Convert_Data.date,\
																																											DS1302_Convert_Data.hour,\
																																											DS1302_Convert_Data.min,\
																																											DS1302_Convert_Data.sec,\
																																											DS1302_Convert_Data.week_day);
	else
		printf("The time is: %d年 - %d月 - %d日 - AM: %d时 - %d分 - %d秒 ,星期%d \r\n", DS1302_Convert_Data.year,\
																																											DS1302_Convert_Data.mouth,\
																																											DS1302_Convert_Data.date,\
																																											DS1302_Convert_Data.hour,\
																																											DS1302_Convert_Data.min,\
																																											DS1302_Convert_Data.sec,\
																																											DS1302_Convert_Data.week_day);
#endif
	
}

(三)主函数

void Init(void)
{
	USART_Config();//串口初始化
	DS1302_GPIO_Config();
}


int main(void)
{
	Init();
	//DS1302_Set_Time();//设置时间,当完成时间设置后,请注释掉这一句,否则单片机每次上电或复位都会重新设置一下时间。
	while(1)
	{
		DS1302_Read_Time();//读取时间
		delay_ms(50);
	}	
}

三、实验结果

(一)24小时制

(二)12小时制

四、开发过程遇到的问题

(一)时序问题

读数据时,在时钟的下降沿时DS1302输出数据

 写数据时,或者写地址时,在时钟的上升沿时DS1302读取数据

(二)DSIO数据管脚的模式问题

在读取数据时,需要先发送寄存器的地址,发送完成后,此时需要将DSIO的推挽输出模式更改为(上拉输入、下拉输入、浮空输入任何一种,经检测3种模式都可以正常读取数据),数据读取完成后,需要将DSIO更改为原来的推挽输出模式,避免影响下一次写地址。

 以上就是DS1302的所有内容了,感谢大家阅读,文中若有错误,麻烦大家指出!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

IIC总线设计⑥——时钟模块DS1302 的相关文章

随机推荐

  • 哔哩哔哩前端笔试(卷1)

    文章目录 哔哩哔哩前端笔试 1 下面哪个网址和示例符合同源策略 2 关于DOMContentLoaded和load事件说法正确的是 3 如何在 div 容器里展示这几个字符 4 以下是哪一组全是块级元素 5 这个div里面最终的字体颜色是什
  • 常用颜色的RGB值及调色方法

    RGB值指某种颜色中的红 Red 绿 Green 蓝 Blue 成分 理论上讲红绿蓝三种基色按照不同的比例混合可以调配出任何一种颜色来 白色 rgb 255 255 255 黑色 rgb 0 0 0 灰色 rgb 128 128 128 红
  • Scrapy爬虫框架(实战篇)【Scrapy框架对接Splash抓取javaScript动态渲染页面】

    1 前言 动态页面 HTML文档中的部分是由客户端运行JS脚本生成的 即服务器生成部分HTML文档内容 其余的再由客户端生成 静态页面 整个HTML文档是在服务器端生成的 即服务器生成好了 再发送给我们客户端 这里我们可以观察一个典型的供我
  • Java实现QQ机器人

    Java实现QQ机器人 使用Java拦截QQ消息 回复消息 等等 酷Q java 实现 需要下载的文件 https pan baidu com s 13xvYG6VXr9Bj oJokVbJ9w 提取码 od38 解压后 添加上项目依赖 j
  • 如何进行Logstash logstash-input-jdbc插件的离线安装

    我们单位的服务器位于隔离区 不允许链接互联网 因此整理了在ELK集群上离线安装Logstash的jdbc input插件的方法 供大家参考 总体思路是需要一台中转的机器 这台机器需要能够访问互联网 先在这台机器中将需要安装的插件及依赖包制作
  • 2022网鼎杯青龙组签到题+crypto题解

    签到题 解题方法 百度搜答案即可 crypto 题目 小A鼓起勇气向女神索要电话号码 但女神一定要考考他 女神说她最近刚看了一篇发表于安全顶会USENIX Security 2021的论文 论文发现苹果AirDrop隔空投送功能的漏洞 该漏
  • numpy添加新的维度:newaxis

    numpy中包含的newaxis可以给原数组增加一个维度 np newaxis放的位置不同 产生的新数组也不同 一维数组 x np random randint 1 8 size 5 x Out 48 array 4 6 6 6 5 x1
  • 织梦dedecms系统后台添加新变量出现Request var not allow

    论坛上很多人都反馈说在后台添加新变量的时候会出现 Request var not allow 的BUG错误 本文主要就是介绍如何去解决这个问题 下面看具体操纵 在DEDE根目录打开 include common inc php 文件 查找到
  • python排序算法之基数排序

    代码如下 基数排序 1 把数据分为10个桶 以为数字有0 9这10个 2 依次把数据的个位 十位 百位等等各个位数的数据进行分桶排序 放在这10个桶中 3 最大的数有k位 则循环k次 4 时间复杂度O kn 空间复杂度O k n 其中k l
  • 自定义view-饼图

    效果图如下 看到上述view的效果 首先分析view有几部分组成 这里仅做练习 没有做适配 一 view的组成 1 由不同的扇形 2 各分类的线段 3 各分类的名字 1 绘制不同的扇形 这个比容易 首先要弄清楚0度是从哪个位值开始 andr
  • Unity3D_最简单的开始界面_结束界面

    Unity3D 最简单的开始界面 结束界面 开始界面 结束界面 开始界面 1 创建一个新的场景 添加button 2 C 脚本 LoadingGame cs using System Collections using System Col
  • org.springframework.web.multipart.MaxUploadSizeExceededException: Maximum upload size exceeded;

    报错信息 org springframework web multipart MaxUploadSizeExceededException Maximum upload size exceeded nested exception is j
  • Vue3全局挂载方法

    方式一 import createApp from vue import App from App vue import router from router const app createApp App app use router a
  • 超级多的yum源哦

    root registry cd etc yum repos d root registry yum repos d vim CentOS Base repo CentOS Base repo The mirror system uses
  • 10秒重启-shell脚本命令:

    bin sh if f reboottest sh then touch reboottest sh echo bin sh gt reboottest sh echo sleep 10 gt gt reboottest sh echo r
  • Doris数仓的4大特点

    01 极简架构 Doris从设计上来说 融合了Google Mesa的数据存储模型 Apache的ORCFile存储格式 Apache Impala查询引擎和MySQL交互协议 是一个拥有先进技术和先进架构的领先设计产品 如图1所示 图1
  • Tools

    代码 css 格式化工具 json 格式化 animate css Iconsfontawesome HTML validation 查询 css 属性 查询 px em pt 之间的转换 wap site 尽量不要固定用px 定死 比如f
  • 矩阵置零

    给定一个 m x n 的矩阵 如果一个元素为 0 则将其所在行和列的所有元素都设为 0 请使用原地算法 示例 1 输入 1 1 1 1 0 1 1 1 1 输出 1 0 1 0 0 0 1 0 1 示例 2 输入 0 1 2 0 3 4 5
  • 5:emmc response

    1 前言 response是由device发给host 作为对先前发送的command的回应 response通过cmd信号线传输 本文将详细介绍response相关 2 response的类型 response有6种类型 分别是R1 R1
  • IIC总线设计⑥——时钟模块DS1302

    目录 一 模块介绍 一 基本信息 二 芯片信息及模块原理图 1 芯片信息 2 原理图 三 指令格式及寄存器介绍 1 指令格式 2 寄存器介绍 四 单字节传输时序 非突发模式 二 程序控制 一 ds1302 h 二 ds1302 c 1 GP