基于嵌入式LED显示课程设计报告书.docx
- 文档编号:7873231
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:16
- 大小:251.07KB
基于嵌入式LED显示课程设计报告书.docx
《基于嵌入式LED显示课程设计报告书.docx》由会员分享,可在线阅读,更多相关《基于嵌入式LED显示课程设计报告书.docx(16页珍藏版)》请在冰豆网上搜索。
基于嵌入式LED显示课程设计报告书
摘要
由于电子技术的迅猛发展,在我们生活的到处都会发现,LED灯的广泛存在。
LED以其组构方式灵活,显示灵活,寿命长,功耗低,技术成熟,成本低廉等特点,广泛在车站,证券所,运动场所,交通干道各种室外显示场所的信息发布,公益宣传,环境参数实时显示,重大活动倒计时等场所得到广泛应用。
本文通过上位机编程控制下位机,在LED灯驱动程序设计的过程中,从零开始做起,到最后完成LED驱动程序设计并成功驱动LED灯,编写本文档有助于巩固实训所学。
设计该LED灯驱动程序主要是为了完成在Linux下设计LED灯驱动程序并成功驱动LED显示相应的图案。
关键词:
嵌入式makefile点阵LED
前言
嵌入式系统一般由嵌入式微处理器,外围硬件设备,嵌入式操作系统,用户应用程序4个部分组成。
用于实现对其他设备的控制,监视或管理等功能。
嵌入式系统已经广泛应用于科学研究,工业控制,军事技术,交通通信,医疗卫生,消费娱乐等领域,人们常用的手机,PDA,汽车,智能家电,GPS等均是嵌入式系统的典型代表。
本课程设计要求利用实验室提供的ARM2410实验箱进行相应的设计,主要包括理解LED原理,掌握在LINUX下常用编辑器的使用,掌握MAKEFILE的编写和使用,掌握LINUX下的程序编译与交叉编译过程,有一定的数字电路的知识,能够设计出新颖的显示图样,最后通过上下位机实现结果的显示
一.实验平台
1.1嵌入式系统简介
嵌入式系统是基于单片机的一种升级版,它是以应用为中心、以计算机技术为基础、软件硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。
我们可从几方面来理解嵌入式系统:
1、嵌入式系统是面向用户、面向产品、面向应用的,嵌入式系统是与应用紧密结合的,它具有很强的专用性,必须结合实际系统需求进行合理的裁减利用。
嵌入式系统和具体应用有机地结合在一起,它的升级换代也是和具体产品同步进行,因此嵌入式系统产品一旦进入市场,具有较长的生命周期。
2、嵌入式系统是将先进的计算机技术、半导体技术和电子技术和各个行业的具体应用相结合后的产物。
这一点就决定了它必然是一个技术密集、资金密集、高度分散、不断创新的知识集成系统。
3、嵌入式系统必须根据应用需求对软硬件进行裁剪,满足应用系统的功能、可靠性、成本、体积等要求。
为了提高执行速度和系统可靠性,嵌入式系统中的软件一般都固化在存储器芯片或单片机本身中,而不是存贮于磁盘等载体中。
4、嵌入式系统本身不具备自主开发能力,即使设计完成以后用户通常也是不能对其中的程序功能进行修改的,必须有一套开发工具和环境才能进行开发。
实际上,凡是与产品结合在一起的具有嵌入式特点的控制系统都可以叫嵌入式系统。
现在人们讲嵌入式系统时,某种程度上指近些年比较热的具有操作系统的嵌入式系统。
1.2认识博创经典实验箱
博创经典UP-TECH-S2410/P270-DVP实验箱是由北京博创兴业科技推出的一款嵌入式实验箱。
它的核心模块为S2410或P270,当它安装S2410核心模块时为S2410实验箱,安装P270核心模块时为P270实验箱。
1.3建立开发环境
1.在下位机断电的情况下,利用实验箱中自带的串口线将上位机的com1口与下位机的RS232-0口进行连接。
2.利用实验箱中自带的直连网线将上位机与下位机进行连接。
3.根据下位机中安装的核心模块,选择相应的嵌入式系统开发软件光盘。
4.将选择好的嵌入式系统开发软件光盘放入上位机的光驱中,在终端命令窗口中挂载该光盘。
mount–oiocharset=gb2312/dev/cdrom/mnt
5.进入光盘的Linux工具软件目录。
执行该目录下的shell文件“install.sh”,Linux工具软件会自动安装完成。
对于S2410,会将程序安装在目录“arm2410cl”下,交叉编译器安装在目录“/opt/host”下。
用户可以通过使用命令“armv41-unknown-linux-gcc”运行交叉编译器。
6.启动minicom超级终端程序,选择“Serialportsetup”进入串口配置界面进行串口配置。
然后可以打开下位机的电源,通过minicom对下位机进行操作。
7.使用命令ifconfig分别查看上位机和下位机的IP地址,判断上位机与下位机是否处于同一个网段。
若它们不在同一网段,使用命令ifconfig或者KDE桌面的工具,将它们配置在同一网段。
使用命令ping查看上位机与下位机的网络连接是否正常,如不正常,请检查网线的连接、IP地址的配置、IP地址是否冲突等。
8.将上位机配置为NFS服务器,设置共享目录为“/arm2410cl”。
9.在上位机中启动NFS服务,下位机使用命令mount挂载上位机的共享目录。
mount–tnfs192.168.0.252:
arm2410cl/mnt/nfs
1.4给下位机烧写软件系统
下位机的软件系统由Bootloader、系统核、根文件系统和应用程序四部分组成。
Bootloader相当于PC机上的BIOS,在下位机加电时自动运行,执行硬件初始化和调用系统核的功能。
Bootloader分为U-boot、Vivi、Blob、ARMBoot、RedBoot等多种,本实验使用实验箱自带光盘中的vivi。
系统核就是运行在下位机上的操作系统核,本实验使用实验箱自带光盘中的zImage,是ARM-Linux的核,版本号为2.6。
根文件系统是Linux系统必不可少的一部分,用来管理下位机中的文件。
本实验使用实验箱自带光盘中的root.cramfs。
Cramfs是专门针对Flash设计的只读压缩的文件系统,其容量上限为256M,采用zlib压缩,文件系统类型可以是EXT2或EXT3,经常作为下位机的根文件系统。
应用程序是需要烧写到下位机,在下位机中运行的程序,在上位机中以压缩文件包的形式保存,本实验使用实验箱自带光盘中的yaffs.tar.bz2。
应用程序所的文件系统为Yaffs(YetAnotherFlashFileSystem),Yaffs是一种专门为Flash设计的嵌入式文件系统,运行速度快、占用存小,提供写均衡、垃圾收集等底层功能。
给下位机烧写软件系统的步骤:
1.烧写Vivi到下位机;
2.在上位机的WindowsXP中配置超级终端,连接下位机;
3.烧写系统核到下位机;
4.烧写根文件系统到下位机;
5.烧写应用程序到下位机。
二.基本原理
2.1LED显示控制原理
LED是发光二极管英文LightEmittingDiode的缩写格式,LED器件种类繁多,早期的LED产品是单个发光管,随着数字化设备的出现,LED数码管和字符管得到了广泛的应用,LED点阵等显示器件的出现,适应了信息化社会发展的需要,成为了大众传媒的重要工具。
LED发光灯按类型可以分为单色发光灯、双色发光灯、三色发光灯、面发光灯、闪烁发光灯、电压型发光灯等;按发光强度可分为普通亮度发光灯、高亮度发光灯、超高亮度发光灯等。
2.1.17段(或8段)LED
LED的7个字段分别称为a、b、c、d、e、f、g,有时还有一个小数点段h,图1(a)所示。
通过7个(或8个)发光段的不同组合,显示0~9和A~F共16个字母数字,从而实现十六进制的显示。
为使7段显示器显示数字或字符,就需点亮相应的段,每个段分别由数据线进行控制,通常数据线D0~D7顺序控制a~h段,如图11-34(b)所示,所需的控制信号称为段码。
由于数字与段码之间没有规律性,因此必须进行数字与段码之间的转换以便显示数字。
常用的转换方法是将要显示字形的段码列成一个表,称为段码表。
显示时,根据字符查段码表,取出其对应的段码送到数据线上来控制显示。
图18段LED显示器外形及各段对应的数据线
LED有两种不同的形式:
一种是8个发光二极管的阳极都连在一起,称为共阳极,如图2(a)所示;
另一种是8个发光二极管的阴极都连在一起,称为共阴极,如图2(b)所示。
2.1.2点阵式LED
点阵式LED的显示单元一般由8行8列LED组成,其外形及部连接如图3所示,可以再由这8行8列的LED拼成更大的LED阵列。
点阵式LED显示器能显示各种字符、汉字及图形、图像,并具有色彩。
点阵式LED中,每个LED表示一个像素,通过每个LED的亮与灭来构造出所需的图形,各种字符及汉字也是通过图形方式来显示的。
对于单色点阵式LED,每个像素需要1位二进制数表示,1表示亮,0表示灭。
对于彩色点阵式LED,则每个像素需要更多的二进制位表示,通常需要一个字节。
点阵式LED显示器的显示控制采用扫描方式,在数据存储器中开辟若干个存储单元作为显示缓冲区,缓冲区中存有所需显示图形的控制信息。
显示时依次通过列信号驱动器输出一行所需所有列的信号,然后再驱动对应的行信号,控制该行显示。
只要扫描速度适当,显示的图形就不会出现闪烁。
2.274HC273在开发板上的连接
2.2.17段(或8段)LED的连接
开发板上设置了2个数码管,由74HC273控制,如图4所示。
74HC273是同步串行转并行的锁存器,在此通过SPI总线和CPU连接,锁存数据后驱动数码管发光。
图4开发板上7段LED的连接
2.2.2点阵式LED的连接
点阵式LED在开发板上的连接如图5所示。
点阵式LED驱动器逻辑中设置了8个字节的缓冲区,每个字节按位对应点阵式LED模块上的一列8个点。
驱动器中的扫描电路会将缓冲区的容不断输出到LED模块,CPU可以读写此缓冲区,从而可以更新现实容。
图5开发板上点阵式LED的连接
点阵LED寄存器组共8个字节寄存器,地址A4A3A2A1=从0000到0111,按地址递增顺序分别对应点阵LED模块从左到右的8个列。
每个字节寄存器对应一列,字节寄存器8个位对应该列的8个LED,从Bit0到Bit7分别对应从上到下的LED,如图6所示。
图6点阵式LED寄存器组
2.3LED编程
本次实验中,利用LED驱动程序“s3c2410-led.o”提供的open、ioctl、write、release等函数控制LED显示。
可在相同目录下找到其源程序“s3c2410-led.c”进行分析。
2.3.17段LED的段码表
由于开发板上两个数码管的连接是共阳极,分别显示“十位”和“个位”数字,中间是一个点号,总是让它置“1”。
所以当想要其中之一显示为“0”时,那么其对应的段码应为“11000000”,转化为十六进制即为0xc0。
同理可以给出“1”~“9”的段码,从而形成如下段码表:
unsignedcharLEDCODE[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
注意:
前10个表示字符“0”~“9”的段码,最后一个表示各段全灭,不显示。
用户程序使用ioctl函数用来控制2个数码管的显示:
ioctl(fd,0x12,LEDWORD);
由于两个8字数码管需要同时显示,故需要将“十位”的段码左移8位,拼接上“个位”的段码,形成一个16位的LEDWORD。
2.3.2点阵式LED的显示缓冲区
点阵式LED驱动器逻辑中设置了8个字节的缓冲区,每个字节按位对应点阵式LED模块上的一列8个点。
如要显示字符或图形,需要先给出对应点阵数据存储在缓冲区才能显示。
图7所示的是字符“0”和心形图的点阵,参照图6分别给出各自8个字节中的数据为:
“0”:
{0x00,0x00,0x7c,0x82,0x82,0x82,0x7c,0x00}
心形图:
{0x00,0x0c,0x12,0x22,0x44,0x22,0x12,0x0c}
通过调用write函数控制点阵式LED显示对应字符或图形。
图7字符“0”和心形图的点阵
三.系统分析与设计
3.1设计需求
本次综合实训任务主要是基于Linux的LED驱动程序设计及完成相关的操作。
大致分为两个阶段,第一阶段为环境搭建,第二部分是驱动程序设计。
需要完成的任务是,由驱动程序驱动开发板的LED灯,并且经测试,能够正确的点亮或熄灭开发板上的LED灯,即为完成本次实训任务。
3.2LED点阵显示与C语言编程
3.2.1LED点阵显示
点阵的接法有共阴极和共阳极两种(共阳极指的是对每一行LED来讲是共阳极的)。
显示的方法有两种:
1、逐列扫描方式:
亮的列从左向右扫描完8列(相当于位码循环移位8次)即显示出一帧完整的图像。
ucharcode
TAB[]={0x81,0xFD,0xFD,0xC1,0xBF,0xBF,0xBD,0xC3};
uchari,t;
delay(uchart)
{
while(t--)
{;}
}
voidmain(void)
{
while
(1)
{
P2=0x01;
for(i=0;i<8;i++)
{
P1=TAB[i];
delay(100);
P2=P2<<1|P2>>7;
}
}
}
2、逐行扫描方式:
与逐列扫描调换,扫描完8行显示出一帧图像。
本设计中图形显示的C语言程序的分析
3.2.2C语言编程
利用嵌入式实验平台和LED的工作原理,在本设计中的C语言编程如下:
1)调用系统库函数
#include
#include
#include
#include
#include
#include
#include
#defineTUBE_IOCTROL0x11
#defineDOT_IOCTROL0x12
2)子函数的设计
voidjmdelay(intn)
{
inti,j,k;
for(i=0;i for(j=0;j<100;j++) for(k=0;k<100;k++); } 3)主函数的设计 intmain() { intfd; inti; unsignedintLEDWORD; unsignedcharLEDCODE[11]= {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; unsignedcharman_data[9][8]={ {0x4c,0x92,0x92,0x7c,0x0c,0x12,0x12,0x0c}, {0,0,0,0,0,0,0x0b,0xd3}, {0,0,0,0,0x0b,0xd3,0x3c,0x48}, {0,0,0x0b,0xd3,0x3c,0x4b,0x20,0}, {0,0,0x03,0x13,0xfc,0x08,0,0}, {0,0,0,0x0b,0xd3,0x3c,0x48,0}, {0,0x0b,0xd3,0x3c,0x48,0x20,0,0}, {0,0x08,0x93,0x4b,0x3c,0x24,0x48,0x20}, {0x48,0x20,0,0,0,0,0,0}}; fd=open("/dev/led/0raw",O_RDWR); if(fd<0) { printf("####Leddeviceopenfail####\n"); return(-1); } LEDWORD=0xff00; printf("willenterTUBELED,pleasewaiting..............\n"); LEDWORD=0xff00; ioctl(fd,0x12,LEDWORD); sleep (1); for(i=10;i>=0;i--) { LEDWORD=(LEDCODE[i]<<8)|LEDCODE[i]; ioctl(fd,0x12,LEDWORD); jmdelay(1500); } printf("willenterDIGLED,pleasewaiting..............\n"); sleep (1); for(i=0;i<9;i++) { write(fd,man_data[i],8); jmdelay(1000); } close(fd); return0; } 3.3Makefile文件的编写 在Makefile中可以使用函数来处理变量,从而让我们的命令或是规则更为的灵活和具有智能。 make所支持的函数也不算很多,不过已经足够我们的操作了。 函数调用后,函数的返回值可以当做变量来使用。 makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。 make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如: Delphi的make,Visual C++的nmake,Linux下GNU的make。 可见,makefile都成为了一种在工程方面的编译方法。 Makefile文件的一般格式 objects=main.okbd.ocommand.odisplay.o\ insert.osearch.ofiles.outils.o edit: $(objects) cc-oedit$(objects) main.o: main.cdefs.h cc-cmain.c kbd.o: kbd.cdefs.hcommand.h cc-ckbd.c command.o: command.cdefs.hcommand.h cc-ccommand.c display.o: display.cdefs.hbuffer.h cc-cdisplay.c insert.o: insert.cdefs.hbuffer.h cc-cinsert.c search.o: search.cdefs.hbuffer.h cc-csearch.c files.o: files.cdefs.hbuffer.hcommand.h cc-cfiles.c utils.o: utils.cdefs.h cc-cutils.c clean: rmedit$(objects) Makefile文件编写的规则: 1)如果这个工程没有编译过,那么我们的所有C文件都要编译并被。 2)如果这个工程的某几个C文件被修改,那么我们只编译被修改的C文件,并目标程序。 3)如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的C文件,并目标程序。 利用Makefile文件的编写方法,编写本设计中的Makefile文件: KERNELDIR=/arm2410cl/kernel/linux-2.4.18-2410cl/ INCLUDEDIR=$(KERNELDIR)/include CROSS_COMPILE=armv4l-unknown-linux- CC=$(CROSS_COMPILE)gcc CFLAGS+=-I.. CFLAGS+=-Wall-O-D__KERNEL__-DMODULE-I$(INCLUDEDIR) TARGET=s3c2410-led.oled01 all: $(TARGET) s3c2410-led.o: s3c2410-led.c $(CC)-c$(CFLAGS)$^-o$ led01: led01.o $(CC)$^-o$ clean: rm-f$(TARGET)*.o*~core.depend 注意: “$(CC)$^-o$”和“rm-f$(TARGET)*.o*~core.depend”前面的空白有一个Tab制表符生成,不能单纯有空格代替。 3.4实验环境的连接 1).配置实验的环境。 一、配置NFS服务 NFS(NetworkFileSystem)指网络文件系统,是Linux系统中经常使用的一种服务,NFS是一个RPCservice,很像windows中的文件共享服务。 它的设计是为了在不同的系统间使用,所以它的通讯协议设计与主机及作业系统无关。 当使用者想用远端档案时只要用"mount"就可把remote档案系统挂接在自己的档案系统之下,使得远端的档案在使用上和local的档案没两样。 在NFS服务中,宿主机(Servers)是被挂载(mount)端,为了远端客户机(Clients)(如: S3C6410目标板)可以访问宿主PC机的文件,我们需要配置宿主机两方面容: ①打开NFS服务,②允许“指定用户”访问宿主PC机。 A、在终端中输入命令安装NFS服务: apt-getinstallnfs-kernel-server B、输入以下命令以配置NFS服务: sudogedit/etc/exports 打开文件后,在文件中添加如下容: /temp/tftpboot/nfsroot*(insecure,rw,sync,no_root_squash) 添加完毕,保存文件并退出,继续输入如下命令,为NFS服务端所在目录授予权限: chmod777/temp/tftpboot/nfsroot C、重新启动NFS服务 sudo/etc/init.d/nfs-kernel-serverrestart sudo/etc/init.d/portmaprestart D、测试NFS服务: showmount–e mount172.16.41.217: /temp/tftpboot/nfsroot/mnt ls-l/mnt 二、配置超级终端 A、在Windwos操作系统下,打开超级终端,新建一个连接,步骤如下: 首先为新建连接输入一个名称,然后选择我们所需要连接到的端口,最后配置端口属性,这里只需要修改两处: ①位/秒(B): 115200,②数据流控制(F): 无。 B、连接到开发板 C、配置开发板 仅仅连接到开发板还不够,要使用开发板进行开发测试工作,需要进行一定的配置后,才能正常工作,接下来准备在超级终端下对开发板进行配置 按如下步骤在超级终端下分别输入如下命令: Ⅰ、setenvbootargsnoinitrdinit=/linuxrcconsole=ttySAC2,115200mem=256Mroot=/dev/nfsnfsroot=172.16.41.217: /temp/tftpboot/nfsrootip=172.16.41.35: 172.16.41.217: 172.16.41.1: 255.255.255.0: : eth0: off Ⅱ、setserverip172.16.41.217 Ⅲ、setipaddr172.16.41.35 Ⅴ、save 执行完以上命令后,开发板就配置完成了,可以使用"print"命令来
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 嵌入式 LED 显示 课程设计 报告书