最新日志

发表于:2007-11-28 15:39:55
标签:无标签

1

数字温度传感器DS18B20介绍

1、DS18B20的主要特性

1.1、适应电压范围更宽,电压范围:3.0~5.5V,在寄生电源方式下可由数据线供电
1.2、独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯
1.3、DS18B20支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现组网多点测温
1.4、DS18B20在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路内
1.5、温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃
1.6、可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,可实现高精度测温
1.7、在9位分辨率时最多在93.75ms内把温度转换为数字,12位分辨率时最多在750ms内把温度值转换为数字,速度更快
1.8、测量结果直接输出数字温度信号,以"一线总线"串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力
1.9、负压特性:电源极性接反时,芯片不会因发热而烧毁,但不能正常工作。

2、DS18B20的外形和内部结构

     DS18B20内部结构主要由四部分组成:64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。DS18B20的外形及管脚排列如下图1:
  
  
DS18B20引脚定义:
     (1)DQ为数字信号输入/输出端;
     (2)GND为电源地;
     (3)VDD为外接供电电源输入端(在寄生电源接线方式时接地)。
点击看大图
图2: DS18B20内部结构图

3、DS18B20工作原理

     DS18B20的读写时序和测温原理与DS1820相同,只是得到的温度值的位数因分辨率不同而不同,且温度转换时的延时时间由2s减为750ms。 DS18B20测温原理如图3所示。图中低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号送给计数器1。高温度系数晶振随温度变化其振荡率明显改变,所产生的信号作为计数器2的脉冲输入。计数器1和温度寄存器被预置在-55℃所对应的一个基数值。计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当计数器1的预置值减到0时,温度寄存器的值将加1,计数器1的预置将重新被装入,计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。图3中的斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正计数器1的预置值。
图3: DS18B20测温原理框图
DS18B20有4个主要的数据部件:
     (1)光刻ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码。64位光刻ROM的排列是:开始8位(28H)是产品类型标号,接着的48位是该DS18B20自身的序列号,最后8位是前面56位的循环冗余校验码(CRC=X8+X5+X4+1)。光刻ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的。
     (2)DS18B20中的温度传感器可完成对温度的测量,以12位转化为例:用16位符号扩展的二进制补码读数形式提供,以0.0625℃/LSB形式表达,其中S为符号位。
表1: DS18B20温度值格式表
点击看大图
     这是12位转化后得到的12位数据,存储在18B20的两个8比特的RAM中,二进制中的前面5位是符号位,如果测得的温度大于0,这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际温度。
     例如+125℃的数字输出为07D0H,+25.0625℃的数字输出为0191H,-25.0625℃的数字输出为FF6FH,-55℃的数字输出为FC90H。
表2: DS18B20温度数据表
点击看大图
     (3)DS18B20温度传感器的存储器
     DS18B20温度传感器的内部存储器包括一个高速暂存RAM和一个非易失性的可电擦除的EEPRAM,后者存放高温度和低温度触发器TH、TL和结构寄存器。
     (4)配置寄存器
该字节各位的意义如下:
表3: 配置寄存器结构
TM
R1
R0
1
1
1
1
1
     低五位一直都是"1",TM是测试模式位,用于设置DS18B20在工作模式还是在测试模式。在DS18B20出厂时该位被设置为0,用户不要去改动。R1和R0用来设置分辨率,如下表所示:(DS18B20出厂时被设置为12位)
表4: 温度分辨率设置表
R1
R0
分辨率
温度最大转换时间
0
0
9位

93.75ms
0
1
10位

187.5ms
1
0
11位

375ms
1
1
12位

750ms

4、高速暂存存储器
     高速暂存存储器由9个字节组成,其分配如表5所示。当温度转换命令发布后,经转换所得的温度值以二字节补码形式存放在高速暂存存储器的第0和第1个字节。单片机可通过单线接口读到该数据,读取时低位在前,高位在后,数据格式如表1所示。对应的温度计算:当符号位S=0时,直接将二进制位转换为十进制;当S=1时,先将补码变为原码,再计算十进制值。表 2是对应的一部分温度值。第九个字节是冗余检验字节。
表5: DS18B20暂存寄存器分布

寄存器内容
字节地址
温度值低位 (LS Byte)
0
温度值高位 (MS Byte)
1
高温限值(TH)
2
低温限值(TL)
3
配置寄存器
4
保留
5
保留
6
保留
7
CRC校验值
8
     根据DS18B20的通讯协议,主机(单片机)控制DS18B20完成温度转换必须经过三个步骤:每一次读写之前都要对DS18B20进行复位操作,复位成功后发送一条ROM指令,最后发送RAM指令,这样才能对DS18B20进行预定的操作。复位要求主CPU将数据线下拉500微秒,然后释放,当DS18B20收到信号后等待16~60微秒左右,后发出60~240微秒的存在低脉冲,主CPU收到此信号表示复位成功。
表6: ROM指令表
指 令
约定代码
功 能
读ROM
33H
读DS1820温度传感器ROM中的编码(即64位地址)

符合 ROM
55H
发出此命令之后,接着发出 64 位 ROM 编码,访问单总线上与该编码相对应的 DS1820 使之作出响应,为下一步对该 DS1820 的读写作准备。

搜索 ROM
0FOH
用于确定挂接在同一总线上 DS1820 的个数和识别 64 位 ROM 地址。为操作各器件作好准备。

跳过 ROM
0CCH

忽略 64 位 ROM 地址,直接向 DS1820 发温度变换命令。适用于单片工作。

告警搜索命令
0ECH

执行后只有温度超过设定值上限或下限的片子才做出响应。

表6: RAM指令表
指 令
约定代码
功 能
温度变换
44H
启动DS1820进行温度转换,12位转换时最长为750ms(9位为93.75ms)。结果存入内部9字节RAM中。

读暂存器

0BEH
读内部RAM中9字节的内容

写暂存器

4EH
发出向内部RAM的3、4字节写上、下限温度数据命令,紧跟该命令之后,是传送两字节的数据。

复制暂存器

48H

将RAM中第3 、4字节的内容复制到EEPROM中。

重调 EEPROM

0B8H

将EEPROM中内容恢复到RAM中的第3 、4字节。
读供电方式
0B4H

读DS1820的供电模式。寄生供电时DS1820发送“ 0 ”,外接电源供电 DS1820发送“ 1 ”。

点击此处查看原文 >>

系统分类: 测试测量   |    用户分类: 无分类    |    来源: 无分类

评论(0) | 阅读(1190)
发表于:2007-11-19 16:11:00
标签:无标签

0

汇编语言超浓缩教程

 本文由waterco's在EDN博客中发表:
汇编语言超浓缩教程
“ 哎哟,哥们儿,还捣鼓汇编呢?那东西没用,兄弟用VB"钓"一个API就够你忙活个十
天半月的,还不一定搞出来。”此君之言倒也不虚,那吾等还有无必要研他一究呢?
(废话,当然有啦!要不然你写这篇文章干嘛。)别急,别急,让我把这个中原委慢慢
道来:一、所有电脑语言写出的程序运行时在内存中都以机器码方式存储,机器码可以
被比较准确的翻译成汇编语言,这是因为汇编语言兼容性最好,故几乎所有跟踪、调试
工具(包括WIN95/98下)都是以汇编示人的,如果阁下对CRACK颇感兴趣……;二、汇
编直接与硬件打交道,如果你想搞通程序在执行时在电脑中的来龙去脉,也就是搞清电
脑每个组成部分究竟在干什么、究竟怎么干?一个真正的硬件发烧友,不懂这些可不行
。三、如今玩DOS的多是“高手”,如能像吾一样混入(我不是高手)“高手”内部,
不仅可以从“高手”朋友那儿套些黑客级“机密”,还可以自诩“高手”尽情享受强烈
的虚荣感--#$%& “醒醒!”

对初学者而言,汇编的许多命令太复杂,往往学习很长时间也写不出一个漂漂亮亮的程
序,以致妨碍了我们学习汇编的兴趣,不少人就此放弃。所以我个人看法学汇编,不一
定要写程序,写程序确实不是汇编的强项,大家不妨玩玩DEBUG,有时CRACK出一个小软
件比完成一个程序更有成就感(就像学电脑先玩游戏一样)。某些高深的指令事实上只
对有经验的汇编程序员有用,对我们而言,太过高深了。为了使学习汇编语言有个好的
开始,你必须要先排除那些华丽复杂的命令,将注意力集中在最重要的几个指令上(CM
P LOOP MOV JNZ……)。但是想在啰里吧嗦的教科书中完成上述目标,谈何容易,所以
本人整理了这篇超浓缩(用WINZIP、WINRAR…依次压迫,嘿嘿!)教程。大言不惭的说
,看通本文,你完全可以“不经意”间在前辈或是后生卖弄一下DEBUG,很有成就感的
,试试看!那么――这个接下来呢?―― Here we go!(阅读时看不懂不要紧,下文
必有分解)

因为汇编是通过CPU和内存跟硬件对话的,所以我们不得不先了解一下CPU和内存:(关
于数的进制问题在此不提)

CPU是可以执行电脑所有算术╱逻辑运算与基本 I/O 控制功能的一块芯片。一种汇
编语言只能用于特定的CPU。也就是说,不同的CPU其汇编语言的指令语法亦不相同。个
人电脑由1981年推出至今,其CPU发展过程为:8086→80286→80386→80486→PENTIUM
→……,还有AMD、CYRIX等旁支。后面兼容前面CPU的功能,只不过多了些指令(如多
能奔腾的MMX指令集)、增大了寄存器(如386的32位EAX)、增多了寄存器(如486的
FS)。为确保汇编程序可以适用于各种机型,所以推荐使用8086汇编语言,其兼容性
最佳。本文所提均为8086汇编语言。寄存器(Register)是CPU内部的元件,所以在寄
存器之间的数据传送非常快。用途:1.可将寄存器内的数据执行算术及逻辑运算。2.
存于寄存器内的地址可用来指向内存的某个位置,即寻址。3.可以用来读写数据到电
脑的周边设备。8086 有8个8位数据寄存器,这些8位寄存器可分别组成16位寄存器:
AH&AL=AX:累加寄存器,常用于运算;BH&BL=BX:基址寄存器,常用
于地址索引;CH&CL=CX:计数寄存器,常用于计数;DH&DL=DX:数据
寄存器,常用于数据传递。为了运用所有的内存空间,8086设定了四个段寄存器,专
门用来保存段地址:CS(Code Segment):代码段寄存器;DS(Data Segment)
:数据段寄存器;SS(Stack Segment):堆栈段寄存器;ES(Extra Segment)
:附加段寄存器。当一个程序要执行时,就要决定程序代码、数据和堆栈各要用到内
存的哪些位置,通过设定段寄存器 CS,DS,SS 来指向这些起始位置。通常是将DS固
定,而根据需要修改CS。所以,程序可以在可寻址空间小于64K的情况下被写成任意大
小。 所以,程序和其数据组合起来的大小,限制在DS 所指的64K内,这就是COM文件
不得大于64K的原因。8086以内存做为战场,用寄存器做为军事基地,以加速工作。除
了前面所提的寄存器外,还有一些特殊功能的寄存器:IP(Intruction Pointer):
指令指针寄存器,与CS配合使用,可跟踪程序的执行过程;SP(Stack Pointer):堆
栈指针,与SS配合使用,可指向目前的堆栈位置。BP(Base Pointer):基址指针寄
存器,可用作SS的一个相对基址位置;SI(Source Index):源变址寄存器可用来存
放相对于DS段之源变址指针;DI(Destination Index):目的变址寄存器,可用来存
放相对于 ES 段之目的变址指针。还有一个标志寄存器FR(Flag Register),有九个
有意义的标志,将在下文用到时详细说明。

内存是电脑运作中的关键部分,也是电脑在工作中储存信息的地方。内存组织有许多可
存放数值的储存位置,叫“地址”。8086地址总线有20位,所以CPU拥有达1M的寻址空
间,这也是DOS的有效控制范围,而8086能做的运算仅限于处理16位数据,即只有0到64
K,所以,必须用分段寻址才能控制整个内存地址。完整的20位地址可分成两部份:1.
段基址(Segment):16位二进制数后面加上四个二进制0,即一个16进制0,变成20位
二进制数,可设定1M中任何一个64K段,通常记做16位二进制数;2.偏移量(Offset):
直接使用16位二进制数,指向段基址中的任何一个地址。如:2222(段基址):3333(
偏移量),其实际的20位地址值为:25553。除了上述营养要充分吸收外,你还要知道
什么是DOS、BIOS功能调用,简单的说,功能调用类似于WIN95 API,相当于子程序。汇
编写程序已经够要命了,如果不用MS、IBM的子程序,这日子真是没法过了(关于功能
调用详见《电脑爱好者》98年11期)。

编写汇编语言有两种主要的方法:1.使用MASM或TASM等编译器;2.使用除错程序DEBUG.
COM。DEBUG其实并不能算是一个编译器,它的主要用途在于除错,即修正汇编程序中的
错误。不过,也可以用来写短的汇编程序,尤其对初学者而言,DEBUG 更是最佳的入门
工具。因为DEBUG操作容易:只要键入DEBUG回车,A回车即可进行汇编,过程简单,而
使用编译器时,必须用到文本编辑器、编译器本身、LINK以及EXE2BIN等程序,其中每
一个程序都必须用到一系列相当复杂的命令才能工作,而且用编译器处理源程序,必须
加入许多与指令语句无关的指示性语句,以供编译器识别,使用 DEBUG 可以避免一开
始就碰到许多难以理解的程序行。DEBUG 除了能够汇编程序之外,还可用来检查和修改
内存位置、载入储存和执行程序、以及检查和修改寄存器,换句话说,DEBUG是为了让
我们接触硬件而设计的。(8086常用指令用法将在每个汇编程序中讲解,限于篇幅,不
可能将所有指令列出)。

DEBUG的的A命令可以汇编出简单的COM文件,所以DEBUG编写的程序一定要由地址 100h
(COM文件要求)开始才合法。FOLLOW ME,SETP BY SETP(步步回车):

输入 A100 ; 从DS:100开始汇编
2.输入 MOV DL,1 ; 将数值 01h 装入 DL 寄存器
3.输入 MOV AH,2 ; 将数值 02h 装入 DL 寄存器
4.输入 INT 21 ; 调用DOS 21号中断2号功能,用来逐个显示装入DL的字符
5.输入 INT 20 ; 调用DOS 20号中断,终止程序,将控制权交回给 DEBUG
6.请按 Enter 键
7.现在已将汇编语言程序放入内存中了,输入 G(运行)
8.出现结果:输出一个符号。
ㄖ ←输出结果其实不是它,因WORD97无法显示原结果,故找一赝品将就着。
Program terminated normally

我们可以用U命令将十六进制的机器码反汇编(Unassemble)成汇编指令。你将发现每
一行右边的汇编指令就是被汇编成相应的机器码,而8086实际上就是以机器码来执行程
序。
1.输入 U100,106
1FED:0100 B201 MOV DL,01
1FED:0102 B402 MOV AH,02
1FED:0104 CD21 INT 21
1FED:0106 CD20 INT 20
DEBUG可以用R命令来查看、改变寄存器内容。CS:IP寄存器,保存了将执行指令地址。
1.输入R
AX=0000 BX="0000" CX="0000" DX="0000" SP="FFEE" BP="0000" SI="0000" DI="0000"
DS=1FED ES="1FED" SS="1FED" CS="1FED" IP="0100" NV UP EI PL NZ NA PO NC
1FED:0100 B201 MOV DL,01

当程序由DS:100开始执行,那么终止程序时,DEBUG会自动将IP内容重新设定为100。
当你要将此程序做成一个独立的可执行文件,则可以用N命令对该程序命名。但一定要
为COM文件,否则无法以DEBUG载入。
输入N SMILE.COM ;我们得告诉DEBUG程序长度:程序从100开始到106,故占用7
;字节。我们利用BX存放长度值高位部分,而以CX存放低位部分。
2.输入RBX ;查看 BX 寄存器的内容,本程序只有7个字节,故本步可省略
3.输入 RCX  ;查看 CX 寄存器的内容
4.输入 7  ;程序的字节数
5.输入 W ;用W命令将该程序写入(Write)磁盘中

修行至此,我们便可以真正接触8086汇编指令了。 当我们写汇编语言程序的时候,通
常不会直接将机器码放入内存中,而是打入一串助记符号(Mnemonic Symbols),这些
符号比十六进制机器码更容易记住,此之谓汇编指令。助记符号,告诉CPU应执行何种
运算。 也就是说,助忆符号所构成的汇编语言是为人设计的,而机器语言是对PC设计
的。

现在,我们再来剖析一个可以将所有ASCII码显示出来的程序。
1. 输入 DEBUG
2. 输入 A100
3.输入 MOV CX,0100 ;装入循环次数
MOV DL,00 ;装入第一个ASCII码,随后每次循环装入新码
MOV AH,02
INT 21
INC DL ;INC:递增指令,每次将数据寄存器 DL 内的数值加 1
LOOP 0105 ;LOOP:循环指令,每执行一次LOOP,CX值减1,并跳
;到循环的起始地址105,直到CX为0,循环停止
INT 20
4.输入 G即可显示所有ASCII码


当我们想任意显示字符串,如:UNDERSTAND?,则可以使用DOS21H号中断9H号功能。输
入下行程序,存盘并执行看看:
1.输入 A100
MOV DX,109 ;DSX = 字符串的起始地址
MOV AH,9 ;DOS的09h功能调用
INT 21 ;字符串输出
INT 20
DB 'UNDERSTAND?$';定义字符串
在汇编语言中,有两种不同的指令:1.正规指令:如 MOV 等,是属于CPU的指令,用来
告诉CPU在程序执行时应做些什么,所以它会以运算码(OP-code)的方式存入内存中;
2.伪指令:如DB等,是属于DEBUG等编译器的指令,用来告诉编译器在编译时应做些什
么。DB(Define Byte)指令用来告诉DEBUG 将单引号内的所有ASCII 码放入内存中。
使用 9H 功能的字符串必须以$结尾。用D命令可用来查看DB伪指令将那些内容放入内
存。
6.输入 D100
1975:0100 BA 09 01 B4 09 CD 21 CD-20 75 6E 64 65 72 73 74 ......!. underst
1975:0110 61 6E 64 24 8B 46 F8 89-45 04 8B 46 34 00 64 19 and$.F..E..F4.d.
1975:0120 89 45 02 33 C0 5E 5F C9-C3 00 C8 04 00 00 57 56 .E.3.^_.......WV
1975:0130 6B F8 0E 81 C7 FE 53 8B-DF 8B C2 E8 32 FE 0B C0 k.....S.....2...
1975:0140 74 05 33 C0 99 EB 17 8B-45 0C E8 D4 97 8B F0 89 t.3.....E.......
1975:0150 56 FE 0B D0 74 EC 8B 45-08 03 C6 8B 56 FE 5E 5F V...t..E....V.^_
1975:0160 C9 C3 C8 02 00 00 6B D8-0E 81 C3 FE 53 89 5E FE ......k.....S.^.
1975:0170 8B C2 E8 FB FD 0B C0 75-09 8B 5E FE 8B 47 0C E8 .......u..^..G..

现在,我们来剖析另一个程序:由键盘输入任意字符串,然后显示出来。db 20指示DEB
UG保留20h个未用的内存空间供缓冲区使用。
输入A100
MOV DX,0116 ;DSX = 缓冲区地址,由DB伪指令确定缓冲区地址
MOV AH,0A ;0Ah 号功能调用
INT 21 ;键盘输入缓冲区
MOV DL,0A ;由于功能Ah在每个字符串最后加一个归位码(0Dh由 Enter
MOV AH,02 ;产生),使光标自动回到输入行的最前端,为了使新输出的
INT 21 ;字符串不会盖掉原来输入的字符串,所以利用功能2h加一
;个换行码(OAh),使得光标移到下一行的的最前端。
MOV DX,0118 ;装入字符串的起始位置
MOV AH,09 ;9h功能遇到$符号才会停止输出,故字符串最后必须加上
INT 21 ;$,否则9h功能会继续将内存中的无用数据胡乱显示出来
INT 20
DB 20 ;定义缓冲区
送你一句话:学汇编切忌心浮气燥。

客套话就不讲了。工欲善其事,必先利其器。与其说DEBUG 是编译器,倒不如说它是
“直译器”,DEBUG的A命令只可将一行汇编指令转成机器语言,且立刻执行。真正编译
器(MASM)的运作是利用文本编辑器(EDIT等)将汇编指令建成一个独立且附加名为.A
SM的文本文件,称源程序。它是MASM 程序的输入部分。MASM将输入的ASM文件,编译成
.OBJ文件,称为目标程序。OBJ文件仅包含有关程序各部份要载入何处及如何与其他程序
合并的信息,无法直接载入内存执行。链结程序LINK则可将OBJ文件转换成可载入内存执
行(EXEcute)的EXE文件。还可以用EXE2BIN,将符合条件的EXE文件转成COM文件(COM
文件不但占用的内存最少,而且运行速度最快)。
下面我们用MASM写一个与用DEBUG写的第一个程序功能一样的程序。
用EDIT编辑一个SMILE.ASM的源程序文件。
源程序 DEBUG 程序
prognam segment
assume cs:prognam
org 100h A100
mov dl,1 mov dl,1
mov ah,2 mov ah,2
int 21h int 21
int 20h int 20
prognam ends
end

比较一下:1.因为MASM会将所有的数值假设为十进制,而DEBUG则只使用十六进制,所
以在源程序中,我们必须在有关数字后加上代表进制的字母,如H代表十六进制,D代表
十进制。若是以字母开头的十六进制数字,还必须在字母前加个0,以表示它是数,如
0AH。2.源程序增加五行叙述:prognam segment 与 prognam ends 是成对的,用来告
诉 MASM 及LINK,此程序将放在一个称为PROGNAM(PROGram NAMe)的程序段内,其中段
名(PROGNAM)可以任取,但其位置必须固定。assume cs:prognam 必须在程序的开头
,用来告诉编译器此程序所在段的位置放在CS寄存器中。end用来告诉MASM,程序到此
结束, ORG 100H作用相当于DEBUG的A100,从偏移量100开始汇编。COM 文件的所有源程
序都必须包含这五行,且必须依相同的次序及位置出现,这点东西记下就行,千篇一律
。接着,我们用MASM编译SMILE.ASM。
输入 MASM SMILE ←不用打入附加名.ASM。
Microsoft (R) Macro Assembler Version 5.10
Copyright (C) Microsoft Corp 1981, 1988. All rights reserved.
Object filename [SMILE.OBJ]: ←是否改动输出OBJ文件名,如不改就ENTER
Source listing [NUL.LST]: ← 是否需要列表文件(LST),不需要就ENTER
Cross-reference [NUL.CRF]: ←是否需要对照文件(CRF),不需要则ENTER
50162 + 403867 Bytes symbol space free
0 Warning Errors ←警告错误,表示编译器对某些语句不理解,通常是输入错误。
0 Severe Errors ←严重错误,会造成程序无法执行,通常是语法结构错误。

如果没有一个错误存在,即可生成OBJ文件。OBJ中包含的是编译后的二进制结果,它还
无法被 DOS载入内存中加以执行,必须加以链结(Linking)。以LINK将OBJ文件(SMIL
E.OBJ)链结成 EXE 文件(SMILE.EXE)时,。
1.输入 LINK SMILE ←不用附加名OBJ
Microsoft (R) Overlay Linker Version 3.64
Copyright (C) Microsoft Corp 1981, 1988. All rights reserved.
Run File [SMILE.EXE]: ← 是否改动输出EXE文件名,如不改就ENTER
List File [NUL.MAP]: ← 是否需要列表文件(MAP),不需要则ENTER
Libraries [.LIB]: ←是否需要库文件,要就键入文件名,不要则ENTER
LINK : warning L4021: no stack segment← 由于COM文件不使用堆栈段,所以错误信

←"no stack segment"并不影响程序正常执行

至此已经生成EXE文件,我们还须使用EXE2BIN 将EXE文件(SMILE.EXE),转换成COM文
件(SMILE.COM)。输入EXE2BIN SMILE产生 BIN 文件(SMILE.BIN)。其实 BIN 文件
与 COM 文件是完全相同的,但由于DOS只认COM、EXE及BAT文件,所以BIN文件无法被正
确执行,改名或直接输入 EXE2BIN SMILE SMILE.COM即可。现在,磁盘上应该有 SMIL
E.COM 文件了,你只要在提示符号C:>下,直接输入文件名称 SMILE ,就可以执行这
个程序了。

你是否觉得用编译器产生程序的方法,比 DEBUG 麻烦多了!以小程序而言,的确是如
此,但对于较大的程序,你就会发现其优点了。我们再将ASCII程序以编译器方式再做
一次,看看有无差异。首先,用EDIT.COM建立 ASCII.ASM 文件。
prognam segment ;定义段
assume cs:prognam ;把上面定义段的段基址放入 CS
mov cx,100h ; 装入循环次数
mov dl,0 ; 装入第一个ASCII码,随后每次循环装入新码
next: mov ah,2
int 21h
inc dl ;INC:递增指令,每次将数据寄存器 DL 内的数值加 1
loop next ; 循环指令,执行一次,CX减1,直到CX为0,循环停止
int 20h
prognam ends ;段终止
end ;汇编终止
在汇编语言的源程序中,每一个程序行都包含三项元素:
start: mov dl,1 ;装入第一个ASCII码,随后每次循环装入新码
标识符 表达式 注解

在原始文件中加上注解可使程序更易理解,便于以后参考。每行注解以“;”与程序行
分离。编译器对注解不予理会,注解的数据不会出现在OBJ、EXE或COM文件中。由于我
们在写源程序时,并不知道每一程序行的地址,所以必须以符号名称来代表相对地址,
称为“标识符”。我们通常在适当行的适当位置上,键入标识符。标识符(label)最
长可达31 个字节,因此我们在程序中,尽量以简洁的文字做为标识符。现在,你可以
将此ASCII.ASM 文件编译成 ASCII.COM 了。1.MASM ASCII,2.LINK ASCII,3.EXE2BI
N ASCII ASCII.COM。

注意:当你以编译器汇编你设计的程序时,常会发生打字错误、标识符名称拼错、十六
进制数少了h、逻辑错误等。汇编老手常给新人的忠告是:最好料到自己所写的程序一
定会有些错误(别人告诉我的);如果第一次执行程序后,就得到期望的结果,你最好
还是在检查一遍,因为它可能是错的。原则上,只要大体的逻辑架构正确,查找程序中
错误的过程,与写程序本身相比甚至更有意思。写大程序时,最好能分成许多模块,如
此可使程序本身的目的较单纯,易于撰写与查错,另外也可让程序中不同部份之间的界
限较清楚,节省编译的时间。如果读程序有读不懂的地方最好用纸笔记下有关寄存器、
内存等内容,在纸上慢慢比划,就豁然开朗了。   下面我们将写一个能从键盘取得
一个十进制的数值,并将其转换成十六进制数值而显示于屏幕上的“大程序”。前言:
要让8086执行这样的功能,我们必须先将此问题分解成一连串的步骤,称为程序规划。
首先,以流程图的方式,来确保整个程序在逻辑上没有问题(不用说了吧!什么语言都
要有此步骤)。这种模块化的规划方式,称之为“由上而下的程序规划”。而在真正写
程序时,却是从最小的单位模块(子程序)开始,当每个模块都完成之后,再合并成大
程序;这种大处著眼,小处著手的方式称为“由下而上的程序设计”。

我们的第一个模块是BINIHEX,其主要用途是从8086的BX寄存器中取出二进制数,并以
十六进制方式显示在屏幕上。注意:子程序如不能独立运行,实属正常。
binihex segment
assume cs:binihex
mov ch,4 ;记录转换后的十六进制位数(四位)
rotate: mov cl,4 ;利用CL当计数器,记录寄存器数位移动次数
rol bx,cl ;循环寄存器BX的内容,以便依序处理4个十六进制数
mov al,bl ;把bx低八位bl内数据转移至al
and al,0fh ;把无用位清零
add al,30h ;把AL内数据加30H,并存入al
cmp al,3ah ;与3ah比较
jl printit ;小于3ah则转移
add al,7h ;把AL内数据加30H,并存入al
printit:mov dl,al ;把ASCII码装入DL
mov ah,2
int 21h
dec ch ;ch减一,减到零时,零标志置1
jnz rotate ;JNZ:当零标志未置1,则跳到指定地址。即:不等,则转移
int 20h ;从子程序退回主程序
binihex ends
end

利用循环左移指令ROL循环寄存器BX(BX内容将由第二个子程序提供)的内容,以便依序
处理4个十六进制数:1. 利用CL当计数器,记录寄存器移位的次数。2.将BX的第一个十
六进制值移到最右边。利用 AND (逻辑“与”运算:对应位都为1时,其结果为1,
其余情况为零)把不要的部份清零,得到结果:先将BL值存入AL中,再利用AND以0Fh(
00001111)将AL的左边四位清零。由于0到9的ASCII码为30h到39h,而A到F之ASCII
码为41h到46h,间断了7h,所以得到结果:若AL之内容小于3Ah,则AL值只加30h,否则
AL再加7h。ADD指令会将两个表达式相加,其结果存于左边表达式内。标志寄存器(Fl
ag Register)是一个单独的十六位寄存器,有9个标志位,某些汇编指令(大部份是涉
及比较、算术或逻辑运算的指令)执行时,会将相关标志位置1或清0, 常碰到的标志
位有零标志(ZF)、符号标志(SF)、溢出标志(OF)和进位标志(CF)。 标志位保
存了某个指令执行后对它的影响,可用其他相关指令,查出标志的状态,根据状态产生
动作。CMP指令很像减法,是将两个表达式的值相减,但寄存器或内存的内容并未改变
,只是相对的标志位发生改变而已:若 AL 值小于 3Ah,则正负号标志位会置0,反之
则置1。 JL指令可解释为:小于就转移到指定位置,大于、等于则向下执行。CMP和JG
、JL等条件转移指令一起使用,可以形成程序的分支结构,是写汇编程序常用技巧。

第二个模块DECIBIN 用来接收键盘打入的十进制数,并将它转换成二进制数放于BX 寄
存器中,供模块1 BINIHEX使用。
decibin segment
assume cs:decibin
mov bx,0 ;BX清零
newchar:mov ah,1 ;
int 21h ;读一个键盘输入符号入al,并显示
sub al,30h ;al减去30H,结果存于al中,完成ASCII码转二进制码
jl exit ;小于零则转移
cmp al,9d
jg exit ;左>右则转移
cbw ;8位al转换成16位ax
xchg ax,bx ;互换ax和bx内数据
mov cx,10d ;十进制数10入cx
mul cx ;表达式的值与ax内容相乘,并将结果存于ax
xchg ax,bx
add bx,ax
jmp newchar ;无条件转移
exit: int 20 ;回主程序
decibin ends
end
CBW 实际结果是:若AL中的值为正,则AH填入00h;反之,则AH填入FFh。XCHG常用于需
要暂时保留某个寄存器中的内容时。
当然,还得一个子程序(CRLF)使后显示的十六进制数不会盖掉先输入的十进制数。
crlf segment
assume cs:crlf
mov dl,0dh ;回车的ASCII码0DH入DL
mov ah,2
int 21h
mov dl,0ah ;换行的ASSII码0AH入AH
mov ah,2
int 21h
int 20 ;回主程序
crlf ends
end

现在我们就可以将BINIHEX、DECIBIN及CRLF等模块合并成一个大程序了。首先,我们要
将这三个模块子程序略加改动。然后,再写一段程序来调用每一个子程序。
crlf proc near;
mov dl,0dh
mov ah,2
int 21h
mov dl,0ah
mov ah,2
int 21h
ret
crlf endp

类似SEGMENT与ENDS的伪指令,PROC与ENDP也是成对出现,用来识别并定义一个程序。
其实,PROC 真正的作用只是告诉编译器:所调用的程序是属于近程(NEAR)或远程(
FAR)。 一般的程序是由 DEBUG 直接调用的,所以用 INT 20 返回,用 CALL 指令所
调用的程序则改用返回指令RET,RET会把控制权转移到栈顶所指的地址,而该地址是由
调用此程序的 CALL指令所放入的。
各模块都搞定了,然后我们把子程序组合起来就大功告成
decihex segment ;主程序
assume cs:decihex
org 100h
mov cx,4 ;循环次数入cx;由于子程序要用到cx,故子程序要将cx入栈
repeat: call decibin;调用十进制转二进制子程序
call crlf ;调用添加回、换行符子程序
call binihex ;调用二进制转十六进制并显示子程序
call crlf
loop repeat ;循环4次,可连续运算4次
mov ah,4ch ; 调用DOS21号中断4c号功能,退出程序,作用跟INT 20H
int 21H ; 一样,但适用面更广,INT20H退不出时,试一下它
decibin proc near push cx ;将cx压入堆栈,;
┇ exit: pop cx ;将cx还原; retdecibin endp binihex proc near push cx
┇ pop cx retbinihex endp crlf proc near
push cx
┇ pop cx retcrlf endpdecihex ends end

CALL指令用来调用子程序,并将控制权转移到子程序地址,同时将CALL的下行一指令地
址定为返回地址,并压入堆栈中。CALL 可分为近程(NEAR)及远程(FAR)两种:1.N
EAR:IP的内容被压入堆栈中,用于程序与程序在同一段中。2.FAR:CS 、IP寄存器的
内容依次压入堆栈中,用于程序与程序在不同段中。PUSH、POP又是一对指令用于将寄存
器内容压入、弹出,用来保护寄存器数据,子程序调用中运用较多。堆栈指针有个“后
进先出”原则,像PUSH AX,PUSH BX…POP BX,POP AX这样才能作到保护数据丝毫不差

点击此处查看原文 >>

系统分类: 软件开发   |    用户分类: 无分类    |    来源: 转贴

评论(0) | 阅读(475)
发表于:2007-11-11 10:10:46
标签:无标签

0

51单片机数码管显示的好帮手---MAX7219

51单片机数码管显示的好帮手---MAX7219
                           
一、51单片机与MAX7219集成电路连接起来能干什么
    俗话说“一个篱笆三个桩,一个好汉三个帮”。单片机这个“好汉”虽然发展已十分成熟,但仍需要很多“热心肠”的帮助,才能发挥其强大的功力,而MAX7219集成电路就是来帮助单片机输出显示的。我们知道单片机的输出显示最常用的是发光二极管和数码管,就是通常所说的LED显示技术(数码管就是用八个发光二极管搭的造型),拿数码管显示为例,分为静态显示和动态显示,静态显示需要占用很多I/O口资源,所以动态显示很受欢迎,但当单片机在做一些较复杂的工程时,尤其是有多个数码管显示时,动态显示也显得占用了较多的I/O口资源,以八个数码管(共阴极)显示输出为例,即使是用3-8译码器对公共端进行选择,加上数据端口,仍然需要11I/O口,往往使单片机不堪重负,功能大打折扣,如图一所示。

点击看大图

 图一:单片机与八个数码管(共阴极)的连接线

 图中共用了单片机的11I/O口。如果用MAX7219帮忙的话,只用三根根I/O口就可以完成任务,真的就是这样的神奇。
 
二、MAX7219的外形及管脚功能
 MAX7219封装常见的是DIP24,外形如图二。其中A图是实物图,B图是逻辑图。

点击看大图
 
                      图二:MAX7219的外形
 其管脚功能如下:    1)VCC:+5V电源端。       2)GND:接地端。    3)ISETLED段峰值电流提供端。它通过一只电阻与电源相连,以便给LED段提供峰值电流。帮助位选信号显示。
   4)SEGASEGGLED七段显示器段驱动端。    5)SEGDP:小数点驱动端。    6)DIG7DIG0:8位数值驱动线。输出位选信号,从每个LED公共阴极吸入电流。    7)DIN:串行数据输入端。在CLK的上升沿,数据被装入到内部的16位移位寄存器中。    8)CLK:串行时钟输入端。最高输入频率为10MHZ,在CLK的上升沿,数据被移入内部移位寄存器;在CLK的下降沿,数据被移至DOUT端。    9) LOAD:装载数据控制端。在LOAD的上升沿,最后送入的16位串行数据被锁存到数据或控制寄存器中。
 10)DOUT:串行数据输出端。进入DIN的数据在16.5个时钟后送到DOUT端,以便在级联时传送到下一片MAX7219
 
三、MAX7219的时序图(DIN CLK LOAD原理)

点击看大图

 这个图很简单,就是告诉大家三个端口是怎么合作传送数据的。其中,DIN是串行数据输入端,CLKLOAD实际上是充当了组织者。针对单片MAX7219介绍一下数据传送的过程:
 首先,在CLK的下降沿,无效,在CLK的上升沿,第一位二进制数据被移入内部移位寄存器,然后CLK再出现下降沿,无效,然后CLK再出现上升沿,第二位二进制数据被移入内部移位寄存器,就这样工作十六个周期,完成十六个二进制(前八个是地址,后八个是数据)的传送,这当中LOAD一直是低电平,当完成十六个二进制的传送后。把LOAD置成高电平,产生上升沿,把这16位串行数据锁存到数据或控制寄存器中。完成装载。然后再把LOAD还原为低。重复开始的动作。周而复之……
 例如:把数据09H传送到地址0AH(亮度控制寄存器)。即设定LED为十六级亮度的第10级。编程如下:
 
MOV A#OAH     ;亮度控制寄存器地址以数据形式送累加器A
START
CLR LOAD
MOV R6#O8H    ;循环次数
LOOP
CLR CLK
RLC A
MOV DINC
SETB CLK
DJNZ R6LOOP
MOV A#09H     ;亮度控制码送累加器A
LJMP START

四、AT89S515类工作寄存器
 它主要由8个数位寄存器和6个控制寄存器组成:    1)数位寄存器7~0:它决定该位LED显示内容。    2)译码方式寄存器:地址为09H,它决定数位寄存器的译码方式,它的每一位对应一个数位。其中,1代表译码方式;0表示不译方式。比如,00H,表示都不译码。若用于驱动LED数码管,一般都设置为译码方式,方便编程;当用于驱动条形图显示器时,应设置为不译码方式。    3)扫描位数寄存器:地址为0BH,设置显示数据位的个数。该寄存器的D2~D0(低三位)指定要扫描的位数,支持0~7位,比如要显示数据位的个数为三,则应送往地址0BH的数据就应为03H。各数位均以1.3kHz的扫描频率被分路驱动。    4)亮度控制寄存器:地址为0AH,该寄存器通常用于数字控制方式,利用其D3~D0位控制内部脉冲宽度调制DAC的占空比来控制LED段电流的平均值,实现LED的亮度控制。D3~D0取值可从0000~1111,对应电流占空比则从1/32变化到31/32,共16级,D3~D0的值越大,LED显示越亮。而亮度控制寄存器中的其他各位未使用,可置任意值。前面已经举例。    5)显示测试寄存器:地址为0FH,当D0置为1时,LED处于显示测试状态,所有8位LED的段被扫描点亮,电流占空比为31/32;若D0为0,则处于正常工作状态。D7~D1位未使用,可任意取值。简单来说就是,D0为1时,点亮整个显示器,为0时,恢复原数据。用来检测外挂LED数码管各段的好坏。    6)关断寄存器:地址为0CH,又叫待机开关,用于关断所有显示器。当D0为0时,关断所有显示器,但不会消除各寄存器中保持的数据;当D0设置为1时,正常工作。剩下各位未使用,可取任意值。    7)无操作寄存器:它主要用于多MAX7219级联,允许数据通过而不对当前MAX7219产生影响。

五、MAX7219AT89S2051的连接及程序清单
   下面,把单片机、MAX7219和数码管连接起来,由于只用了单片机(MCU)三个管脚,所以用简化版的AT89S2051单片机就足够了。连接如下:

点击看大图

图四  MAX7219AT89S2051的连接

  图中,DIN P1.0     CLK P1.1      LOAD P1.2
  先来做个简单的小实验:让数码管从左到右分别显示   01234567,电路图如图四。
 程序清单如下:
      ORG  0000H
      AJMP MAIN
      DIN BIT P1.0   ;定义变量
      CLK BIT P1.1
      LOAD BIT P1.2
      ORG 0080H
 MAIN:MOV A,#0BH      ; 扫描位数:八位
      MOV B,#07H
      LCALL WRITE
      MOV A,#09H     ;译码方式:译码
      MOV B,#0FFH
      LCALL WRITE
      MOV A,#0AH     ; 亮度调节:10
      MOV B,#09H
      LCALL WRITE
      MOV A,#0CH     ; 待机开关:关
      MOV B,#01H
START:MOV R3,#08H
      MOV R0,#00H
LOOP:MOV DPTR,#TAB
      MOV R4,#01H
   LP:MOV A,R0
      MOVC A,@A+DPTR
      MOV B,A
      MOV A,R4
      LCALL WRITE
      INC R0
      INC R4
      DJNZ R3,LP
 LJMP START
  TAB:DB 00H,01H,02H,03H,04H,05H,06H,07H08H06H
 ;前面对“译码方式寄存器”采用了(BCD)译码方式。
WRITE:CLR LOAD
      LCALL QQ
      MOV A,B
      LCALL QQ
      SETB LOAD
      RET
   QQ:MOV R6,#08H
 LP1:CLR CLK
      RLC A
      MOV DIN,C
      NOP
      SETB CLK
      DJNZ R6,LP1
      RET
      END
六、多片MAX7219AT89S51的连接(多片级联)
 如果在实际应用中需要更多的数码管,大于八个,还可以利用DOUT进行多片MAX7219的连接,这里就不再进行详细的解释。
七、几个注意事项
    ①串口时,单片机串行发送码
 ②数码管是共阴极的
 ③数码管可以换成64个发光二极管或者LCD
 ④用单片机的串口与MAX7219DIN连接时,注意数据传送的方向

点击此处查看原文 >>

系统分类: 汽车电子   |    用户分类: 无分类    |    来源: 无分类

评论(0) | 阅读(943)
发表于:2007-11-9 15:40:06
标签:无标签

1

GPRS 数据传输应用

GPRS 数据传输应用
设置 PPP 场景:AT+CIPCSMP=1,”CMNET”
连接服务器:AT+CIPSTART="TCP",218.246.31.188,2020
OK
CONNECT OK
查询 PPP 状态:AT+CIPSTATUS
8
OK
发送信息到网络服务器:AT+CIPSEND
> hello(^Z)
SEND OK
收到网络服务器的数据:Hello
关闭 TCP 连接:AT+CLOSE
            OK
关闭 PPP 连接:AT+CIPSHUT
OK

四、电脑通过内置Modem上网
  M55支持电脑或者笔记本用手机的内置Modem连接上网,因为没有红外线,所以电脑和手机的连接只有通过数据线,可以是COM口或者USB口。
  1.使用SDS中的Siemens GPRS助手上网,安装很简单,按提示一步一步走即可。
  2.另一种简单的通用方法
  以windows 98为例,2000和XP的操作类似。
  1)、首先到控制面板里安装调制解调器,选择“不检测调制解调器,直接从列表中选择”,下一步,在窗口左边选择标准调制解调器,右边选择标准19200调制解调器,下一步,选择COM口,然后下一步点击完成。
  2)、添加拨号连接。到我的电脑中的拨号网络里(如果没有安装拨号网络,请到控制面板—添加删除程序—WINDOWS组件里安装拨号网络),然后选择添加新连接,选择刚才新建的标准19200调制解调器,点击设置设置最快速度为57600,下一步,电话号码中输入*99***1#,下一步完成。
  3)、APN的设置,到调制解调器里选高级属性,再附加设置里填入AT+CGDCONT=1,"IP","cmnet";^sgauth=1 然后确定即可。
  4)、双击刚才新建的连接就可以通过手机上网了。
  PS:有关彩信和电子邮件的配置使用和技巧在下一篇文章详细阐述。


数据中心的IP地址问题有哪几种方式呢?

A:
1、固定IP地址
从系统运行的可靠角度而言,数据中心具有固定IP地址是最好的选择,而且,这对于将来系统增加新的、更强大的功能(比如:无线视频监控)也非常方便,但是,申请固定IP地址需要支付较大的一笔月租费,而且,如果数据采集系统本身规模就不大,这就更不经济了。

2、动态域名解析
也可以通过域名解析解决数据中心的IP地址问题。
用户向ISP(Internet Service Provider)申请一个域名服务,并将此域名配置到GPRS/CDMA DTU中,则每次拨号时,DTU就可以通过域名解析连接到服务器,无须服务器具有固定IP地址了。用户需要向ISP支付域名服务的费用,通常这个费用比申请固定IP地址低得多。但是,采用域名解析,系统的稳定性在很大程度上取决于域名解析服务器的工作状况,而域名服务器通常是由ISP提供的。

3、ADSL拨号,短消息通知IP
客户可以采用价格低廉的ADSL拨号连接Internet,每次拨号连接所获得的IP地址都是动态的,这个IP地址以短消息的方式通知GPRS/CDMA数据采集系统中的每个DTU,DTU接受到短消息后,就以此IP地址进行连接。

采用这种方式就无须支付任何月租费用了。缺点是每次ADSL拨号后,如果要进行数据传输,都需要用短消息通知每个DTU数据中心的IP地址。这种方式特别适用于数据传输不是很频繁、也无须DTU永远在线的情况。
我公司的GPRS/CDMA DTU支持上述的所有方式,客户可以根据实际组网的需要,灵活选择。特别是第三种方式,我公司深入分析了客户的需求,在短消息控制连接上,提供了使用灵活、功能强大的工作方式。比如:短消息启动tcp连接、短消息断开tcp连接、短消息修改密码、短消息修改DTU的ID等等。



3 图像传输系统的软件设计
3.1 设计目的
    
软件设计目的:通过向GPRS模块发送AT指令,控制移动终端的通信过程,使移动台能借助GPRS提供的网关和路由接入Intemet,并通过TCP/IP网络协议完成与Internet上监控中心传输图像数据的任务。

     基于以上要求,设计了通信软件,即GPRS客户端软件和服务器端软件。

3.2 GPRS无线模块通信指令

     WISMO 2D模块的软件部分对外提供了控制系统操作的AT指令集,通过接收来自UART的AT指令,解释并执行相应操作,实现无线Modem相应功能。

     由于编写的程序过长,只列出进行TCP传输用到的主要AT指令:
     AT+CGREG=1;//设置GPRS注册状态
     AT+CGATT=l;//GPRS网络附着
     AT#APNSERV=“CMNET”;//设置GPRS接入点
     AT#APNUN=″″;//身份验证用户名设为空
     AT#APNPW=″″;//身份验证密码设为空
     AT# ConnectionStart;//连接CPRS网登录Internet,成功返回动态分配的IP地址
     AT#TCPSERV=″202.112.135.203″://设置服务器IP地址,即监控中心的IP地址
     AT#TCPPORT=″6000″://设置服务器与客户端通信的Socket端口:
     AT#otcp;//打开与远程服务器的TCP连接

     TCP连接成功后,GPRS模块进入数据传送状态,这时就可通过串口向GPRS模块发送图像数据,模块通过Socket发送到监控中心,监控中心也能向模块发送回应数据。数据传完后控制机向GPRS模块发送终止字符<ETX>,移动终端又回到AT指令接收状态。

3.3 GPRS客户端软件

     运行于控制机上的客户端软件具有以下功能:
     (1)串口通信,包括AT指令通信和数据文件通信。
     (2)显示传输过程计时,用于测试系统的传输速率。
     (3)中止GPRS模块TCP协议栈通信。系统传输出错时中止协议栈工作。

     Q2406B内嵌TCP协议栈的缓存区有限,若串口写入速率远高于GPRS传输速率,协议栈将会丢失数据。为保证数据传输的可靠性,必须进行流控制。设计中采用了两种流控制方法:数据分包法和硬件握手法。

     采用数据分包法的GPRS客户端传输图像文件流程图如图4所示。该方法将图像文件先打成若干个小数据包,逐个写入串口,由GPRS模块发送。监控中心的服务器端接收完一个数据包后返回应答帧,GPRS模块再发下一个数据包。若超时还未返回应答帧,则重发上一个数据包。此法牺牲了一定时间,但很好地保证了图像传输的可靠性。

     硬件握手法采用9线串口中的硬件握手信号:RTS/CTS做流控制。系统工作时。控制机使用RTS启动GPRS模块的数据流,GPRS模块用CTS启动和暂停来自控制机的数据流。当缓存区内数据量达到高位时,模块将CTS线置低电平,控制机程序检测到CTS为低后,就停止发送数据,直到协议栈缓存区的数据量低于低位而将CTS置高电平。

     此法也可保证写入数据不丢失,而且传输图像文件的耗时低于前种方法。但它不能用于简化的三线串口协议,也不能如前种方法那样检测到GPRS数据传输过程中的丢包现象,通过重发来保证传输过程的可靠性。

3.4 GPRS服务器端软件

     GPRS图像传输系统采用多个移动终端都与监控中心服务器连接的方法。服务器采用普通Internet上的主机方式,作为TCP服务器端,具有静态公网IP,开放了侦听端口,可从外部访问,其上运行TCP端口监听程序,接收来自移动台的TCP数据包,并向移动台发送回应数据。采用数据分包法的GPRS服务器端接收图像文件流程如图5所示。该服务器端软件具有以下功能:(1)监听TCP端口;(2)接收数据包,发送接收应答帧;(3)显示接收数据和大小,保存图像文件。

     本系统的发送端设计了两种流控制方法,一种从硬件上实现,另一种从软件上实现。前者在网络状况稳定的情况下,传输速度较快。后者可有效保证整个GPRS传输过程的稳定可靠,并能直接用于简化的三线串口协议,当控制机采用嵌入式微处理器时,能方便地与微处理器串口相连,无需串口转换芯片。

     使用中国移动提供的普通GPRS业务进行测试,本系统的传输速率可达10kbps,大量测试中未出现丢失数据的情况,整套系统工作稳定可靠。同时也可胜任传输任何形式的文件数据,应用于需要远程传送数据的系统中。

3 建立SOCKET连接的命令

  下面对SOCKET通信中要用到的一些AT命令[2]进行说明。

  3.1 基本设置

  ① GPRS ISP 码。
  AT+IISP1=*99***1# //全国通用

  ② 登录用户名。
  AT+IUSRN=WAP//GPRS网络登录名

  ③ 登录密码。
  AT+IPWD=WAP// GPRS网络登录密码

  ④ MODEM 类型。
  AT+IMTYP=2 //定义GPRS MODEM

  ⑤ 初始化命令。
  AT+IMIS=“AT+CGDCONT=1,ip,CMNET”

  ⑥ 域名服务器。
  AT+IDNS1=211.136.18.171
  //DNS服务器地址,全国通用

  ⑦ 扩展码(XRC)。
  AT+IXRC=0

  3.2 SOCKET设置

  ① 建立一个TCP通信。
  AT+ISTCP:218.66.16.173,1024<CR>
  建立SOCKET连接,218.66.16.173为应用服务中心计算机端IP地址(实际地址由实际情况决定),1024 为端口号(端口号由中心SOCKET端口监听程序设置决定)。 如果连接成功,LT8030返回I/xxx。xxx为LT8030中本次SOCKET连接的句柄号。中心监听程序会显示连接的终端IP地址。如果连接失败,LT8030返回I/ERROR(xxx)。xxx为错误代码。

  ② 发送数据。
  AT+ISSND%:xxx,<string Length>:<string>
  发送数据,xxx为句柄,<string Length>为要发送的字符长度,<string>为要发送的数据。发送成功后,在中心端可看到终端发送的数据。最多一次能够发送5K以下的数据。

  ③ 查询SOCKET状态。
  AT+ISST:xxx<CR>
  查询SOCKET状态,xxx为句柄。 LT8030返回I/<SOCKETstat>。如果<SOCKETstat>= 000,表示该端口连接正常;如果<SOCKETstat>≥1,LT8030通过该端口从中心接收存在Buffer 里的字节数;如果<SOCKETstat><0,则SOCKET错误。

  ④ 接收数据。
  AT+ISRCV:xxx<CR>
  xxx为句柄。该指令会读取LT8030通过该句柄从中心接收到的,存在Buffer 里的数据;Buffer最大可存储30K的数据。

  ⑤ 关闭SOCKET通道。
  AT+ISCLS:xxx
  关闭SOCKET通道,xxx为句柄。

4 程序的设计  

  根据单片机与GPRS模块通信协议的约定,单片机串行口设为方式1,波特率为9 600 bps,8位UART,1位起始位,1位停止位,无奇偶校验。上电后,首先向GPRS模块发送基本设置命令,即ISP码、用户名及用户密码帧等,其中ISP码必须为“*99***1#”,用户名和用户密码可以任意设置,但不能为空。在使用LT8030 GPRS 上网功能之前,必须正确设置这些参数。参数一旦设置后,即永久保存,以后无需重新再设( 以上设定为LT8030C出厂时的默认参数)。然后向GPRS模块发送SOCKET设置帧,如成功,则点和点通信环境已建立,接着就调用发送数据帧。

  开机上电后,程序在主函数中运行,单片机进行初始化。初始化包括设置串口工作方式、波特率,并初始化变量参数和标志位。

点击此处查看原文 >>

系统分类: 汽车电子   |    用户分类: 无分类    |    来源: 无分类

评论(0) | 阅读(1122)
发表于:2007-11-9 15:39:27
标签:无标签

0

GPS 输出数据的格式分析

GPS 接收OEM 板的型号甚多、性能各异,但它们的GPS定位信息串行输出格式大多采用美国国家海洋电子协会制定的NMEA-0183 通信标准格式。其输出数据采用的是ASCII码,内容包含了纬度、经度、高度、速度、日期、时间、航向以及卫星状况等信息,常用语句有6 种,包括GGAGLLGSAGSVRMC VTG。我们也可以通过GPS 专用设置软件或普通的串口调试软件发送相应的命令语句给OEM 板,把GPS OEM 板设置为每隔若干毫秒发送哪种或哪几种NMEA 语句,然后该OEM 板将这些设置参数存储到板上的EEPROM 芯片内,此后该OEM 板将按照这些设置每隔相应的毫秒数发送出一个或几个GPS 输出NMEA 语句。根据不同的应用需要,设置选择不同的输出记录语句以及它们的发送时间间隔,如本系统我们只关心其时间、经纬度、海拔高度、地面速度信息以及卫星使用数信息,因而可只选用GGAVTG记录语句并设成每1s发送一次。不过须注意,这些设置信息只在系统本次上电,并设置后方有效,在下次重新上电时需重新设置。

一条$GPGGA 语句包括17个字段:语句标识头,世界时间,纬度,纬度半球,经度,经度半球,定位质量指示,使用卫星数量,水平精确度,海拔高度,高度单位,大地水准面高度,高度单位,差分GPS数据期限,差分参考基站标号,校验和结束标记(用回车符<CR>和换行符<LF>),分别用14个逗号进行分隔。该数据帧的结构及各字段释义如下:

$GPGGA,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,M,<10>,M,<11>,<12>*xx<CR><LF>

$GPGGA:起始引导符及语句格式说明(本句为GPS定位数据);

<1>   UTC时间,格式为hhmmss.sss
<2>
纬度,格式为ddmm.mmmm(第一位是零也将传送);
<3>
纬度半球,NS(北纬或南纬)
<4>
经度,格式为dddmm.mmmm(第一位零也将传送);
<5>
经度半球,EW(东经或西经)
<6>
定位质量指示,0=定位无效,1=定位有效;
<7>
使用卫星数量,从0012(第一个零也将传送)
<8>
水平精确度,0.599.9
<9>
天线离海平面的高度,-9999.99999.9

M   
指单位米
<10>
大地水准面高度,-9999.99999.9
M   
指单位米
<11>
差分GPS数据期限(RTCM SC-104),最后设立RTCM传送的秒数量

<12> 差分参考基站标号,从00001023(首位0也将传送)。

*    语句结束标志符
xx   
$开始到*之间的所有ASCII码的异或校验和
<CR>  
回车
<LF>  
换行

对于VTG信息我们只需要以Km/h 为单位的速度信息,就不再累述其格式。

MTI-3板输出的信息可通过串口调试工具在PC机的超级终端中显示。如在PC机上看到的实时接收GPGGA语句为:
$GPGGA,114641,3002.3232,N,12206.1157,E,1,05,12.9,53.2,M,11.6,M,,*4A
   
这是一条GPS定位数据信息语句,意思为世界(格林威治)时间为114641秒,位置在北纬302.3232分,东经1226.1157分,定位有效,接收到5颗卫星,水平精度12.9米,天线离海平面高度53.2米,所在地离地平面高度11.6米,校验和为4AH

GPS 板接收下来的数据流是文本字符串。可根据GPS 输出数据NMEA-0183 通信标准格式中定义的各种记录语句的结构组成特点,编制程序解析其中包含的有用信息。但在此需要强调的是,GPS 输出记录中各ASCII 码字段的位数可能随着实际测量计算出的定位数据的不同而有所变化,因此在进行识别、分解、解析记录中各字段时必须以逗号分割符“,”作为各字段的分割标志,而不应该以各字段的字符位数作为分割各字段的依据,否则将会导致严重的数据错位。

点击此处查看原文 >>

系统分类: 嵌入式   |    用户分类: 无分类    |    来源: 无分类

评论(0) | 阅读(1247)
发表于:2007-11-9 15:38:53
标签:无标签

0

基于GSM的GPS车辆定位监控系统

利用GPS(Global Positioning System)来作定位导航是GPS的最基本应用,随着我国城市建设规模的扩大,车辆日益增多,交通运输的经营管理和合理调度已成为一个广泛关注的问题,尤其是全球定位系统(GPS)从军用转为民用以后,GPS技术应用于移动目标的监控有着其他监控手段无法比拟的优势,所以采用GPS技术对各种车辆实施监控、调度管理是一个新的研究热点。

系统的总体结构与工作原理

      基于GSM的GPS车辆定位监控系统,是对车辆管理提出的较理想解决方案。该系统采用GPS技术对移动目标进行实时定位,利用GSM数字移动通信网络进行实时数据传输,以电子地图和空间信息系统为支撑平台,实现定位跟踪、监控报警、反劫防盗、指挥调度和信息查询管理。整个系统是由GPS卫星定位系统和地面移动通信系统两大部分组成,而地面移动通信系统是由指挥监控中心、车载移动单元和GSM通信网络三个部分组成。车载移动单元设备可以为指挥监控中心实时提供每一个移动目标的最新定位数据、运行状况和报警信息等,并自动记录这些信息以便事后查询分析,是用户终端。指挥监控中心结合GIS(Geographic Information System)电子地图,实时地显示出当前监控、指挥的车辆的地理位置。GSM通信网络则进行数据、语音、图像的传输。

系统监控中心

      系统监控中心结构如图1所示,主要包括GSM通信网络、GIS终端、电子显示屏、监控终端、主控计算机。监控中心接收车载移动单元传送来的车辆GPS定位数据信息,并对车辆的报警和调度信息进行处理,通过GIS地图匹配就能在电子地图上实时显示车辆当前精确位置,从而方便的实现对车辆的调度、监控、指挥等功能;同时也可通过GSM无线通信网络向指定的车载台发送各种控制指令,实现对车辆的远程控制和信息查询服务。


图1 GPS车辆监控指挥系统中心结构图

车载移动单元主要组成部分的设计

      车载移动单元是由主控制器CPU、GPS接收机、GSM无线通信模块、功能控制单元(手柄)和液晶显示屏组成,其结构原理如图2所示。


图2 车载移动单元硬件结构原理图

      车载移动单元通过GPS接收天线接收GPS卫星发射的定位信号,经过CPU主控器处理,计算出车辆的日期、时间、经纬度、速度和行驶方向等定位数据。主控制器CPU是核心,处理接收机发来的定位信息,将定位信息和监控中心发来的控制信息显示在液晶屏上,并控制GSM模块进行短信息的收发,手柄控制单元实现遥控监听、请求服务、中文短信息接收及通话等功能。由于GSM无线模块和GPS模块都以串口通信方式与MCU相连,因此硬件设计较简单,在本设计中MCU选择华邦公司的W77E58,是因为它带有两个串行口能同时与GSM模块、GPS模块进行通信,并且它的指令完全兼容MCS-51,片内有32k flash MTP ROM,可编程的看门狗定时器等,采用它可以省去很多外围元器件,提高了系统的稳定性。系统主控制器电路如图3所示。

GSM无线通信

     GPS车辆定位监控管理系统的通信方式有两种:专用无线通信网和公众GSM网。GPS/GSM车辆定位监控管理系统利用GSM短信息业务实现数据的双向传输,短信息业务在移动台和移动业务交换中心之间建立的是信令连接,具有优先权,可通率极高,误码率极低。这是GSM公众网带来的专用网和集群网无法比拟的好处。短消息用于车辆监控最大的优点在于建立连接简单,接续快,服务费用低,这适合定时把定位信息发送到监控中心。

点击看大图
图3 系统主控制器电路


图4 WM01-G900/1800外围电路设计框图

      在实际应用中,我们选用WM02-G900/1800。它的外围电路设计框图如图4所示,其相关的性能指标如表1所示。它与单片机之间采用标准的串行口进行通信,通信的最高波特率可以达到      115 200b/s。GSM模块与SIM卡之间主要通过SIMCLK和SIMDATA信号线进行数据通信。为了保证发送短消息与短消息到达之间的时间间隔尽量短,选用的SIM卡最好是同一个电信运营商提供的。在使用GPRS功能时,还需要选择支持GPRS的SIM卡,并开通GPRS服务。该模块还支持驱动两路麦克风、两路扬声器和一路蜂鸣器。其中一路麦克风和扬声器可以连到手柄的听筒上,以实现车载电话功能;另一路可以实现监听和免提功能,但这两路不能同时工作,如果在通话中需用免提方式,可以通过AT指令:AT+SPEAKER=0或1进行切换。

      WM02-G900/1800的I/O接口的逻辑电平是3V,当它与微控制器串口通信时,要进行电平转换,笔者在应用中选用MAX3237/3238进行转换,如果需用GPRS业务,也可以选择西门子公司生产的TC-45模块和索尼爱立信公司的GR47,它们支持GSM/GPRS格式的传输。

      控制WM02-G900/1800模块进行短信息的收发及语音通信是设计的关键,如果对相关的AT指令不熟悉就不能进