您现在的位置: 晨光科技 >> 文章 >> 技术 >> 单片机 >> 正文  
  零成本学Arduino单片机之1602液晶和PWM灯           
零成本学Arduino单片机之1602液晶和PWM灯
[ 作者:佚名    转贴自:http://www.eefocus.com/zhang700309/blog/12-11/288060_bcff3.html    点击数:38    更新时间:2018/5/10    文章录入:LA ]
[注:本站登载的某些文章并不代表本站支持或反对其观点或肯定其真实性]

   记得早在2008年,我看到哈工大郭天祥同学的《十天攻克单片机》的视频讲座,为他的不断学习,不断追求的进取精神所感染。我从这个视频讲座里学习到的学以致用的思维理念和规范严谨的编程风格,至今还影响着我。视频配套教程也常常在我手边翻阅,书名为《新概念 51单片机C语言教程-入门、提高、开发、拓展全攻略》。

 

 书中第8讲,题为“1602液晶显示原理及应用”,讲述了1602液晶模块的工作原理,模块的控制和数据引脚功能、控制线的时序,缓存RAM地址以及如何用软件指令控制1602液晶硬件运行。不妨看看这段郭天祥同学当年的教学视频,为Arduino单片机控制1602液晶显示,做些知识准备。

1602液晶显示原理及应用视频:

 

   现在的时间已经来到了2012年11月了,一种易学好用的Arduino单片机正在风靡全球。所以我把兴趣点从51转到了Arduino,是不是这山望那山高,也不是的,单片机是拿来用的,不是用来学的,Arduino因为更方便“用”,而且会了51,学习Arduino单片机也就是分分钟的时间,所以转到Arduino单片机来做应用也是自然进化的结果。

    上一篇文章《零成本学Arduino单片机之入门》提到了Arduino单片机的5点优势,其中有一个优势是:“针对周边I/O设备的Arduino编程,由于很多I/O设备都随之带有库文件或者样例程序,所以在自己的程序中,可以引用库文件中的函数,或复制样例程序,然后修改下其中的参数,即可迅速编写出大段大段的复杂程序,从而放大了您的编程能力。”,所以有了Arduino单片机可能就不需要了解上述视频所介绍的1602液晶工作原理以及软件指令与硬件底层电路之间对应关系。完全可以把1602液晶模块看成黑匣子,只要知道1602液晶11个引脚哪几根是控制引脚,哪几根是数据引脚就OK了!

    Arduino确实不是省油的灯,早就帮你准备好了一切,1602液晶有专门的函数库,即LiquidCrystal,这个函数库相关资讯,可以从官网了解到,http://arduino.cc/en/Tutorial/HomePage

    LiquidCrystal函数库针对1602液晶的数据传送有两种模式,一种是8bit模式,一种是4bit模式。8bit的传送速度快,是因为显示的字符都是ASCII码,ASCII码是8位二进制数组成,所以8bit刚好一次就把字符的二进制码一次传完,而4bit则是需要将字符拆成两半,一次只传送4bit,两倍时间才可以把数据传完,不过4bit模式的好处是需要的数据引脚少了一半,方便硬件连线。

    8bit模式需要D0~D7引脚,4bit只需后四个引脚D4~D7。不管是哪种模式控制引脚都有3个,分别为:RS、RW、Enable。 

    4bit模式的LiquidCrystal申明函数为:LiquidCrystal(RS, RW, Enable, D4, D5, D6, D7);

    8bit模式的LiquidCrystal申明函数为:LiquidCrystal(RS, RW, Enable, D0, D1, D2, D3, D4, D5, D6, D7);

     这篇文章介绍的仿真项目中1602液晶显示采用的是8bit模式,用到的3个控制引脚和8个数据引脚,如下图所示,它们分别连到了Arduino单片机11个数字端口上,根据8bit模式的LiquidCrystal申明函数的参数格式和Arduino单片机与1602液晶的引脚连线关系,1602液晶引脚与Arduino数字端口对应关系,可申明为:LiquidCrystal lcd(11,12,13,2,3,4,5,6,7,8,10)。

 尽管网络上的Arduino英文资讯可谓铺天盖地,但是中文书籍却很少,但是还是要尽可能地收集些中文资料才对,比如LiquidCrystal函数库的用法,我就是从《Arduino一试就上手》书中第7-5页看到。在这本书你可以继续看到LiquidCrystal函数库的其它函数,如初始化1602液晶工作模式函数lcd.begin(16,2);光标定位函数lcd.setCursor();ASCII字符显示函数lcd.print()。

    此书是台湾作者孙骏荣等所编写,已经被科技出版社引进,并转换成简体中文版,是本学习Arduino的好书。台湾总是在新科技潮流工具的应用上,能紧跟国际潮流。

 

说完1602液晶的Arduino单片机的应用,接着谈谈如何在仿真环境下,输出PWM信号,来调节LED灯的亮度。

   Arduino单片机发出的PWM信号频率大约500hz,所以用实物进行测试,由于滞留效应,人眼感觉不到LED灯发生了闪烁现象,认为亮度变化是平稳的。但是用 Proteus进行仿真试验,却只是看到LED灯闪烁得厉害,所以我采用了一个由电感与电容组成的滤波电路,把PWM信号变成直流信号,消除了仿真时闪烁的问题。注意实物测试,不需要这个滤波电路。

     在Proteus软件环境里,提取Arduino单片机、LCD1602、LED、电位计,并进行硬件连线,并根据上一篇“入门”文章介绍的方法,设置Arduino单片机的工作模式和上载Hex文件,就可以仿真,测试下仿真实验的效果了。

《零成本学Arduino单片机之入门》文章网址:http://www.eefocus.com/zhang700309/blog/12-10/287570_57f22.html

双击图片,都可以放大看!

 

该实验的Proteus硬件原理图请下载:Proteus原理图.zip

 

根据上图所示硬件原理图,Arduino程序所需完成的任务是:调节电位计输出的电压值,并通过模拟端口0采集到单片机中,1602液晶实时显示该电压值的变化,并把电压值正比转换为PWM信号的脉宽值,然后从数字端口9输出PWM信号,驱动LED灯,使LED灯的亮度发生改变。

注意:由于“单三角括号”里的内容,博客里显示不出来,所以我把头文件声明命令“被迫”进行了修改,以便在博客里看到头文件,例如改成"#include 《LiquidCrystal.h>"。当您把程序复制到Arduino IDE编程软件里时,注意改回“头文件”申明指令的“单三角括号”格式。

Arduino程序:

#include 《LiquidCrystal.h> //申明1602液晶的函数库

int potpin = 0; // 申明电位计连在模拟端口0

int PWMpin = 9; // 申明LED灯连在数字端口9

//申明1602液晶的11个引脚所连接的Arduino数字端口

LiquidCrystal lcd(11,12,13,2,3,4,5,6,7,8,10);      

//初始化

void setup()

{

  lcd.begin(16,2);      //初始化1602液晶工作模式

                       //定义1602液晶显示范围为2行16列字符

  lcd.setCursor(0,0);   //把光标定位在第0行,第0列

  lcd.print("Voltage ="); //显示“Voltage =”

  lcd.setCursor(15,0);   //把光标定位在第0行,第15列

  lcd.print("V");       //显示“V”

}

//主程序 

void loop()

{

  //把电位计的电压值采集为10位数字量,并赋值给变量sensorValue,数值范围为0~1023

  float sensorValue = analogRead(potpin);

  //把数值范围为0~1023的数字量正比转换为实测电压值

  float voltage=sensorValue/1023*5;

  //把光标定位在第0行,第10列

  lcd.setCursor(10,0);  

  lcd.print(voltage);//显示实测电压值 

  //把数值范围为0~1023的数字量正比转换为PWM信号的脉宽等份值0~255

  sensorValue = (int)sensorValue/4;

  //输出PWM信号,驱动LED灯,调节灯的亮度

  analogWrite(PWMpin, sensorValue);

  delay(20);//延时

}

   有了库文件的帮助,我们发现各种外围周边设备的编程变得十分轻松。掌握了Arduino单片机在仿真环境中应用,按照类似方法,也很容易移植到实际电子设备中,如下图所示。

 

    采用实物来完成1602液晶显示,我选用的设备是DFRobot公司的IIC/TWI LCD1602液晶模块,该液晶模块的说明书网址为:http://wiki.dfrobot.com.cn/index.php?title=IIC/TWI_LCD1602%E6%B6%B2%E6%99%B6%E6%A8%A1%E5%9D%97_(SKU:DFR0063)

   IIC/TWI LCD1602液晶模块在1602液晶基础上加装了I2C接口,使LCD1602液晶与Arduino单片机的连线从原来的11根线缩减到4根线,这4根线为SDA、SCL、GND和VCC它们能直接与层叠在Arduino控制板上的Xbee传感器扩展板的I2C专用端口连接起来,于是较原先的1602液晶的硬件连线更加简捷方便。由于1602液晶加装了I2C接口,所以不能直接用官方的LiquidCrystal函数库了,但不要紧,可以用DFRobot公司提供的LiquidCrystal_I2C函数库,加上用于I2C通讯的官方Wire函数库,有了这两个函数库文件,再借助DFRobot公司产品说明书网址中提供的样例程序,应该可以很容易编写自己的程序了。

LiquidCrystal_I2库文件的RAR文件请下载:LiquidCrystal_I2C.zip

 

Arduino程序:(IIC/TWI LCD1602液晶模块 

#include 《Wire.h> //申明库文件

#include 《LiquidCrystal_I2C.h>

int potpin = 0; // 申明电位计连在模拟端口0

int PWMpin = 9; // // 申明LED灯连在数字端口9

 //申明DFRobot公司1602液晶的I2C地址和工作模式

LiquidCrystal_I2C lcd(0x27,16,2);        

//初始化

void setup()

{

  lcd.init();//1602液晶初始化

  delay(20);//延时

  lcd.init();//需要两次初始化

  delay(20);

  lcd.backlight();  //点亮背光灯

  lcd.setCursor(0,0);//把光标定位在第0行,第0列

  lcd.print("Voltage ="); //显示“Voltage =”

  lcd.setCursor(15,0);//把光标定位在第0行,第15列

  lcd.print("V");    //显示“V”

}

//主程序 

void loop()

{

  //把电位计的电压值采集为10位数字量,并赋值给变量sensorValue,数值范围为0~1023

  float sensorValue = analogRead(potpin); 

  //把数值范围为0~1023的数字量正比转换为实测电压值

  float voltage=sensorValue/1023*5; 

  //把光标定位在第0行,第10列

  lcd.setCursor(10,0);  

  lcd.print(voltage);  //显示实测电压值 

  //把数值范围为0~1023的数字量正比转换为PWM信号的脉宽等份值0~255

  sensorValue = sensorValue/4;

  //输出PWM信号,驱动LED灯,调节灯的亮度

  //由于使用了DFRobot的Xbee V5传感器扩展板,该板子的电路特点所致,

  //脉宽等份值越大,LED灯亮度越小,所以需进行算式255-sensorValue的修正

  analogWrite(PWMpin, 255-sensorValue);

  delay(20);//延时

}

仿真实验与实物对照视频:

 

   这篇文章不仅强调了Arduino编程中I/O设备函数库的强大,而且也取证了函数库一样可以用在Arduino单片机的Proteus仿真项目中。

    目前直接针对Arduino单片机的Proteus仿真实例还十分得少,但是针对51单片机的单片机仿真实例很多,只要用ATMEGA328P去代替51单片机,就可以把现成的51单片机Proteus仿真项目变成了Arduino单片机项目。彭伟老师编写的《单片机C语言程序设计实训100例》就是一本Proteus仿真的好书,还附带一张光盘,内含全部实例的程序清单和Proteus电气原理图。

    国内最火的Proteus仿真论坛:http://proteus.5d6d.net/bbs.php,在这个论坛,你也可以看到有关Proteus仿真的资讯,下载到很多有用的资料。

  • 上一篇文章: 零成本学Arduino单片机之串行通讯

  • 下一篇文章: 零成本学Arduino单片机之入门
  •    
    [注:标题搜索比内容搜索快]
    发表评论】【告诉好友】【打印此文】【关闭窗口
     最新5篇热点文章
  • 轨道钢承重计算公式及应用[109]

  • 【选型】如何为变频器选取阻值…[86]

  • AIS2023参展厂商名录[346]

  • AGV综合选型[170]

  • APIE 2023第4届亚太国际智能装…[138]

  •  
     最新5篇推荐文章
  • 外媒:正在唤醒中国的习近平[305]

  • 中国反伪科学运动背后的CIA黑手…[494]

  • [转载]袁隆平真言:中国最大的…[668]

  • 台专家:当年我们造IDF时 大陆…[572]

  • 旅日华人:中国严重误判日本民…[577]

  •  
     相 关 文 章
  • Arduino和STM32性能对比究竟谁…[26]

  • Labview及Proteus软件环境下单…[38]

  • 基于labview串口通讯的虚拟数字…[41]

  • AVR编程语言Arduino也可以用Pr…[47]

  • Arduino编程 PWM方法调节LED光…[37]


  •   网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
        没有任何评论
    设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 管理登录 | 
    版权所有 Copyright© 2003 晨光科技        站长:璀璨星辰        页面执行时间:210.94毫秒
    Powered by:MyPower Ver3.5