您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 1发光二极管、数据类型、运算符与表达式
二、流水灯程序贾函龙通过流水灯程序实例,让大家了解单片机编程控制基础知识什么是发光二极管?•LED发光二极管是一只有2个引脚的可发光器件。•当正极接高电平,负极接低电平,此时就会有电流流过发光二极管,它就会发出光。*实际使用时,还需要加限流电阻。这里只为初学者介绍原理,不详细说明。5V0V悬空0V无电流流过时有电流流过时什么是流水灯程序?•之前我们学习过,单片机其中32个引脚(I/O口)可以通过程序,对相应的引脚写1或者写0,控制其高、低电压信号(5V或者0V)的变化。•根据右侧原理图,通过程序控制P0口的引脚依次拉低至低电平,即可出现流水灯现象。•请看演示程序如何写入单片机(仿真器)•首先需要在KEIL开发软件中编写程序。•程序编写好之后,可以通过KEIL开发软件,直接将程序下载至仿真器,然后运行。实际上机输入程序•#includereg52.h•#includedelay.h•main()•{•chara;•a=0xfe;•P0=a;•do{•delay_ms(800);•a=1;•a|=1;•if(a==(char)0xff)a=0XFE;•P0=a;•}while(1);•}*将根据实际情况调整进度代码简单介绍•#includereg52.h•#includedelay.h•main()•{•chara;•a=0xfe;•P0=a;•do{•delay_ms(800);•a=1;•a|=1;•if(a==(char)0xff)a=0XFE;•P0=a;•}while(1);•}头文件,定义了不同型号单片机内部的特殊功能寄存器等主函数,程序开始执行的地方定义变量区,存放流水灯需要的数据do-while循环,程序在此反复执行在程序执行过程中,数值可以发生改变的量称为变量。变量名与存储单元地址相对应,变量值与存储单元的内容相对应。例如二.C51的数据结构1.C51的变量-变量•其值可以改变的量称为变量。一个变量应该有一个名字,在内存RAM中占据一定的存储单元。变量定义必须放在变量使用之前。一般放在函数体的开头部分。•要区分变量名和变量值是两个不同的概念。【存储种类】数据类型【存储类型】变量名存储地址(标准C)作用范围(标准C)*方括号项——可以缺省C51变量定义的四个要素:存储空间(C51特有)数据格式(C51扩充)数据的不同格式叫做数据类型,数据类型不同,取值范围也不同。标准C语言的数据类型【存储种类】数据类型【存储类型】变量名变量名可以由字母、数字和下划线三种字符组成,且第一个字符必须为字母或下划线,变量名长度随编译系统而定。变量名具有字母大小写的敏感性,如SUM和sum代表不同的变量。强调:头文件中定义的变量都是大写的【存储种类】数据类型【存储类型】变量名标识符•在C语言中,有许多符号的命名,如变量名、函数名、数组名等,都必须遵守一定的规则,按此规则命名的符号称为标识符。合法标识符的命名规则是:标识符可以由字母、数字和下划线组成,并且第一个字符必须为字母或下划线。在C语言程序中,凡是要求标识符的地方都必须按此规则命名。以下都是合法的标识符:•area、PI、_ini、a_array、a1234、P101p•以下都是非法的标识符:•456P、cade-y、w.w、a&b2.2.3-变量的定义•C语言中变量必须先定义,后使用,而且必须定义在第一条执行的语句之前。main(){变量定义部分;语句执行部分;}实际上,每一个{}的开始部分都属于变量定义部分,其后为程序执行部分。变量赋初值•在程序中常常需要对变量赋初值,以便使用变量。语言程序中可有多种方法为变量提供初值。•在变量定义中赋初值的一般例如:main(){inta=3;intb,c=5;floatx=3.2,y=3,z=0.75;charch1='K',ch2='P';}应注意,在定义中不允许连续赋值,如a=b=c=5是不合法的。赋值语句•在赋值表达式(“=”)的尾部加上一个“;”号,就构成了赋值语句,也称表达式语句。•例如a=b+c是赋值表达式,a=b+c;则是赋值语句。•赋值语句是一种可执行语句,应当出现在函数的可执行部分。不同于变量赋初值部分。•例如:main(){chara;a=5;//错误部分intb;}•在程序编译时将提示错误不同进制的表示方法在C语言中,有十六进制和十进制二种进制被经常使用。•1.十进制整常数:十进制整常数没有前缀。其数码为0~9。•2.十六进制整常数:十六进制整常数的前缀为0X或0x。其数码取值为0~9,A~F或a~f。以下各数是合法的十六进制整常数:0X2A(十进制为42)、0XA0(十进制为160)、0XFFFF(十进制为65535);C运算符简介C语言的常用运算符可分为以下几类:•算术运算符:用于各类数值运算。包括加(+)、减(-)、乘(*)、除(/)、求余(或称模运算,%)、自增(++)、自减(--)共七种。•关系运算符:用于比较运算。包括大于()、小于()、等于(==)、大于等于(=)、小于等于(=)和不等于(!=)六种。•逻辑运算符:用于逻辑运算。包括与(&&)、或(||)、非(!)三种。•位操作运算符:参与运算的量,按二进制位进行运算。包括位与(&)、位或(|)、位非(~)、位异或(^)、左移()、右移()六种。•赋值运算符:用于赋值运算,分为简单赋值(=)、复合算术赋值(+=,-=,*=,/=,%=)和复合位运算赋值(&=,|=,^=,=,=)三类共十一种。C运算符简介•求余运算符(模运算符)“%”:双目运算。要求参与运算的量均为整型。求余运算的结果等于两数相除后的余数。【例】main(){ints,x,z;s=11%3;//11/3=3……2所以s=100除以3所得//的余数2x=20%5;//20/5=4……0z=4%7;//4/7=0……4}C运算符简介•自增、自减运算符•自增1,自减1运算符:自增1运算符记为“++”,其功能是使变量的值自增1。•自减1运算符记为“--”,其功能是使变量值自减1。•自增1,自减1运算符均为单目运算。可有以下几种形式:++ii自增1后再参与其它运算。--ii自减1后再参与其它运算。i++i参与运算后,i的值再自增1。i--i参与运算后,i的值再自减1。C运算符简介•【例】main(){inti=5,j=5,p,q;p=(i++)+(i++)+(i++);q=(++j)+(++j)+(++j);}这个程序中,对P=(i++)+(i++)+(i++)应理解为p=5+6+7,故P值为18。i的最后值为8。而对于q的值则为21,因为q=6+7+8,j的最后值仍为8。复合的赋值运算符例如:a+=5等价于a=a+5x*=y+7等价于x=x*(y+7)r%=p等价于r=r%p数据的移位•左移变量1变量2将变量1的二进制位值向左移动由变量2所指定的位数。高位溢出,低位补0•右移变量1变量2将变量1的二进制位值向右移动由变量2所指定的位数。低位溢出,高位补0数据的移位•例如:0XA3•main()•{•charA=0XA3;•A=A1;•A=A3;•}10100011101000110101000110000D7D6D5D4D3D2D1D0单片机中存储的8位数据位操作运算•除了左移右移外,C51提供了如下位操作运算符:•&按位与;•|按位或;•^按位异或;•~接位取反;••除了按位取反运算符~以外,以上位操作运算符都是两目运算符,即要求运算符两侧各有一个运算对象。•注意:位运算符只能是整型或字符型数。不能为实型数据。按位取反运算符~•~是一个单目运算符,用来对一个二进制数按位进行取反,即0变1,1变0。•例若a=F0H=11110000B•则表达式:a=~a值为0F•即a:11110000•~00001111(0FH)•按位与运算符&•运算规则:参加运算的两个运算对象,若两者相应的位都为1,则该位结果值为1,否则为0。•即•0&0=0•0&1=0•1&0=0•1&1=1•例若a=54H=01010100B•b=3BH=00111011B•则表达式:c=a&b的值为10H•即a:01010100•b:&00111011•c:=00010000(10H)•特点:按位与可以将指定位清0。按位或运算符|运算规则:参加运算的两个运算对象,若两者相应的位中,只要有一个为1,则该侠结果为1。即0|0=00|1=11|0=11|1=1例若a=30H=00110000Bb=0FH=00001111B则表达式:c=a|b的值为3FH即a:00110000b:|0000111100111111(3FH)特点:按位或可以将指定位置1。异或运算符^运算规则:参加运算的两个运算对象,若两者相应的位值相同,则结果为0;若两者相应的位相异,则结果为1。即0^0=00^1=11^0=11^1=1例a=A5H=10100101b=37H=00110111则表达式:c=a^b的值为92H即a:10100101^b:0011011110010010(92H)特点:按位异或可以将指定位取反。各类数值型数据之间的混合运算•若参与运算量的类型不同,则先转换成同一类型,然后进行运算。•转换按数据长度增加的方向进行,以保证精度不降低。如int型和long型运算时,先把int量转成long型后再进行运算。•所有的浮点运算都是以双精度进行的,即使仅含float单精度量运算的表达式,也要先转换成double型,再作运算。•char型和int型参与运算时,必须先转换成int型。•在赋值运算中,赋值号两边量的数据类型不同时,赋值号右边量的类型将转换为左边量的类型。如果右边量的数据类型长度左边长时,将丢失一部分数据,这样会降低精度。各类数值型数据之间的混合运算【例】main(){floatPI=3.14159;ints,r=5;s=r*r*PI;}本例程序中,PI为实型;s,r为整型。在执行s=r*r*PI语句时,r和PI都转换成double型计算,结果也为double型。但由于s为整型,故赋值结果仍为整型,舍去了小数部分。强制类型转换•强制类型转换是通过类型转换运算来实现的。•其一般形式为:(类型说明符)(表达式)•其功能是把表达式的运算结果强制转换成类型说明符所表示的类型。例如:(float)a把a转换为实型(int)(x+y)把x+y的结果转换为整型•在使用强制转换时应注意以下问题:1、类型说明符和表达式都必须加括号(单个变量可以不加括号),如把(int)(x+y)写成(int)x+y则成了把x转换成int型之后再与y相加了。2、无论是强制转换或是自动转换,都只是为了本次运算的需要而对变量的数据长度进行的临时性转换,而不改变数据说明时对该变量定义的类型。【例】main(){floatf=5.75,f2;intn=6,n2;f2=(float)n;n2=(int)f;}运算符的优先级和运算顺序C语言中的优先级从高到低分为15级。运算符的一般顺序:–先运算优先级别高的,再运算优先级别低的。–对于优先级别相同的运算符,按其结合方向执行。运算符的优先级和结合方向优先级运算符对象结合方向1()、[]、-、。→2!、~、++、-、(类型)、*、&、sizeof1←右3*、/、%2→4+、-2→5、2→6、=、、=2→7==、!=2→8&(按位与)2→9^(按位异或)2→10|(按位或)2→11&&(逻辑与)2→12||(逻辑或)2→13?:3←右14=+=-=/=%=等赋值运算符2←右15,(逗号)不定→
本文标题:1发光二极管、数据类型、运算符与表达式
链接地址:https://www.777doc.com/doc-3249327 .html