精华内容
下载资源
问答
  • 模块化开发怎么?

    千次阅读 2018-08-09 16:59:33
    模块就是一个有特定功能的文件,我们可以通过加载这些模块得到特定的功能 2. 模块化开发就是js的功能分离,通过需求引入不同的文件 3. 模块化开发可以使代码耦合度降低,避免代码多次在页面出现,他最大的作用就是...

    问题网址 : http://bbs.daxiangclass.com/?thread-268.htm

    模块化开发

    首先我们要知道什么是模块化开发?
    1. 模块就是一个有特定功能的文件,我们可以通过加载这些模块得到特定的功能
    2. 模块化开发就是js的功能分离,通过需求引入不同的文件
    3. 模块化开发可以使代码耦合度降低,避免代码多次在页面出现,他最大的作用就是重用
    模块开发要遵循的规范
    1. AMD规范也叫异步模块加载规范,在这个规范下模块会异步加载,不影响后面语句的执行,我们可以使用define定义模块,使用require调用模块
    2. CommonJS规范是服务器端模块的规范,node.js就采用了这个规范,每个模块都有一个单独的作用域,模块内部的变量无法被其他模块读取,除非定义为global的对象和属性
    3. CMD规范通用模块定义.CMD是按需加载,一个模块就是一个文件

    展开全文
  • ESP8266 WIFI串口通信模块应该是使用最广泛的一种WIFI模块之一了。为什么呢? 因为ESP8266模块是一款高性能的WIFI串口模块,可以不用知道太多WIFI相关知识就可以很好的上手。说白了,只是个WIFI转串口的设备,你...

    物联网,万物互联。这里涉及到的最基本的东西就是如何将所有的物联网设备连接在一起。最简单、最广泛使用的就是互联网。

    ESP8266 WIFI串口通信模块应该是使用最广泛的一种WIFI模块之一了。为什么呢?

    因为ESP8266模块是一款高性能的WIFI串口模块,可以不用知道太多WIFI相关知识就可以很好的上手。说白了,只是个WIFI转串口的设备,你只要知道串口怎么编程使用,就可以了,实现了所谓的透明传输。

    但是就是这么一个很常见的模块,网上很多的博客写的都是错的,或者都是很不详细的。

     

    模块名称:ESP8266 WIFI串口通信模块

    参考资料:ESP8266 WIFI串口通信模块官方资源ATK-ESP8266资源包(提取码: nhsh)

    知识储备:【STM32】串口通信基本原理(超基础、详细版)

    其他模块:USB转TTL模块

    项目下载链接:见本文文末

     

    WIFI模块的调试

    准备工作

    USB转TTL模块与ESP8266 WIFI模块的接线:

    现在市面上使用比较的ESP8266有两个版本,分别是官方的ESP8266(两排8引脚)、ATK-ESP8266(一排6引脚)。其实并没有太大的区别,只是将其中的一些引脚进行额外布局而已。

    如果是官方的ESP8266模块,接线方式如下:

    如果是ATK-ESP8266(正点原子)模块,接线方式如下:

    这六个引脚只需要4个就行了:RXD、TXD、GND、VCC,分别和USB转TTL模块的TXD、RXD、GND、VCC相连接就行了。

    需要注意两点:

    1、ESP8266的RXD(数据的接收端)需要连接USB转TTL模块的TXD,TXD(数据的发送端)需要连接USB转TTL模块的RXD,这是基本的;

    2、关于VCC的选取,在USB转TTL模块上有3.3V和5V两个引脚可以作为VCC,但是一般选取5V作为VCC。如果选取3.3V,可能会因为供电不足而引起不断的重启,从而不停的复位。

    AT指令

    在使用USB转TTL模块与电脑连接之后,就可以使用串口调试助手进行WIFI模块的调试了。首先有一点,AT指令不区分大小写,均以回车、换行结尾。下面介绍常用的AT指令:

    常用AT指令
    指令名响应含义
    ATOK测试指令
    AT+CWMODE=<mode>OK设置应用模式(需重启生效)
    AT+CWMODE?+CWMODE:<mode>获得当前应用模式
    AT+CWLAP+CWLAP:<ecn>,<ssid>,<rssi>返回目前的AP列表
    AT+CWJAP=<ssid>,<pwd>OK加入某一AP
    AT+CWJAP?+CWJAP:<ssid>返回当前加入的AP
    AT+CWQAPOK退出当前加入的AP
    AT+CIPSTART=<type>,<addr>,<port>OK建立TCP/UDP连接
    AT+CIPMUX=<mode>OK是否启用多连接
    AT+CIPSEND=<param>OK发送数据
    AT+CIPMODE=<mode>OK是否进入透传模式

    需要补充几点:

    1、ESP8266的应用模式:ESP266支撑单AP模式、单STA模式和混合模式。简单的来说就是:

    • AP:可以将ESP8266作为热点,可以让其他的设备连接上它;
    • STA:可以连接上当前环境下的WIFI热点。

    2、什么是透传模式?

    透传就是指不需要关心wifi协议是如何实现的。所需要做的就是A通过串口发数据,B通过串口收数据,整个过程中A串口和B串口就像是用导线直接连接起来了一样。则对于开发人员来看,就是完全透明的。

    更简单地理解就是:

    如果不开启透传模式,我们怎么发送数据呢?在每次发送数据前都必须先发送指令AT+CIPSEND=<param>,例如:

    AT+CIPSEND=4
    
    OK
    >                //在 > 后面输入要上传的数据

    但是一旦开启了透传模式,我们就不需要在每次发送数据前都发送指令AT+CIPSEND=<param>了,只需要发送一次AT+CIPSEND,之后发送的所有内容全部当成是数据了!

    但是这也存在一个问题,要是我后来又想发送命令了,但是却也当成是数据发送过去了。这可怎么办?

    这就要退出透传模式了。怎么退出,发送数据"+++"就可以了。注意:此时“+++”后面,不接“发送新行”!

     

    WIFI模块的使用

    ESP8266的一般使用顺序

    这里的“一般”指的是:ESP8266连接当前环境的热点,与服务器建立TCP连接,传输数据。

    1. AT+CWMODE=1:设置工作模式(STA模式)
    2. AT+RST:模块重启(生效工作模式)
    3. AT+CWJAP="111","11111111":连接当前环境的WIFI热点(热点名,密码)
    4. AT+CIPMUX=0:设置单路连接模式
    5. AT+CIPSTART="TCP","xxx.xxx.xxx.xxx",xxxx:建立TCP连接
    6. AT+CIPMODE=1:开启透传模式
    7. AT+CIPSEND:透传模式下,传输数据
    8. +++:退出透传模式

    ESP8266的封装代码

    关于与单片机的引脚连接:ESP8266与USART3(引脚PB10、PB11)连接。

    首先是USART的配置:

    #include "delay.h"
    #include "usart3.h"
    #include "stdarg.h"	 	 
    #include "stdio.h"	 	 
    #include "string.h"	 
    #include "timer.h" 
    
    //串口接收缓存区 	
    u8 USART3_RX_BUF[USART3_MAX_RECV_LEN]; 				//接收缓冲,最大USART3_MAX_RECV_LEN个字节.
    u8  USART3_TX_BUF[USART3_MAX_SEND_LEN]; 			//发送缓冲,最大USART3_MAX_SEND_LEN字节
    
    //通过判断接收连续2个字符之间的时间差不大于10ms来决定是不是一次连续的数据.
    //如果2个字符接收间隔超过10ms,则认为不是1次连续数据.也就是超过10ms没有接收到
    //任何数据,则表示此次接收完毕.
    //接收到的数据状态
    //[15]:0,没有接收到数据;1,接收到了一批数据.
    //[14:0]:接收到的数据长度
    vu16 USART3_RX_STA=0;   	
    
    
    void USART3_IRQHandler(void)
    {
    	u8 res;	      
    	if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)//接收到数据
    	{	 
    		res =USART_ReceiveData(USART3);		 
    		if((USART3_RX_STA&(1<<15))==0)//接收完的一批数据,还没有被处理,则不再接收其他数据
    		{ 
    			if(USART3_RX_STA<USART3_MAX_RECV_LEN)	//还可以接收数据
    			{
    				TIM_SetCounter(TIM7,0);//计数器清空          				//计数器清空
    				if(USART3_RX_STA==0) 				//使能定时器7的中断 
    				{
    					TIM_Cmd(TIM7,ENABLE);//使能定时器7
    				}
    				USART3_RX_BUF[USART3_RX_STA++]=res;	//记录接收到的值	 
    			}else 
    			{
    				USART3_RX_STA|=1<<15;				//强制标记接收完成
    			} 
    		}
    	}  				 											 
    }   
    
    
    //初始化IO 串口3
    //pclk1:PCLK1时钟频率(Mhz)
    //bound:波特率	  
    void usart3_init(u32 bound)
    {  
    
    	NVIC_InitTypeDef NVIC_InitStructure;
    	GPIO_InitTypeDef GPIO_InitStructure;
    	USART_InitTypeDef USART_InitStructure;
    
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);	// GPIOB时钟
    	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE); //串口3时钟使能
    
     	USART_DeInit(USART3);  //复位串口3
    		 //USART3_TX   PB10
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PB10
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//复用推挽输出
      GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化PB10
       
        //USART3_RX	  PB11
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
      GPIO_Init(GPIOB, &GPIO_InitStructure);  //初始化PB11
    	
    	USART_InitStructure.USART_BaudRate = bound;//波特率一般设置为9600;
    	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
    	USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
    	USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
    	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
    	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//收发模式
      
    	USART_Init(USART3, &USART_InitStructure); //初始化串口	3
      
    
    	USART_Cmd(USART3, ENABLE);                    //使能串口 
    	
    	//使能接收中断
      USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//开启中断   
    	
    	//设置中断优先级
    	NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
    	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;//抢占优先级3
    	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		//子优先级3
    	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
    	NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器
    	
    	
    	TIM7_Int_Init(1000-1,7200-1);		//10ms中断
    	USART3_RX_STA=0;		//清零
    	TIM_Cmd(TIM7,DISABLE);			//关闭定时器7
    
    }
    
    //串口3,printf 函数
    //确保一次发送数据不超过USART3_MAX_SEND_LEN字节
    void u3_printf(char* fmt,...)  
    {  
    	u16 i,j; 
    	va_list ap; 
    	va_start(ap,fmt);
    	vsprintf((char*)USART3_TX_BUF,fmt,ap);
    	va_end(ap);
    	i=strlen((const char*)USART3_TX_BUF);		//此次发送数据的长度
    	for(j=0;j<i;j++)							//循环发送数据
    	{
    	  while(USART_GetFlagStatus(USART3,USART_FLAG_TC)==RESET); //循环发送,直到发送完毕   
    		USART_SendData(USART3,USART3_TX_BUF[j]); 
    	} 
    }

    由于在USART3中是通过判断接收连续2个字符之间的时间差不大于10ms来决定是不是一次连续的数据,而10ms怎么定呢?通过定时器来的,所以我们需要开启定时器:

    #include "timer.h"
    
    extern vu16 USART3_RX_STA;
    
    //定时器7中断服务程序		    
    void TIM7_IRQHandler(void)
    { 	
    	if (TIM_GetITStatus(TIM7, TIM_IT_Update) != RESET)//是更新中断
    	{	 			   
    		USART3_RX_STA|=1<<15;	//标记接收完成
    		TIM_ClearITPendingBit(TIM7, TIM_IT_Update  );  //清除TIM7更新中断标志    
    		TIM_Cmd(TIM7, DISABLE);  //关闭TIM7 
    	}	    
    }
     
    //通用定时器7中断初始化,这里时钟选择为APB1的2倍
    //arr:自动重装值 psc:时钟预分频数
    //定时器溢出时间计算方法:Tout=((arr+1)*(psc+1))/Ft us.
    //Ft=定时器工作频率,单位:Mhz 
    //通用定时器中断初始化 
    void TIM7_Int_Init(u16 arr,u16 psc)
    {	
    	NVIC_InitTypeDef NVIC_InitStructure;
    	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    
    	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM7, ENABLE);//TIM7时钟使能    
    	
    	//定时器TIM7初始化
    	TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值	
    	TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
    	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
    	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
    	TIM_TimeBaseInit(TIM7, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
     
    	TIM_ITConfig(TIM7,TIM_IT_Update,ENABLE ); //使能指定的TIM7中断,允许更新中断
    	
    	TIM_Cmd(TIM7,ENABLE);//开启定时器7
    	
    	NVIC_InitStructure.NVIC_IRQChannel = TIM7_IRQn;
    	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0 ;//抢占优先级0
    	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;		//子优先级2
    	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
    	NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器
    	
    }

    这两个都完成了之后,就可以向ESP8266传输数据了:

    #include "esp8266.h"
    #include "string.h"
    #include "usart.h"
    #include "usart3.h"
    #include "stm32f10x.h"
    #include "sys.h" 
    #include "delay.h"
    
    //ESP8266模块和PC进入透传模式
    void esp8266_start_trans(void)
    {
    	//设置工作模式 1:station模式   2:AP模式  3:兼容 AP+station模式
    	esp8266_send_cmd("AT+CWMODE=1","OK",50);
    	
    	//让Wifi模块重启的命令
    	esp8266_send_cmd("AT+RST","ready",20);
    	
    	delay_ms(1000);         //延时3S等待重启成功
    	delay_ms(1000);
    	delay_ms(1000);
    	delay_ms(1000);
    	
    	//让模块连接上自己的路由
    	while(esp8266_send_cmd("AT+CWJAP=\"111\",\"11111111\"","WIFI GOT IP",600));
    	
    	//=0:单路连接模式     =1:多路连接模式
    	esp8266_send_cmd("AT+CIPMUX=0","OK",20);
    	
    	//建立TCP连接  这四项分别代表了 要连接的ID号0~4   连接类型  远程服务器IP地址   远程服务器端口号
    	while(esp8266_send_cmd("AT+CIPSTART=\"TCP\",\"xxx.xxx.xxx.xxx\",xxxx","CONNECT",200));
    	
    	//是否开启透传模式  0:表示关闭 1:表示开启透传
    	esp8266_send_cmd("AT+CIPMODE=1","OK",200);
    	
    	//透传模式下 开始发送数据的指令 这个指令之后就可以直接发数据了
    	esp8266_send_cmd("AT+CIPSEND","OK",50);
    }
    
    //ESP8266退出透传模式   返回值:0,退出成功;1,退出失败
    //配置wifi模块,通过想wifi模块连续发送3个+(每个+号之间 超过10ms,这样认为是连续三次发送+)
    u8 esp8266_quit_trans(void)
    {
    	u8 result=1;
    	u3_printf("+++");
    	delay_ms(1000);					//等待500ms太少 要1000ms才可以退出
    	result=esp8266_send_cmd("AT","OK",20);//退出透传判断.
    	if(result)
    		printf("quit_trans failed!");
    	else
    		printf("quit_trans success!");
    	return result;
    }
    
    
    //向ESP8266发送命令
    //cmd:发送的命令字符串;ack:期待的应答结果,如果为空,则表示不需要等待应答;waittime:等待时间(单位:10ms)
    //返回值:0,发送成功(得到了期待的应答结果);1,发送失败
    u8 esp8266_send_cmd(u8 *cmd,u8 *ack,u16 waittime)
    {
    	u8 res=0; 
    	USART3_RX_STA=0;
    	u3_printf("%s\r\n",cmd);	//发送命令
    	if(ack&&waittime)		//需要等待应答
    	{
    		while(--waittime)	//等待倒计时
    		{
    			delay_ms(10);
    			if(USART3_RX_STA&0X8000)//接收到期待的应答结果
    			{
    				if(esp8266_check_cmd(ack))
    				{
    					printf("ack:%s\r\n",(u8*)ack);
    					break;//得到有效数据 
    				}
    					USART3_RX_STA=0;
    			} 
    		}
    		if(waittime==0)res=1; 
    	}
    	return res;
    } 
    
    
    //ESP8266发送命令后,检测接收到的应答
    //str:期待的应答结果
    //返回值:0,没有得到期待的应答结果;其他,期待应答结果的位置(str的位置)
    u8* esp8266_check_cmd(u8 *str)
    {
    	char *strx=0;
    	if(USART3_RX_STA&0X8000)		//接收到一次数据了
    	{ 
    		USART3_RX_BUF[USART3_RX_STA&0X7FFF]=0;//添加结束符
    		strx=strstr((const char*)USART3_RX_BUF,(const char*)str);
    	} 
    	return (u8*)strx;
    }
    
    //向ESP8266发送数据
    //cmd:发送的命令字符串;waittime:等待时间(单位:10ms)
    //返回值:发送数据后,服务器的返回验证码
    u8* esp8266_send_data(u8 *cmd,u16 waittime)
    {
    	char temp[5];
    	char *ack=temp;
    	USART3_RX_STA=0;
    	u3_printf("%s",cmd);	//发送命令
    	if(waittime)		//需要等待应答
    	{
    		while(--waittime)	//等待倒计时
    		{
    			delay_ms(10);
    			if(USART3_RX_STA&0X8000)//接收到期待的应答结果
    			{
    				USART3_RX_BUF[USART3_RX_STA&0X7FFF]=0;//添加结束符
    				ack=(char*)USART3_RX_BUF;
    				printf("ack:%s\r\n",(u8*)ack);
    				USART3_RX_STA=0;
    				break;//得到有效数据 
    			} 
    		}
    	}
    	return (u8*)ack;
    } 

    最后是主程序:

    #include "delay.h"
    #include "sys.h"
    #include "usart.h"
    #include "usart3.h"
    #include "esp8266.h"
    #include "string.h"
    #include "timer.h"
     
    /*
    项目的主要内容:STM32配合ESP8266模块与服务器数据交互
    
    ESP8266的连接:USART3(PB10、PB11)
    
    如何判断数据接收完全?
    1、出现了换行符;
    2、如果超过10ms了都没有下一条数据(TIM7来进行10ms的定时)。
    */
    
    
     int main(void)
     {		
    	delay_init();	    	 			//延时函数初始化	  
    	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 			//设置NVIC中断分组2:2位抢占优先级,2位响应优先级
    	uart_init(115200);	 				//串口初始化为115200
    	usart3_init(115200);	 				//串口初始化为115200
    
    	esp8266_start_trans();							//esp8266进行初始化
    	 
    	esp8266_send_data("12",50);
    	 
    	esp8266_quit_trans();
    
     	while(1)
    	{
    		
    	}
     }

    完整项目链接:

    百度云盘链接: https://pan.baidu.com/s/1LKjJL06fHyt1O5p9Jxmbig 提取码: p8yn 

    展开全文
  • 在fpga开发过程中,往往是模块化的分工合作,大家做好自己的模块再统一添加到顶层。  rtl代码是透明,当你不想公开自己的代码而只想提供一个黑盒子时,就需要想别的办法。  xilinx vivado提供IP封装的功能,但是不...

       在fpga开发过程中,往往是模块化的分工合作,大家做好自己的模块再统一添加到顶层。

       rtl代码是透明,当你不想公开自己的代码而只想提供一个黑盒子时,就需要想别的办法。

      xilinx vivado提供IP封装的功能,但是不能提供加密,所以可行的办法是提供网表来供顶层使用。

      模块的网标生成需要注意三个问题:

      1、将模块作为顶层综合时,端口会被工具认作是I/O而添加IO BUF;

      2、端口的很多信号由于没有驱动所以会被工具优化掉;

      3、xilinx工具无法确定网表使用者是否有IP核的licence,所以制作网表的rtl内不能包含xilinx的IP核。

     以上问题都能想办法规避,

      1、IO BUF可以不用管,工具会将不是顶层模块的端口的IO BUF优化掉,当然你也可以自己去删;

      2、在模块的端口添加(*KEEP = "TRUE"*),保证信号不被优化;

      3、一定需要用到xilinx的IP核的话就将IP核作为你的模块的一个平行模块。

    网标的生成也很简单,将模块作为顶层综合后,路径下会有checkpoint,而该文件会包含顶层例化的.v和.vhd、网表.edf.。将该文件加入工程替代.v或.vhd即可。


    展开全文
  • 之前用四位LED八段数码管过温度计,效果不错。半夜里不会太亮以至于影响到睡觉,然而想看的时候却显示的绝对清晰。干脆再一个时钟吧,想看时间瞄一眼就好,省得摸手机。LED数码管选了一种由TM1637驱动的四位LED...

    之前用四位LED八段数码管做过温度计,效果不错。半夜里不会太亮以至于影响到睡觉,然而想看的时候却显示的绝对清晰。

    干脆再做一个时钟吧,想看时间瞄一眼就好,省得摸手机。

    LED数码管选了一种由TM1637驱动的四位LED模块,没有小数点但是有时间分隔符,非常适合显示HH:mm。使用起来很简单,只需要两个IO口即可。DS3231选了I2C的模块,甚至还支持温度检测(本项目未使用此功能)。

    接线很简单。DS3231就按硬件I2C标准连接Arduino就好,LED模块我选了A0、A1这两个口。当然这个是可以任意改的,代码中指定好CLK和DIO连接哪两个IO口即可。

    较新版的Arduino IDE支持在库管理中在线搜索并下载安装库,因此库安装还是相当方便的。TM1637相关库选用了DigitalTube的,DS3231选用了Sodaq的。

    代码比较简单。这个LED模块支持亮度设置,挺好的,晚上不会太刺眼。需要说明的是DS3231模块时间校准设置时需要正确构造 DateTime对象。为了尽可能的准确,预留好代码编译和上传的时间。比如,现在是14:58分,预估编译+上传需要10秒钟,那么DateTime可以构造成15:00,并且在14:59:50的时候开始运行。记得该次运行的时候rtc.setDateTime(dt);是不能被注释的。一旦上传成功,就必须把它注释掉并且再次上传,不然Arduino掉电后下次运行还是从15:00开始计时。此外,只要不执行setDateTime,DateTime对象就并不要求给出准确的时间,甚至可以不必定义。

    LED的时间分割符控制是通过point方法实现的,参数为true代表显示,为false代表不现实。

    #include "TM1637.h"
    #include <Wire.h>
    #include "Sodaq_DS3231.h"
    DateTime dt(2018, 5, 4, 14, 5, 0, 5); // 年 月 日 时 分 秒 星期。周日-周六对应0-6
    
    //pins definitions for TM1637 and can be changed to other ports
    #define CLK A0  
    #define DIO A1
    TM1637 tm1637(CLK, DIO);
      
    void setup()
    {
      tm1637.init();
     
      // 设置LED亮度。最暗到最亮 0-7。典型值2。
      tm1637.set(1);
     
      Wire.begin();
      rtc.begin();
     
      // 第一次使用时钟模块,或者需要校准时放开下列注释
      // 一旦校准完毕,继续注释掉,并再次上传
      // 定义dt的时候建议预留一些编译和上传的时间
      //rtc.setDateTime(dt);
    }
     
    // 时间分隔符闪烁标识
    bool ShowPoint = true;
     
    void loop()
    {
      DateTime now = rtc.now();
     
      int h = now.hour();
      int mn = now.minute();
     
      int b0 = h / 10;
      int b1 = h % 10;
     
      int b2 = mn / 10;
      int b3 = mn % 10;
     
      tm1637.point(ShowPoint);
      tm1637.display(0, b0);
      tm1637.display(1, b1);
      tm1637.display(2, b2);
      tm1637.display(3, b3);
     
      ShowPoint = !ShowPoint;
     
      delay(1000);
     
    }

    这样就实现了一个最简单的只能显示时分的数字钟。显然和市售商品相比,时间校准方式是个可以改进的点。



    展开全文
  • 一、模块介绍 1. 定义: 模块:本质就是.py结尾的python文件(文件名:test.py,对应的模块名:test) 用来从逻辑上组织python代码(变量,函数,类,逻辑:实现一个功能) 更多Python视频、源码、资料加群...
  • 如题: 我们当前通过maven依赖,依赖了多个模块,在junit单元测试时我们的单元测试类中 引入了其他模块声明的服务类或者是Dao类,通过@Autowired注入,spring无法对该类注入 请大神解答一下
  • python自定义模块模块调用

    千次阅读 2018-09-07 14:27:53
    在python中,一个.py文件就是一个模块,程序复杂的情况下,将代码成一个个模块,然后调用,就能把大问题分解成一个个小问题。 使用模块还可以避免函数名和变量名冲突。相同名字的函数和变量完全可以分别存在不同...
  • 模块划分

    千次阅读 2010-06-16 23:00:00
     内聚,是从功能角度来衡量模块内的联系,一个好的内聚模块应当恰好一件事。它描述的是模块内的功能联系; 耦合,是从模块角度来衡量软件结构中各模块之间相互连接的一种度量,耦合强弱取决于模块间接口的复杂...
  • 最近接手一个专门在印度...但因为这两个项目交给了公司刚来的新人在,所以尝试把两个语言对应的网站在一个框架里面分成不同的模块来处理,中英文对应的数据信息也存储在不用的数据库。在此记录总结。 框架用的是...
  • 工程模块

    万次阅读 2020-04-19 12:29:21
    工程模块 1. 模块划分 项目共分为7大模块,分别如下: –start: 启动模块 –infrastructure:基础设施层 –query:查询层 –application: 应用层 –**domain:领域层–shared:共享层 –api:对外服务接口 ** 2. ...
  • 肯定多个jar啊 用zuul来网关来分发请求 你看看spring cloud吧 一个服务一个jar zuul就可以不需要nginx了 除非你的zuul主机有多个 对外需要nginx负载 然后你Nginx压力太大又要lvs四层或者7层负载均衡...
  • 大致意思是,用C++写了一个算法,成了dll,然后在C#里调用,在调试Dll的时候遇到了这样的问题。尝试了很多网上的方法,无效。经过三个多小时的挣扎,最后发现了问题在于,我运行的C#程序里给定的是相对路径,此时...
  • 使用urllib模块的urlopen方法: import urllib reponse=urllib.urlopen("http://www.itcast.cn") print(reponse.read()) reponse.read():打开网页源代码。 reponse.getcode():获取http状态码:200...
  • WiFi模块浅析

    千次阅读 2018-04-11 18:12:59
    一、什么是wifi 模块 百度百科上这样定义: Wi-Fi模块又名串口Wi-Fi模块,属于物联网传输层,功能是将串口或TTL电平转为符合Wi-Fi无线网络通信标准的嵌入式模块,内置无线网络协议IEEE802.11b.g.n协议栈以及TCP/IP...
  • 一、引言数据中心机房作为公司内部一个重要的领域,如何保护好机房安全性能非常的重要,微模块机房是数据机房时代化进步的选择。而模块化数据机房,是将大型数据中心分割成若干个独立...
  • 怎么前后端分离的个人博客,内部还有仿网易云音乐模块?点进便知!(基于Vue,Springboot+mybatisplus+SpringCloud+ElasticSearch等框架实现)功能有博客展示,博客分类、标签管理,留言墙、查询博客,发布博客...
  • 4G模块连接TCP

    万次阅读 2020-06-28 09:58:41
    Air724模组内置TCP/IP协议栈,提供TCP客户端和服务器端服务(PS:模块没有公网IP所以服务端模式多用于专属VPN网络)。可使用AT指令,LUAT二次开发,CSDK,开源DTU等多种方式开发,开发者根据实际需求合理选择开发...
  • 模块化开发

    千次阅读 2015-03-30 22:23:57
    什么是模块化? 模块化是个一般概念,这一概念也适用于软件开发,可以让软件按模块单独开发,各模块通常都用一个标准化的接口来进行通信。实际上,除了规模大小有区别外,面向对象语言中对象之间的关注点分离与模块...
  • logging日志模块

    万次阅读 2019-08-23 16:05:00
    文章目录一、logging模块logging模块的四大组件Loggers(日志记录器)Handlers(日志处理器)Filters(日志过滤器)Formatters(日志记录格式化)二、[django官方中文文档]...一、logging模块 ...
  • nginx高级模块

    万次阅读 2018-06-21 00:20:56
    nginx高级模块 secure_link_module模块 http_geoip_module模块 nginx高级模块 secure_link_module模块 作用:用于校验链接的真实性(md5)和有效时间(expires) nginx配置 server { listen ...
  • Arduino读取GPS模块

    千次阅读 2019-12-06 22:30:40
    最近要一个公交车报站器,所以打算用GPS模块来实现定位的功能,于是找朋友借了个GPS模块来试试。 GPS模块 常见的GPS模块的参数都差不多,除了有些个别输出格式不同。 ● 接口:RS232 TTL ● 电源:3V至5V ● ...
  • 模块学习总结

    千次阅读 多人点赞 2020-08-23 00:48:28
    准确来说,光模块是几种类别的模块的统称,具体包括:光发送模块Transmitter、光接收模块Receiver、光收发一体模块Transceiver和光转发模块Transponder。通常我们所说的光模块,一般是指光收发一体模块(下同)。 ...
  • 转载链接本文转自阮一峰老师的技术博客:Javascript模块化编程:模块的写法前言Javascript模块化编程,已经成为一个迫切的...Javascript社区了很多努力,在现有的运行环境中,实现“模块”的效果。本文总结了当前
  • WebKit模块化分析

    万次阅读 热门讨论 2013-01-03 22:51:17
    模块化  软件的首要技术使命是管理复杂度(Complexity)。这是>中的一个标题。软件本质性困难的根源都在于复杂性。Dijkstra指出没有谁的大脑能容得下一计算机程序。正如社会进步催生社会分工一样,软件... 信息隐藏
  • Verilog模块语法

    万次阅读 多人点赞 2018-07-10 22:39:54
    1、Verilog的基本设计单元是模块(block)。一个模块是有两部分组成的 ,一部分描述接口,另一部分描述逻辑功能,及定义输入时如何影响输出的。下图为模块结构的组成。模块特点Verilog HDL程序是由模块构成的。每个...
  • JDK9的新特性:JPMS模块

    千次阅读 2020-05-22 06:50:41
    在module中会有元数据来描述该模块信息和该模块与其他模块之间的关系。这些模块组合起来,构成了最后的运行程序。 听起来是不是和gradle或者maven中的模块很像? 通过组件化,我们可以根据功能来区分具体的模块...
  • 隔离模块介绍-隔离电源模块

    万次阅读 2018-09-14 10:07:29
     这里将隔离模块分为隔离电源模块和隔离信号模块部分,分别以隔离电源模块和光耦为目标进行介绍,大部分数据都来自相应的数据手册,侵删! 隔离模块介绍-隔离电源模块 1.介绍  DC-DC隔离电源,定压输入、非...
  • 在eclipse中有Workspace(工作空间)和 Project(工程)的概念在 IDEA中只有 Project(工程)和 Module(模块)的概念。这个地方刚开始用的时候会很容易理不清它们之间的关系。 在eclipse中是一个窗口管理多个项目...
  • 上一篇《我所理解的Android模块化(一)》笔者讲到了Android模块化的基本知识和模块化跳转路由的基本用法,解决了模块化中跳转的问题,下面就来讲讲如何实现模块化之间的通信和跨模块方法调用。 有这样一个场景,...
  • 也许对于系统高手来说这...看下错误信息由于新装的 centos7 同事基线的时候没有针对centos7的 扫描检查,只有linux一个模板他就照着那个的 没办法形势所迫啊,结果出现缺失以下俩个so文件/usr/lib64/security/p...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,460,867
精华内容 584,346
关键字:

信息模块怎么做