实验2:继电器控制LED灯实验

《物联网感知技术》实验报告

学院:交通与物流工程

实验组号:指导教师:张玲

实验地点:实验时间:

实验2:继电器控制LED灯实验

一、实验设备

CC2530单片机、计算机、仿真器、SRD-03VDC-SL-C继电器、USB数据线、串口小助手

二、实验内容

1.认识继电器。

2.了解继电器基本工作原理。

3.了解继电器的驱动原理。

4.烧写程序实现继电器控制开发板上2个LED灯的亮灭

三、实验原理

主要的中断程序:

#include "interrupt.h"

void ex_init(void)

{

EA = 1; //使能全局中断

IEN2 |= 0x02; //P2口中断使能打开 P2IEN |= 0x01; //将P2-0设置中断使能

PICTL |= 0x08;//下降沿触发

P2IFG = 0; //初始化中断标志位

P0IF = 0;//清除中断标志

}

void gpio_init(void)

{

P1DIR |= 0x3;

}

P1DIR |= 0x4; P0DIR |= 0x20;

电磁式继电器一般由铁芯、线圈、衔铁、触点簧片等组成的。只要在线圈两端加上一定的电压,线圈中就会流过一定的电流,而产生电磁效应,衔铁就会在电磁力吸引的作用下克服返回弹簧的拉力吸向铁芯,从而带动衔铁的动触点与静触点(常开触点)吸合。当线圈断电后,电磁的吸力也随之消失,衔铁就会在弹簧的反作用力返回原来的位置,使动触点与原来的静触点(常闭触点)释放。这样吸合、释放,从而达到了在电路中的导通、切断的目的。

四、实验过程

通过外部供电线与USB串口线将继电器,开发板和电脑连接起来,将CC2530按键控制程序烧录到CC2530芯片中。复位芯片,按下开关键,2个LED灯亮起,再次按下开关键,2个LED灯熄灭。过程中可以听到衔铁被吸附时的声音。

五、实验结果及分析

通过控制继电器可以实现对开发板LED灯的间接控制。继电器是一种电子控制器件,它具有输入回路和输出回路,通常应用于自动控制电路中,它实际上是用较小的电流去控制较大电流的一种“自动开关”,在电路中起着自动调节、安全保护、转换电路等

作用。当线圈引出脚两端加上电压或电流,线圈的激磁电流产生磁通,磁通通过铁心、轭铁、衔铁和工作气隙组成的磁路,并在工作气隙产生电磁吸力。当激磁电流上升达到某一值时,电磁吸力矩将克服动簧的反力矩使衔铁转动,带动推动片推动动簧,实现触点闭合,此时LED灯所在电路连通,LED亮起;当激磁电流减小到一定值时,动簧反力矩大于电磁吸力矩衔铁回到初始状态,触点断开,LED灯所在电路断开,LED熄灭。

六、个人总结

在本次实验中,了解了继电器的相关特性,学会了如何使用继电器和它的连接电路,学会了串口工具的程序烧录过程及通过代码控制高低电位产生电压,从而控制继电器衔铁和电路的导通与断开。明白了中断是单片机实时地处理内部或外部事件的一种内部机制。对其有了更深的认识。

 

第二篇:ARM裸机实验之用按键控制LED灯

ARM裸机实验之用按键 控制LED灯

嵌入式可以说是一门很复杂的学科,要想学透并不容易,初学者可以从裸机实验开始学起,所以我为大家准备了一些裸机实验,供大家学习参考,高手就不用看了,呵呵额。。。。。

想当初我学嵌入式时,觉的有点单片机的基础,学起ARM来应该不难,没想到事实并不是我想的那样,单片机相比ARM来说差的远了,呵呵,也并不是说ARM很不好学,只要找到合适的方法,肯下功夫,一段时间之后,你就会收到满意的效果的,好了,进入主题。。。。。。。

主机操作系统:linux redhat9.0

目标板 :TQ2440

ARM: S3C2440

SDRAM:64M

NOR FLASH : 2M

NAND FLASH:256M

记得当初刚开始学的时候,总是想先弄明白ARM是通过什么方式控制它的IO端口的,现在我还是先从这方面开始讲起吧。。。。。。

通过三星公司S3C2440的数据手册可知,它有9组GPIO端口,分别是GPA-GPJ(没有GPI),

它的每组端口的输入和输出都是通过配置相关的寄存器来实现的,比如说GPB这一组,GPB共有11个IO端口GPB0-GPB10,相应的控制寄存器为

GPBCON、GPBDAT、GPBUP。

GPBCON用来设置GPB端口是用来输出还是输入还是用来做第二功能,GPBDAT则是控制IO口的输出电平或从中得到输入电平,GPBUP是决定各个端口是否使用上拉电阻功能。

正因为这样给了我们很大方便,使得我们通过修改寄存器就可以控制端口。下面就来看看我们的程序吧。

首先说要实现的功能:用开发板上的4个按键来控制4个LED灯的亮灭,哪个键按下,相应的灯就亮起,键松开,灯就灭掉。

电路连接情况:4个按键分别接的是GPF0、GPF1、GPF2、GPF4

4个LED灯分别接的是GPB5、GPB6、GPB7、GPB8

先来一个简单的程序,让4个LED灯全亮,看一下整个程序的流程:

.text .global start _start: ldr r0,=0x56000010 mov r1,#0x15400 str r1,[r0] ldr r0,=0x56000014 mov r1,#0x0 str r1,[r0] main_loop: b main_loop

整个程序只有几行,下面咱们来一行一行分析:

ldr r0,=0x56000010 查看S3C2440数据手册可知其中0x56000010就是寄存器GPBCON的地址。这句意思

是把这个地址值赋给r0.

mov r1,#0x15400 这句是把要传到GPBCON中的值先赋给r1.

str r1,[r0]这句的意思就是把r1的值传给以r0中的值为地址所指向的存储空间中,这就完成了设置GPBCON的值。 ldr r0,=0x56000014 mov r1,#0x0 str r1,[r0] 后面这三行

就是给控制GPB端口高低电平的寄存器赋值,使引脚都输出低电平,根据电路图,这时4个LED灯就会全部点亮了。

这是源程序,放到linux系统里面,在同一文件夹下还要编写Makefile文件,这样编译起来比较省事。Makefile文件内容如下:

led.bin:led.S

arm-linux-gcc -g -c -o led.o led.S

arm-linux-ld -Ttext 0x0000000 -g led.o -o led_elf arm-linux-objcopy -O binary -S led_elf led.bin

clean:

rm -f led.bin led_elf *.o

这里暂不介绍Makefile文件的写法,以后会有专门章节讲解的。

下面是通过按键控制LED灯亮灭的程序,程序分为两部分,由于我们打算用C语言编写,所以要先用汇编

语言做一下初始化工作,包括关闭看门狗和设置堆栈。 汇编语言程序:

.text

.global start

_start:

ldr r0,=0x53000000

mov r1,#0 ;关闭看门狗

str r1,[r0]

ldr sp,=1024*4 ;设置堆栈

bl main ;跳转到main函数

main_loop:

bl main_loop

保存为 :led2.S

C语言程序:

/*定义各个端口寄存器,GPB用于LED灯的输出控制,GPF用于按键的输入控制*/

#define GPBCON *((volatile

*)0x56000010)

#define GPBDAT *((volatile

*)0x56000014)

#define GPFCON *((volatile

*)0x56000050)

unsigned unsigned unsigned long long long

#define GPFDAT *((volatile

*)0x56000054)

/*初始化各个端口寄存器*/

void IO_init()

{ unsigned long

GPBCON=0x55<<10;//将GPB5-8端口设为输出,用于控制LED灯的两灭

GPBDAT=0x0f<<5;//初始化LED灯,使其初始状态为熄灭

//GPF初始状态即为输入,可取默认值,不做更改

}

void LED1()

{

//////////////////////////////////在死循环中依次查询各个按键的状态,若键按下,相应的灯亮,若抬起,灭 while(1)

{

if(!(GPFDAT&0x02))

GPBDAT=GPBDAT&~(0x01<<5);

else

GPBDAT=GPBDAT|(0x01<<5); if(!(GPFDAT&0x10))

GPBDAT=GPBDAT&~(0x01<<6); else

GPBDAT=GPBDAT|(0x01<<6); if(!(GPFDAT&0x04))

GPBDAT=GPBDAT&~(0x01<<7); else

GPBDAT=GPBDAT|(0x01<<7); if(!(GPFDAT&0x01))

GPBDAT=GPBDAT&~(0x01<<8); else

GPBDAT=GPBDAT|(0X01<<8); }

}

/////////////////////////C语言主函数

void main()

{

IO_init();

LED1();

}

保存为main.c

如果上面那个让LED灯全亮的程序大家能理解的话,那这个程序也很好理解,它只不过是多了对GPF几个端口的电平读取,然后根据电平判断某个按键是否被按下,来决定让哪个LED灯点亮或是熄灭。

这个程序的功能是某个按键按下LED灯就点亮,等按键松开LED灯就熄灭,如果你能将这个程序理解了的话,为了加深印象,你可自己试着做做改动,比如某个按键按下后它控制的LED灯点亮,直到有另一个按键按下它才会熄灭,相应的LED灯又会点亮。 下面是本程序的Makefile文件:

led2.bin:led2.S main.c

arm-linux-gcc -g -c -o led2.o led2.S

arm-linux-gcc -g -c -o main.o main.c

arm-linux-ld -Ttext 0x0000000 -g led2.o main.o -o led2_elf

arm-linux-objcopy -O binary -S led2_elf led2.bin arm-linux-objdump -D -m arm led2_elf > led2.dis clean:

rm -f led2_elf *.o led2.dis

相关推荐