M0模块的读写操作_第1页
M0模块的读写操作_第2页
M0模块的读写操作_第3页
M0模块的读写操作_第4页
M0模块的读写操作_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

-.z.嵌入式系统是物联网产业开展的核心推动力〔中嵌协会柏斯维〕

2009年8月7日**总理视察**时,提出在**加快建立"感知中国〞中心的指示。从此在国内不管是各级地方政府还是企业都很重视,并掀起了一个追逐物联网的行动热潮。一年过去了,再一次的解读温总理的"感知中国〞更具有现实意义和深远的历史意义。嵌入式与物联网的关系温总理用经典的四个字"感知中国〞全面描述和定义了物联网产业的内涵。从字面上来理解,"感〞既是信息采集〔传感器〕;"知〞信息处理〔运算、处理、控制、通信并通过互联网进展信息传递和控制〕。这些都是嵌入式系统的特征实质。如果归纳一句话来理解总理"感知中国〞的含义,既是通过嵌入式系统智能终端产品网络化的过程实现感知的目的。简单讲,物联网是物与物、人与物之间的信息传递与控制。专业上讲就应该是智能终端的网络化。大家都知道,嵌入式系统无所不在,有嵌入式系统的地方才会有物联网的应用。所以,我在所有的场合都在传播一个理念,什么是物联网呢?物联网就是基于互联网的嵌入式系统。从另一个意义也可以说,物联网的产生是嵌入式系统高速开展的必然产物,更多的嵌入式智能终端产品有了联网的需求,催生了物联网这个概念的产生。记得是在09年10月12日,英特尔公司宣布成立中国研究院并且专攻嵌入式方向。在全球热炒物联网概念时,英特尔为什么不成立物联网研究院?而专注嵌入式的研究呢。这是值得深思研究的课题。则,在2010英特尔信息技术峰会〔IDF〕的前一天,英特尔CTO贾斯汀和英特尔研究院方之熙院长一起宣布了英特尔中国研究院全新的研究战略——致力于打造世界一流的嵌入式系统研究院。方院长讲到:作为英特尔研究院全球5大节点之一,英特尔中国研究院将承当嵌入式系统的前瞻性研究任务,放眼全球嵌入式增长机遇,融合国人智慧做世界级的研究,并将国际水准的研究成果直接奉献于中国的开展。中国手机、互联网、有线电视用户人数均居全球第一,也已成为名副其实的世界第一汽车市场。从智能交通到车载信息设备,从"物联网〞到智能家电,嵌入式移动互联在中国开展前景广阔。中国这么大的市场规模、这么快的增长速度,提供了很多非常好的研究课题。这些研究课题在世界上也都是非常前沿的,为企业提供了很多的开展时机。企业追逐的是利润而不是概念。从以上例子就足以看出物联网与嵌入式系统的关系、嵌入式系统的重要性、嵌入式系统在物联网产业开展中的角色地位。嵌入式系统才是拉动GDP的增长和产业升级的真正动力。嵌入式系统才是物联网产业开展的核心推动力。物联网人才需求与培养企业开展科技进步离不开人才,特别是在21世纪科技高速开展的今天。毋庸置疑,物联网的开展对人才的需求更是迫在眉睫,人才的短缺将是物联网产业开展的瓶颈。可以这样说,在物联网产业开展中,有了人才就掌握了竞争的主动权,有了人才就占领了竞争的制高点。目前,在高等院校都纷纷加快物联网相关的学科建立,社会培训机构也是人才培养的不可或缺的力量,特别是利用嵌入式系统的培训机构,在嵌入式系统教学的根底上,增加通信、无线模块、RFID、网络等课程,就可以很快的适应物联网技术开展的需求,这也是最快的人才培养捷径之一。大力推动嵌入式与物联网的人才引进和培训,是为构筑物联网产业开展创造人力资源的根底条件。物联网、云计算不是炒作,是嵌入式系统物联与互联网技术在高级阶段上穿插融合变革时代产物。当物联网热闹过后,必然会进入一个理性时代。深入了解嵌入式系统物联史,有助于厘清物联网、云计算的本质。目前,物联网、云计算领域中,缺少嵌入式系统视角。物联网系统构建、物联网系统工程应用,是物联网时代嵌入式系统的新机遇。下面由卓跃教育为您介绍。

单片、嵌入、物联三位一体的嵌入式系统

单片机与嵌入式系统是不同时代概念的同一事物,经历了许多不为人知的诞生环境与开展历程。单片机概念出现在PC机诞生之前,PC机诞生后才有了嵌入式系统概念。无论是单片机还是嵌入式系统,它们都呈现出单片、嵌入、物联的三位一体的特征。"单片〞机强调的是形态,"嵌入式〞系统强调的是应用形式,"物联〞则是它们的本质。

PC机出现后,计算机走出机房,成为群众工具。计算领域、工业控制领域都寄希望于计算机,由此诞生了通用计算机系统与嵌入式计算机系统两大概念。嵌入式计算机系统企图沿袭PC机的模式,走单板机、工控机、单片微型计算机〔6801系列〕的道路,却进入死胡同。在计算机界,"嵌入式计算机系统〞死亡了,"嵌入式系统〞却始终存在,以至于20多年后,单片机有了"嵌入式系统〞的称呼与视角。

1971年,Intel公司推出了世界上第一个微处理器,即4位微处理器4004。随后又推出了8位的8008。1974年,8008开展成8080,成为第二代微处理器,其目的是代替子逻辑电路器件,应用于各种电路系统和设备中,由此开场了嵌入式处理器的尝试。随后,众多的单片机〔微控制器〕应运而生,如1974年Mostek公司与仙童公司的3870系列单片机、1976年Intel公司的8048单片机、1977年GI公司的PIC1650系列单片机、1978年Rockwell公司的6500系列单片机,以及1980年Intel

公司推出的MCS51系列单片机,这些单片机本质上都是嵌入式处理器根底上的微控制器。1981年8月12日,IBM公司在Intel8088微处理器根底上,推出了全球第一台

个人计算机,即IBMPC。

实际上,在PC机诞生前,单片机也经为嵌入式应用寻找到了最正确的"微控制器〞应用模式。当时由于强调的自己独立的单片形态,称之为单片机,即实现单

片形态嵌入式应用的微控制器,控制的是物理对象。因此,"单片〞、"嵌入〞、"物联〞是单片机或嵌入式系统三位一体、与生俱来的本质特性M0内核PLC11C14的中断和其他arm产品的中断不一样,PLC11C14芯片手册上说有32个中断0-31,其中27号中断保存,0-11共十二个是静态的中断向量,有外部引脚P0端口的,P0_0到P0_11,一一对应,12号中断由P1_0对应。PLC11C14一共四个端口,P0到P3,其中P0到P2每个端口十二个引脚,P3口四个引脚。内部中断有四个定时器中断,看门狗中断,串口,SPI,等等。这些也**小异,但是在最后的有一个中断状态的中断源28PIO_3GPIOinterruptstatusofport3

29PIO_2GPIOinterruptstatusofport2

30PIO_1GPIOinterruptstatusofport1

31PIO_0GPIOinterruptstatusofport0经过仔细研究BSP包内的软件源码,发现上诉四个中断可以监控四个端口,当这些端口中有引脚电位变化时,出发中断,进入中断效劳函数,PIOINT0_IRQHandler〔void〕;在中断中判断是哪个引脚发生了中断if(GPIOIntStatus(PORT2,8)){//对应PORT2_8端口的中断事件,}这样一来所有外部的GPIO,都可以作为外部中断使用,大大提高了资源的利用率,我们可以在下半部机制完成中断处理函数,在中断中只置位标志位,在main〔〕函数中轮询标志位是否发生变化,发生变化后跳转到对应的下半部处理函数中,这样中断触发后可以很快完成处理,不会在中断中浪费过多资源。同时我们可以设置触发中断的条件,BSP包中提供了一个函数GPIOSetInterrupt(PORT2,8,1,0,0);GPIOIntEnable(PORT2,8);对应参数,第一个端口号;第二个参数管脚号;第三个参数电平触发还是跳变沿触发〔0为跳变沿触发,1为电平触发〕;第四个参数当第三参数设置为跳变沿出发时,0位单边沿触发,1为双边沿触发;当第三参数设置为点评触发是,0代表低电平,1代表高电平。第五个参数设置上升沿还是下降沿触发,对单边沿触发有效。上面设置PORT2_8引脚,低电平触发方式。1、Colink固件升级Colink板子2、安装Colink驱动ColinkE*UsbDriver-1.2.0,然后重启PCwin764位ColinkE*UsbDriver-1.2.0安装方法youneedtodownload

Modifiedtheinffilefrom:.cooco*.org/tools/patch/colinke*.inf,

thendothefollowingoperation:1.Openthe

Installationfolder:

replacetheinffilewiththenewone.2.Deletethefile:dpinst.*ml.3.rundpinst_amd64.e*e.PS:OnlyWindows

64bit

OSneedtodo

thereplacement.For

Nepi:Pleasedothesameoperation.Ifthedriver

isunabletobeinstalledonvista64bit,connectus.Wewillreleaseanewdriverinafewdays.早上安装keil的一点小插曲,我的是vin764位没有对应的驱动,后来在网上查到的解决方法;好了下面开场分析程序,在keil下建立工程就会生成对应的引导文件,也就是汇编写的,怎么引导c代码,这里掠过。开场第一个main〔〕;intmain(void)

{

SystemInit();

GPIOInit();

CLKOUT_Setup(CLKOUTCLK_SRC_MAIN_CLK);

/*这个主要是要设置CLKOUT,WDTCLOCK,SPI,UART,等输出时钟*/

while(1)

{

}

}好了啃掉第一个函数SystemInit〔〕,这里涉及到各种存放器都要亲自动手去看芯片手册,voidSystemInit(void)

{

uint32_ti;

LPC_SYSCON->SYSMEMREMAP=0*2;/*这个函数是内存映射函数,0*2,是将flash映射到0*0地址,我看了一下手册,发现flash就在0*0地址,所以只要程序下载到flash中就可以运行,〔注意,程序默认从0*0地址开场执行的〕*/

LPC_SYSCON->SYSOSCCTRL=0*00;/*系统晶振选择,0*00是默认值,频率范围是1-20MHz*/

LPC_SYSCON->PDRUNCFG&=~(0*1<<5);/*这个用来设置power-down的,不知道怎么翻译好了,大家应该都懂得,这种表示是将第六位清零,其他位保持不变第六位是SYSOSC_PD系统晶振*/

for(i=0;i<0*100;i++);/*等待200us

*/

Main_PLL_Setup();

/*又遇到一个函数,这个函数是对时钟进展设置的,上面选择了晶振然后设置时钟很正常的思路,具体解释看下面*/

LPC_SYSCON->SYSAHBCLKCTRL|=(1<<16);/*使能IO时钟,注意,这里没有使能其他时钟,如果要用其他设备,可以在下面添加使能代码*/

return;

}voidMain_PLL_Setup(void)

{

uint32_tregVal;

ClockSource=OSC_CLK;

LPC_SYSCON->SYSPLLCLKSEL=MAIN_CLKSRCSEL_Val;

/*SelectsystemOSC*/

LPC_SYSCON->SYSPLLCLKUEN=0*01;

/*Updateclocksource*/

LPC_SYSCON->SYSPLLCLKUEN=0*00;

/*toggleUpdateregisteronce*/

LPC_SYSCON->SYSPLLCLKUEN=0*01;

while(!(LPC_SYSCON->SYSPLLCLKUEN&0*01));

/*Waituntilupdated*/

/*这一局部是选择时钟源的,将SYS-PLL时钟源设置为System晶振,并更新时钟源*/

regVal=LPC_SYSCON->SYSPLLCTRL;

regVal&=~0*1FF;

LPC_SYSCON->SYSPLLCTRL=(regVal|(MAIN_PLL_P_Val<<5)|MAIN_PLL_M_Val);

LPC_SYSCON->PDRUNCFG&=~(0*1<<7);/*这个用来设置power-down的,第八位代表SYSPLL_PD晶振*/

while(!(LPC_SYSCON->SYSPLLSTAT&0*01));

LPC_SYSCON->MAINCLKSEL=0*03;

LPC_SYSCON->MAINCLKUEN=0*01;

LPC_SYSCON->MAINCLKUEN=0*00;

LPC_SYSCON->MAINCLKUEN=0*01;

while(!(LPC_SYSCON->MAINCLKUEN&0*01));

/*这一局部是选择时钟源的,将MAINCLK时钟源设置为PLLclock,并更新时钟源*/

LPC_SYSCON->SYSAHBCLKDIV=SYS_AHB_DIV_Val;

SystemFrequency=ClockSource*(MAIN_PLL_M_Val+1);

SystemAHBFrequency=(uint32_t)(SystemFrequency/SYS_AHB_DIV_Val);

return;

}工程大体框架:假设你要管理一个大的仓库,其中要防止的重要的物品,你要实时的监控仓库的环境,包括温度,湿度,光照,和进出货物的数量以及进出人员。怎么样像不像一个仓库管理员的工作,没错就是管理员的工作,我们的工程就是要用物联网的知识来搭建一个系统完成管理员的工作,这个工程管理比管理员管理范围更大精度更高,本钱更低。好了下面具体说一说工程模块。模块一:感知模块,实时监测仓库环境,主要有温度传感器,湿度传感器,三轴传感器。模块二:效劳模块,boa效劳器,在a8上创立效劳器,处理由M0上传来的信息。模块三:在a8上移植linu*kernel,用于线程调度,摄像头驱动〔I2C控制〕模块四:网页编写,可以登录物联网系统,实时查看环境信息下面是boa效劳器移植过程嵌入式Linu*中的Web效劳器应用〔一〕BOA简介

Boa是一个非常小巧的Web效劳器,其可执行代码只有60K左右。它是一个单任务的Web效劳器,只能依次完成用户的请求,而不会fork出新的进程处理并发连接请求。但boa支持cgi,能够为cgi程序fork出一个进程来执行。Boa的设计目标是速度和平安,在其站点公布的性能测试中,boa的性能要好于apache效劳器。:w随着网络技术的迅猛开展,在嵌入式设备的管理和交互中,基于Web方式的应用成为目前的主流,用户可以直接通过远程登录的方式对设备进展管理和维护,大大方便了使用性。下面就为大家讲解一下boa效劳器在嵌入式Linu*系统中的移植过程。〔二〕BOA效劳器移植工具链:gcc

version

4.5.1

平台:处理器:s5pc100

内核:linu*-2.6.35

1.解压源码2.进入src/./configure

生成Makefile

修改Makefile

修改CC

gcc

CC

arm-none-linu*-gnueabi-gcc

修改CPP

gcc

-E

CPP

arm-none-linu*-gnueabi-gcc

-E3.make编译1)

编译一个linu*下的c系统,包含词法和语法分析模块,Linu*上用bison和fle*。yacc是一个文法分析器的生成器,bison即是yacc的GNU版本.Le*和YACC是用于构造词法分析机和语法解释器的工具,利用Le*和YACC你可以轻松的构造一个语法解释器。sudo

apt-get

install

bison

fle*2)

修改src/log.c注释掉if

(dup2(error_log,

STDERR_FILENO)

==

-1)

{

DIE("unable

to

dup2

the

error

log");

}为:/*if

(dup2(error_log,

STDERR_FILENO)

==

-1)

{

DIE("unable

to

dup2

the

error

log");

}*/3)

修改src/boa.c注释掉下面内容:if

(passwdbuf

==

NULL)

{

DIE(〞getpwuid〞);

}

if

(initgroups(passwdbuf->pw_name,

passwdbuf->pw_gid)

==

-1)

{

DIE(〞initgroups〞);

}为#if

0

if

(passwdbuf

==

NULL)

{

DIE(〞getpwuid〞);

}

if

(initgroups(passwdbuf->pw_name,

passwdbuf->pw_gid)

==

-1)

{

DIE(〞initgroups〞);

}

#endif4)

修改src/boa.c

if

(setuid(0)

!=

-1)

{

DIE(〞icky

Linu*

kernel

bug!〞);

}为#if

0

if

(setuid(0)

!=

-1)

{

DIE(〞icky

Linu*

kernel

bug!〞);

}#endif5)

执行make出现错误:arm-none-linu*-gnueabi-gcc

-g

-O2

-pipe

-Wall

-I.

-c

-o

util.o

src/util.csrc/util.c:100:1:

error:

pasting

"t"

and

"->"

does

not

give

a

valid

preprocessing

tokenmake:

***

[util.o]

Error

1

#

去掉其中〔./src/pat.h〕120行的

〞##〞

。然后给boa瘦身

arm-none-linu*-gnueabi-strip

boa〔三〕Boa效劳器配置1.创立目录mkdir

/source/rootfs/etc/boa将boa源码目录下的boa.conf拷贝到/source/rootfs/etc/boa目录下cp

boa.conf

/source/rootfs/etc/boa2.修改配置文件boa.confvim

/source/rootfs/etc/boa(1)

user的修改修改

User

nobody为

User

0

(2)

Group的修改修改

Group

nogroup为

Group

0(3)ScriptAlias的修改修改ScriptAlias

/cgi-bin/

/usr/lib/cgi-bin/为

ScriptAlias

/cgi-bin/

//cgi-bin/(5)DocumentRoot的修改修改DocumentRoot

/var/为DocumentRoot

/(6)ServerName的设置修改#ServerName

ServerName

否则会出现错误"gethostbyname::No

such

file

or

directory〞(7)AccessLog修改修改AccessLog

/var/log/boa/access_log为#AccessLog

/var/log/boa/access_log(8)以下配置和boa.conf的配置有关,都是在ARM根文件系统rootfs中创立以下步骤在开发板上进展:创立HTML文档的主目录/mkdir

/创立CGI脚本所在录

//cgi-binmkdir

//cgi-bin当不能使用cgi

时将#AddType

application/*-d-cgi

cgi改为AddType

application/*-d-cgi

cgi〔四〕boa器测试将boa拷贝到开发板根文件系统的/etc/boa下#cp

src/boa

/source/rootfs/etc/boa将ubuntu下/etc/mime.types拷贝到开发板根文件系统的/etc下#cp

/etc/mime.types

/source/rootfs/etc将你的主页inde*.html拷贝到目录下运行boa,然后在主机游览器输入开发板网址[rootfarsight

boa]#

./boa[30/10/2011:19:10:36

+0000]

boa:

server

built

10

30

2011

at

19:10:36[30/10/2011:19:10:36

+0000]

boa:

starting

server

pid=968,

port

80附1〕:boa配置文件参数说明boa的配置文件是/etc/boa/boa.conf。Port:boa效劳器监听的端口,默认的端口是80。如果端口小于1024,则必须是root用户启动效劳器。

Listen:绑定的ip地址。不使用这个参数时,将绑定所有的地址。User:连接到效劳器的客户端的身份,可以是用户名或UID。Group:连接到效劳器的客户端的组,可以是组名或GID。ServerAdmin:效劳器出故障时要通知的地址。ErrorLog:指定错误日志文件。如果路径没有以"/〞开场,则相对于ServerRoot路径。没有配置时默认的文件是/dev/stderr。假设不想记录日志,指定文件为/dev/null。AccessLog:设置存取日志文件,与ErrorLog类似。UseLocaltime:设置使用本地时间,使用UTC时注释这个参数。这个参数没有值。VerboseCGILogs:在错误日志文件中记录CGI启动和停顿时间,假设不记录,注释这个参数。这个参数没有值。ServerName:指定效劳器的名称,当客户端使用gethostname

+

gethostbyname时返回给客户端。VirtualHost:虚拟主机开关。使用此参数,则会在DocumentRoot设定的目录添加一个ip地址作为新的DocumentRoot来处理客户端的请求。如DocumentRoot设置为/var/,则localhost/

则转换成,假设注释此参数,则为/var//。DocumentRoot:HTML文件的根目录〔也就是的目录〕。UserDir:指定用户目录。DirectoryInde*:指定预生成目录信息的文件,注释此变量将使用DirectoryMaker变量。这个变量也就是设置默认主页的文件名。DirectoryMaker:指定用于生成目录的程序,注释此变量将不允许列目录。DirectoryCache:当DirectoryInde*文件不存在,而DirecotryMaker又被注释掉时,将列出这个参数指定目录给客户端。KeepAliveMa*:每个连接允许的请求数量。如果将此值设为"

0

",将不限制请求的数目。KeepAliveTimeOut:在关闭持久连接前等待下一个请求的秒数。〔秒〕。MimeTypes:设置包含mimetypes信息的文件,一般是/etc/mime.types。DefaultType:默认的mimetype类型,一般是te*t/html。CGIPath:相当于给CGI程序使用的$PATH变量。SinglePostLimit:一次POST允许最大的字节数,默认是1MB.AddType:

增加MimeType没有指定的类型,例:

AddType

type

e*tension

[e*tension

...]。要使用cgi,必须添加cgi类型:AddType

application/*-d-cgi

cgiRedirect:重定向文件Aliases:指定路径的别名。ScriptAlias:指定脚本路径的虚拟路径。附2〕:编译中的出错处理错误1:debian:/home/a/boa-0.94.13/src#

make

yacc

-d

boa_grammar.y

make:

yacc:

mand

not

found

make:

***

[y.tab.c]

Error

127

解决方法:

debian:/home/a/boa-0.94.13/src#

apt-get

install

bison

错误2:debian:/home/a/boa-0.94.13/src#

make

le*

boa_le*er.l

make:

le*:

mand

not

found

make:

***

[le*.yy.c]

Error

127

解决方法:

debian:/home/a/boa-0.94.13/src#

apt-get

install

fle*make:

Nothing

to

be

done

for

`all'.

说明make没有检查到需要编译的东西,库或者应用程序已经编译好了。make主要检查的是时间戳,只要target比依赖的文件时间靠后它就认为不需要编译.今天写个程序,要求有输入两个数字,想都没想就用了scanf〔〕;本想写的严谨一些,就加了判断条件if〔scanf〔"%d,%d〞,&a,&b〕!=2〕{perror("inputerror\n");e*it(1);}测试时,输入少于两了数据,一个或不插入时错误信息被打印出来,但是当我输入的数字个数超过两个时,不会出现打印信息,测试结果也正常这样让我觉得这个判断条件有些鸡肋了,于是到网上找一下关于scanf〔〕原函数#include<stdio.h>#include<stdarg.h>#include"loc_incl.h"intscanf(constchar*format,...){va_listap;intretval;va_start(ap,format);retval=_doscan(stdin,format,ap);va_end(ap);returnretval;}其中,_doscan(stdin,fromat,ap)很复杂,大致功能定义一些后面需要用到的变量跳过format格式串中的空格,并且跳过输入流中的空格输入流stream与format格式串中的空白符〔空白符可以是空格(space)、制表符(tab)和新行符(newline)〕保持一致在format中的字符为'%'的前提下,stream中的字符也为'%',则继续format当前字符为'*',表示读指定类型的数据但不保存指定说明最大域宽。在百分号(%)与格式码之间的整数用于限制从对应域读入的最大字符数于宽度所以我出现的问题很好解释了,我输入数字时被放在输入缓冲区中,scanf对有需要的数字进展格式化输入,多余的还在缓冲区内,所以不会报错。输入一个数字后再输入任何间隔符,都会被scanf吃掉,直到输入第二个数字为止,格式化输入完毕。工程中涉及到温湿度传感器,原理图给出,用DHT11温湿度一体ICDHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数

字模块采集技术和温湿度传感技术,确保产品具有枀高的可靠性与卓越的长期稳定性。传感器包括一

个电阻式感湿元件和一个NTC

测温元件。单总线说明

DHT11器件采用简化的单总线通信。单总线即只有一根数据线,系统中的数据交换、控制均由单总线

完成。设备〔主机或从机〕通过一个漏枀开路或三态端口连至该数据线,以允许设备在不发送数据时能够

释放总线,而让其它设备使用总线;单总线通常要求外接一个约

5.1kΩ的上拉电阻,这样,当总线闲置时,

其状态为高电平。由于它们是主从结极,只有主机呼叫从机时,从机才能应答,因此主机器件都必须

严格遵循单总线序列,如果出现序列混乱,器件将不响应主机。单总线传送数据位定义

DATA用于微处理器与DHT11之间的通讯和同步,采用单总线数据格式,一次传送40位数据,高位先

出。

数据格式:

8bit湿度整数数据

+8bit湿度小数数据+8bit温度整数数据

+8bit温度小数数据+8bit校验位。校验位数据定义

"8bit湿度整数数据

+8bit湿度小数数据+8bit温度整数数据

+8bit温度小数数据〞8bit校验位等于所

得结果的末8位。

例如一:接收到的40位数据为:

00110101

00000000

00011000

00000000

01001101

湿度高8位

湿度低8位

温度高8位

温度低8位

校验位

计算:00110101+00000000+00011000+00000000=01001101下面是一些代码,其中涉及到时序的地方做出注释uint32_tRead_Temp_Hum(uint8_t*temp,uint8_t*hum)

{

uint32_tt_last;

uint8_thum_10,hum_01,temp_10,temp_01,chksum,chk;

uint32_ttc1,tc;

uint32_ti;

p3_2_counter=0;//用来检测中断是否产生,在中断中进展p3_2_counter++;

t_last=p3_2_counter;

GPIOIntDisable(PORT1,5);

/************************************************************************************************

微处理器的I/O设置为输出同时输出低电平,且低电平保持时间不能小于18ms,然后微处理器的I/O

设置为输入状态,由于上拉电阻,微处理器的I/O即DHT11的DATA数据线也随之变高,等待DHT11作

出答复信号**************************************************************************************************/

GPIOSetDir(PORT1,5,1);//SetPIO1_5tooutput

GPIOSetValue(PORT1,5,0);

delay_ms(30);//保证时间大于18ms

GPIOSetValue(PORT1,5,1);//变成高电平

GPIOSetDir(PORT1,5,0);//setPIO1_5toinput

GPIOSetInterrupt(PORT1,5,0,0,0);//设置下降沿触发,使能中断

GPIOIntEnable(PORT1,5);/************************************************************************************************

DHT11的DATA引脚检测到外部信号有低电平时,等待外部信号低电平完毕,延迟后DHT11的DATA

引脚处于输出状态,输出

80微秒的低电平作为应答信号,紧接着输出

80

微秒的高电平通知外设准备接

收数据,微处理器的

I/O

此时处于输入状态,检测到

I/O

有低电平〔DHT11回应信号〕后,等待80微秒的高电平后的数据接收**************************************************************************************************/

for(i=0;i<3;i++)//应答信号刚好是三个跳变沿,全部承受后,进展数据的接收

{

GPIOSetInterrupt(PORT1,5,0,0,i&0*01);

while(p3_2_counter==t_last);//用来检测是否有中断产生,生成中断后p3_2_counter++;

t_last=p3_2_counter;

}

/************************************************************************************************

由DHT11的DATA引脚输出40位数据,微处理器根据I/O电平的变化接收40位数据,

位数据"0〞的格式为:

50

微秒的低电平和

26-28

微秒的高电平。

位数据"1〞的格式为:

50

微秒的低电平加

70

微秒的高电平。**************************************************************************************************/

for(i=0;i<40;i++)

{

GPIOSetInterrupt(PORT1,5,0,0,1);

while(p3_2_counter==t_last);//功能同上

t_last=p3_2_counter;

tc1=p3_2_tc;

//p3_2_tc=SysTick->VAL;在中断中完成

GPIOSetInterrupt(PORT1,5,0,0,0);

while(p3_2_counter==t_last);

t_last=p3_2_counter;

if(p3_2_tc<tc1)

{

tc=tc1-p3_2_tc;

//高电平时间,低电平都是50us不判断,判断高电平是时间来判断是‘0’or‘1’

}

else

{

tc=48000-(p3_2_tc-tc1);

}/***********************************************************************************************

DATA用于微处理器与DHT11之间的通讯和同步,采用单总线数据格式,一次传送40位数据,高位先出。

数据格式:

8bit湿度整数数据

+8bit湿度小数数据+8bit温度整数数据

+8bit温度小数数据+8bit校验位。**************************************************************************************************/

if(i<8)

{

hum_10<<=1;

if(tc>=2328)//这里的2328是怎么得到的,系统时钟设置为48MHz,(1/48MHZ)*2328=48.5us;

hum_10|=0*01;//上面提到位数据"0〞时高电平26-28微秒我们取27us,位数据"1〞时高电平70,

}//判断上下的临界值〔27+70〕/2=48.5;

elseif(i<16)

{

hum_01<<=1;

if(tc>=2328)

hum_01|=0*01;

}

elseif(i<24)

{

temp_10<<=1;

if(tc>=2328)

temp_10|=0*01;

}

elseif(i<32)

{

temp_01<<=1;

if(tc>=2328)

temp_01|=0*01;

}

else

{

chksum<<=1;

if(tc>=2328)

chksum|=0*01;

}

}

/***********************************************************************************************

当一位数据传输完毕后,总线重新恢复高电平状态,下面的一次中断,就是恢复高电平状态同时也用来

同步p3_2_counter==t_last;**************************************************************************************************/

GPIOSetInterrupt(PORT1,5,0,0,1);

while(p3_2_counter==t_last);

GPIOIntDisable(PORT1,5);

*temp=temp_10;

*(temp+1)=temp_01;

*hum=hum_10;

*(hum+1)=hum_01;/************************************************************************************************

下面是对校验位核对,如上面所诉

"8bit湿度整数数据

+8bit湿度小数数据+8bit温度整数数据

+8bit温度小数数据〞8bit校验位等于所**************************************************************************************************/

chk=hum_10;

chk+=hum_01;

chk+=temp_10;

chk+=temp_01;

if(chk==chksum)

return1;

else

return0;

}以上就是单总线下温湿度传感器的核心代码,其中中断局部不同处理器定义不同,这里就不进展阐述了。还有不处理器的系统时钟设置不同,在临界值得判断也不一样。关于ucos在lpc上移植:主要有四个文件,传统的有三个文件:os_cpu_c.c,os_cpu_a.s,os_cpu.h还有一个是IRQ.incOs_cpu.h:这个文件相对来说还是很简单的,关于变量的重新定义,堆栈生长度,临界区了,最有特色的是运用swi软中断。Os_task_sw()肯定是用软中断了,在mdk中要声明一个没有定义的函数,就要在这个函数前面加上__SWI(),也就是用它声明,而__swi()就是一个关键字了。uc在*86上移植也是用的软中断int0*80。在lpc中一旦调用os_task_sw()就会触发__swi(0*00)这个软中断,那它就会使arm进入管理模式然后执行软中断函数SoftwareInterrupt,这个函数在os_cpu_a.s中定义,后续。关于os_task_sw()osstartHighRdy()进入临界区的两个函数还有一些ARM用到的函数它们为什么要用软中断而不用普通函数调用呢?答案是这样的:ARM处理核有两个指令集,用户任务还可以使用两种模式:用户和系统,组合起来就有4种方式了,各种方式对系统资源有不同的控制权限。为了使底层接口函数与处理器状态无关,同时在任务调用相应的函数时不需要知道函数位置,也就是说:统一进入管理模式,统一用软中断调用。Os_cpu_a.s:这个文件主要当然是SoftwareInterrupt了,在这个函数里有三方面跳转:1.os_task_sw2.osstartHighRdy3.SWI_E*ception1.一个任务切换也调用OSIntCt*Sw这个标号,说明它和中断切换过程一样,都是先保存老的再迎取新的,但是有一点不同:就是这两个函数调用的模式不同:任务级切换是进入管理模式而中断级是进入IRQ模式。妙就妙在虽然是进入的不同模式但一进来都是在SP指针下取老任务的数据然后保存,然后迎新。可以看出这时的SP指针一个是管理的一种情况是IRQ的。Spsr记录了任务的环境,而不管什么模式都用R3来记录spsr,然后保存,总之陈明计写得太效率和有技巧了。2.osstartHighRdy其实就是调用OSIntCt*Sw_1,就不多说了它就是迎新呗3.这个函数在.c文件里,后续。Os_cpu_c.c:文件有一个OSTaskStkInit函数就很明显了,按照堆栈格式模拟,就不多说了。SWI_E*ception这个函数有好几路转向,去除了第一和第二路,因为在os_cpu_a.s中定义了。临界区函数其实就是进去把中断位关闭就行了。但是还有一个陈添上去的一个全局变量OsEnterSum:主要来实现临界区嵌套,当OsEnterSum=0的时候才开中断。剩下的函数也是改变cpsr就完了没什么。主要是在调用完SWI_E*ception这个函数后还得回SoftwareInterrupt里面实现任务的继续运行关于函数的参数问题两个参数一个放到R0一个放到R1中传过来,呵呵。IRQ.inc:这个文件是汇编头文件里面定义了一个宏,在不少应用里直接把它复制到IRQ.S中了,然后在写上;/*中断*/IRQ_HandlerHANDLERIRQ_E*ception;/*定时器0中断*/Timer0_HandlerHANDLERTimer0_E*ception这就是对这个宏的运用,分别套用就行了,它实现了os对IRQ的管理。在这个宏里面调用了两个函数:一个是IRQ_E*ception_Function,一个是OSIntE*it。第一个可以是Timer0_E*ception在它里面调用timetick(),第二个调用OSIntE*it(),在这个函数里调用osIntct*Sw(),但是在includes.h中#defineOSIntCt*Sw()return,把这个函数给费了,呵呵,直接返回啦。然后在宏里判断是否执行中断级切换。但是我就不明白陈为什么这样做了。也可以还用os的osIntct*Sw()调用啊,如果回来了说明不切换,然后直接恢复现场也行吧。切换就调用osIntct*Sw呗。ISL20093是一款综合性光传感器,内部有16位ADC转换,通过I2C用户配置参数,可编程lu*范围选择。大致了解一下芯片知识,然后详细追踪代码,看I2C实现。RE*TE*ternalresistorpinforADCreference;connectthispintogroundthrougha(nominal)100kΩresistor两个二极管,一个队可见光〔540nm〕敏感,一个对红外线敏感,模式一对应第一个二极管工作,模式二对应第二个二极管工作,模式三对应二个二极管同时工作〔Diode1-Diode2〕。8*8位内部控制存放器:2*8控制存放器2*8设置上下中断阈值4*8data存放器,只读模式,2个reading2个timercountsISL20093的原理图如下所示:由原理图可以看出,ISL20093数据传输是由I2C总线传输的,I2C协议简单介绍一下。具体的定义这里不说了,主要是怎么用,以其中一种模式进展说明。I2CSDAOut从机数据时序,I2CSDAin主机发送的时序。解释一下上面的时序:时钟高电平时一个下降沿,表示开场信号Start。接着在8个时钟周期内发送10001000〔w〕前七位是从机地址,最后一位是代表〔R/W〕。下一个时钟〔第九个时钟〕,从机拉低应答。接下来8个时钟周期是存放器的地址,00000***三位可变的。从机应答。主机接收后SCL高电平期间,由主机产生一个上升沿的信号作为停顿。主机产生一个下降沿作为start。接下来发送8位的读指令,10001001.拉低SDA放弃总线。接下来从机发送8位数据。主机将SDA不操作,作为应答非信号。迫使从机释放总线。主机发送停顿信号。A1-6代表从机地址,R7-0存放器地址,D7-0数据。I2C写时序原理和上面一样,对应读写位改变就行。这里只是I2CSDAOut只从机,I2CSDAin主机发送的。解释一下上面的时序:时钟高点评时一个下降沿,Start。接着在8个时钟周期内发送10001000〔w〕下一个时钟,从机压低应答。接下来8个时钟周期是存放器的地址,00000***三位可变的。从机应答。主机接收后SCL高电平期间,由主机产生一个上升沿的信号作为停顿。主机产生一个下降沿作为start。接下来发送8位的读指令,10001001.拉低SDA放弃总线。接下来从机发送8位数据。主机将SDA不操作,作为应答非信号。迫使从机释放总线。主机发送停顿信号。A1-6代表从机地址,R7-0存放器地址,D7-0数据I2C的写时序和上面类似。这里只是ISL20093的简单介绍,I2C具体传输还要看LPC11C14配置存放器。配置LPC11C14可以不用考虑每个时序的数据。是不是觉得上面分析的时序没有用了,其实还是有用的,当你用io口模拟时序时就必须要考虑每个时序的数据了。这种情况还是存在的,有的IC传输协议不是标准I2C的协议,而是变种协议,大致一样,细节处要自己考虑。下一篇准备写一下LPC11C14s上的I2C存放器配置,以及,存放器控制时序方法。很多时候我们需要在程序退出的时候做一些诸如释放资源的操作,但程序退出的方式有很多种,比方main()函数运行完毕、在程序的*个地方用e*it()完毕程序、用户通过Ctrl+C或Ctrl+break操作来终止程序等等,因此需要有一种与程序退出方式无关的方法来进展程序退出时的必要处理。方法就是用ate*it()函数来注册程序正常终止时要被调用的函数。

ate*it()函数的参数是一个函数指针,函数指针指向一个没有参数也没有返回值的函数。ate*it()的函数原型是:intate*it(void(*)(void));

在一个程序中最多可以用ate*it()注册32个处理函数,这些处理函数的调用顺序与其注册的顺序相反,也即最先注册的最后调用,最后注册的最先调用。下面是一段代码例如:

#include<stdlib.h>

//使用ate*it()函数所必须包含的头文件stdlib.h

#include<stdio.h>

voidfn1(void);

intmain(void)

{

ate*it(fn1);

printf("a./n");

return0;

}

voidfn1()

{

printf("b./n");

}

输出结果是:a.b.什么是仓储系统编辑仓储系统指的是产品分拣或储存接收中使用的设备和运作策略的组合。[1]仓储系统的构成编辑·存储空间·货物·仓储设施设备·人员·作业及管理系统等要素。仓储系统的经济优化编辑对于仓储系统的根本要求是满足供给需求前提下,尽量减少存贮物资的数量,从而降低存贮费用,提高存贮系统经济效益。为到达这一要求,在存贮管理和运输上必须选择合理的策略。确定性存贮模型的特点是需求消耗速度和入库补充特性都是确定的。它又依入库物资速率是否有限制和出库物资是否允许短缺分为有限供给率、无限供给率、允许缺货、不许缺货四种类型。本文主要讨论基于(β,S)混合策略确实定性存贮理论,即物资补充和消耗满足一定的规律下,当存贮量Q低于最底库存量β时,就进展物资补充,把存贮量提高到S;反之,当Q>S时,就不做补充。一、物流仓储模型的建立(一)无限供给率根本问题假设①无限供给率,即定货物资在规定时间一次到货。每次定货量为常数Q;②需求连续均匀,速度为常数R,t时间的需求量为R(t);③当存贮量下降到β时,又进展下一次补充。存贮量随时间的变化如下图;④每次定货费用C0和单位物资年存贮费C1为常数;⑤年度保障经费用Cy为运输费Cd和存贮费Cb之和,即Cy=Cd+Cb.。(二)数学模型的建立与分析在每次输送量Q,年需求量D的条件下,年运输次数为,每次运输费用C0,因而年运输费用为;在无限供给率及常需求速度情况下,物资存贮量以匀速减小。当存贮量接近戒备量β时,一次定货入库。因而,年平均存贮量为,于是年存贮费用为;由此得到年度保障费用公式:由公式可以看出,增加每次定货量Q,一方面可以减少年度运输费Cd,另一方面又增加年存贮费Cb。研究每次定货量Q对年度保障费用Cy的动态影响,将公式积分得到:,由此计算得到最小经济定货量,相应的年度保障经费优化值.二、应用举例(一)问题陈述为满足市场需求,*物资仓库每年从上级仓库申请补充*型号物资5000箱,每箱物资每月存贮费用折算大约50元,其每次运输费10000元,每次运量为200箱。仓库不允许缺货,始终保持800箱的库存量用于市场调拨。现明确研究问题为:如何调整运输方案和运输量,在满足市场供给的情况下,使仓库经费最少。(二)数学模型的验证计算根据的运输存贮模型,可知当前每次运输量Q=200箱,仓库最低存贮要求β=800箱,单位物资年度存贮费用C1=50*12=600元。代入年度经费公式,得到当前仓库年度保障经费Cy≈80万元。现考虑每次运量为变量,采取优化方案。计算每次定货入库量≈408箱,则年度运输存贮综合经费=72.5万元。(三)基于Vensim的动力学建模对于物流仓储系统,由于其物资补充和消耗规律易于描述,经费构造流图简单,适合使用系统动力学方法建立经济模型加以分析和研究,从而有利于决策者选择更加合理的策略,提高系统经济效益。针对上述案例,明确研究对象为每次定货入库量Q对度综合经费Cy的影响,现基于Vensim仿真平台,建立"定货量-经费〞动力学模型如下:在建立的动力学模型中,调整定货入库变量Q数值,将每次运输量取整,即每次运输入库408箱物资。利用模型再次仿真运算,得到=72.5万,=25次。费用比拟结果如下列图:可见采取优化方案后,虽然增加了物资存贮的经费,但是运输本钱Cd降低幅度远远大于存贮费用Cb的提高量,使得最终总经费得到了有效的减少,年度保障费用比拟结果如下:为此,将每次运输量取整,采取优化措施,即每次运输入库400箱。运次减少一半,运输周期延长了一倍。考虑真实系统运次和运输周期条件可以实现的情况下,采取这样的方案不但使得每年综合保障经费节省了约7.5万元,而且大大节省了人力物力的开支。概述编辑这里所称的"仓储〞包括生产和供给领域中各种类型的储存仓库和配送中心,当然包括普通仓库,物流仓库以及仓储管理系统货代仓库。RF-WMS仓储管理系统包括软件、硬件、管理经历。传统的仓储管理系统概念中忽略了管理经历和自动识别硬件的缺失。仓储管理系统中的软件指的是支持整个系统运作的软件局部,包括收货处理、上架管理、拣货作业、月台管理、补货管理、库内作业、越库操作、循环盘点、RF操作、加工管理、矩阵式收费等。仓储管理系统中的硬件指的是用于打破传统数据采集和上传的瓶颈问题,利用自动识别技术和无线传输提高数据的精度和传输的速度。管理经历指的是开发商根据其开发经历中客户的管理方式和理念整合的一套管理理念和流程,为企业做到真正的管理。优点编辑·根底资料管理更加完善文档利用率高仓储管理系统·库存准确·操作效率高·库存低,物料资产使用率高·现有的操作规程执行难度小·易于制定合理的维护方案·数据及时,本钱降低·提供历史的记录分析·规程文件变更后的及时传递和正确使用·仓库与财务的对帐工作量见效效率提高·预算控制严格、退库业务减少特点编辑从财务软件、进销存软件CIMS,从MRP、MRPII到ERP,代表了中国企业从粗放型管理走向集约管理的要求,竞争的剧烈和对本钱的要求使得管理对象表现为:整和上游、企业本身、下游一体化供给链的信息和资源。而仓库,尤其是制造业中的仓库,作为链上的节点,不同链节上的库存观不同,在物流供给链的管理中,不再把库存作为维持生产和销售的措施,而将其作为一种供给链的平衡机制,其作用主要是协调整个供给链。但现代企业同时又面临着许多不确定因素,无论他们来自分供方还是来自生产或客户,对企业来说处理好库存管理与不确定性关系的唯一方法是加强企业之间信息的交流和共享,增加库存决策信息的透明性、可靠性和实时性。而这,正是WMS所要帮助企业解决的问题。WMS软件和进销存管理软件的最大区别在于:进销存软件的目标是针对于特定对象〔如仓库〕的商品、单据流动,是对于仓库作业结果的记录、核对和管理——报警、报表、结果分析,比方记录商品出入库的时间、经手人等;而WMS软件则除了管理仓库作业的结果记录、核对和管理外最大的功能是对仓库作业过程的指导和标准:即不但对结果进展处理,更是通过对作业动作的指导和标准保证作业的准确性、速度和相关记录数据的自动登记〔入计算机系统〕,增加仓库的效率、管理透明度

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论