ppptalk

  • 2018-04-13
  • 回复了主题帖: 10分钟理解DS18B20数字温度计模块

    中国罗宾鸟 发表于 2018-4-13 18:36 非常好,不过,你用的什么 编程语言呀?
    我用的C语言

  • 2018-04-11
  • 回复了主题帖: 10分钟理解DS18B20数字温度计模块

    曹伟1993 发表于 2018-4-11 16:58 如果我没有记错应该是DALLAS公司而不是DALLA公司,
    你是对的,抱歉,写错了

  • 发表了主题帖: 10分钟理解DS18B20数字温度计模块

    replyreload += ',' + 2355042; 本帖最后由 ppptalk 于 2018-4-11 17:01 编辑 1. 明确目的 DS18B20是美国DALLAS半导体公司推出的一种数字化单总线器-数字温度计。既然是数字温度计,那么它一定具备这样的能力-把周围环境的温度信号转换成数字信号。那么这个转换的结果放到哪里去了呢?存放到了一个叫做Scratchpad的上面,这个Scratchpad是什么意思不用去管它,只需要知道它是一个SRAM就可以了。这个Scratchpad一共有9个字节(BYTE0~BYTE8),转换的数字信息就存放在BYTE0和BYTE1,如下图所示。所以,目的就很明确了,对于DS18B20模块就是去读Scratchpad的BYTE0和BYTE1. 2. 思路分析 现在目的已经知道了,就是读Scratchpad(read scratchpad)的BYTE0和BYTE1. 那么怎么样Read Scratchpad呢?当然是去查看DS18B20的芯片手册了。阅读说明书你会发现Read Scratchpad是一个功能命令(DS18B20 FUNCTION COMMANDS),类似的还有其他很多功能命令,如下图所示: 说明书上已经讲的非常清楚了,要求每次在访问DS18B20的时候一定要遵循以下步骤,如下所示, 简单的讲,你想发送一个功能命令Read Scratchpad, 那必须在它前面加两步,初始化命令(Initialization)和ROM命令(ROM Command)。初始化命令只有一个,很容易确定,但是ROM命令有多个,需要找到一个与功能命令Read Scratchpad相匹配的ROM命令。如果总线上只有一个DS18B20模块,选择Skip ROM就可以了。 这样整个步骤就很简单了,先初始化,然后发送skip rom命令,紧接着发送read scratchpad命令,然后开始接收DS18B20传送的数据,第0和第1个字节就是我们所需要的。这样读出来的全部是0和1组成的信号,我们还需要将这些0和1组成的信号翻译成“温度值”。怎么样翻译,去查看说明书上的温度-数据对应表就可以了,如下所示: 注意这个表中的数据是补码形式,如果你只是考虑温度为正的情况,那么就不用去管原码,反码和补码了。因为对于正数的原码,反码和补码都是一样的。 如果读写操作正确的话,此时计算出来的温度应该是+85摄氏度。通过这个值可以判断你的读写程序和温度计算过程是否正确。那么为什么是+85摄氏度呢?在一上电的时候,DS18B20处在一个"idle state",简单的讲就是它没有工作,没有采集周围环境的温度。Scratchpad的BYTE0和BYTE1里面放的默认值是+85,所以你读到的其实是它的默认值。如果你想让DS18B20开始工作,那么很简单,发送一个Convert T命令就可以了。注意Convert T也是一个功能命令(Function Command),同样的按照前面的规则,给它添加初始化命令和ROM命令。 这样整个过程是不是完了呢?注意DS18B20完成温度的采集和转换是需要时间的,好比你敲隔壁的门,那你发出“敲门”这个命令后,你同学过来开门是需要时间的,在这个过程中你要做的事情就是等待。同样的,当你发送一个Convert T命令后,你需要等待DS18B20完成温度采集和转换的工作。那么等待多长呢,这个与你设置精度有关,精度越高,需要的时间越长,最多不超过750ms。当然这个过程中,你也可以采用忙信号检测的方式来判断。 3. 操作步骤 这样整个操作步骤就非常简单了, (1) initial                       (DS18B20初始化) (2) skip rom (3) convert T                 (让DS18B20开始工作采集周围温度) (4) busy check              (等待DS18B20完成采集) (5)  initial                        (DS18B20初始化) (6) skip rom (7) read scratchpad       (发送读scratchpad命令) (8) rcv data                     (接收DS18B20传过来的数据) (9) cal                             (计算温度值) (10) display                    (把这个值显示出来)复制代码 4. 参考代码游客,如果您要查看本帖隐藏内容请回复 上一篇: 10分钟理解OLED显示模块 10分钟理解LCD1602如何显示自定义字符 10分钟理解LCD1602液晶显示模块 此内容由EEWORLD论坛网友ppptalk原创,如需转载或用于商业用途需征得作者同意并注明出处

  • 2018-04-09
  • 回复了主题帖: 10分钟理解OLED显示模块

    lising 发表于 2018-4-9 16:07 喜欢
    谢谢啊

  • 发表了主题帖: 10分钟理解OLED显示模块

    replyreload += ',' + 2354021;前面的一个帖子简单介绍了LCD1602如何显示字符,同时整理出了一个思路:初始化,确定显示位置,确定显示内容。OLED模块也是一个显示模块,我们关心的仍然是两点内容,在哪里显示,显示什么内容。所以上面的这个思路对于OLED模块同样适用。只不过OLED模块显示的位置更多一点罢了。 LCD1602模块每行16个空格,共2行,也就是一共有32个空格。我们在LCD1602自定义字符这一个帖子中,是从这32个空格中提取出一个空格来看成8×8的点阵(64个led),然后通过控制这64个led从而实现自定义字符。现在把这8×8的点阵放大成128×64的点阵就是OLED模块了。 可见只要把LCD1602如何显示字符和1602如何构造字符结合起来就很容易搞定OLED了。 1. 初识OLED模块 OLED(Organic Light-Emitting Diode),即有机发光二极管,其实物图如下所示. OLED由于同时具备自发光,不需背光源,对比度高,厚度薄,视角广,反应速度快,可用于挠曲性面板,使用温度范围广,构造及制程简单等优异特性,被认为是下一代的平面显示器新兴应用技术。具有轻,薄,省电等特性,工作电压宽度高,从2.2V到5.5V. 以上关于OLED的介绍简单看看就可以了,只需要知道它是128×64的点阵就行(当然也有其他尺寸的)。 2. 思路分析 前面已经讲了,就是三步曲, (1) 初始化 (2)确定显示位置 (3)确定显示内容 3. 操作步骤 3.1 初始化 初始化过程说明书讲的很详细了,想都不用想,照做即可 (1)Set MUX Ratio A8h, 3Fh (2)Set Display Offset D3h, 00h (3)Set Display Start Line 40h (4)Set Segment re-map A0h/A1h (5)Set COM Output Scan Direction C0h/C8h (6)Set COM Pins hardware configuration DAh,02h (7)Set Contrast Control 81h,7Fh (8)Disable Entire Display On A4h (9)Set Normal Display A6h (10)Set Osc Frequency D5h, 80h (11)Enable charge pump regulator 8Dh, 14h (12)Display On AFh 复制代码 3.2 确定显示位置 与LCD1602的分析思路相同,要知道知道在哪里显示,就需要先知道哪些地方能显示。这里我们使用的oled模块的分辨率是128×64,也就是说一共128×64个led,下面用一个128列,64行的表格来描述更清晰一些,如下表所示。显示模块上的每一个点就对应着这个表格的一个空格,假设你在某一个空格中放1表示这个‘点‘亮,那么放0就表示这个’点‘暗。现在我们把这个表格的每8行叫做一个PAGE,这样一共就有8个PAGE(PAGE0~PAGE7). 由于我们在写如数据时通常以字节为单位,那么现在把表格中的Col0这一列的Row0-Row7作为一个单位,一共8个空格,刚好对应一个字节。那么这个字节的高低位如何分配呢?最低位放到Row0-Col0对应的空格(bit0),最高位放到Row7-Col0对应的空格(bit7)。这样当你写入一个字节的数据0x08时,对应的坐标(Col0-Row3)这个’点‘就亮了,其他7个点为暗。 那么现在对OLED模块的控制这个问题就转换成了如何向以下这个表格写入数据了。所谓确定显示屏的位置就是确定这个表格的位置,而确定表格的位置就是确定第几行,第几列。注意到我们这里是把表格中的每8行看成一个基本单位,因此确定表格的位置就是确定第几个PAGE,第几列。                  Col 0     Col 1     Col 2     Col 3     Col 4     …     Col 125     Col 126     Col 127     PAGE 0    bit 0     Row 0     0                                             bit 1     Row 1     0                                             bit 2     Row 2     0                                             bit 3     Row 3     1                                             bit 4     Row 4     0                                             bit 5     Row 5     0                                             bit 6     Row 6     0                                             bit 7     Row 7     0                                             PAGE 1     bit 0     Row 8                                                  bit 1     Row 9                                                  bit 2     Row 10                                                  bit 3     Row 11                                                  bit 4     Row 12                                                  bit 5     Row 13                                                  bit 6     Row 14                                                  bit 7     Row 15                                                  PAGE 2                                                            PAGE 3                                                            PAGE 4                                                            PAGE 5                                                            PAGE 6                                                            PAGE 7                                                           那么如何确定PAGE和'列'呢?这个就涉及到寻址模式了,看看下面的这个图就明白了 这个属于页寻址模式,当然还有其他寻址,为了描述的简洁性这里不列出来(加个ID叁议电子ppptalk),详细内容查看说明书应该不难理解。这样对这个表格位置的确定就转换成了如何确定寻址模式,如何确定PAGE,如何确定起止列。与LCD1602类似,去查看OLED的指令表就可以搞定了,指令表中描述的非常清楚了。 3.3 确定显示内容 显示位置确定后,以字节为单位写入数据就可以了,一个字节8位,对应8个led,让它亮就写1,让它灭就写0. 写完一个字节的数据,指针会按照寻址模式的方向自动加1。这样就能构造出各种形状了。当然在实际操作过程中我们需要借助字模工具,让设计过程更加便捷。 4. 显示模块小结: 以上只是简单的描述OLED显示模块操作的思路,忽略了很多具体的细节。但是了解了这个思路,然后去查看说明书就很容易了。 现在来小结一下,对于显示模块,其功能自然是显示作用,既然是显示,我们关心无非就是在哪里显示,显示什么内容。只不过对于不同的显示模块,有些显示的位置多些,有些显示的内容更加丰富一些,比如有些模块可以显示不同的颜色。整体来讲对于显示模块,我们只需要做一件事情就可以了,就是在显示画面的任意一个位置能显示一个点(白点,黑点或者红点等等)。因为任何一个形状都是由点构成的,所以你能在任意一个位置显示一个点,那么理论上讲你就能显示各种形状了。当然,在具体操作中我们会借助一些字模工具来完成。 5. OLED模块参考代码 游客,如果您要查看本帖隐藏内容请回复

  • 回复了主题帖: 10分钟理解LCD1602如何显示自定义字符

    lising 发表于 2018-4-8 23:58 不错!
    谢谢哦

  • 2018-04-08
  • 发表了主题帖: 10分钟理解LCD1602如何显示自定义字符

    replyreload += ',' + 2353704;相信大家都知道如何通过查字库表的方法来显示表中的任意一个字符。假如现在我想显示某个温度值,需要标志出温度符号”°C”,现在你去字库表里面查找,发现根本找不到这个符号,那怎么办?可以通过自定义字符解决这个问题。在上一个帖子简单讲解了LCD1602的基本操作过程,下面我们就来简单描述如何让1602显示自定义字符。 1. 思路分析 为了方便阅读,在这里我们把LCD1602字库表的一部分截取过来。前面讲了,如果要显示字符‘A’,那么写入数据高位(b7-b4)为0100,写入数据低位(b3-b0)为0001,合起来为0x41.那么如果现在写入数据0x00显示什么呢?数据0x00高4位和低4位全部为0,对应下表中第一行的第一列,我们发现里面是空的,如下图中红色方框所示。 图1 这个红色框的部分就是给我们‘自定义字符的’。CGRAM一共64个字节,一个字符需要8个字节,这样CGRAM一共可以表示8个字符,简单的说就是有8个‘空’可以由我们来自定义(我们把它记作-“自定义空”)。类似的,在(b7-b4)为0000的整列都是空的,其余的都是有字符的,也就是说右边蓝色框部分是‘固定’的,或者说别人已经帮我们写好的。现在我们要写入数据0x00显示某个字符,那么就需要在0x00对应的这个位置(上图红色框所示)构造出一个字符,简单的讲就是先‘填空’, ‘填空’之后就和蓝色部分一样了。而‘填空’的这个字符可以是任意的,也就是说属于‘自定义字符’。 这样思路就很清楚了 第一步:填空           (构造这个字符) 第二步:显示这个空  (显示这个字符) 2. 如何填空(构造字符) 前面讲了1602模块共2行,每行16个空格,一共32个空格,如下图所示,每一个空格能显示一个字符。 图2 现在我们从这32个空格中提取出一个来分析,如下图所示。仔细观察,一个大空格实际上是由很多小空格组成的,每一行5个小空格,一共8行。我们把这里面的每一个小空格理解成一个led(共40个)。那么也就是说,LCD1602模块显示32个字符,实际上每一个字符是由40个led组成的。这样回到我们的目的-显示自定义字符,实际上就是控制这40led点亮或者熄灭。 这里为了分析的方便,现在给每一行(5个led)前面多添加3个led,如下图所示,只不过每一行前面的这3个led永远都不亮。 图3 这样问题就变成了如何控制8×8的点阵,每一行8个led,一共8行。回去查看LCD1602指令表即可,这个命令字节(CMD)的高两位固定为01(也就是0x40),剩下的6位如何分布,如下图所示。CMD剩下6位中的高3位,用来确定“你要填哪一个空”,前面讲了一共有8个“自定义空”可用。如果你取000的话,就表示你填的是图1中红色方框所示的“自定义空”,如果取001的话,就表示图1中红色方框下面的一个“自定义空”,依此类推。继续看,CMD的低3位就来确定8×8的点阵位置。如果取000,就表示第一行的8个led,如果取001,就表示第二行的8个led,依此类推。确定了点阵的‘行’,紧跟着写入一个字节的数据就可以了,一个字节8位,刚好对应这一行的8个led,1表示led亮,0表示led灭。 图4 3. 显示构造字符 当这个字符构造好了之后,剩下步骤就前面一样了,确定显示位置,确定显示内容。 LCD1602自定义字符参考代码: 游客,如果您要查看本帖隐藏内容请回复 此内容由EEWORLD论坛网友ppptalk原创,如需转载或用于商业用途需征得作者同意并注明出处

  • 发表了主题帖: 10分钟理解LCD1602液晶显示模块

    1. 初识LCD1602液晶模块LCD1602什么意思,LCD表示LiquidCrystal Display,1602表示一行可以显示16个字符,一共有两行。实物图如下所示: 2. 思路分析 LCD1602是显示模块,主要作用当然是显示了。既然是显示,我们可以想一想,无非就是两个内容: 第一点:你打算让它在哪里显示(显示位置) 第二点:你要显示什么内容       (显示内容) 很明显,这两点都是来自于单片机的控制,单片机让它显示什么它就显示什么,单片机让它在哪里显示它就在哪里显示。 这一句话也可以换个说法,比如单片机'告诉'LCD1602模块:请你在第1行的第4个位置,显示字符‘A' 所谓'告诉',也即是单片机与LCD1602模块进行'沟通'。类比一下我们平时的"沟通",比如打电话,是不是一上来就开始 谈论主题了。当然不是,先要发出一信号,比如"喂",打个招呼,确定对方能收到信号后才开始谈论主题。当然也有些人会嘘寒问暖 几句才开始正题谈话。 总之,在'沟通'之前要有个'打招呼'的过程。对于单片机与LCD1602的'沟通'也一样,同样需要先'打个招呼',只不过我们这里换了个说法 叫做"初始化"。 这样整个思路就出来了: 第一步:初始化            (单片机先跟1602打个招呼) 第二步:确定显示位置  (单片机告诉1602在哪里显示) 第三部:确定显示内容  (单片机告诉1602显示什么内容) 3. 操作步骤 思路出来,下面就是按照这个思路去实现就行了。如何实现呢,当然要看你使用的LCD1602液晶模块厂家给的说明书了。 3.1 初始化 如何初始化呢?1602说明书上已经告诉你了,想都不用想,照做即可 延时15ms 写指令38H 延时5ms 写指令38H 写指令08H 写指令01H 写指令06H 写指令0CH 复制代码 3.2 确定显示位置 如何确定显示位置呢?前面说了显示位置就是2行,每一行16个空格,这样一共是32个空格。那么单片机如何告诉LCD1602 在哪个空格显示呢?注意到单片机和LCD1602都是机器,既然是机器之间的沟通当然要使用机器语言了。既然是机器语言无非 就是0和1组成的语言。那么现在的问题就是如何通过0和1来确定显示位置。这个就比较容易了,比如我只使用一个位的话, 那么就只能确定两个位置,用0来表示第一行的第一个空格显示,用1来表示第一行的第2个空格显示。前面说了,1602有32个 空格,很明显一个位肯定不够用。同样的道理,采用两个位的话就是4种组合,也就是可以确定4个空格,三个位的话就是8个 空格,仍然不够用。那么就继续增加位数,五个位就够了。比如当单片机发送00000这个信息给1602时就表示要它在第1行的第1 个空格显示,00001表示在第1行的第2个空格显示,依此类推。但是通常机器之间的沟通是以字节(8位)为最小单位的,这样 我们就能通过8位0和1的组合确定显示位置。至于具体的组合方式对应着什么位置就要查看厂家提供的说明书了。 对于这8位0和1的组合在说明书上已经明确指出了,它的最高位固定为1,剩下7位由上表确定。比如剩下7位为40H的时候,就表示 在1602的第2行第1个空格显示。当剩下7位为4FH的时候就表示在第2行的第16个空格显示。 3.3 显示内容 剩下的一个问题就是如何确定显示内容。同样显示什么内容也是通过8位的0和1的组合来完成的,这8位不同的组合形式就对应着不同 的显示内容,具体如下图所示 比如当单片机发送00110000给1602的时候,就表示告诉让1602显示字符0,等等。 这样又有了个新的问题,当单片机发送1000 0100给1602的时候,它怎么知道这个信息是"位置"信息还是"内容"信息呢? 这两种信息都是用8位的0和1组合而成的,如何区别?我们把"位置"信息定义为"命令",把"内容"信息定义为"数据"。那么 单片机如何告诉1602发送的是"命令"还是"数据",这个问题就去翻一翻说明了,上面讲的很清楚。 步骤整理好了,下面就是对照时序图实现单片机如何发送一个字节(命令/数据)给1602了。 参考代码如下: 此内容由EEWORLD论坛网友ppptalk原创,如需转载或用于商业用途需征得作者同意并注明出处

TA暂时无记录哦~

最近访客

< 1/1 >

统计信息

已有9人来访过

  • 芯币:38
  • 好友:--
  • 主题:4
  • 回复:4
  • 课时:--
  • 资源:--

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言