《物联网感知技术》实验报告
学院:交通与物流工程
实验组号:指导教师:张玲
实验地点:实验时间:
实验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