资源描述
实训笔记2014.9.9C语言部分C语言关键字解析C语言关键字有32个,如表1所示。虽然简单,但还是让一些初学者犯错,譬如sizeof,好多初学者都认为是函数,其中包括我的一些同学,他们学过有好多年了,如此看来,有时我们追求高深的内容,往往会忽略基础的简单的内容!表1 C语言标准定义的32个关键字关键字意义auto声明自动变量,缺省时编译器一般默认为autoint声明整型变量double声明双精度变量long声明长整型变量char声明字符型变量float声明浮点型变量short声明短整型变量signed声明有符号类型变量unsigned声明无符号类型变量struct声明结构体变量union声明联合数据类型enum声明枚举类型static声明静态变量switch用于开关语句case开关语句分支default开关语句中的“其他”分支break跳出当前循环register声明寄存器变量,空间有限const声明只读变量volatile说明变量在程序执行中可被隐含地改变-易变量typedef用以给数据类型取别名(当然还有其他作用)-变量类型重定义extern声明导出全局变量或者全局函数 是在其他文件中声明(也可以看return子程序返回语句(可以带参数,也可不带void声明函数无返回值或无参数,声明空类continue结束当前循环,开始下一轮循环do循环语句的循环体while循环语句的循环条件if条件语句else条件语句否定分支(与if连用)for一种循环语句(可意会不可言传)goto无条件跳转语句sizeof计算对象所占内存空间大小在这里我们也不一一讲解每个关键字,只是讲讲比较容易被人忽略的或者易出错的关键字说明一下。在讲之前,先说明一下,定义和声明的区别:定义:编译器在创建一个对象时,为该对象申请开辟的内存空间,这个空间的的名字就是变量名或者对象名。同一个变量名在摸个区域内只能定义一次,重复定义会出现错误的。声明:有两种作用,1.告诉编译器,这个变量或者函数,我已经定义了(开辟空间了),但是在别的地方,我先说明一下,免得编译器报错。当然,声明可以多次出现。2.告诉编译器,这个变量名或者对象名,我先预定了,其他地方不可以用了。和在饭馆吃饭(人多)要提前预约一样的道理。定义和声明最本质的区别在于,声明没开辟空间,而定义则创建对象(变量)并开辟了空间。这是最重要的一点。一. auto,register,extern,static,四种关键字C语言说明变量的时,同时给出了两个方面的信息:数据类型和存储类。C语言中提供了存储说明符auto,register,extern,static说明的四种存储类别。1.auto是变量是C语言最常用的。编译器在默认的缺省情况下,所有变量都是auto的。对于函数的形参,也是auto型的。2.extern,语言中存在这样的一种变量,在一个函数中合法出现的同时,又可以在其他的函数中合法出现,这就是外部变量。它的生命周期是整个程序的执行周期。3.register,寄存器变量,其值存放在寄存器中,访问速度快。有最快的关键字的称呼。虽然寄存器的速度非常快,但是使用register修饰符也有些限制的:register变量必须是能被CPU寄存器所接受的类型。意味着register变量必须是一个单个的值,并且其长度应小于或等于整型的长度。而且register变量可能不存放在内存中,所以不能用取址运算符“&”来获取register变量的地址。4.static静态变量,两个作用。第一个作用:修饰变量,都存在内存的静态区。静态局部变量:出现在函数体内,生命周期是整个程序的执行过程,由于被static修饰的变量总是存在内存的静态区,即使该函数生命结束,其值不会被销毁,同样要修改该变量,就要到函数内部完成,所以用起来比较安全,起到信息屏蔽的作用。静态全局变量:出现在函数体外,作用域仅限于变量被定义的文件中,其他文件即使用extern声明也没法使用他。第二个作用,修饰函数,函数前加static使得函数成为静态函数。但此处“static”的含义不是指存储方式,而是指对函数的作用域仅局限于本文件(所以又称内部函数)。使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名。二.基本数据类型-short、int、long、char、float、double这些关键字都是基本的数据类型,每种类型占据的内存空间不一样,其实每种类型相当于一个模型,再通俗点就是一个模子。具体占多少个字节,可以用关键字sizeof去测一下。另外就就是存储问题。不论是float还是double在存储方式上都遵从IEEE的规范,float遵从的是IEEE R32.24 ,而double 遵从的是R64.53。#include int main() float a=999.999; float b=0.005; printf(%lf/n,a+b-1000.004); return 0;看看得到的结果并不是0,按数学计算本来应该是0,但由于浮点数的存储有微小的误差从而导致计算结果不是0double m=3.3;cout指向结构体成员运算符;. 结构体成员运算符。2级(右结合)“ ! ”逻辑非运算符;“ ”按位取反运算符;“ + ”前缀增量运算符;“ - ”前缀减量运算符;“ - ”负号运算符;(类型)类型转换运算符;“ * ”指针运算符;“ & ”地址运算符。3级(左结合)“ * ” 乘法运算符;“ / ”除法运算符;“ % ” 取余运算符。4级(左结合)“ + ”加法运算符;“ - ”减法运算符。5级(左结合) 右移运算符。6级(左结合)、=关系运算符。7级(左结合)“ = ”等于运算符;“ != ”不等于运算符。8级(左结合)“ & ”按位与运算符。9级(左结合)“ ”按位异或运算符。10级(左结合)“ | ”按位或运算符。11级(左结合)“&”逻辑与运算符。12级(左结合)“ | ”逻辑或运算符。13级(右结合)? :条件运算符。14级(右结合)=、 +=、 -=、 *=、 /=、 %=、 &=、 =、 |=、 =赋值运算符。15级(左结合)“,”逗号运算符。C 语言中,逗号(,)也可以是运算符,称为逗号运算符(Comma Operator)。逗号运算符可以把两个以上(包含两个)的表达式连接成一个表达式,称为逗号表达式。其一般形式为:子表达式1, 子表达式2, ., 子表达式n例如:a + b, c = b, c+逗号运算符的优先级是所有运算符中级别最低的,通常配合 for 循环使用。逗号表达式最右边的子表达式的值即为逗号表达式的值。上例中,c+ 的值(c 自增之前的值)即为该表达式的值。逗号运算符保证左边的子表达式运算结束后才进行右边的子表达式的运算。也就是说,逗号运算符是一个序列点,其左边所有副作用都结束后,才对其右边的子表达式进行运算。因此,上例中,c 得到 b 的值后,才进行自增运算。2优先级优先级:C语言中,运算符的运算优先级共分为15 级。1 级最高,15 级最低。 在表达式中,优先级较高的先于优先级较低的进行运算。而在一个运算量两侧的运算符 优先级相同时,则按运算符的结合性所规定的结合方向处理。结合性:C语言中各运算符的结合性分为两种,即左结合性(自左至右)和右结合性(自右至左)。例如算术运算符的结合性是自左至右,即先左后右。如有表达式x-y+z 则y 应先与“-”号结合,执行x-y 运算,然后再执行+z 的运算。这种自左至右的结合 方向就称为“左结合性”。而自右至左的结合方向称为“右结合性”。最典型的右结合 性运算符是赋值运算符。如x=y=z,由于“=”的右结合性,应先执行y=z 再执行x=(y=z)运算。C语言运算符中有不少为右结合性,应注意区别,以避免理解错误。优先级从上到下依次递减,最上面具有最高的优先级,逗号操作符具有最低的优先级。所有的优先级中,只有三个优先级是从右至左结合的,它们是单目运算符、条件运算符、赋值运算符。其它的都是从左至右结合。具有最高优先级的其实并不算是真正的运算符,它们算是一类特殊的操作。()是与函数相关,与数组相关,而及.是取结构成员。其次是单目运算符,所有的单目运算符具有相同的优先级,因此在我认为的 真正的运算符中它们具有最高的优先级,又由于它们都是从右至左结合的,因此*p+与*(p+)等效是毫无疑问的。另外在C语言里,没有前置后置之分,因为+ - 是右结合所以右侧优先运算,表现为 操作数后置优先级比较高 的假象,前置和后置的区分是因为运算符重载而后加入C+的接下来是算术运算符,*、/、%的优先级当然比+、高了。移位运算符紧随其后。其次的关系运算符中, =要比 = !=高一个级别,不大好理解。所有的逻辑操作符都具有不同的优先级(单目运算符除外,!和)逻辑位操作符的与比或高,而异或则在它们之间。跟在其后的&比|高。接下来的是条件运算符,赋值运算符及逗号运算符。在C语言中,只有4个运算符规定了运算方向,它们是&、| |、条件运算符及赋值运算符。&、| |都是先计算左边表达式的值,当左边表达式的值能确定整个表达式的值时,就不再计算右边表达式的值。如 a = 0 & b; &运算符的左边位0,则右边表达式b就不再判断。在条件运算符中。如a?b:c;先判断a的值,再根据a的值对b或c之中的一个进行求值。赋值表达式则规定先对右边的表达式求值,因此使 a = b = c = 6;成为可能。口诀注释优先级等级口诀圆方括号、箭头一句号, 自增自减非反负、针强地址长度,乘除,加减,再移位,小等大等、等等不等,八位与,七位异,六位或,五与,四或,三疑,二赋,一真逗。其中“,”号为一个等级分段。优先级等级注释“圆方括号、箭头一句号”指的是第15级的运算符。其中圆方括号很明显“()、”,箭头 指的是指向结构体成员运算符“-”,句号 指的是结构体成员运算符“.” ;“自增自减非反负、针强地址长度”指的是第14级的运算符。其中 非 指的是逻辑运算符“!”,反 指的是按位取反运算符“”,负 指的是负号运算符“”,针 指的是指针运算符“*”,强 指的是强制类型转换运算符,地址 指的是地址运算符“&”,长度 指的是长度运算符“sizeof ”;“乘除,加减,再移位”移位指的是左移运算符“”,其中除法还包括了 取余运算符“%”;“小等大等、等等不等” 指的是第10级到第9级的运算符:、和=,等等指的是等于运算符=,不等指的是不等于运算符!=“八位与,七位异,六位或”其中 八位与 指的是第8级的 按位与 运算符“&”,七位异 指的是第7级的按位异或运算符“”,六位或 指的是第6级的按位或运算符“|”;“五与,四或”指的是第5级、第4级的逻辑与运算符“&”和逻辑或运算符“|”;“三疑,二赋,一真逗”指的是第3级到第1级的运算符。其中,三疑指的是条件运算符“?:” (三有双重含义:即指优先级别是三,它的运算符类型也是三目,疑也取“?”之意),二赋 指的是赋值运算符=、+=、-=、*=、/=、%=、=、0).如果a0,则执行if语句中的内容,否则退出。6、条件运算符:a=(b0)?b:-b;当b0时,a=b;当b不大于0时,a=-b;其实上面的意思就是把b的绝对值赋值给a。7、逗号运算符:b=2,c=7,d=5;a=(+b,c-,d+3);有三个表达式,用逗号分开,所以最终的值应该是最后一个表达式的值,也就是d+3=8,所以a=8。8、位逻辑运算符包括:1。&位与符 2。|位或符 3。位异或符 4。位取反符以操作数12为例。位运算符将数字12视为1100。位运算符将操作数视为位而不是数值。数值可以是任意进制的:十进制、八进制或十六进制。位运算符则将操作数转化为二进制,并相应地返回1或0。位运算符将数字视为二进制值,并按位进行相应运算,运算完成后再重新转换为数字。例如:表达式10&15表示(1010 & 1111),它将返回表示1010的值10。因为真真得真,或者是11得1,同位全是1结果也是1表达式10|15表示(1010 | 1111),它将返回表示1111的值15。假假得假。全零得零。表达式1015表示(1010 1111), 它将返回表示0101的值5。此时是同性相斥,相同的就为假。表达式10表示(1010),它将返回表示0101的值 -11。此号好理解,按位取反。2014.09.10函数和变量的命名规则C 语言变量和函数命名规范: 关于C语言变量和函数命名规范 据考察,没有一种命名规则可以让所有的程序员赞同,程序设计教科书一般都不指定命名规则。命名规则对软件产品而言并不是“成败悠关”的事,而应当制定一种令大多数项目成员满意的命名规则,并在项目中贯彻实施。1 共性规则本节论述的共性规则是被大多数程序员采纳的,我们应当在遵循这些共性规则的前提下,再扩充特定的规则,如3.2节。【规则1-1】标识符应当直观且可以拼读,可望文知意,不必进行“解码”。标识符最好采用英文单词或其组合,便于记忆和阅读。切忌使用汉语拼音来命名。程序中的英文单词一般不会太复杂,用词应当准确。例如不要把CurrentValue写成NowValue。【规则1-2】标识符的长度应当符合“min-length & max-information”原则。几十年前老ANSI C规定名字不准超过6个字符,现今的C+/C不再有此限制。一般来说,长名字能更好地表达含义,所以函数名、变量名、类名长达十几个字符不足为怪。那么 名字是否越长约好?不见得! 例如变量名maxval就比maxValueUntilOverflow好用。单字符的名字也是有用的,常见的如i,j,k,m,n,x,y,z等,它们 通常可用作函数内的局部变量。【规则1-3】命名规则尽量与所采用的操作系统或开发工具的风格保持一致。例如Windows应用程序的标识符通常采用“大小写”混排的方式,如AddChild。而Unix应用程序的标识符通常采用“小写加下划线”的方式,如add_child。别把这两类风格混在一起用。【规则1-4】程序中不要出现仅靠大小写区分的相似的标识符。例如:intx,X;/ 变量x 与 X 容易混淆void foo(int x);/ 函数foo 与FOO容易混淆void FOO(float x);【规则1-5】程序中不要出现标识符完全相同的局部变量和全局变量,尽管两者的作用域不同而不会发生语法错误,但会使人误解。【规则1-6】变量的名字应当使用“名词”或者“形容词名词”。例如:floatvalue;floatoldValue;floatnewValue;【规则1-7】全局函数的名字应当使用“动词”或者“动词名词”(动宾词组)。类的成员函数应当只使用“动词”,被省略掉的名词就是对象本身。例如:DrawBox(); / 全局函数box-Draw(); / 类的成员函数【规则1-8】用正确的反义词组命名具有互斥意义的变量或相反动作的函数等。例如: int minValue; int maxValue; int SetValue(); int GetValue();【建议1-1】尽量避免名字中出现数字编号,如Value1,Value2等,除非逻辑上的确需要编号。这是为了防止程序员偷懒,不肯为命名动脑筋而导致产生无意义的名字(因为用数字编号最省事)。2 简单的Windows应用程序命名规则作者对“匈牙利”命名规则做了合理的简化,下述的命名规则简单易用,比较适合于Windows应用软件的开发。【规则2-1】类名和函数名用大写字母开头的单词组合而成。例如: class Node; / 类名 class LeafNode;/ 类名 voidDraw(void);/ 函数名 voidSetValue(int value);/ 函数名C语言变量和函数命名规范(2):【规则2-2】变量和参数用小写字母开头的单词组合而成。例如:BOOflag; intdrawMode;【规则2-3】常量全用大写的字母,用下划线分割单词。例如:const int MAX = 100;const int MAX_LENGTH = 100;【规则2-4】静态变量加前缀s_(表示static)。例如:void Init()static int s_initValue; / 静态变量【规则2-5】如果不得已需要全局变量,则使全局变量加前缀g_(表示global)。例如:int g_howManyPeople; / 全局变量int g_howMuchMoney; / 全局变量【规则2-6】类的数据成员加前缀m_(表示member),这样可以避免数据成员与成员函数的参数同名。例如:void Object:SetValue(int width, int height)m_width = width;m_height = height;【规则2-7】为了防止某一软件库中的一些标识符和其它软件库中的冲突,可以为各种标识符加上能反映软件性质的前缀。例如三维图形标准OpenGL的所有库函数均以gl开头,所有常量(或宏定义)均以GL开头。c语言模块化程序设计思想模块划分模块划分的划是规划的意思,意指怎样合理的将一个很大的软件划分为一系列功能独立的部分合作完成系统的需求。C 语言作为一种结构化的程序设计语言,在模块的划分上主要依据功能(依功能进行划分在面向对象设计中成为一个错误,牛顿定律遇到了相对论),C 语言模块化程序设计需理解如下概念:(1) 模块即是一个.c 文件和一个.h 文件的结合,头文件(.h)中是对于该模块接口的声明;(2) 某模块提供给其它模块调用的外部函数及数据需在.h 中文件中冠以extern 关键字声明;(3) 模块内的函数和全局变量需在.c 文件开头冠以static 关键字声明;(4) 永远不要在.h 文件中定义变量!定义变量和声明变量的区别在于定义会产生内存分配的操作,是汇编阶段的概念;而声明则只是告诉包含该声明的模块在连接阶段从其它模块寻找外部函数和变量。如:/*module1.h*/int a = 5; /* 在模块1 的.h 文件中定义int a */*module1 .c*/#include module1.h /* 在模块1 中包含模块1 的.h 文件 */25/*module2 .c*/#include module1.h /* 在模块2 中包含模块1 的.h 文件 */*module3 .c*/#include module1.h /* 在模块3 中包含模块1 的.h 文件 */以上程序的结果是在模块1、2、3 中都定义了整型变量a,a 在不同的模块中对应不同的地址单元,这个世界上从来不需要这样的程序。正确的做法是:/*module1.h*/extern int a; /* 在模块1 的.h 文件中声明int a */*module1 .c*/#include module1.h /* 在模块1 中包含模块1 的.h 文件 */int a = 5; /* 在模块1 的.c 文件中定义int a */*module2 .c*/#include module1.h /* 在模块2 中包含模块1 的.h 文件 */*module3 .c*/#include module1.h /* 在模块3 中包含模块1 的.h 文件 */这样如果模块1、2、3 操作a 的话,对应的是同一片内存单元。模块化的好处是很多的,不仅仅是便于分工,它还有助于程序的调试,有利于程序结构的划分,还能增加程序的可读性和可移植性。进制转换以下是各种进制的转换方法:两个进制(其中之一为10进制)之间的互转(手工计算方法) 以2,10进制互转为例,其他请举一反三: 二进制数1101转十进制: 12的三次幂12的二次幂02的一次幂12的零次幂840113 附加一个八进制转十进制的例子吧: 507(八进制转10进制): 58的2次幂08的1次幂78的0次幂 5640871327(10进制) 以上是小进制向大进制的转换,从2-10和8-10,下面说说大进制向小进制的转换。(方法是相除去余) 10进制327转八进制: 327/8 40 余数为7 40/8 5 余数为0 于是八进制数为507(第一位5是最后的商) 10进制13转2进制: 13/2 6 余数为1 6/2 3 余数为0 3/2 1 余数为1 所以对应的二进制数为1101(第一位1是最后的商) 再测试一下,把307(10进制)转换为16进制: 307/16 19 余数为3 19/16 1 余数为3 对应的16进制数应该是:133 再把133转回10进制: 116的2次幂316的1次幂316的零次幂 256483307这是程序:include #define BASE 8 /*要转换成几进制数/* #define DIGIT 100 /*转换数的位数/* int main(void) int i,input; int xDIGIT; printf(Please enter(Enter q to quit) while(scanf(%d,&input)=1) for (i=0;input!=0;input/=BASE) xi%=input; for (;i0;i-) printf(%d,xi); return 0; 要转换成16进制只要改下BASE的值就有了单片机部分编写程序应掌握的知识1、 明确设备的功能和作用2、 找到与设备相关的概念与术语,以及所有的技术参数3、 明确设备的使用方法、4、 要完全掌握与设备相关的寄存器组的使用方法5、 会绘制控制流程图6、 会写程序如何点亮一个LED小灯单片机C语言SFR声明单片机的传感器有液位传感器,光照传感器,温度传感器,湿度传感器,压力传感器,速传感器,红外传感器等。 摘要:文章主要论述了单片机技术在传感器设计中的应用以及对其发展的影响。重点指出传感器本身的稳定性应该放在研究工作的首位,单片机技术和传感器相结合,改善了传感器本身抗干扰能力和促进了传感器本身的智能化与标准化等。 关键词:单片机技术;传感器;稳定性 从传感器的设计出发,要尽可能提高传感器本身的性能,严格控制其生产的各个环节,以实现小型化、高性能、标准化输出的目标。但是,随着计算机和微电子技术的高速发展,尤其是单片机的系列化发展,其强大的运算能力,微小的体积以及低廉的价格,对传感器的传统研究方式带来了重大的变革。下面就传感器研究中的一些体会,谈些初步的看法。 1 单片机对提高传感器稳定性的作用 稳定性是指传感器在长时间工作下输出量发生的变化,它作为传感器的一项重要的技术指标,目前在多方面已得到了越来越多的重视。而在智能传感器的研究制造中,由于传感器的其他一些性能指标,如灵敏度、分辨力、抗干扰能力等均可通过低程序加以修正,因此很多人把传感器的长期稳定性放在了工作的首位。 为了提高传感器的稳定性,避免在长时间的工作下产生非线性的误差,我们可利用单片机技术来修正非线性误差从而提高传感器的稳定性。 以我们常见的智能压力传感器为例,提出一种可提高其稳定性的方法见图1。 传感器接收外界的压力信号x并产生一个输出信号y,再由接口电路和AD模数转换器对其进行处理后,输出可由单片机接收的数字信号Y,最后由单片机对其处理后,即可得到经过修正的标准输出Yc。一般在标定传感器的过程中,输入校准温度和压力点,然后测出xy的数据,最后用二元函数插值法来修正传感器的非线性误差。 修正过程:首先,在单片机中存储关于x、Y、三者关系的公式,其中X为x的数字量。这些公式可以在单片机存储器的数据区内以表格形式存放,也可在底程序中用常数形式来体现。单片机接收经接口电路输出的未修正的数字量Y和环境温度的数字量,然后计算出相对应的被测数字量X,再与比例系数k相乘后,则可得到标准输出Yc=kX。 2单片机对减少传感器干扰方面的作用 传感器在实际工作中,常常会遇到外来干扰,有些为确定性的,有些为随机性的,这也是在传感器研究中常见问题之一。 2.1确定性的干扰 在实际工作中,传感器常常会产生一个确定性的干扰,这是由于传感器的自身结构特点或者外界环境的影响决定的,而这种干扰通常可由单片机来解决。 例如电涡流位移传感器在实际的工作中,由于被测物体材料的均匀性和导磁性的不同,会给测量结果带来一定的影响。轴承中轴的位置,需要进行精确的测量,但是由于轴表面不均匀的材质。会使测量变得困难。轴在转动过程中,虽然其位置保持不变,但传感器仍会有电压的输出,这样得到的测量结果会有很大的误差。由于轴在每次转动中产生的位移保持不变,所以这种干扰也可以说是确定性的。通过引用单片机技术,传感器在实际测量中,每当轴转动一周后,就对传感器的输出特性曲线进行定量修正,这样就能基本解决由于被测物体材质的不均匀性给测量结果带来的确定性干扰。2.2随机干扰 传感器的工作环境往往是比较恶劣和复杂的,其应用的可靠性、安全性就成为一个非常突出的问题。所以,需要在工作中尽量减少干扰。提高输出信号信噪比的问题,是传感器研究中的最大难题之一。 但是实际上在传感器的使用中,单片机可利用软件来部分消除随机干扰,下面介绍一些在软件抗干扰用到的方法。 2.2.1指令冗余法 单片机受到干扰后,往往会把操作数当作指令码来执行,引起整个程序的混乱和程序弹飞。如果程序弹飞到某一条单字节指令上时,就不会发生将操作数当成指令的错误,而能自动纳入正轨。当弹飞到双字节或三字节指令的操作时,程序将继续弹飞。因此,在程序中插人几个单字节的空操作指令NOP,就可以保护其后面的指令不被拆散而被完整地执行。 2.2.2软件陷阱法 系统中未使用的单元用跳转引导指令填满,作为软件“陷阱”,以捕获“飞掉”的程序,并强行将捕获的程序引向一个特定的地址,由一段专站处理错误的程序进行处理,以恢复系统的正常运行。 2.2.3软件“看门狗,(WATCH DOG)法” WATCH DOG即定时监视器,俗称“看门狗”,当侵人的电磁干扰使系统程序弹飞,或进入死循环,或死机时,WATCHDOG能够帮助系统自动恢复正常运行。 3在传感器发展方面的应用 目前。成熟的传感器品种规格繁多,长期以来。由于传感器的输入输出信号符不相同,其原理和电路也差别较大,使得传感器的标准化工作进度较慢。给传感器的用户带来了很多的麻烦。同时,也不利于传感器及测试仪器的发展和在更广阔领域的应用。但是,随着单片机成本逐渐的降低,运算能力的提高以及体积的减小,会给传感器机及测试仪器的发展带来积极的影响。目前,中国也已开展了传感器的标准化工作,这也成为了目前传感器研究的一个重要方向。 标准化电路的传感器应具有的功能如下:应对传感器信号进行放大及标准化的输出;应具有温度补偿技术;应具有线性校正技术;应具有信号存储功能;应具有简单的信号处理功能;能连接在高一级的控制单元上,应具有良好的互换性。 传感器的标准化工作在今后也会更好地推进智能仪表的规范化,使其可以根据不同的测试对象及功能,设计为模块化的结构,并根据需要进行组合,这样将会大大地提高测试仪器的可靠性并且降低其成本单片机的串并行接口MCS51串行通信接口技术微机联网: 单片机与单片机;单片机与其他微机之间实现信息共享;典型的计算机测量与控制系统构成:一个典型集散式(DCS)控制系统的构成10.1 串行通信基础数据通信方式:并行通信与串行通信并行通信:一次传输8(16、32Bit)8根数据线,1根控制线,1根状态线,地线,共11根; 特点:速度快,适合近距离传输 计算机并口,打印机,8255 串行通信: 数据一位一位地发送 ,一根发送线,一根接受线,地线,共3根特点:硬件方便,适合距离远,速度要求不高的场合分类:同步串行通信和异步串行通信一、 异步通信:串行通信就是将并行的数据分开后,一位一位地发送出去,接收方也是一位一位地接收数据,这就需要通信的双方有一个协议,什么时候开始发送,什么时候发送完毕;接收方收到的信息是否正确等,而这些信息只能以电平的高低来表示,构成这些位的数据称为一帧。异步串行通信规定了传输数据的结构即帧格式:起始位 数据位 奇偶校验位 停止位 1 起始位:在数据发送线上规定无数据时电平为1,当要发送数据时,首先发送一个低电平0,表示数据传送的开始,这就是起始位。2 数据位:真正要传送的数据,可以是8位、10位等多位,数据位是由地位开始,高位结束;3 奇偶校验:数据发送完后,发送奇偶校验位,以检验数据传送的正确性,这中方法是有限的,但是容易实现。4 停止位:表示数据传送的结束,可以是一位或两位。帧格式: 二、 同步通信同步通信先发送一个字符,作为同步字符,之后便连续发送数据,数据之间不能有间隔,直到数据发送完毕。速度要比异步通信快通用异步接受/发送器(UNIVERSAL ASYNCHRONOUS RECEIVER/TRANSMITTER):UART:8250 6850 三、 单工、半双工、全双工通信方式按通信进行的过程,分为:单工、半双工、全双工通信方式1 单工方式一端是发送端,另外一端是接收端:接收器发送器2 半双工发式每端口由一个发送器和接收器,通过开关连接在线路上,数据可以双方交换,但不能同时发送和接收.接收器发送器发送器接收器 3. 全双工方式发送器接收器接收器发送器 通信双方用两个独立的收发器单独连接,可以同时发送和接收数据,因而提高了速度。4 波特率单位时间内传送的信息量。以每秒传送的位为单位:电传机:10字符/秒,1个字符11位, 波特率位:1011=110(波特)位宽:传送过程中平均每位占用时间 Td = 9.1ms(1/110)10.2串行通信总线标准及接口在测控系统中,计算机通信主要采用异步串行通信方式,常用的异步串行通信接口标准有三种:RS-232(RS-232A RS-232B RS-232C)RS-449 (RS422 RS423 RS485)20mA电流环一、 通信方式的选取1 通信速率和通信距离 这两个方面是相互制约的,降低通信速率,可以提高通信距离 RS-232C:速率:20Kbit/S,最大通信距离:15m RS422: 10Mbit/s, :300m 90Kbit/s, :1200m2 抗干扰能力 采用标准的通信接口,本身具有一定的抗干扰能力,但是工业现场的情况往往很恶劣,因而要根据具体情况进行选择。 RS232C:一般场合 RS422: 共模信号比较强 光纤: 电磁干扰较强二、 RS232C简介美国电子工业协会(EIA)公布的一种异步通信标准:RS232C标准:设备之间通信的距离不大于15米最大传输速率20KB/S采用负逻辑:“1” 5V 15V “0” +5V + 15V不带负载时输出电平:25V +25V输出短路电流: 0.5A最大负载电容: 2500pF TTL电平可以由专用集成电路转换成RS232C标准; 如: MC1488 或 75188 TTL RS232CMC1489 或 75189 RS232C TTL +12V +5VMC1489 MC1488 TTL TTL 12V 由于MC1488需要采用12V电源,一般在单片机通信中大量使用的是只需要+5V电源、具有发送和接收的一体化芯片,如:MAX232、ICL232、ADM202等。 MAX232芯片及接口内部有两路接收器和发送器具有电源变换电路 C5 VCC C3 C1+ V+ +5V 至 +10V (倍压器) C1- C2+ V- +10V 至 10V (电压反向器) C2- +10V C1 10V C2 C4 T1 T1int 11 14 T1out T1 T2int 10 7 T2out R1 R1out 12 13 R1in R2 R2out 9 8 R2int MAX232原理图 电源变换电路:C1,C2,C3,C4,V+,V;MCS51 RXDTXDGNDMAX232MCS51 TXD RXD GNDMAX232 T1in T1out R1out R1in MCS51双机通信(利用MAX232)三、 调制与解调RS232C通信距离很短,RS422通信距离不过1200米;更长距离需采用调制与解调。10.3 MCS-51的串行口的结构8051有一个可编程的全双工串行通信接口,它可作UART用,也可作同步移位寄存器,其帧格式可有8位、10位或ll位,并能设置各种波特率,给使用者带来很大的灵活性。一、结 构805l通过引脚RXD(P30,串行数据接收端)和引脚TXD(P3.l,串行数据发送端)与外界进行通信。其内部结构简化示意图如图所示。串行口内部结构示意图图中有两个物理上独立的接收、发送缓冲器SBUF,它们占用同一地址99H,可同时发送、接收数据。发送缓冲器只能写入,不能读出,接收缓冲器只能读出、不能写入。 串行发送与接收的速率与移位时钟同步。8051用定时器T1作为串行通信的波特率发生器,T1溢出率经2分频(或不分频)又经16分频作为串行发送或接收的移位脉冲。移位脉冲的速率即是波特率。 从图中可看出,接收器是双缓冲结构,在前个字节被从接收缓冲器SBUF读出之前,第二个字节即开始被接收(串行输入至移位寄存器),但是,在第二个字节接收完毕而前个字节CPU未读取时会丢失前一个字节。 串行口的发送和接收都是以特殊功能寄存器SBUF的名义进行读或写的,当向SBUF发“写”命令时(执行MOV SBUF,A指令),即是向发送缓冲器SBUF装载并开始由TXD引脚向外发送一帧数据,发送完便使发送中断标志位TI1。 在满足串行口接收中断标志位RISCON00的条件下,置允许接收位REN(SCON4)1就会启动接收一帧数据进入输入移位寄存器,并装载到接收SBUF中,同时使RIl。当发读SBUF命令时(执行MOV A,SBUF指令),即是由接收缓冲器(SBUF)取出信息通过8051内部总线送CPU。对于发送缓冲器,因为发送时CPU是主动的,不会发生重迭错误,所以不需要用双缓冲结构来保持最大传送速率。二、串行口控制字及控制寄存器8051串行口是一个可编程接口,对它的编程只用两个控制字分别写入特殊功能寄存器:串行口控制寄存器SCON(98H)和电源控制寄存器PCON(97H)个即可。 1SCON(98H)8051串行通信的方式选择、接收和发送控制以及串行口的状态标志等均由特殊功能寄存器SCON控制和指示。其控制字格式如图所示:SCOND7 D6 D5 D4 D3 D2 D1 D0 98HSM0SM1SM2RENTB8RB8TIRI (1) SM0和SMl 串行口工作方式选择位。两个选择位对应4种
展开阅读全文