不过我们的实验板是做不了这个实验的,为什么,我们稍候再讲,先让我们来讲解一下字形表的 制作问题,先就上述标准的图形来做,写出数据位和字形的对应关系并列一个表如下(共阳接法,也就
是输出为“0”时笔段亮)。
怎么样,不算复杂吧,就是这样列个表格,根据要求(“0”亮“1”灭)写出相应位的“0”和“1”就可以了。接着练习一下,写出显示
A-F 的字形码。
不过这是按照上面的标准接线排列的,在实际的程序设计中,有时为了接线方便常常会把接线顺序打乱(我们的实验板就是这样的),那么此时的字形表又该如何做呢?其实也很简单,一样地列表,以我们的实验板为例,同样显示9876543210,共阴极接法(注意:和共阳极
接法的区别)。接线如下:
P2.0 P2.1 P2.2 P2.3 P2.4 P2.5 P2.6 P2.7 对应g f a b h c d e,则字形码如下所示:
(0)11101110/EEH;(1)00101000/28H;(2)11001101/ CDH;(3)01101101/6DH;(4)00101011/ 2BH;(5)01100111/67H;(6)11100111/E7H;(7)00101100/2CH;(8)11101111/EFH;(9)00101111/ 2FH;继续练习,写出显示此时的A-F 的字形码。下面提个问
题:如果是共阳极的接法,字形码又该是怎么样的呢?不用我再说了吧,如果学到现在连这个还不明白,那真的是惨了! 现在让我们来继续上面的实验,把543210 的字形码放入上面的查表程序中(即DB:。 。)后面,如果要显示012345,我们的程序又该
如何修改呢?自己想一下。
本来这里讲的是显示器的静态接口问题,到此应当可以算结束了,但我还是想接着上面讲到的数的本质问题谈一点。单片机中有一些术语、名词本来是帮助我们理解事物的,但有时我们会被这些术语的相关语义所迷惑,以致不能进一步认清他们的本质,由此陷入困惑的境界。为什么会这样呢?因为我们往往只会从词义的本身去理解它,而不是从词义的概念和来历去了解它,所以只有深入地了解74LS164 的工作
特性,才能真正理解何谓串行的数据。如果您还不明白,我们可以课后再交
单片机经典教程24 LED 数码显示器的动态显示方法
由于静态显示占用的I/O 口线较多,CPU 的开销很大,所以为了节省单片机的I/O 口线,常采用动态扫描方式来作为LED 数码管的接口电路。在实际的工程应用中,它是使用最为广泛的一种显示方式,其接口电路是把所有显示器的8 个笔划段h-a 同名端连在一起,而每一个显示器的公共极COM 端与各自独立的I/O 口连接。当CPU 向字段输出口送出字形码时,所有显示器接收到相同的字形码,但究竟是那个显示器亮,则取决于COM 端,而这一端是由I/O 口控制的,所以我们就可以自行决定何时显示哪一位了。而所谓动态扫描就是指我们采用分时的方法,一位一位地轮流控制各个显示器的COM 端,使各个显示器每隔一段时间点亮一次。
在轮流点亮的扫描过程中,每位显示器的点亮时间是极为短暂的(约1ms 左右),由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位显示器并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感。
在我们实验板的电路图中,我们把89C51 的P2 口作为位选端(即同名端ABCDEFGH )并联起来,而把它们的片选端分别与P3.5 和P3.6 连接(图中为了增加P3.5 和P3.6 的驱动能力采用了一个三极管)这样由P3.5 和P3.6 控制对应数码管的亮或灭,只要给P2.0 送入不同的字形码,就能显示不同的数了。下面的这个程序,就是用我们实验板上的两个数码管来显示“0”和“1”,电路的连接方法请看后面的实验板电路图。
FIRST EQU P3.6 ;第一位数码管的位控制 SECOND EQU P3.5 ;第二位数码管的位控制 DISPBUFF EQU 5AH ;显示缓冲区为5AH ORG 0000H ; AJMP START ; ORG 30H ;
START:MOV SP,#5FH ;设置堆栈 MOV P0,#0FFH ; MOV P1,#0FFH ;
MOV P2,#0FFH ;初始化所有显示器,LED 灭 MOV DISPBUFF,#0 ;第一位显示0 MOV DISPBUFF+1,#1 ;第二位显示1 LOOP:LCALL DISP ;调用显示程序 AJMP LOOP ;主程序到此结束 DISP:PUSH ACC ;ACC 入栈 PUSH PSW ;PSW 入栈
MOV A,DISPBUFF ;取第一个待显示数 MOV DPTR,#DISPTAB ;字形表首地址 MOVC A,@A+DPTR ;取数字0 的字形码 MOV P2,A ;将字形码送P2 口
SETB FIRST ;打开第一位显示器位选端 LCALL DELAY ;延时1 毫秒
CLR FIRST ;关闭第一位显示器(开始准备第二位的数据)
从上面的例子中可以看出,动态扫描显示必须由CPU 不断地调用显示程序,才能保证持续不断的显示。上面的这个程序虽然可以实现数字的显示,但不太实用,为什么呢?因为这里做了两个数字的显示工作,没有做其他的事情,而在实际的产品中,不可能只显示两个数字,当然肯定还要做其他的事情。这样在两次调用显示程序之间的时间间隔就不能确定了,如果时间间隔比较长,就会使显示不连续,也就是说,在实际的应用中是很难保证所有工作都能在很短的时间内完成的,况且这个显示程序也有点“浪费”,每个数码管显示都要占用1 个毫秒的时间,这在很多场合是不允许的,怎么解决这个问题呢?我们可以借助于定时器,定时时间一到,就产生中断,点亮一个数码管,然后马上返回,这个数码管就会一直亮到下一次定时时间到,而不用再调用延时程序了,这段时间可以留给主程序干其他的事情,直到下一次定时时间到,显示下一个数码管,这样就不会有浪费了。具体这么做,我们就不讲了,大家可以结合以前学过的知识自己编一段程序,就算是这一课的习题吧。
从上面的程序中我们可以看出,与静态扫描相比,动态扫描的程序稍微有点复杂。但这是值得的,因为它可以大大节省单片机的I/O 口线资源,所以在实际的工程应用中几乎都采用动态扫描的方法来进行数码管的显示,我们的这个程序也具有一定的通用性,只要改变端口的值及计数器的值就可以显示更多的位数了。
不过正如我前面所说的那样,单片机的程序设计在实际应用中还会考虑很多的其他问题,所以这一课的内容同样只是给大家以后的学习打一个基础。倒是下面的LED 数码管的选择原则和驱动方法大家有必要了解一下。二.LED 数码管的选择和驱动
LED 数码管是单片机人机界面输出中用的最多也是最简单的显示方式,由于单片机口线的驱动能力是有限的,所以如何来选择和驱动LED 数码管是单片机初学者的基本功,下面就来给大家介绍一下。
前面我们已经讲过,LED 数码管有两种连接方法:一种是共阳接法;一种是共阴接法。在单片机的应用中,对于共阳接法,我们一般把它叫做“接电源”方法,即把COM 端接“VCC”,通过控制COM 端引脚电平的高低来达到选通的目的;而对于共阴接法,则通常叫做“接地”方法,即把COM 端接“GND”。
由于受单片机口线驱动能力的限制,采用直接驱动的方法,只能连接小规格的LED 数码管,目前市场上有一种高亮度的数码管,每段工作电流约为1-2mA ,这样当LED 全亮时,工作电流在10-20mA 左
右,是普通数码管的1/10 ,正好能用单片机的口线直接驱动,因此在条件允许的情况下,应尽量采用这种LED 数码管作为显示器件。 当然如果想用更高亮度或更大尺寸的数码管来作为显示器件,比如户外的电子钟,大型广告牌等等,就必须采用适当的扩展电路来实现与单片机的接口,常用的接口元件可以是三极管、集成电路和专用芯片,
三极管的规格可以根据数码管所需的驱动电流大小进行选择,电流比较小的可以用9013,8550 等小功率晶体管,电流比较大的则可以用BU208 等大功率三极管;而当显示器的位数较多时,一般采用集成电路来作接口,此类集成电路有2003 、7406 、75452 等,它们的功能其实就是由多路晶体管组成的达林顿电路具体电路请大家自己找一些相关的资料查一下;另外还可以使用一种叫译码/驱动器的芯片,这种芯片能将二-十进制码(BCD 码)译成七段码(a-g )以驱动数码管,采用这种芯片的最大好处是编程简单,并且能提高CPU 的运行效率,如CD4511 或74LS47 等就是此类芯片(不过,它们的驱动能力也是有限的,具体数据请参考有关的使用手册)。
近几年来,国内外厂商还开发了许多基于串行总线(SPI )方式的LED 接口芯片,这些芯片采用SPI 总线方式与单片机进行串行通讯,具用占用单片机口线少,程序易于实现的特点,比如美信的MAX7219 、力源的PS7219 等,有些芯片还集成了键盘控制器,可以实现键盘和显示的双重功能,如zlg7289 等。关于这方面的内容请您自己找一些相关的资料来看一下。
其实,除了数码管显示外,在实际的工程应用中,单片机还有很多的显示方法,其中比较常用的就是液晶显示器。液晶显示器是一种低压低功耗的显示器件,它的工作电压一般只要几伏,工作电流仅有几个微安,是任何数码管显示器件所无法比拟的。除此之外,液晶显示器的最大优点就是可以显示文字、图形和曲线,与传统的数码管显示器相比,显示界面有了质的提高,采用点阵式的液晶显示器配合大规模集成电路能够显示大量的信息,目前已经广泛使用在各类中高档仪器仪表及家用电器中,比如数字万用表,手机,数码相机等等。 单片机C语言教程 第一课 建立你的第一个Keil C51项目
随着单片机技术的不断发展,以单片机C语言为主流的高级语言也不断被更多的单片机爱好者和工程师所喜爱。使用C51肯定要使用到编译器,以便把写好的C程序编译为机器码,这样单片机才能执行编写好的程序。KEIL uVISION2 是众多单片机应用开发软件中优秀的软件之一,它支持众多不一样公司的MCS51架构的芯片,它集编辑,编译,仿真等于一体,同时还支持,PLM,汇编和C语言的程序设计,它的界面和常用的微软 VC++的界面相似,界面友好,易学易用,在调试程序,软件仿真方面也有很强大的功能。本站提供的单片机c语言教程都是基于keilc51的。
下面结合8051介绍单片机C语言的优越性:
·无须懂得单片机的具体硬件,也能够编出符合硬件实际的专业水平的程序; ·不懂得单片机的指令集,也能够编写完美的单片机程序; ·不同函数的数据实行覆盖,有效利用片上有限的RAM空间;
·提供auto、static、const等存储类型和专门针对8051单片机的data、idata、pdata、xdata、code等存储类型,自动为变量合理地分配地址;
·C语言提供复杂的数据类型(数组、结构、联合、枚举、指针等),极大地增强了程序处理能力和灵活性; ·提供small、compact、large等编译模式,以适应片上存储器的大小;
·中断服务程序的现场保护和恢复,中断向量表的填写,是直接与单片机相关的,都由C编译器代办;
·程序具有坚固性:数据被破坏是导致程序运行异常的重要因素。C语言对数据进行了许多专业性的处理,避免了运行中间非异步的破坏
·提供常用的标准函数库,以供用户直接使用;
·有严格的句法检查,错误很少,可容易地在高级语言的水平上迅速地被排掉;
·可方便地接受多种实用程序的服务:如片上资源的初始化有专门的实用程序自动生成;再如,有实时多任务操作系统可调度多道任务,简化用户编程,提高运行的安全性等等。
·头文件中定义宏、说明复杂数据类型和函数原型,有利于程序的移植和支持单片机的系列化产品的开发;
以上简单介绍了 KEILC51 软件,要使用KEILC51软件,必需先要安装它,这也是学习单片机编程语言所要求的第一步――建立学习环境。 安装好后,您是不是想建立自己的第一个单片机C语言程序项目呢?下面就让我们一起来建立一个小程序吧,请根据教程一步步的来,你绝对可以在短时间内熟悉c51的。
首先当然是运行KEIL软件,接着按下面的步骤建立您的第一个项目:
(1)点击 Project 菜单,选择弹出的下拉式菜单中的 New Project,如图 1-2。接着弹 出一个标准 Windows 文件对话窗口,如图 1-3。在“文件名”中输入您的第一个 C 程序项 目名称,这里我们用“test”。“保存”后的文件扩展名为 uv2,这是 KEIL uVision2 项目文件扩展名,以后能直接点击此文件以打开先前做的项目。
图 1-2 New Project 菜单
图 1-3 文件窗口
(2)选择所要的单片机,这里选择常用的 Ateml 公司的 AT89c51。而且本单片机c语言教程里的大部分程序都是基于此芯片的,此时屏幕如图 1-4 所示。AT89c51 有什么功能、特点呢?看图中右边有简单的介绍。完成上面步骤后,就可 以进行程序的编写了。 (3)首先在项目中创建新的程序文件或加入旧程序文件。如果您没有现成的程序,那 么就要新建一个程序文件。在 KEIL 中有一些程序的 Demo,在这里我们还是以一个 C 程序 为例介绍如何新建一个 C 程序和如何加到您的第一个项目中吧。点击图 1-5 中 1 的新建文 件的快捷按钮,在 2 中出现一个新的文字编辑窗口,这个操作也能通过菜单 File-New 或 快捷键 Ctrl+N 来实现。好了,现在能编写程序了。下面是经典的一段程序,呵,如果您看过别的程序书也许也有类似的程序: #include #include
SCON = 0x50; //串口方式1,允许接收 TMOD = 0x20; //定时器1定时方式2
TCON = 0x40; //设定时器1开始计数 TH1 = 0xE8; //11.0592MHz 1200波特率 TL1 = 0xE8; TI = 1;
TR1 = 1; //启动定时器
while(1)
printf (Hello World!\\n);; //显示Hello World }
图 1-4 选取芯片
图 1-5 新建程序文件
这段程序的功能是不断从串行口输出“Hello World!”字符,先不管程序的语法和意思吧,先 看看如何把它加入到项目中和如何编译试运行。
(4)点击图 1-5 中的 3 保存新建的程序,也能用菜单 File-Save 或快捷键 Ctrl+S 进行保存。因是新文件所以保存时会弹出类似图 1-3 的文件操作窗口,把第一个程序命名
为 test1.c,保存在项目所在的目录中,这个时候您会发现程序单词有了不一样的颜色,说明 KEIL的C语言语法检查生效了。如图 1-6 鼠标在屏幕左边的 Source Group1 文件夹图标上右击弹出 菜单,在这里能做在项目中增加减少文件等操作。选“Add File to Group ‘Source Group 1’” 弹出文件窗口,选择刚刚保存的文件,按 ADD 按钮,关闭文件窗,程序文件已加到项目中了。这个时候在 Source Group1 文件夹图标左边出现了一个小+号说明,文件组中有了文件,点击它能展开查看。
图 1-6 把文件加入到项目文件组中
(5)C程序文件已被加到了项目中了,下面就剩下编译运行了。这个项目只是用做学 习新建程序项目和编译运行仿真的基本方法,所以使用软件默认的编译设置,它不会生成用 于芯片烧写的 HEX 文件。先来看图 1-7 吧,图中 1、2、3 都是编译按钮,不一样是 1 是用 于编译单个文件。2 是编译链接当前项目,如果先前编译过一次之后文件没有做动编辑改动, 这个时候再点击是不会再次重新编译的。3 是重新编译,每点击一次均会再次编译链接一次,不 管程序是否有改动。在 3 右边的是停止编译按钮,只有点击了前三个中的任一个,停止按钮 才会生效。5 是菜单中的它们。在 4 中能看到编译的错误信息和使用的系统资源情况等, 以后我们要查错就靠它了。6 是有一个小放大镜的按钮,这就是开启\\关闭调试模式的按钮, 它也存在于菜单 Debug-Start\\Stop Debug Session,快捷键为 Ctrl+F5。
图 1-7 编译程序
(6)进入调试模式,软件窗口样式大致如图 1-8 所示。图中 1 为运行,当程序处于停止 状态时才有效,2 为停止,程序处于运行状态时才有效。3 是复位,模拟芯片的复位,程序 回到最开头处执行。按 4 能打开 5 中的串行调试窗口,这个窗口能看到从 51 芯片的串 行口输入输出的字符,这里的第一个项目也正是在这里看运行结果。这些在菜单中也有。首 先按 4 打开串行调试窗口,再按运行键,这个时候就能看到串行调试窗口中不断的打印“Hello World!”。最后要停止程序运行回到文件编辑模式中,就要先按停止按钮再按开启\\关闭调试 模式按钮。然后就能进行关闭 KEIL 等相关操作了。