【51单片机】 数据管显示HELLO.

来源:互联网 发布:c语言校园导游系统 编辑:程序博客网 时间:2024/05/22 03:36

软件准备+硬件准备

软件:1.Keil软件v6.12(与书中版本保持一致方便学习,如果喜欢别的版本也可以下载别的)

      2. STC-ISP(将十六进制代码写到单片机上)

硬件:TX-1C(书本推荐,并非本人广告)

【学习单片机,你起码得有块单片机的板子吧…也不一定是自己的,借别人的也可以】


HELLO.程序

#include <reg52.h>#define uchar unsigned char#define uint unsigned intsbit dula=P2^6;                           //申明U1锁存器的锁存端sbit wela=P2^7;                           //申明U2锁存器的锁存端  void delayms(uint xms){                  //延时函数uint i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}                    void main(){while(1){dula=1;P0=0x76;               //送段选数据,显示Hdula=0;                P0=0xff;               //原来段选数据通过位选锁存器造成混乱,专业术语叫"消影"wela=1;                P0=0xfe;               //送位选数据wela=0;        delayms(1);            //延时dula=1;P0=0x79;              //送段选数据,显示Edula=0;P0=0xff;wela=1;P0=0xfd;wela=0;delayms(1);dula=1;P0=0x38;              //送段选数据,显示Ldula=0;P0=0xff;wela=1;P0=0xfb;wela=0;delayms(1);dula=1;P0=0x38;               //送段选数据,显示Ldula=0;P0=0xff;wela=1;P0=0xf7;wela=0;delayms(1);dula=1;P0=0x3f;               //送段选数据,显示0dula=0;P0=0xff;wela=1;P0=0xef;wela=0;delayms(1);dula=1;P0=0x80;               //送段选数据,显示.dula=0;P0=0xff;wela=1;P0=0xDf;wela=0;delayms(1);}}



 

如果你是初学者,对其中的一些概念还不太清楚的话,那么就继续往下看。如果和我差不多的话,也可以继续看下,帮我纠正我理解上的错误~(蟹蟹)


一步一步读代码

头文件reg52.h

里面放的是定义52单片机中特殊功能寄存器的位寄存器

(不是51单片机吗怎么变成52了,其实两者差不多52就比51多了个T2定时器)

在Keil软件中,输<reg52.h>,右键->Open Document就可以看到头文件中的详细内容。

接下来的定义宏我就不细说了。

再接下来就是两个锁存器的声明




什么是锁存器?

就是用来控制数据的输出输入状态的。具体原理看下面:

74HC573(锁存器)引脚图

 

真值表:

(L:低电平H:高电平X:任意电平Z:高阻态(电平由于它相连的其他电气决定)Q0:上次的电平状态)


OE 的专业术语为三态允许控制端(低电平有效),通常叫做输出使能端,或输出允许端。

1D-8D:为数据输入端

1Q-8Q:为数据输出端

LE:为锁存允许段或锁存控制端

总结:总的来说,当OE为高电平的时候,不论锁存和数据输入端是什么状态,输出都是高阻态,就是不可控。(所以一般OE都为低电平)

当OE为低电平的时候,LE也为低电平的时候,不论输入什么输出都是上一次输出的状态不会改变。但当LE为H的是什么输出和输入是一致的。

所以不想改变输出的值的时候就应该把LE设为L如果想改变就把LE设为H。



 

C51数据类型扩展定义

sfr        特殊功能寄存器的数据声明,声明一个8位的寄存器

sfr16   16位特殊功能寄存器的数据声明

sbit       特殊功能位声明,也就是声明某一个特殊功能寄存器中的某一位

bit 位变量声明,当定义一个位变量时可以使用此符号

例:sfr SCON=0x98;

0x98是串行口控制寄存器的开始地址,所以这样声明和赋值之后,SCON就具有此寄存器的功能可以直接对变量的操作来操作寄存器。

所以你要定义某个变量时需要知道那个寄存器的位置来去使用它。

现在来解释代码的意思

sbit dula=P2^6;     声明U1锁存器的锁存端(P2^6)用dula这个变量名表示

sbit wela=P2^7;     声明U2锁存器的锁存端(P2^7)用wela这个变量名表示





延时函数

理解这个含义我们首先要来了解一下单片机中的几个周期

时钟周期(振荡周期):定义为时钟频率的倒数就是单片机外接晶振的频率的倒数。为CPU仅完成一个最基本的动作所用的时间。是单片机中最基本最小的时间单位。

状态周期:时钟周期的两倍。

机器周期:完成一项基本操作所用的时间,如取指令、存储器读/写。为单片机的基本操作周期,由12个时钟周期组成。

指令周期:指CPU执行一条指令所需要的时间,一般一个指令周期含有1-4个机器周期

一次自减操作为机器周期这样算得传入xms就为延时多少ms

计算方法:首先算出时钟周期:T=1/(11.0529M)   s  

             然后一次自减是机器周期 12*T     s

                为了达到函数效果我们需要计算出1ms所需次数:0.001/12T  次    ->对应于j的初始值                   最后双重循环达到延时xms的效果


为什么填1呢?1ms人眼显然是不能辨别的。就好像固定显示一样。其实是在闪烁的。

(电影胶片是24帧 也就是每秒钟可以看到24张图像 低于这个数值就会感觉画面不流畅  如果以24帧为界限 那么人眼在高于0.04167秒的间隔就会感觉到(百度来的..))






对数据管显示的操作理解

理解一个,其他的就好理解了。

首先你要了解寄存器之间控制的联系


看清图上数字标号的顺序,就能够了解他们输入的对应关系接下来是位选段选的原理图


这样之后应该就能够了解下面一系列代码的含义。而且也能够写出自己想要显示的内容,当然是不能超出它本来的限制的。

对于单个数据管的显示,那个h对应的就是小数点,置1就亮置0就不亮。

然后还有一个小细节需要注意的是赋值是从高位向低位赋值的并不是从低到高。

这样你就可以尝试一下,写出自己想要显示内容的代码了。


效果截图



2 0
原创粉丝点击