51单片机控制八个发光二极管左右循环。

// 定义一个演示函数,定时时间大概为一个ms。 //重复以上语句, led灯点亮,保持亮的状态,熄灭,保持熄//灭状态 循环这个4个过程。

/*  */作用,它是用来注释一段内容的,编译器不对其进行编译,只要在/*  */直接的内容都被注释掉。

// 是用来注释其后面的内容,只能注释一行。

#include <reg51.h> //这句告诉我们包涵51的头文件,头文件放的是什么东西,放的是51单片机对应的操作的寄存器地址,如我们直接用来操作的P1口就是代表0x90地址,我们可以将光标低位在<reg51.h>上然后右键

…………………………….

头文件中定义了51系列单片机的所有功能寄存器,我们直接使用其代号就可以,P0,P1等

如 sfr P0=0x80,意思是把单片机内部地址0x80处的寄存器重新起名字叫P0,以后我们在程序中直接操作P0,就相当于对单片机内部0x80地址处的寄存器进行操作。通俗的讲,也就是说,通过sfr这个关键字,让Keil编译器在单片机与人之间搭建一个桥梁,我们操作P0口,单片机对应就去操作内部0x80的地址。所以我们写程序要在开始处直接包涵单片机的头文件。

 定义一个函数delay();与c语言一样,要用一个函数,先定义,我们可以叫它子函数,可以调用的。

从这句开始,你现在控制单片机了,告诉单片机把你的P2口都输出0,如果你不操作P2口了,那么P2口一直保持这个状态,直到你去改变它。

调用子函数delay(),告诉单片机去执行delay那个函数,那么P2口一直保持0这状态。

这时告诉P2口全部输出1,(0xff=).转太有0变成1了,对应的灯的输出也由低电平变成高电平了

这个程序里执行完了一次又干什么呢,

Keil编译器会编译成一直重复执行main()函数里面的代码,整个代码的效果就是:

2)延时一段时间,目的是P2输出的电平保持一段时间

4)延时一段时间,目的是P2输出的电平保持一段时间

通过更改delay(延时时间t),参数t,可以改变闪烁频率。

  1. 打开软件(提前装好驱动)
  2. 点击打开文件,打开我们刚刚编译的led.hex文件,下载程序,就会看到led闪烁。
延时实现P2口LED流水灯效果 (用循环移位指令)

一般在排阻上都标有阻值号,其公共端附近也有明显标记。如下下图表示为472,表示47*(10^2)=4700欧姆,

还有的标号如3R0,表示阻值为3欧姆, 4K7表示阻值为4.7kΩ, R002表示阻值为0.002欧姆。

    (2)发光二极管。它具有单向导电性,通过5mA左右电流即可发光,电流越大,其亮度越强,但若电流过大,会烧毁二极管,一般我们控制在3 mA-20mA之间。在这里,给发光二极管串联一个电阻的目的就是为了限制通过发光二极管的电流不要太大,因此这个电阻又称为“限流电阻”。当发光二极管发光时,测量它两端电压约为1.7V,这个电压又叫做发光二极管的“导通压降”。图2.2.9和图2.2.10分别为直插式发光二极管和贴片式发光二极管实物图。发光二极管正极又称阳极,负极又称阴极,电流只能从阳极流向阴极。直插式发光二极管长脚为阳极,短脚为阴极。仔细观察贴片式发光二极管正面的一端有彩色标记,通常有标记的一端为阴极。

   关于排阻大小的选择:欧姆定律想必大家都清楚,U=IR,当发光二极管正常导通时,其两端电压约为1.7V,发光管的阴极为低电平,即0V,阳极串接一电阻,电阻的另一端为Vcc , 为5V,因此加在电阻两端的电压为5V-1.7V=3.3V,计算穿过电阻的电流,3.3 V/ 1000Ω=3.3mA

即穿过发光管的电流也为3.3mA,若想让发光管再亮一些,我们可以适当减小该电阻。

看我们的原理图,可以知道:LED的正极接在VCC上,只要给了低电平,那么LED就会亮,低电平对应到单片机的逻辑就是0,只要单片机的某一个管脚输出0,那么对应的发光二极管就会亮。

通过汇编代码点亮LED

先看看原理图-看点灯需要操作哪一些GPIO端口

同时nLED_1中的n,表示低电平有效

看用户手册,这3个GPIO端口怎么操作

通过C语言代码点亮LED

C语言的函数需要用到栈传递参数(栈就是一片内存空间),这里就需要看看jz2440在单片机模式下的内存布局

可存储代码,像硬盘一样 可存储代码,像硬盘一样
可执行代码,但无法修改norFlash的数据(可读,可执行) 不能执行代码,需要把代码复制到SRAM(SRAM像内存条一样)执行

在上表中,包含了3个硬件:

    • 1)可以像固态硬盘一样存储数据,
    • 2)从nor flash启动之后,nor flash也像包含代码的内存空间,可以执行代码,
    • 3)由于nor flash本身是存储代码的,为了让其上的数据不被破坏,在其内存空间上无法进行写操作,
    • 1)可以单纯的理解为PC上的固态硬盘,
    • 1)片内内存(可读,可写,可执行),

在JZ2440中,也有像PC上内存条一样的硬件,叫做SDRAM,但是需要初始化,暂时就当这个硬件不存在

再说到C语言函数的栈,是需要可被修改的(能被进行写操作)

1)在之前的点亮3个LED的例子中,有nor启动和nand启动

  • CPU读出Nor上第1个指令(前4字节),执行;
  • CPU继续读出其它指令执行。
  • 2440硬件把Nand前4K内容复制到片内的RAM,然后CPU从0地址取出第1条指令执行

2)当前需要编写C语言的函数,需要栈,而栈是往下增长的,所以nor flash启动和nand flash启动,栈的设置如下

  • 从Nand Flash启动: 0地址在SRAM的地址空间上,0地址可被修改

通过判断0地址是否被修改,来判断是从nor启动还是nand启动

2440里面有个看门狗定时器,开发板上电后,需要在一定时间内“喂狗”(设置相应的寄存器),否则就会重启开发。这里直接关闭看门狗

* 写0到0地址, 再读出来 * 如果得到0, 表示0地址上的内容被修改了, 它对应ram, 这就是nand启动 * 否则就是nor启动

我要回帖

更多关于 单片机按键控制发光二极管的亮灭 的文章

 

随机推荐