精华内容
下载资源
问答
  • 压力变送器接线方法

    千次阅读 2020-04-02 14:05:55
    压力变送器接线方法 1、二线制的压力变送器,+极出来PLC AI 模块的-;...3、四线制的压力变送器,信号+出来PLC AI 模块的+:信号-出来PLC AI 模块的-:剩下的24dc+24v电源+:24dc-24v电源-。 信...

    压力变送器接线方法

    1、二线制的压力变送器,+极出来接PLC AI 模块的-;-极出来接PLC AI 模块的+。

    2、三线制的压力变送器,信号+出来接PLC AI 模块的+:公用-出来接PLC AI 模块的-:剩下的24dc+接24v电源+

    3、四线制的压力变送器,信号+出来接PLC AI 模块的+:信号-出来接PLC AI 模块的-:剩下的24dc+接24v电源+:24dc-接24v电源-。

    信号端子设置在电气盒的一个独立舱内。接线时,可拧下接线侧的表盖。位移传感器上面的端子是信号端子,下面的端子是指示表连接端子。下面端子上的电流和信号端子上的电流一样,都是4-2OmADC,它可用来连接指示表头。

    压力变送器电气壳体上的穿线孔,应当密封或者塞住(用密封胶),以避免电气壳内潮气积聚。如果穿线孔不密封,则安装送器时,应使穿线孔朝下,以便容易排除液体。

    电源是通过信号线接到压力变送器的,不需要另外的接线。称重传感器压力变送器信号线最好采用屏蔽绞合线。信号线不要与其它电源线一起穿越金属管或放在同一线槽中,也不要在强电设各附近通过。信号线可以浮空或在信号回路中任何一点接地,变送器外壳可以接地或不接地。电源不一定要稳压,即使电源电压波动lV,对输出信号的影响几乎都可以忽略。
    

    压力变送器的最大输出电流不超过3OmADC因为压力变送器通过电容藕合接地,所以检查绝缘电阻时,不能用高于1OOV的高阻表,压力变送器电路检查应采用不大于1OOV的电压。

    展开全文
  • 信息模块打线步骤及技巧解读

    千次阅读 2016-01-16 16:29:16
    在制作传统信息模块的过程中,打线是必不可少的一部分。打线模块使用灵活,接触性好,后期维护故障少,常用于现今的网络布线中。今天我们就来介绍下传统的打线信息模块的打线方法和技巧。

    信息模块也叫信息插槽,主要用来连接设备,可以将各种低压电器插座或者连接头安装到各种面板和接线板中。使用时,将一条直通双绞线直接插入信息模块,即可完成与信息模块另一端的网线的连接,简单方便。目前信息模块一般用于内墙,这样既能保护模块免遭破坏,又能美化整个网络布线环境。由于其具备稳定性且经久耐用的优点,现已使用于大多网络布线中,为企业减少了绕行布线造成的高成本。现阶段常用的信息模块主要有6P6C信息模块、8P8C信息模块及RCA信息模块等等。

    信息模块打线步骤及技巧解读 - amelialiu8 - 我说光通讯
     
     在制作传统信息模块的过程中,打线是必不可少的一部分。当然,随着科技的进一步发展,现在出现了一种新型的不需要打线的模块。这种新型的模块不需要手工打线及各种打线工具,只需要把线芯放入模块凹槽相对应的位置,再用手轻轻一压即可,非常简便。这种免打线信息模块价格稍贵,目前尚未被业内广泛使用。相比之下,打线模块使用灵活,接触性好,后期维护故障少,常用于现今的网络布线中。今天我们就来介绍下传统的打线信息模块的打线方法和技巧。

    在制作信息模块前,必须准备好相对应的打线工具,比如剥线钳、剪刀、打线刀等。剥线钳主要用于分离双绞线的线芯和绝缘层,从而达到剥线的目的。在外皮被剥掉后,剪刀则用来剪掉撕剥线。接着线芯被放入相对应的凹槽,打线刀可以帮助将线芯压好。看到以上对打线工具的简单介绍,是不是感觉打线很简单呢?尽管打线过程简单,但有一点我们必须注意。

    注意事项:在打线的过程中,线缆PVC绝缘层的外皮需与IDC打线端子对齐,可降低近端线对的串扰值。同时,在线缆到达IDC打线端子刀口处,尽量不要破坏对绞线的绞距。如果打接时有对芯线在IDC处分开距离太大(因4对线中有一对节距相对较大,很容易松开),则近端串音NEXT的余量就小;如果打接时能保证线对不松开,则近端串音NEXT的余量就会明显增大,前后会有3dB的差异。了解这个打线过程的基本常识,对信息模块的正确制作是很有必要的,接下来我们就正式开始进行打线了。

    首先,在距离双绞线末端约3cm处,用剥线钳剥除其外皮,然后用剪刀剪去撕剥线。在剥皮的过程中要注意,线头需要放在剥线钳的刀口处,将双绞线慢慢旋转,直至刀口将其的保护套划开,再拔下胶皮。

    信息模块打线步骤及技巧解读 - amelialiu8 - 我说光通讯

     

    接下来就要将剥掉胶皮的线放入信息模块的凹槽内,此时护套部分需伸入槽内约2mm左右。这里需要注意一下,一共有两种将线芯放入卡槽的方式。一种是将两根绞在一起的线对分开并卡到槽位上;另一种是不开绞,从线头处挤开线对,将两个线芯同时卡入相邻槽位。可根据自己习惯灵活选择。在凹槽内,一般都会有色标和A、B标记,标记A表示按T568A规则打线,标记B则表示按T568B规则打线。(关于T568A与T568B的线序规则,在之前的“交叉线与直通线的区别及制作教程”里详细的提到过,具体可参考http://cn.fs.com/tutorial/492.html。)

    以T568B规则为例,首先根据模块上的图标,将线与凹槽一一对应。将绿对与橙对的线两边分开放入对应的IDC打线端口并拉紧,然后用专用单对端接工具进行压制。棕对的节距较大,需绞紧一圈,避免头部线缆扳直后会松开,然后把两对线按色标放好,再用专用单对端接工具(俗称打线刀)进行压制。

    信息模块打线步骤及技巧解读 - amelialiu8 - 我说光通讯

     

    在线对全部放入相对应的槽位后,再仔细检查一遍线的顺序是否正确。待确定无误后,再用打线刀来进行压线的步骤。压线时,打线刀需要与模块垂直,刀口向外,将每一条线芯压入槽位内后,将伸出槽位的多余的线头剪断。

    :这里在压线时对操作手势有一定的要求。正确的操作可以提高生产效率,也避免了手受伤的可能。正确的手势是:把模块放在一张平整的工作台上,一只手紧握住模块,并用手指把线压住。另一只手先把芯线按色标要求放到位并拉紧(可以放一对打一对,也可以把芯线全放好后再打),然后,拿起打线刀,握住打线刀手柄的中间,使手臂与打线刀之间成一直角,将打线刀顺势往下一压即可。注意打线刀切线的刀片应该放在模块的外边,而不是里面。

    信息模块打线步骤及技巧解读 - amelialiu8 - 我说光通讯

     

    下面的左图中为压接好的信息模块。模块压接好后,打线工作就进入了收尾阶段了。最后给模块安装上保护帽,然后把线板直卡入槽内。这样一个信息模块就完成了。

    信息模块打线步骤及技巧解读 - amelialiu8 - 我说光通讯
     

    温馨提示:

    1、打线要打到底,听到“喀嗒”声后方能放手;
    2、打线刀应启动旁边的切刀,在打线的同时切断线;
    3、不要使用美工刀打线;
    4、打完线后将盖子盖上,保持长期可靠性。

    本文转载自宇轩网络(FS.COM)
    本文转载自宇轩网络(FS.COM)
    展开全文
  • 最近老师让做课程设计,同学们用继电器模块的人不少,但是同学们貌似都不会用继电器模块,这次我就写一个文章记录一下,详细的讲解一下继电器的模块使用,以及引脚的定义。  首先说最普通的继电器模块吧(在本文图...

        最近老师让做课程设计,同学们用继电器模块的人不少,但是同学们貌似都不会用继电器模块,这次我就写一个文章记录一下,详细的讲解一下继电器的模块使用,以及引脚的定义。

        首先说最普通的继电器模块吧(在本文图中就简称继电器了,仍然指继电器模块,请大家悉知),先上图:

        这个就是大概的引脚图,VCC就是电源正极,GND就是电源负极,IN是通断信号的输入引脚。

        而另一边,NC即常闭端(normal close),COM即公共端,NO即常开端(normal open)。在中学物理中已经学过,开路即通路、断路,闭合指的是开关闭合,也就是说,在没有任何上电之类的动作时,NC和COM端相当于已经连通,这种继电器模块的连线一般为:

        因为在一般情况下NC是闭合的,所以我们要接到NO接口,然后信号输入引脚即IN引脚给低电平,NC端断开,NO端闭合,负载端电路形成闭合回路,开始工作,当IN端给高电平时,NO端断开,负载即停止工作。

        如果想一直工作,给信号停止工作,即把NO端的连线接在NC端就行了。(切记:继电器的GND要和单片机的GND接在一起共地,也可以使用同一个电源来达到共地的效果)

        继电器被发明的目的使用来用弱电控制强电,保证人们不会在高压电路中因为某种因为发生危险(当然单片机使用的继电器模块驱动电流很小,甚至光耦隔离的继电器,只需要一个低电平的信号即可触发,并不需要太大的电流。如果是工业级的继电器,可能需要几安培的电流才能驱动,所以不建议大家使用)

        继电器模块的大概使用方法已经讲完了,下面介绍一下工作原理,先上图:

        这个大概就是继电器模块内部的原理了(本人小白理解浅陋,如果有错误希望大家留言指正,我一定会修改错误)。

        PS:图中为PNP型三极管,基极为0是,发射极有电压,三极管导通,所以给低电平会吸合。

        当输入口给低电平时,这个线圈便会因为电生磁原理将COM端的动子吸下来,完成吸合。

        PS:    手绘图,难看,请大家多多包涵。

        以上就是继电器模块(不是工业级的)的工作原理以及内部结构还有使用方法,希望能帮助到大家。

    -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    2018年7月21号更新:

            npn管高电平导通,pnp管低电平导通.特意来补充,因为有的厂家生产的继电器不一样,大部分应该是NPN的三极管。

    展开全文
  • //1: 并行8080模式 (模块的BS1,BS2均VCC) #define OLED_MODE 1 //---------------------------OLED端口定义-------------------------- #define OLED_CS PDout(6) #define OLED_RST PGout...

    OLED的基础介绍

    OLED的定义和优势

    OLED,即有机发光二极管(Organic Light-Emitting Diode),又称为有机电激光显示(Organic Electroluminesence Display, OELD)。OLED由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优异之特性,被认为是下一代的平面显示器新兴应用技术。

    OLED显示技术具有自发光的特性,采用非常薄的有机材料涂层和玻璃基板,当有电流通过时,这些有机材料就会发光,而且OLED显示屏幕可视角度大,并且能够节省电能,从2003年开始这种显示设备在MP3播放器上得到了应用。

    LCD都需要背光,而OLED不需要,因为它是自发光的。这样同样的显示,OLED效果要来得好一些。以目前的技术,OLED的尺寸还难以大型化,但是分辨率确可以做到很高。

    ALINETEK的0.96寸OLED模块

    • 模块有单色和双色两种可选,单色为纯蓝色,而双色则为黄蓝双色。单色模块每个像素点只有亮与不亮两种情况,没有颜色区分;
    • 尺寸小,显示尺寸为0.96寸,而模块的尺寸仅为27mm*26mm大小;
    • 高分辨率,该模块的分辨率为128*64;
    • 多种接口方式,该模块提供了总共4种接口包括:6800、8080两种并行接口方式、 4线的穿行SPI接口方式、IIC接口方式
    • 不需要高压,直接接3.3V就可以工作了。

    OLED模块工作模式选择

    4种模式通过模块的BS1/BS2设置(通过硬件来设置),BS1/BS2的设置与模块接口模式的关系如表所示:

    OLED四种工作模式
    接口方式 4线SPI IIC 8位6800 8位8080
    BS1 0 1 0 1
    BS2 0 0 1 1

    下面是OLED模块的具体实物图:

    ALIENTEK OLED模块默认设置是BS0接GND,BS1和BS2接VCC(8080模式),即使用8080并口方式,如果想要设置成其他的模式,则需要在OLED的背面,用烙铁修改BS0-BS2的设置。

    从模块的原理图上,我们可以看到的更加清晰:

    该模块采用8*2的2.52排针与外部连接,总共16个管脚,在16条线中,我们只用了15条,有一条是悬空的。15条线中,电源和地线占了2条,还剩下13条信号线。在不同的模式下,需要的信号线的数目是不同的,在8080模式下,需要全部的13条。

    OLED控制器为SSD1306,也就是说:裸屏由SSD1306驱动,这也是一种较为广泛使用的led驱动芯片。

     

    OLED的显示原理

    OLED8080并行接口信号线说明

    在上面,提到了本文中OLED采用8080的接口方式,其对应的并行接口图如下所示:

    接下来,就对这个并行接口的各个信号线的含义进行解释说明:

    • CS:OLED片选信号;
    • WR:向OLED写入数据;
    • RD:从OLED读取数据;
    • D[7:0]:8位双向数据线;
    • RST(RES):硬复位OLED;
    • DC(RS):命令/数据标志(0,读写命令;1,读写数据)。

    OLED8080并口读写过程

    模块的8080并口读/写的过程为:

    • 将数据放到数据口;
    • 根据要写入/读取的数据的类型,设置DC(RS)为高(数据)/低(命令);
    • 拉低片选,选中SSD1306;
    • 接着我们根据是读数据,还是要写数据置RD/WR为低;
    • 读数据过程:在RD的上升沿, 使数据锁存到数据线(D[7:0])上;
    • 写数据过程:在WR的上升沿,使数据写入到SSD1306里面;
    • 拉高CS和DC(RS)。

    并口写时序图

    并口读时序图

    OLED模块显存

    OLED本身是没有显存的,它的显存是依赖于SSD1306提供的(之后讲解的TFTLCD是本身自带显存,利用FSMC来进行控制)。而SSD1306提供一块显存,芯片具体的讲解见下文。

    SSD1306的显存总共为128*64bit大小,SSD1306将这些显存分为了8页。每页包含了128个字节,总共8页,这样刚好是128*64的点阵大小。

    程序显示原理

    在STM32的内部建立一个缓存(共128*8个字节),在每次修改的时候,只是修改STM32上的缓存(实际上就是SRAM),在修改完了之后,一次性把STM32上的缓存数据写入到OLED的GRAM。当然这个方法也有坏处,就是对于那些SRAM很小的单片机(比如51系列)就比较麻烦了。

     

    SSD1306芯片

    SSD1306芯片简介

    SSD1306是一个单片CMOS、OLED/PLED驱动芯片可以驱动有机/聚合发光二极管点阵图形显示系统。由128 segments 和64 Commons组成。该芯片专为共阴极OLED面板设计。 

    SSD1306中嵌入了对比度控制器、显示RAM和晶振,并因此减少了外部器件和功耗。有256级亮度控制。数据/命令的发送有三种接口可选择:6800/8000串口,I2C接口或SPI接口。适用于多数简介的应用,注入移动电话的屏显,MP3播放器和计算器等。

    SSD1306芯片特性

    • 分辨率:128 * 64 点阵面板;
    • 电源:
    1. VDD = 1.65V to 3.3V,用于IC逻辑;
    2. VCC = 7V to 15V,用于面板驱动;
    • 点阵显示:
    1. OLED驱动输出电压,最大15V;
    2. Segment最大电流:100uA;
    3. 常见最大反向电流:15mA;
    4. 256级对比亮度电流控制;
    • 嵌入式128 * 64位SRAM显示缓存;
    • 引脚选择MCU接口:
    1. 8位6800/8000串口;
    2. 3/4线SPI接口;
    3. I2C接口。

    SSD1306芯片命令

    • 命令0X81:设置对比度。包含两个字节,第一个0X81为命令,随后发送的一个字节为要设置的对比度的值。这个值设置得越大屏幕就越亮。
    • 命令0XAE/0XAF:0XAE为关闭显示命令;0XAF为开启显示命令。
    • 命令0X8D:包含2个字节,第一个为命令字,第二个为设置值,第二个字节的BIT2表示电荷泵的开关状态,该位为1,则开启电荷泵,为0则关闭。在模块初始化的时候,这个必须要开启,否则是看不到屏幕显示的。
    • 命令0XB0~B7:用于设置页地址,其低三位的值对应着GRAM的页地址。
    • 命令0X00~0X0F:用于设置显示时的起始列地址低四位。
    • 命令0X10~0X1F:用于设置显示时的起始列地址高四位。

     

    STM32控制OLED

    硬件连接

    • 单片机:STM32F103ZET6
    • 模块:OLED显示模块
    • 引脚连接:

    之前的并行接口图是相对于显示屏上的引脚,而上图的并行接口图是相对于STM32的IO口的图。

    OLED_DC(RS):OV SCL(PD3)、OLED_CS:FIFO WRST(PD6)、OLED_ED:OV SDA(PG13)、OLED_WR:FIFO RRST(PG14)、OLED_RST:FIFO OE(PG15)、OLED_D0:OV D0(PC0)、OLED_D1:OV D1(PC1)、OLED_D2:OV D2(PC2)、OLED_D3:OV D3(PC3)、OLED_D4:OV D4(PC4)、OLED_D5:OV D5(PC5)、OLED_D6:OV D6(PC6)、OLED_D7:OV D7(PC7)

    • 硬件资源:指示灯DS0、OLED模块

    STM32控制程序

    • 设置STM32与OLED模块相连接的IO(设置与OLED相连的IO口设置为输出);
    • 初始化OLED模块(硬复位SSD1306、驱动IC初始化程序、开启显示、清零显存、开始显示);
    • 通过函数将字符和数字显示到OLED模块上。
    //OLED模式设置
    //0: 4线串行模式  (模块的BS1,BS2均接GND)
    //1: 并行8080模式 (模块的BS1,BS2均接VCC)
    #define OLED_MODE 	1 
    		    						  
    //---------------------------OLED端口定义--------------------------  					   
    #define OLED_CS  PDout(6)
    #define OLED_RST PGout(15) 	
    #define OLED_RS  PDout(3)
    #define OLED_WR  PGout(14)		  
    #define OLED_RD  PGout(13)	   
    //PC0~7,作为数据线
     
    #define DATAOUT(x) GPIO_Write(GPIOC,x);//输出  
      
    //使用4线串行接口时使用 
    #define OLED_SCLK PCout(0)
    #define OLED_SDIN PCout(1)
    		     
    #define OLED_CMD  0	//写命令
    #define OLED_DATA 1	//写数据
    //OLED的显存
    //存放格式如下.
    //[0]0 1 2 3 ... 127	
    //[1]0 1 2 3 ... 127	
    //[2]0 1 2 3 ... 127	
    //[3]0 1 2 3 ... 127	
    //[4]0 1 2 3 ... 127	
    //[5]0 1 2 3 ... 127	
    //[6]0 1 2 3 ... 127	
    //[7]0 1 2 3 ... 127 		   
    u8 OLED_GRAM[128][8];	 
    
    //更新显存到LCD		 
    void OLED_Refresh_Gram(void)
    {
    	u8 i,n;		    
    	for(i=0;i<8;i++)  
    	{  
    		OLED_WR_Byte (0xb0+i,OLED_CMD);    //设置页地址(0~7)
    		OLED_WR_Byte (0x00,OLED_CMD);      //设置显示位置—列低地址
    		OLED_WR_Byte (0x10,OLED_CMD);      //设置显示位置—列高地址   
    		for(n=0;n<128;n++)OLED_WR_Byte(OLED_GRAM[n][i],OLED_DATA); 
    	}   
    }
    
    //向SSD1306写入一个字节。
    //dat:要写入的数据/命令
    //cmd:数据/命令标志 0,表示命令;1,表示数据;
    void OLED_WR_Byte(u8 dat,u8 cmd)
    {
    	DATAOUT(dat);	    
     	OLED_RS=cmd;
    	OLED_CS=0;	   
    	OLED_WR=0;	 
    	OLED_WR=1;
    	OLED_CS=1;	  
    	OLED_RS=1;	 
    } 	    	    
    	  	  
    //开启OLED显示    
    void OLED_Display_On(void)
    {
    	OLED_WR_Byte(0X8D,OLED_CMD);  //SET DCDC命令
    	OLED_WR_Byte(0X14,OLED_CMD);  //DCDC ON
    	OLED_WR_Byte(0XAF,OLED_CMD);  //DISPLAY ON
    }
    //关闭OLED显示     
    void OLED_Display_Off(void)
    {
    	OLED_WR_Byte(0X8D,OLED_CMD);  //SET DCDC命令
    	OLED_WR_Byte(0X10,OLED_CMD);  //DCDC OFF
    	OLED_WR_Byte(0XAE,OLED_CMD);  //DISPLAY OFF
    }		   			 
    //清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!!	  
    void OLED_Clear(void)  
    {  
    	u8 i,n;  
    	for(i=0;i<8;i++)for(n=0;n<128;n++)OLED_GRAM[n][i]=0X00;  
    	OLED_Refresh_Gram();//更新显示
    }
    //画点 
    //x:0~127
    //y:0~63
    //t:1 填充 0,清空				   
    void OLED_DrawPoint(u8 x,u8 y,u8 t)
    {
    	u8 pos,bx,temp=0;
    	if(x>127||y>63)return;//超出范围了.
    	pos=7-y/8;
    	bx=y%8;
    	temp=1<<(7-bx);
    	if(t)OLED_GRAM[x][pos]|=temp;
    	else OLED_GRAM[x][pos]&=~temp;	    
    }
    //x1,y1,x2,y2 填充区域的对角坐标
    //确保x1<=x2;y1<=y2 0<=x1<=127 0<=y1<=63	 	 
    //dot:0,清空;1,填充	  
    void OLED_Fill(u8 x1,u8 y1,u8 x2,u8 y2,u8 dot)  
    {  
    	u8 x,y;  
    	for(x=x1;x<=x2;x++)
    	{
    		for(y=y1;y<=y2;y++)OLED_DrawPoint(x,y,dot);
    	}													    
    	OLED_Refresh_Gram();//更新显示
    }
    //在指定位置显示一个字符,包括部分字符
    //x:0~127
    //y:0~63
    //mode:0,反白显示;1,正常显示				 
    //size:选择字体 12/16/24
    void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 size,u8 mode)
    {      			    
    	u8 temp,t,t1;
    	u8 y0=y;
    	u8 csize=(size/8+((size%8)?1:0))*(size/2);		//得到字体一个字符对应点阵集所占的字节数
    	chr=chr-' ';//得到偏移后的值		 
        for(t=0;t<csize;t++)
        {   
    		if(size==12)temp=asc2_1206[chr][t]; 	 	//调用1206字体
    		else if(size==16)temp=asc2_1608[chr][t];	//调用1608字体
    		else if(size==24)temp=asc2_2412[chr][t];	//调用2412字体
    		else return;								//没有的字库
            for(t1=0;t1<8;t1++)
    		{
    			if(temp&0x80)OLED_DrawPoint(x,y,mode);
    			else OLED_DrawPoint(x,y,!mode);
    			temp<<=1;
    			y++;
    			if((y-y0)==size)
    			{
    				y=y0;
    				x++;
    				break;
    			}
    		}  	 
        }          
    }
    //m^n函数
    u32 mypow(u8 m,u8 n)
    {
    	u32 result=1;	 
    	while(n--)result*=m;    
    	return result;
    }				  
    //显示2个数字
    //x,y :起点坐标	 
    //len :数字的位数
    //size:字体大小
    //mode:模式	0,填充模式;1,叠加模式
    //num:数值(0~4294967295);	 		  
    void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size)
    {         	
    	u8 t,temp;
    	u8 enshow=0;						   
    	for(t=0;t<len;t++)
    	{
    		temp=(num/mypow(10,len-t-1))%10;
    		if(enshow==0&&t<(len-1))
    		{
    			if(temp==0)
    			{
    				OLED_ShowChar(x+(size/2)*t,y,' ',size,1);
    				continue;
    			}else enshow=1; 
    		 	 
    		}
    	 	OLED_ShowChar(x+(size/2)*t,y,temp+'0',size,1); 
    	}
    } 
    //显示字符串
    //x,y:起点坐标  
    //size:字体大小 
    //*p:字符串起始地址 
    void OLED_ShowString(u8 x,u8 y,const u8 *p,u8 size)
    {	
        while((*p<='~')&&(*p>=' '))//判断是不是非法字符!
        {       
            if(x>(128-(size/2))){x=0;y+=size;}
            if(y>(64-size)){y=x=0;OLED_Clear();}
            OLED_ShowChar(x,y,*p,size,1);	 
            x+=size/2;
            p++;
        }  
    	
    }	   
    //初始化SSD1306					    
    void OLED_Init(void)
    { 	
     
     	GPIO_InitTypeDef  GPIO_InitStructure;
     	
     	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOG, ENABLE);	 //使能PC,D,G端口时钟
    
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_6;	 //PD3,PD6推挽输出  
     	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz
     	GPIO_Init(GPIOD, &GPIO_InitStructure);	  //初始化GPIOD3,6
     	GPIO_SetBits(GPIOD,GPIO_Pin_3|GPIO_Pin_6);	//PD3,PD6 输出高
     
     	GPIO_InitStructure.GPIO_Pin =0xFF; //PC0~7 OUT推挽输出
     	GPIO_Init(GPIOC, &GPIO_InitStructure);
     	GPIO_SetBits(GPIOC,0xFF); //PC0~7输出高
    
     	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;				 //PG13,14,15 OUT推挽输出
     	GPIO_Init(GPIOG, &GPIO_InitStructure);
     	GPIO_SetBits(GPIOG,GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);						 //PG13,14,15 OUT  输出高
      							  
    	OLED_CS=1;
    	OLED_RS=1;	 
    	
    	OLED_RST=0;
    	delay_ms(100);
    	OLED_RST=1; 
    					  
    	OLED_WR_Byte(0xAE,OLED_CMD); //关闭显示
    	OLED_WR_Byte(0xD5,OLED_CMD); //设置时钟分频因子,震荡频率
    	OLED_WR_Byte(80,OLED_CMD);   //[3:0],分频因子;[7:4],震荡频率
    	OLED_WR_Byte(0xA8,OLED_CMD); //设置驱动路数
    	OLED_WR_Byte(0X3F,OLED_CMD); //默认0X3F(1/64) 
    	OLED_WR_Byte(0xD3,OLED_CMD); //设置显示偏移
    	OLED_WR_Byte(0X00,OLED_CMD); //默认为0
    
    	OLED_WR_Byte(0x40,OLED_CMD); //设置显示开始行 [5:0],行数.
    													    
    	OLED_WR_Byte(0x8D,OLED_CMD); //电荷泵设置
    	OLED_WR_Byte(0x14,OLED_CMD); //bit2,开启/关闭
    	OLED_WR_Byte(0x20,OLED_CMD); //设置内存地址模式
    	OLED_WR_Byte(0x02,OLED_CMD); //[1:0],00,列地址模式;01,行地址模式;10,页地址模式;默认10;
    	OLED_WR_Byte(0xA1,OLED_CMD); //段重定义设置,bit0:0,0->0;1,0->127;
    	OLED_WR_Byte(0xC0,OLED_CMD); //设置COM扫描方向;bit3:0,普通模式;1,重定义模式 COM[N-1]->COM0;N:驱动路数
    	OLED_WR_Byte(0xDA,OLED_CMD); //设置COM硬件引脚配置
    	OLED_WR_Byte(0x12,OLED_CMD); //[5:4]配置
    		 
    	OLED_WR_Byte(0x81,OLED_CMD); //对比度设置
    	OLED_WR_Byte(0xEF,OLED_CMD); //1~255;默认0X7F (亮度设置,越大越亮)
    	OLED_WR_Byte(0xD9,OLED_CMD); //设置预充电周期
    	OLED_WR_Byte(0xf1,OLED_CMD); //[3:0],PHASE 1;[7:4],PHASE 2;
    	OLED_WR_Byte(0xDB,OLED_CMD); //设置VCOMH 电压倍率
    	OLED_WR_Byte(0x30,OLED_CMD); //[6:4] 000,0.65*vcc;001,0.77*vcc;011,0.83*vcc;
    
    	OLED_WR_Byte(0xA4,OLED_CMD); //全局显示开启;bit0:1,开启;0,关闭;(白屏/黑屏)
    	OLED_WR_Byte(0xA6,OLED_CMD); //设置显示方式;bit0:1,反相显示;0,正常显示	    						   
    	OLED_WR_Byte(0xAF,OLED_CMD); //开启显示	 
    	OLED_Clear();
    }  
    
    int main(void)
     {	u8 t;
    	delay_init();	    	 //延时函数初始化	  
    	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);	 //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
     	LED_Init();			     //LED端口初始化
    	OLED_Init();			//初始化OLED      
      OLED_ShowString(0,0,"ALIENTEK",24);  
    	OLED_ShowString(0,24, "0.96' OLED TEST",16);  
     	OLED_ShowString(0,40,"ATOM 2015/1/14",12);  
     	OLED_ShowString(0,52,"ASCII:",12);  
     	OLED_ShowString(64,52,"CODE:",12);  
      
    	OLED_Refresh_Gram();		//更新显示到OLED 
    	t=' ';  
    	while(1) 
    	{		
    		OLED_ShowChar(48,48,t,16,1);//显示ASCII字符	   
    		OLED_Refresh_Gram();
    		t++;
    		if(t>'~')t=' ';
    		OLED_ShowNum(103,48,t,3,16);//显示ASCII字符的码值 
    		delay_ms(500);
    		LED0=!LED0;
    	}	  
    	
    }

    STM32控制程序分析

    OLED_Refresh_Gram()函数:更新显存到OLED。

    在STM32内部定义了一个块GRAM:

    u8 OLED_GRAM[128][8];

    此部分GRAM对应OLED模块上的GRAM。在操作的时候,我们只需要修改STM32内部的GRAM,然后通过OLED_Refresh_Gram()函数将GRAM一次性刷新到OLED的GRAM中。

    	for(i=0;i<8;i++)  
    	{  
    		OLED_WR_Byte (0xb0+i,OLED_CMD);    //设置页地址(0~7)
    		OLED_WR_Byte (0x00,OLED_CMD);      //设置显示位置—列低地址
    		OLED_WR_Byte (0x10,OLED_CMD);      //设置显示位置—列高地址   
    		for(n=0;n<128;n++) OLED_WR_Byte(OLED_GRAM[n][i],OLED_DATA); 
    	} 

    函数的具体内容先设置页地址,然后写入列地址,然后从0开始写入128个字节,这样就将一页的内容刷新过去。重复8次,将8页的内容全部刷新过去。

    OLED_WR_Byte()函数:向SSD1306写入数据或命令(参数cmd为1时表示数据,为0时表示命令)。这里的步骤是和上文中8080并口写时序图的步骤基本类似。具体为:

    void OLED_WR_Byte(u8 dat,u8 cmd)
    {
    	DATAOUT(dat);	    
     	OLED_RS=cmd;
    	OLED_CS=0;	   
    	OLED_WR=0;	 
    	OLED_WR=1;
    	OLED_CS=1;	  
    	OLED_RS=1;	 
    } 	

    首先通过DATAOUT()函数将数据放到数据口,其中DATAOUT()是一个宏定义:

    #define DATAOUT(x) GPIO_Write(GPIOC,x);//输出  

    其次,在判断cmd参数是命令还是数据,如果是命令,DC置高;如果是数据,DC置低。接下来,拉低片选,将WR拉低再拉高产生一个上升沿。这样数据就写入到了控制器。最后,拉高片选、DC。

    OLED_DrawPoint()函数:画点函数,这里有一个对应关系需要理解。

    OLED_GRAM[128][8]中的128代表列数(x坐标),而8代表的是页,每页又包含8行,总共是64行(y坐标)。从高到低对应行数从小到大。比如,我们要在x=100,y=29这个点写入1,则可以用这个句子实现:

    OLED_GRAM[100][4]=1<<2;

    一个通用的点(x,y)置1的表达式为:

    OLED_GRAM[x][7-y/8]=1<<(7-y%8);

    其中,x的取值范围为0-127;y的取值范围为0-63。

    OLED_ShowChar()函数:显示字符。这里的字符采用16*8的显示方式,也就是说在OLED上16*8数目大小的点阵表示一个字符,即128个点。

    下面截取了一部分16*8的字符库的内容,一个字符用16个u8类型的数字表示:

    {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*" ",0*/
    {0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xCC,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00},/*"!",1*/
    {0x00,0x00,0x08,0x00,0x30,0x00,0x60,0x00,0x08,0x00,0x30,0x00,0x60,0x00,0x00,0x00},/*""",2*/
    {0x02,0x20,0x03,0xFC,0x1E,0x20,0x02,0x20,0x03,0xFC,0x1E,0x20,0x02,0x20,0x00,0x00},/*"#",3*/
    {0x00,0x00,0x0E,0x18,0x11,0x04,0x3F,0xFF,0x10,0x84,0x0C,0x78,0x00,0x00,0x00,0x00},/*"$",4*/
    {0x0F,0x00,0x10,0x84,0x0F,0x38,0x00,0xC0,0x07,0x78,0x18,0x84,0x00,0x78,0x00,0x00},/*"%",5*/
    {0x00,0x78,0x0F,0x84,0x10,0xC4,0x11,0x24,0x0E,0x98,0x00,0xE4,0x00,0x84,0x00,0x08},/*"&",6*/

    具体的显示方式如下图所示:

    从上到下,从左到右,高位在前。就是这样的取模方式,将字符集按照16*8的大小取模出来。1表示亮,0表示暗。

    显示字符函数的具体实现:

            for(t1=0;t1<8;t1++)
    		{
    			if(temp&0x80)OLED_DrawPoint(x,y,mode);
    			else OLED_DrawPoint(x,y,!mode);
    			temp<<=1;
    			y++;
    			if((y-y0)==size)
    			{
    				y=y0;
    				x++;
    				break;
    			}
    		}  

    这里也是按照从上到下,从左到右的取模方式来进行的。先得到最高位,然后判断是写1还是0,画点;接着读第二位,如此循环,直到一个字符的点阵全部取完为止。这里涉及到的列地址和行地址的自增,不难理解。

     

    展开全文
  • 模块:PCB设计方法

    千次阅读 2018-05-31 15:45:34
    模块部分:PCB设计1、拼板方式小型化光模块PCB推荐中心镜像对称拼板设计,具体设计要求下图所示。2 、Mark点设计单元板上推荐放置两个Mark点,如下图所示:注:单元板如果放置不下两个Mark点,但至少放置一个Mark...
  • 光纤模块与光纤收发器使用方法

    千次阅读 2020-04-13 14:07:15
    一、光纤模块的原理二、光纤模块的分类三、SFP+光纤模块使用方法四、光纤收发器原理五、100M光纤收发器使用说明六、光纤模块与光纤收发器的区别七、光纤收发机八、光收发器安装介绍九、光纤收发器的连接 一、光纤...
  • 高性能服务器底层网络通信模块的设计方法 分类: 网游服务器2010-09-19 11:16 339人阅读 评论(0) 收藏 举报 服务器网络工作测试多线程数据库连接池 在对I/O完成端口进行底层封装的基础上,本文...
  • STM32读取HX711(AD)模块数据——压力传感器

    千次阅读 热门讨论 2019-10-28 23:41:15
    背景:在无人机动力系统的选型时,为了测试无人机的动力...HX711模块是一个24位精度的AD模块。 (1)https://item.taobao.com/item.htm?spm=a1z10.3-c-s.w4002-21223910208.20.6c496a4bdA2Bew&id=522572281513...
  • 使用STM32F407读取HX711压力传感器模块

    千次阅读 多人点赞 2018-09-12 10:11:35
    hx711是一个很常见的压力传感器模块,精度很高,在平时做嵌入式开发的时候也常常遇到。但是在网上找到的代码往往都很老了,用现在常用的stm32板子都或多或少有一些问题,尤其是在一些购买该模块地方那里要的资料就更...
  • 实验七十二:人体秤50kg称重传感器模块(电阻应变半桥式)应变片是由敏感栅等构成用于测量应变的元件。电阻应变片的工作原理是基于应变效应制作的,即导体或半导体材料在外界力的作用下产...
  • java模块之间的调用(接口的回调)

    万次阅读 2018-03-23 11:15:29
    模块间调用在一个应用系统中,无论使用何种语言开发,必然存在模块之间的调用,调用的方式分为几种:(1)同步调用同步调用是最基本并且最简单的一种调用方式,类A的方法a()调用类B的方法b(),一直等待b()方法执行...
  • 在角色权限管理模块中,管理员可以添加或移除指定角色所包含的用户、可以分配或授予指定角色的模块(菜单)的访问权限、可以收回或分配指定角色的操作(功能)权限、可以对所有角色、用户、模块(菜单)、操作(功能...
  • 汽车主要电子控制系统模块

    千次阅读 2019-08-13 10:01:01
    LIN接收模块接收控制手柄单元信号(灯光、雨刮、洗涤等信号),输出模块采用功率驱动和继电器驱动实现,有很好的性价比,CAN通信模块实现与其它汽车电子模块信息交换。主要实现车身门控制包括门锁、各种灯光、前后...
  • USB口433MHz透传模块概述  VT-DTMUA5-433模块是高度集成半双工无线数据传输模块,基于德州仪器(TI)高性能CC1110 SoC芯片设计,工业级的单片机和高性能射频收发器集成在一个芯片内,体积小,工作稳定。  VT-...
  • DIY一款4路USB转TTL串口调试模块

    千次阅读 2020-09-01 16:13:20
    最近调测程序经常用到单片机的三个串口同时交互通信,我使用1路USB转TTL串口调试模块不断切换,不仅影响观察效果,更是劳心劳力。 本打算淘宝选购4路USB转TTL串口调试模块,均价在60RMB...... 遂决定DIY一款4路USB转...
  • 在本篇文章中,您将了解称重传感器模块、其应用程序及其操作。此外,您将了解如何在Arduino中使用称重传感器模块。然后在了解了称重传感器的校准后,将制作一个可以测量重量的数字体重秤,精度为0.0001克,并且制作...
  • 超声波模块

    千次阅读 多人点赞 2019-07-15 11:02:35
    HC-SR04超声波测距模块可提供约2cm400厘米的非接触式距离感测功能,测距精度可达高到3毫米;模块包括超声波发射器,接收器与控制电路像智能小车的测距以及转向,或是一些项目中,常常会用到。智能小车测距可以及时...
  • 5000米433M透明传输模块,5000米传输无线数传模块 概述  VT-DTMSD3-433模块是高度集成半双工无线数据传输模块,基于德州仪器(TI)高性能CC112x RF芯片和Energy Micro Cortex-M3 32位ARM设计,工业级的单片机和...
  • 文章目录下载Sentinel数据的方法哥白尼数据开放访问中心SNAP软件批量下载Vertex(美国阿拉斯加卫星设备处)USGS(美国地质调查局网站)Sentinelsat包常见报错批量下载哨兵数据 下载Sentinel数据的方法 本节内容引用...
  • Python异步通信模块asynchat

    千次阅读 2016-04-15 09:23:23
    Python异步通信模块asynchat介绍文档上说:这个模块建立在 asyncore 基础结构上,简化了异步客户端和服务器,使得处理带有以任意字符串终止或者可变长度的元素的协议更加容易。asynchat 定义了你子类化的抽象类 ...
  • 概述:树莓派是一个稳定成熟性价比合理且受创客喜爱的计算平台,在实际应用中有一个比较典型的远程控制需求,只要树莓派能上网,那么可以通过各种方法来进行远程控制,比如MQTT、发送邮件、FTP、远程SSH等。...
  • PT100热电阻接线方法

    千次阅读 2019-08-09 08:15:15
    热电阻的引线方式有二线制、三线制和四线制三种: ...三线制方式是在热电阻一端引出一根线,另一端引出两线,当热电阻与测量电桥配用时,引线电阻分别在电桥的两个桥臂线路中,消除了引线电阻...
  • Air724UG_模块硬件设计手册_V2.2

    万次阅读 2021-03-12 16:12:15
    1. 绪论 ...2.1 型号信息 表格1:模块支持频段列表 型号 Air724UG-NFM Air724UG-NFC Air724UG-MFM Air724UG-MFC LTE-FDD B1/B3/B5/B8 B1/B3/B5/B8 B1/B3/B5/B8 B1/B3/B5/B8 LTE-TDD B34/B38/B
  • 红外循迹模块

    万次阅读 多人点赞 2020-02-23 11:43:36
    模块描述 此模块是为智能小车、机器人等...时,红外线反射回来被接收管接收,经过比较器电路处理之后,同时信号输出 口输出数字信号(一个低电平信号),可通过电位器旋钮调节检测距离,有效距 离范围 2~60cm,...
  • 在这些电路中,根据电阻R和电容C的取值不同、输入和输出关系以及处理的波形之间的关系,产生了具有不同功能的RC电路,常见的电路应用包括微分电路 、积分电路、耦合电路、滤波电路及脉冲分器。RC电路在模拟电路、...
  • 一、模块概述 该模块是一个基于触摸检测IC(TTP223)的电容式点动型触摸开关模块。常态下,模块输出低电平,模式为低功耗模式;当用手接触相应位置时,模块会输出高电平,模式切换为快速模式;当持续12秒没有触摸...
  • python中的log模块笔记

    千次阅读 2018-09-26 14:10:39
    向日志输出中添加上下文信息 参考文档 一、日志相关概念 日志是一种可以追踪某些软件运行时所发生事件的方法。软件开发人员可以向他们的代码中调用日志记录相关的方法来表明发生了某些事情。一个事件可以用一个可...
  • RJ45是一个常用名称,指的是由IEC (60)603-7标准化, 使用由国际性的插件标准定义的8个位置(8针)的模块化插孔或者插头。IEC (60)603-7也是ISO/IEC 11801国际通用综合布线标准的连接硬件的参考标准。  RJ-45接口...
  • 隔离模块介绍-隔离信号模块-光耦

    万次阅读 2018-09-14 11:42:21
     这里将隔离模块分为隔离电源模块和隔离信号模块部分,分别以隔离电源模块和光耦为目标进行介绍,大部分数据都来自相应的数据手册,侵删! 隔离模块介绍-隔离信号模块-光耦 光耦的内容可能比较多,可能会从以下几...
  • 做一个小项目的原因,需要使用无线传输数据,实现双向通信。恰好实验室有几对蓝牙模块,就用了这个模块。本来为了图快速实现功能,直接使用了正点原子的蓝牙例程,总是显示检测不到蓝牙模块。...VCC: 电源

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 150,891
精华内容 60,356
关键字:

信息模块的压接方法