ARM课程设计论文撰写模板Word下载.docx
- 文档编号:20794700
- 上传时间:2023-01-25
- 格式:DOCX
- 页数:23
- 大小:72.17KB
ARM课程设计论文撰写模板Word下载.docx
《ARM课程设计论文撰写模板Word下载.docx》由会员分享,可在线阅读,更多相关《ARM课程设计论文撰写模板Word下载.docx(23页珍藏版)》请在冰豆网上搜索。
5)课程设计进度安排
内容周数 地点
构思及收集资料1 图书馆
组装与调试3 实验室
撰写论文1 图书馆、实验室
学生签名:
2012年月日
课程设计(论文)评审意见
(1)完成原理分析(20分):
优( )、良( )、中( )、一般( )、差( );
(2)设计分析 (30分):
(3)完成调试 (30分):
(4)回答问题 (20分):
(5)格式规范性及考勤是否降等级:
是( )、否( )
评阅人:
分数:
2012年月日
目录
第一章课程设计绪论1
1.1课程设计目的1
1.2课程设计要求1
1.3环境要求1
1.4小组成员分工1
第2章数码管LED概述2
2.1LED数码管结构2
2.2LED数码管工作原理2
2.3LED数码管驱动方式3
第三章概要设计4
3.1总体设计思路4
3.2总流程图4
3.3LED驱动程序设计思路5
3.4DS1621驱动程序设计流程图5
第四章详细设计7
4.1LED驱动原理7
4.2LED驱动程序设计7
4.3应用程序设计7
第5章上机调试与运行结果7
5.1终端输出结果:
7
5.2LED显示结果:
第6章课程设计小结8
附录1程序清单9
附录2参考文献15
第一章课程设计绪论
1.1课程设计目的
1.2课程设计要求
本课程设计要求学生了解Linux操作系统下设备驱动程序的基本知识,掌握Linux内核提供的重要函数接口,掌握IIC接口连接外部设备连接的方法,
根据所掌握的知识编写驱动程序和应用程序源代码,实现以下功能:
在Linux操作系统和ARM嵌入式教学实验系统环境下,利用ARM嵌入式教学实验平台留有的扩展接口连接3个温度传感器DS1621芯片,设计接口电路并联线,编写驱动程序和应用程序实现温度的采集并从终端输出(输出格式:
第几个传感器:
温度值=+32.5℃)和LED显示(显示格式:
传感器号-32.5)。
1.3环境要求
HHARM9-EDU实验教学试验箱一套,PC机一台、3个温度传感器DS1621芯片,导线若干条。
1.4小组成员分工
●欧阳娜(学号06)——编写DS1621驱动程序,进行温度采集;
●余力中(学号22)——编写LED驱动程序和应用程序,进行温度采集。
第2章数码管LED概述
2.1LED数码管结构
LED数码管实际上是由七个发光管组成8字形构成的器件,加上小数点就是8个,引线已在LED内部连接完成,只需引出它们的各个笔划,公共电极(结构见图2.1)。
这些段分别由字母a,b,c,d,e,f,g,dp来表示,见图2.2。
常用LED数码管显示的数字和字符是0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F。
图2.1LED数码管结构图图2.2LED引脚
led数码管根据LED的接法不同分为共阴和共阳两类:
将多只LED的阴极连在一起即为共阴式,而将多只LED的阳极连在一起即为共阳式。
led数码管广泛用于仪表,时钟,车站,家电等场合。
选用时要注意产品尺寸颜色,功耗,亮度,波长等。
2.2LED数码管工作原理
当数码管特定的段加上电压后,这些特定的段就会发亮,以形成我们眼睛看到的字样了。
如:
显示一个“2”字,那么应当是a亮b亮g亮e亮d亮f不亮c不亮dp不亮(参考图2.3)。
图2.3
2.3LED数码管驱动方式
LED数码管要正常显示,就要用驱动电路来驱动数码管的各个段码,从而显示出我们要的数位,因此根据LED数码管的驱动方式的不同,可以分为静态式和动态式两类。
1.静态显示驱动:
静态驱动也称直流驱动。
静态驱动是指每个数码管的每一个段码都由一个单片机的I/O埠进行驱动,或者使用如BCD码二-十进位*器*进行驱动。
静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O埠多,如驱动5个数码管静态显示则需要5×
8=40根I/O埠来驱动,要知道一个89S51单片机可用的I/O埠才32个呢。
故实际应用时必须增加*驱动器进行驱动,增加了硬体电路的复杂性。
2.动态显示驱动:
数码管动态显示介面是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划"
a,b,c,d,e,f,g,dp"
的同名端连在一起,另外为每个数码管的公共极COM增加位元选通控制电路,位元选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位元选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位元就显示出字形,没有选通的数码管就不会亮。
透过分时轮流控制各个LED数码管的COM端,就使各个数码管轮流受控显示,这就是动态驱动。
在轮流显示过程中,每位元数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极体的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示资料,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O埠,而且功耗更低。
第三章概要设计
由于我负责的主要是LED驱动程序和应用程序。
因此,在此以LED驱动程序和应用程序的讲解为主。
3.1总体设计思路
首先,要对需要的参数和变量进行定义及初始化;
然后,使用open函数打开温度传感器DS1621和LED数码管;
再次,然后从温度传感器中采集温度;
最后,再将采集的温度从终端输出,并显示对应的温度传感器序号,同时将结果显示在LED上。
3.2总流程图
1.总体设计流程图见图3.1。
图3.1
3.3LED驱动程序设计思路
DS1621驱动程序设计思路如下:
3.4DS1621驱动程序设计流程图
1.驱动程序设计流程图见图3.2。
图3.2
第四章详细设计
4.1LED驱动原理
驱动LED的时候,应该分二种情况比如用共阳接法和共阴接法,共阳的时候LED正端接正电源,负端通过一个限流电阻接P口,这时不用接上拉电阻,只要这个限流电阻取合适就可以了发光管亮的时候电流就是从电源正——LED——限流电阻——P口,P口为低电位发光管灭的时候没有电流流过,P口为高电位或高阻状态共阴接法,LED负端接地,正端直接P口,这时候要接上拉电阻,这个上拉电阻是提供LED发光用的,发光管亮的时候电流是从电源正——上拉电阻——LED——地。
这时上拉电阻也是限流用的。
P口为高电位或高阻状态发光管暗的时候电流是从电源正——上拉电阻——P口,这时LED无电流流过,P口为低电位,限流电阻上流过电流全部从P口流入。
4.2LED驱动程序设计
4.3应用程序设计
第5章上机调试与运行结果
OpenLEDsuccess!
OpenDS1621success!
NO1DS1621is45.8
N02DS1621is69.6
N03DS1621is53.4
6个LED数码管共显示了三组信息,如下:
1-45.8
2-69.6
3-53.4
第6章课程设计小结
用单片机驱动LED数码管有很多方法,按显示方式分,有静态显示和动态(扫描)显示,按译码方式可分硬件译码和软件译码之分。
静态显示就是显示驱动电路具有输出锁存功能,单片机将所要显示的数据送出后就不再管,直到下一次显示数据需要更新时再传送一次新数据,显示数据稳定,占用很少的CPU时间。
动态显示需要CPU时刻对显示器件进行数据刷新,显示数据有闪烁感,占用的CPU时间多。
这两种显示方式各有利弊;
静态显示虽然数据稳定,占用很少的CPU时间,但每个显示单元都需要单独的显示驱动电路,使用的硬件较多;
动态显示虽然有闪烁感,占用的CPU时间多,但使用的硬件少,能节省线路板空间。
附录1程序清单
1.驱动程序ds1621.c代码:
#include<
module.h>
linux/fs.h>
linux/iobuf.h>
linux/major.h>
linux/blkdev.h>
linux/capability.h>
linux/smp_lock.h>
asm/uaccess.h>
asm/hardware.h>
asm/arch/cpu_s3c2410.h>
asm/io.h>
linux/vmalloc.h>
linux/delay.h>
#defineSKELETON_MAJOR220
unsignedchards18b20ret[3];
typedefunsignedcharuchar;
devfs_handle_tdevfs_ds18b20;
intds1621_open(structinode*,structfile*);
//ds1621设备打开函数
intds1621_release(structinode*,structfile*);
//ds1621设备释放函数
intds1621_ioctl(structinode*,structfile*,unsignedint,unsignedlong);
//选择待测量的引脚,并触发中断
ssize_tds1621_read(structfile*,char*,size_t,loff_t*);
ssize_tds1621_write(structfile*,constchar*,size_t,loff_t*);
voidwritebyte(unsignedchardat,inti);
//写函数
ucharreadbyte(inti);
//读函数
voidsetbit(inti);
//设置电平
voidclearbit(inti);
chargetbit(inti);
//获取电平
voidreadtemp(inti);
//读取温度
staticstructfile_operationsds1621_fops={
ioctl:
ds1621_ioctl,
open:
ds1621_open,
read:
ds1621_read,
write:
ds1621_write,
release:
ds1621_release,
};
//GPB0--9GPB1--11GPB9--13GPB10--10
//1.GND;
2,DQ;
3,VDD
#defineSTARTCONVER0
#defineSETCHANNEL1
#definerGPBCON(*(volatileunsigned*)rGPBCONADD)
#definerGPBDAT(*(volatileunsigned*)rGPBDATADD)
#definerGPBUP(*(volatileunsigned*)rGPBUPADD)
unsignedlongrGPBCONADD;
unsignedlongrGPBDATADD;
unsignedlongrGPBUPADD;
#defineucharunsignedchar
#defineuintunsignedint
unsignedintichannel=0;
intds1621_open(structinode*inode,structfile*filp)
{
printk("
openDS1621success!
\n"
);
return0;
}
ssize_tds1621_read(structfile*filp,char*buf,
size_tsize,loff_t*offp)
copy_to_user(buf,ds1621ret,3);
ssize_tds1621_write(structfile*filp,constchar*buf,
char_buf;
copy_from_user(&
_buf,buf,1);
writebyte(_buf,ichannel);
intds1621_release(structinode*inode,structfile*filp)
releaseok\n"
intds1621_ioctl(structinode*inode,
structfile*flip,
unsignedintcommand,
unsignedlongarg)
interr=0;
switch(command){
caseSTARTCONVER:
initio();
readtemp(ichannel);
return0;
caseSETCHANNEL:
{
switch(arg)
{
case0:
ichannel=0;
return0;
case1:
ichannel=1;
case2:
ichannel=9;
return0;
default:
err=-EINVAL;
break;
}
break;
}
returnerr;
int__initds1621_init(void)
devfs_ds1621=
devfs_register(NULL,"
ds1621"
DEVFS_FL_DEFAULT,
SKELETON_MAJOR,0,
S_IFCHR|S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP,
&
ds1621_fops,NULL);
rGPBCONADD=ioremap(0x56000010,4);
rGPBDATADD=ioremap(0x56000014,3);
rGPBUPADD=ioremap(0x56000018,3);
void__exitds1621_exit(void)
devfs_unregister(devfs_ds1621);
module_init(ds1621_init);
module_exit(ds1621_exit);
ucharx=1;
unsignedcharflag;
uchartemper[2];
voidsetioin(inti)
rGPBCON=rGPBCON&
~(0x000000|(0x3<
<
(2*i)));
voidsetioout(inti)
rGPBCON=rGPBCON|(1<
(2*i));
voidsetbit(inti)
rGPBDAT|=1<
i;
voidclearbit(inti)
rGPBDAT&
=~(0x000|1<
i);
voidinitio()
rGPBUP&
=~(0x000|1<
0|1<
1|1<
9|1<
10);
chargetbit(inti)
returnrGPBDAT&
(1<
voidreset(inti)
{
x=0;
setioout(i);
setbit(i);
clearbit(i);
udelay(600);
udelay(60);
setioin(i);
x=getbit(i);
if(x==1)
printk("
DS1621fail!
udelay(200);
ucharreadbyte(inti)
ucharj=0;
uchardat=0;
for(j=8;
j>
0;
j--)
{
dat>
>
=1;
setioout(i);
clearbit(i);
udelay
(2);
setbit(i);
udelay(10);
setioin(i);
if(getbit(i))
dat|=0x80;
udelay(60);
return(dat);
voidwritebyte(unsignedchardat,inti)
if(dat&
0x01)
udelay(10);
setbit(i);
udelay(60);
else
udelay(75);
udelay(3);
udelay(5);
voidreadtemp(inti)
uchara=0,b=0;
unsignedintt=0;
flag=0;
reset(i);
writebyte(0xcc,i);
writebyte(0x44,i);
udelay(750000);
writebyte(0x7f,i);
writebyte(0xbe,i);
a=readbyte(i);
b=readbyte(i);
t=b;
t=t<
8;
t=t|a;
if(t>
0x7ff)
t=~t+1;
flag=1;
t=t>
4;
ds1621ret[0]=a&
0x0f;
ds1621ret[1]=t;
ds1621ret[2]=flag;
2.驱动程序led.c代码:
linux/module.h>
#include"
led_ioctl.h"
#defineLED_MAJOR139
#defineLED_2(LED_1+1)
#defineLED_3(LED_1+2)
#defineLED_4(LED_1+3)
#defineLED_5(LED_1+4)
#defineLED_6(LED_1+5)
#defineled_sle(*(volatileunsignedlong*)LED_GPACON)
#defineled_sle_data(*(volatileunsignedlong*)LED_GPADATA)
devfs_handle_tdevfs_led;
unsignedlongLED_1;
unsignedlongLED_GPACON;
unsignedlongLED_GPADATA;
unsignedlongled_write_addr;
intled_open(structinode*,structf
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ARM 课程设计 论文 撰写 模板