基于嵌入式LED显示课程设计报告书Word格式.docx
- 文档编号:21005560
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:16
- 大小:251.07KB
基于嵌入式LED显示课程设计报告书Word格式.docx
《基于嵌入式LED显示课程设计报告书Word格式.docx》由会员分享,可在线阅读,更多相关《基于嵌入式LED显示课程设计报告书Word格式.docx(16页珍藏版)》请在冰豆网上搜索。
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的显示缓冲区
如要显示字符或图形,需要先给出对应点阵数据存储在缓冲区才能显示。
图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<
stdio.h>
stdlib.h>
fcntl.h>
unistd.h>
sys/ioctl.h>
sys/mman.h>
linux/delay.h>
#defineTUBE_IOCTROL0x11
#defineDOT_IOCTROL0x12
2)子函数的设计
voidjmdelay(intn)
inti,j,k;
for(i=0;
n;
for(j=0;
j<
100;
j++)
for(k=0;
k<
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;
willenterTUBELED,pleasewaiting..............\n"
sleep
(1);
for(i=10;
i>
=0;
i--)
LEDWORD=(LEDCODE[i]<
8)|LEDCODE[i];
ioctl(fd,0x12,LEDWORD);
jmdelay(1500);
willenterDIGLED,pleasewaiting..............\n"
for(i=0;
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 显示 课程设计 报告书