实验四 数码管静态显示.docx

上传人:牧羊曲112 文档编号:5175329 上传时间:2023-06-11 格式:DOCX 页数:10 大小:269.91KB
返回 下载 相关 举报
实验四 数码管静态显示.docx_第1页
第1页 / 共10页
实验四 数码管静态显示.docx_第2页
第2页 / 共10页
实验四 数码管静态显示.docx_第3页
第3页 / 共10页
实验四 数码管静态显示.docx_第4页
第4页 / 共10页
实验四 数码管静态显示.docx_第5页
第5页 / 共10页
亲,该文档总共10页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《实验四 数码管静态显示.docx》由会员分享,可在线阅读,更多相关《实验四 数码管静态显示.docx(10页珍藏版)》请在三一办公上搜索。

1、实验四数码管静态显示一、实验目的1. 熟练掌握单片机定时器的原理和应用方法。2. 了解数码管的原理,掌握数码管的真值表的计算方法。二、实验内容通过对单片机编程来实现数码管静态显示。三、实验知识点3.1定时器的初步认识时钟周期:时钟周期T是时序中最小的时间单位具体计算的方法就是1/时钟源,我们 KST-51单片机开发板上用的晶振是11.0592M,那么对于我们这个单片机系统来说,时钟周 期=1/11059200 秒。机器周期:我们的单片机完成一个操作的最短时间。机器周期主要针对汇编语言而言, 在汇编语言下程序的每一条语句执行所使用的时间都是机器周期的整数倍,而且语句占用的 时间是可以计算出来的,

2、而C语言一条语句的时间是不可计算的。51单片机系列,在其标 准架构下一个机器周期是12个时钟周期,也就是12/11059200秒。定时器和计数器。定时器和计数器是单片机内部的同一个模块,通过配置SFR (特殊功 能寄存器)可以实现两种不同的功能。顾名思义,定时器就是用来进行定时的。定时器内部有一个寄存器,我们让它开始计数 后,这个寄存器的值每经过一个机器周期就会加1一次,因此,我们可以把机器周期理解为 定时器的计数周期。我们的秒表,每经过一秒,数字加1,而这个定时器就是每过一个机器 周期的时间,也就是12/11059200秒,数字加1。3.2定时器的寄存器描述标准的51里边只有定时器0和定时器

3、1这两个定时器,现在很多单片机也有多个定时 器的,在这里我们先讲定时器0和1。那么我前边提到过,对于单片机的每一个功能模块, 都是由他的SFR,也就是特殊功能寄存器来控制。而和定时器有关的特殊功能寄存器,有 TCON和TMOD,定时值存储寄存器。a)定时值存储寄存器表4-1中的寄存器,是存储计数器的计数值的,TH0/TL0用于T0,TH1/TL1用于 T1。表4-1定时值存储寄存器名称描述SFR地址TH0定时器0高字节8CHTL0定时器0低字节8AHTH1定时器1高字节8DHTL1定时器1低字节8BHb) TCON-定时器/计数器控制寄存器表4-2 TCON-定时器/计数器控制寄存器的位分配(

4、地址:88H) 可位寻址;复位值:0x00;复位源:任何复位位76543210符号TF1TR1TF0TR0IE1IT1IE0IT0表4-3 TCON-定时器/计数器控制寄存器的位描述位符号描述7TF1定时器1溢出标志。一旦定时器1发生溢出时硬件置1。清零有两种方式:软件清零,或者进入定时器中断时硬件清零。6TR1定时1运行控制位。软件置位/清零来进行启动/关闭定时器。5TF0定时器0溢出标志。一旦定时器0发生溢出时硬件置1。清零有两种方式: 软件清零,或者进入定时器中断时硬件清零。4TR0定时0运行控制位。软件置位/清零来进行启动/关闭定时器。3IE1外部中断部分,与定时器无关,暂且不看2IT

5、11IE00IT0表4-2中有TF1、TR1、TF0、TR0这4位需要我们理解清楚。两位定时器1的,两位 定时器0的,我们只解释定时器1的,定时器0的同理。先看TR1,当我们程序中写TR1 = 1 以后,定时器值就会每经过一个机器周期加1,当我们程序中写TR1 = 0以后,定时器值就 会保持不变化。TF1,这个是一个标志位,他的作用是告诉我们定时器溢出了。比如我们的 定时器设置成16位的定时器,那么每经过一个机器周期,TL1加1 一次,当TL1加到255 后,再加1,TL1变成0,TH1会加1 一次,如此一直加到TH1和TL1都是255 (即TH1 和TL1组成的16位整型数为65535)以后

6、,再加1 一次,那么就会溢出,TH1和TL1同时 都变为0,只要一溢出,TF1马上自动变成1,告诉我们定时器溢出了,仅仅是提供给我们 一个信号,让我们知道定时器溢出了,它不会对定时器是否继续运行产生任何影响。c) TMOD-定时器方式控制寄存器表4-4 TMOD-定时器方式控制寄存器的位分配(地址89H) 不可位寻址;复位值:0x00;复位源:任何复位位76543210符号GATE(T1)C/T(T1)M1 (T1)M0 (T1)GATE(T0)C/T(T0)M1 (T0)M0(T0)表4-5 TMOD-定时器/计数器方式控制寄存器的位描述符号描述T1/T0在表5-5中,标T1的表示控制定时器

7、1的位,标T0的表示控制 定时器0的位。GATE该位被置1时为门控位。当该位被清0时,只要TRx位被置1, 定时器x就使能开始计时C/T定时器或计数器选择位。该位被清零时用作定时器功能(内部系统 时钟),被置1用作计数器功能。表4-6 TMOD-定时器方式控制寄存器M1/M0工作模式M1M0工作模式描述000兼容8048单片机的13位定时器,THn的8位和TLn的5位组 成一个13位定时器011THn和TLn组成一个16位的定时器1028位自动重装模式,定时器溢出后THn重装到TLn中113禁用定时器1,定时器0变成2个8位定时器以上这4种模式的配置,其中模式0是为了兼容老的8048单片机而设

8、的,现在的51 几乎不会用到这种模式,而模式3根据我的应用经验,他的功能模式2完全可以取代,所以 基本上也是不用,那么我们重点就学习模式1和模式2。模式1就是THn和TLn组成了一个16位的定时器,取值范围是0到65535,溢出后, 只要不对THn和TLn重新赋值,则从0开始计数。模式2的功能是自动装载,就是TLn溢 出后,TFn就直接置1 了,并且THn的值直接赋给TLn,然后TLn从新赋值的这个数字开 始计数。这个功能可以用来产生串口的通信波特率。为了加深大家理解这个定时器原理,我们来看一下他的模式1的电路示意图3-1。图4-1定时器/计数器模式1示意图OSC框表示时钟频率,d等于12,因

9、为1个机器周期等于12个时钟周期,下边GATA 右边的那个门是一个非门电路,再右侧是一个或门,再往右是一个与门电路。图上可以看出来,下边部分电路是控制了上边部分,那我们先来看下边是如何控制的, 我们以定时器0为例。1、TR0和下边或门电路的结果要进行与门运算,TR0如果是0的话,与运算完了 肯定是0,所以确定如果要让定时器工作,TR0 = 1。2、与门结果要想是1,那或门出来的信号必须也得是1才行。在GATE位为1的 情况下,经过一个非门变成0,或门电路结果要想是1的话,那INT0即P3.2引脚必须 是1的情况下,这个时候定时器才会工作,而INT0引脚是0的情况下,定时器不工作, 这就是GAT

10、E位的作用。3、当GATE位为0的时候,经过一个非门变成1,不管INT0引脚是什么电平, 经过或门电路后则肯定是1,定时器就会工作。4、要想让定时器工作,就是加1,从图上看有两种方式,第一种方式是那个开关 打到上边的箭头,就是C/T = 0的时候,一个机器周期TL就会加1 一次,当开关打到 下边的箭头,即C/T =1的时候,T0引脚即P3.4引脚来一个脉冲,TL就加1 一次,这 也就是计数器功能。INT0引脚是P3.2,INT1引脚是P3.3,T0引脚是P3.4,T1引脚是P3.5,这个可以 从我们KST-51开发板原理图上看出来。3.3定时器程序应用我们这节课的程序先使用定时器0,在使用定时

11、器的时候,需要以下几个步骤:第一步:设置特殊功能寄存器TMOD,配置好工作模式; 第二步:设置计数寄存器TH0和TL0的初值;第三步:设置TCON,通过打开TR0位来让定时器开始计数。第四步:判断TCON寄存器的TF0位,监测定时器溢出情况。如何用定时器定时时间?晶振是11.0592M,时钟周期就是1/11059200,机器周期就是 12/11059200,我们假如要定时20ms,就是0.02秒,要经过x个机器周期得到0.02秒,我 们来算一下x*12/11059200=0.02,得到x= 18432。那么我们现在16位的定时器溢出值是65536, 我们可以这样,先给TH0和TL0 一个初值,

12、让他们经过18432个机器周期后刚好溢出,溢 出后我们可以通过检测TF0位得知,就刚好是0.02秒。这个初值y = 65536 - 18432 = 47104, 转成16进制就是0xB800,那么就是TH0 = 0xB8,TL0 = 0x00。那0.02秒我们已经定时出来了,细心的同学会发现,我们如果初值直接给一个0x0000, 一直到65536溢出,定时器定时值最大也就是71ms左右,那么我们想定时更长时间怎么办 呢?倍数关系就可以解决此问题。那好了,我们下面就用程序来实现以下这个功能。#includesbit LED = P0A0;sbit ADDR0 = P1A0;sbit ADDR1

13、= PW;sbit ADDR2 = P1A2;sbit ADDR3 = P1A3;sbit ENLED = PW;void main()unsigned char counter = 0;ENLED = 0;ADDR0 = 0;ADDR1 = 1;ADDR2 = 1;ADDR3 = 1;LED = 1; /74HC138和LED灯初始化部分TMOD = 0x01; 设置定时器0为模式1,0b00000001TH0 = 0xB8;TL0 = 0x00; /定时值初值TR0 = 1;/打开定时器0,从初始值47104开始一个机器周期加1,直到65536溢出,TF会被置1.while(1)if(1

14、= TF0)/判断定时器0是否溢出TF0 = 0;TH0 = 0xB8;一旦溢出后,重新赋值TL0 = 0x00;counter+;if(50 = counter) /判断定时器0溢出是否达到50次,50*20ms=1scounter = 0; /counter 清 0,重新计数LED = !LED; /LED取反操作,0-1,1-0小灯1秒亮,一秒灭图4-1数码管原理图从图4-1能看出来,数码管共有a,b,c,d,e,f,g,dp这8个段,而实际上,这8个段每一段 都是一个LED小灯,所以数码管就是由8个LED小灯所组成的。我们看一下数码管内部结 构图4-2。本程序实现的结果是我们板子上最右

15、边的小灯点亮持续一秒,熄灭持续一秒,也就是以 0.5HZ的频率进行闪烁。3.4数码管的基本介绍图4-3数码管结构图数码管分为共阳数码管和共阴数码管,所谓的共阴数码管就是8只LED小灯的阴极是 接在一起的,也就是阴极是公共端,由阳极来控制小灯是否亮灭。同理,共阳数码管就是阳 极是接到一起的,从我们板子的电路图上能看出来,我们所用的数码管是共阳数码管,如图 4-4所示。图4-4共阳数码管电路他们的com是接到了正极上,当然了,和LED小灯电路类似,也是由74HC138控制 了三极管的导通来控制整个数码管的电流,我们先来看DS1这个数码管。原理图上可以看 出来,控制DS1的三极管是Q17,控制Q17

16、的引脚是LEDS0,对应到74HC138上边就是 Y0端的输出。APPROADDK1ADDR2ADD3B15LEDSO14LEDS113LEDS212LEDS311LEDS410LEDS59LEDS67图4-5 74HC138控制图我们现在的目的是让LEDS0这个引脚输出低电平,相信大家现在可以独立根据前边学 至U的内容把ADDR0,ADDR1,ADDR2,ADDR3,ENLED这4个输入状态写出来。数码管通常是用来显示数字的,我们板子上的6个数码管,习惯上我们称之为6位,那 控制位选择的就是74HC138 了。而数码管内部的8个LED小灯我们称之为数码管的段,那 么数码管的段选择(即该段的亮

17、灭)是通过P0 口控制,经过74HC245驱动。3.5数码管的真值表数码管的8个段,我们直接当成8个LED小灯来控制,那就是a、b、c、d、e、f、g、 dp 一共8个LED小灯。我们通过图5-1可以轻而易举的看出来,如果我们点亮b和c这两 个LED小灯,也就是数码管的b段和c段,其他的所有的段都熄灭的话,就可以让数码管DS1显示一个数字1,那么这个时候实际上P0的值的二进制就是0b11111001,十六进制就 是0xF9。那么我们写一个程序进去,看看让数码管显示一下看看。#include/包含寄存器的库文件sbit ADDR0 = P1A0;sbit ADDR1 = PW;sbit ADDR

18、2 = P1A2;sbit ADDR3 = P1A3;sbit ENLED = PW;void main()unsigned char j = 0;unsigned int i = 0;ENLED = 0;ADDR0 = 0;ADDR1 = 0;ADDR2 = 0;ADDR3 = 1;/74HC138 开启三极管 Q17while(1)/程序死循环P0 = 0xF9;/打开数码管b和c段大家把这个程序编译一下,下载到单片机里会发现,最右侧的数码管成功显示1这个数 字。同样的方法,我们可以把其他的数字都成功的在数码管上显示出来,而数码管显示的数 字对应给P0的赋值,我们叫做数码管的真值表。我们来

19、列一下我们这个电路图的数码管真 值表,注意,这个真值表里显示的数字都不带小数点。表5-1数码管真值表数字01234567真值表0xC00xF90xA40xB00x990x920x820xF8数字89ABCDEF真值表0x800x900x880x830xC60xA10x860x8E大家可以把上边那个数码管显示1的那个程序中的P0的赋值随便修改成我们表5-1中 的真值表里的数字试试看,把数码管显示的数字显示出来。3.6数码管的静态显示前面的实验我们了解到74HC138同时一次只能让一个输出口为低电平,也就是在一个 时刻内,我们只能让一个数码管显示,始终选通数码管并且可以根据我们的P0总线的信号 来

20、改变这个数码管的值,我们可以理解为数码管的静态显示。数码管静态显示是对应动态显示而言的,静态显示对于一两个数码管还行,多个数码管, 静态显示实现的意义就没有了。这节课我们先用一个数码管的静态显示来实现一个简单的秒 表,为下节课的动态显示打下基础。四、实验步骤建立工程-保存工程-建立文件-保存文件-添加文件到工程-编写 程序9编译9下载程序五、实验参考程序#include/包含寄存器的库文件sbit LED = P0A0;sbit ADDR0 = P1A0;sbit ADDR1 = PW;sbit ADDR2 = P1A2;sbit ADDR3 = P1A3;sbit ENLED = PW;un

21、signed char code LedChar = (0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8e;/用数组来存储数码管真值表void main()设置定时器0为模式1unsigned char counter = 0;unsigned char j = 0;ENLED = 0; ADDR0 = 0; ADDR1 = 0;ADDR2 = 0; ADDR3 = 1; P0 = 0XFF; /74HC138 和 P0 初始化部分TMOD = 0x01;设置定时器0为模式1TH0 =

22、0xB8;TL0 = 0x00;/定时值初值TR0 = 1;/打开定时器0/定时值初值/打开定时器0while(1)if(1 = TF0)/判断定时器0是否溢出TF0 = 0;TH0 = 0xB8;TL0 = 0x00;counter+;if(50 = counter)/溢出后,重新赋值每 20ms 变量 counter 加 1/判断定时器0溢出是否达到50次,50*20ms=1scounter = 0; /counter 清 0,重新计数P0 = LedCharj+; /把数组里的对应值送给P0 if(16 = j)当显示到F后,归0重新开始P0 = LedCharj+; /把数组里的对应值送给P0

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号