单片机素材课件

上传人:txadgkn****dgknqu... 文档编号:242814610 上传时间:2024-09-04 格式:PPT 页数:125 大小:2.41MB
返回 下载 相关 举报
单片机素材课件_第1页
第1页 / 共125页
单片机素材课件_第2页
第2页 / 共125页
单片机素材课件_第3页
第3页 / 共125页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单片机素材课件,1,培训内容,第一部分:C语言基础,1、C51特点,2、C51开发环境安装与简介,3、C语言基本语法,4、编程风格,第二部分:常用接口模块编程,1、键盘接口,2、数码管显示,3、温度传感器18B20使用,4、LCD1602使用,5、时钟芯片1302使用与编程,培训内容第一部分:C语言基础,2,C51知识,C语言是一种编译型程序设计语言,它兼顾了多种高级语言的特点,并具备汇编语言的功能。目前,使用C语言进行程序设计已经成为软件开发的一个主流。用C语言开发系统可以大大缩短开发周期,明显增强程序的可读性,便于改进、扩充和移植。而针对8051的C语言日趋成熟,成为了专业化的实用高级语言。,C51知识C语言是一种编译型程序设计语言,它兼顾了多种高级语,3,C语言作为一种非常方便的语言而得到广泛的支持,很多硬件开发都用C语言编程,如:各种单片机、DSP、ARM等.,C语言程序本身不依赖于机器硬件系统,基本上不作修改就可将程序从不同的单片机中移植过来。,C提供了很多数学函数并支持浮点运算,开发效率高,故可缩短开发时间,增加程序可读性和可维护性。,C-51的特点,C语言作为一种非常方便的语言而得到广泛的支持,很多硬件开发都,4,C-51与ASM-51相比,有如下优点:,1.对单片机的指令系统不要求了解,仅要求对8051 的存贮器结构有初步了解;,2.寄存器分配、不同存贮器的寻址及数据类型等细节可由编译器管理;,3.程序有规范的结构,可分成不同的函数,这种方式可使程序结构化;,4.提供的库包含许多标准子程序,具有较强的数据处理能力;,5.由于具有方便的模块化编程技术,使已编好程序可容易地移植;,C-51与ASM-51相比,有如下优点:,5,汇编语言与C语言对比举例 (1),汇编语言与C语言对比举例 (1),6,1、在一个C语序中必须有一个void main()函数,此函数是整个程序的入口,函数体由括起。,2、C语言中的大小写是敏感的。,3、C程序是由语句构成,一个语句必须由“;”号结束。,4、#include命令的功能是把指定的文件插入该命令行位置取代该命令行,从而把指定的文件和当前的源程序文件连成一个源文件。:系统路径查找 “”:源文件路径查找,通常有:reg51.h reg52.h math.h stdio.h 常用有:reg51.h reg52.h(定义特殊功能寄存器和位寄存器),基本C程序结构,1、在一个C语序中必须有一个void main()函数,此函,7,C语言基础知识,下面我们开始学习C语言基本知识,C语言基础知识下面我们开始学习C语言基本知识,8,一、常量,常量是在程序运行过程中不能改变值的量,常量表示:,1 整型常量十进制表示如123,0,89等。十六进制表示则以0x开头如0x34,-0x3B等。,2 浮点型常量。十进制由数字和小数点组成,如0.888,3345.345,0.0等,,3 字符型常量是单引号内的字符,如a,d等,,4 字符串型常量由双引号内的字符组成,如test,OK等。,一、常量,9,二、变量,程序执行过程中其值能不断变化的量,放在RAM中。,例如你要对P1.1口输入的脉冲进行计数,就需要一个地方存这个数。,1、定义一个,普通变量,的格式如下:,数据类型变量名表,例如:unsigned int a,b,c;,变量名,只能以字母或下划线开头,由字符组成,不能与关键字重名。,常见的数据类型:,C语言基础知识,二、变量C语言基础知识,10,类型,符号,关键字,数的表示范围,所占位数,整型,字符型,实型,有,无,(signed) int,16,-3276832767,(signed) short,16,-3276832767,(signed) long,32,-21474836482147483647,16,unsigned int,065535,32,04294967295,unsigned long int,unsigned short int,16,065535,有,float,32,3.4e-383.4e38,有,double,64,1.7e-3081.7e308,有,char,8,-128127,无,unsigned char,8,0255,举例说明 2,类型符号关键字数的表示范围所占位数整型字符型实型有无(sig,11,C关键字(保留),C关键字(保留),12,单片机素材课件,13,2、定义一个特殊功能寄存器变量的格式如下:,sfr 特殊功能寄存器名= 特殊功能寄存器地址常数;,例如:sfr P0 = 0x80;,3、定义一个可位寻址对象变量的格式如下:,sbit 位变量名位地址,例如:sbit P0.0 = 0x80;,sbit P0.0 = P00;,举例说明作用,4、位变量定义,bit 位变量名,2、定义一个特殊功能寄存器变量的格式如下:,14,单片机素材课件,15,三、运算符,1、赋值运算符,赋值运算符就是赋值符号“=”,2、算术运算符, 加法运算符, 减法运算符,乘法运算符,除法运算符, 模运算或取余运算符,为自增运算符,为自减运算符。,三、运算符,16,3、复合赋值运算符,, , ,例如:,a+=b 等价于a=(a+b),x*=a+b 等价于x=(x*(a+b),4、位运算符,& 按位与相当于ANL指令,| 按位或 相当于ORL指令,按位异或相当于XRL指令, 按位取反相当于CPL指令, 右移相当于RR指令,3、复合赋值运算符,17,按位与 (&),运算规则,0 ,0 ,1 ,1 ,用途,按位清零,保留某些指定位,按位与 (&)运算规则,18,按位与举例,运算举例,1010,1101 (0xAD),& 0110,1001 (0x69),0010,1001 (0x29),按位清零、其他位不变,xxxx,xxxx,_,& 0110,0010 (0x62),0xx0,00x0,_,按位与举例运算举例,19,按位或 (|),运算规则,0 | 0 = 0;,0 | 1 = 1;,1 | 0 = 1;,1 | 1 = 1;,用法,按位置一,按位或 (|)运算规则,20,按位或举例,运算举例,1010,1101 (0xAD),| 0110,1001 (0x69),1110,1101 (0xED),按位置一,xxxx,xxxx,_,| 0110,0010 (0x62),x11x,xx1x,_,按位或举例运算举例,21,按位异或,(),运算规则,0 0 = 0;,0 1 = 1;,1 0 = 1;,1 1 = 0;,说明,相“异”则为,1,,相“同”则为,0,相当于按位且无进位的加法,按位异或 ()运算规则,22,按位异或用法举例,特定位翻转,1010,1101 (0xAD), 0110,1001 (0x69),1100,0100 (0xC4),与,0,相异或,保持原值不变。,与,1,相异或,翻转其值。(翻转特定位),与自身相异或,则全部位清零,交换两个整数值,a=ab; b=ba; a=ab;,按位异或用法举例特定位翻转,23,按位取反 (),运算规则, 0 = 1;, 1 = 0;,用法,所有位翻转,按位取反 ()运算规则,24,按位取反举例,运算举例, 1010,1101 (0xAD),0101,0010 (0x52),所有位翻转,按位取反举例运算举例,25,左移 (),运算规则,i n,把,i,各位全部向左移动,n,位,最左端的,n,位被移出丢弃,最右端的,n,位用,0,补齐,用法,若没有溢出,则左移,n,位相当于乘上,2,n,运算速度比真正的乘法和幂运算快得多,左移 ()运算规则,26,左移举例,运算举例,1010,1101 3,(101)0110,1000_,溢出举例,若左移后的数据超出表示范围,则发生溢出,int i, j;,i = 0x2431;,j = i2; /* j=-0x6F3C,溢出,*/,j = i),运算规则,i n,把,i,各位全部向右移动,n,位,最右端的,n,位被移出丢弃,最左端的,n,位用,0,补齐(逻辑右移),或最左端的,n,位用,符号位,补齐(算术右移),用法,右移,n,位相当于除以,2,n,,并舍去小数部分,运算速度比真正的除法和幂运算快得多,右移 ()运算规则,28,右移举例,运算举例,0101,1101 3,0000,1011(101),右移举例运算举例,29,5、关系运算符, 小于, 小于等于, 大于, 大于等于, 等于,! 不等于,5、关系运算符,30,实例分析,实例分析,31,6、逻辑运算符,& 逻辑与,| 逻辑或,! 逻辑非,6、逻辑运算符,32,实例分析,实例分析,33,四、程序流程控制,1、顺序结构,依次执行的语句。,2、选择语句,(1)、if语句,以下三种形式:,if(表达式)语句;,if(表达式)语句1; else 语句2;,四、程序流程控制,34,嵌套使用:,if(表达式1),语句1;,else if(表达式2),语句2;,else if(表达式3),语句3;,else if(表达式m),语句m;,else,语句 n;,嵌套使用:,35,三种形式的简明示意图,三种形式的简明示意图,36,例1: if (p1!=0),c=20;,例2: if (p1!=0),c=20;,else,c=0;,例3: if (a=1) c=10;,else if (a=2) c=20;,else if (a=3) c=30;,else if (a=4) c=40;,else c=0;,例1: if (p1!=0),37,if语句中注意的问题,if关键字之后的表达式通常是逻辑表达式或关系表达式,但也可以是其它表达式,如赋值表达式等,甚至可以是一个变量。,例如:if(a=5);if(b)语句;都是允许的。只要表达式的值为非0,即为“真”,那么其后的语句就要执行。在if语句中,条件判断表达式必须用括号括起来,在语句之后必须加分号。,在if语句的3种形式中,所有的语句应为单个语句,如果要想在满足条件时执行一组(多个)语句,则必须把这一组语句用括起来组成一个复合语句。但要注意的是在“”之后不能再加分号。,if语句中注意的问题if关键字之后的表达式通常是逻辑表达式,38,上机练习:,根据按键亮灯,当按下一个铵键后,灯亮,松开后,灯灭。,上机练习:,39,(2)、,switch/case语句,switch/case语句的一般形式如下:,switch(表达式),case 常量表达式1:语句1; break;,case 常量表达式2:语句2; break;,case 常量表达式n:语句n; break;,default :语句n+1;,break语句又称间断语句,它的功能是终止当前语句的执行,使程序跳出switch语句。,(2)、switch/case语句,40,switch语句说明,(1)switch括号后面的表达式,允许为任何类型。,(2)当“表达式”的值与某个case后面的常量表达式的值相等时,就执行此case后面的语句。如果表达式的值与所有常量表达式都不匹配,就执行default后面的语句(如果没有default就执行跳出switch,执行switch语句后面的语句)。,(3)各个常量表达式的值必须互不相同,否则出现矛盾。,(4)各个case,default出现的顺序不影响执行结果。,switch语句说明(1)switch括号后面的表达式,允许,41,(5)执行完一个case后面的语句后,流程控制转移到下一个case中的语句继续执行。此时,“case 常量表达式”只是起到语句标号的作用,并不在此处进行条件判断。在执行一个分支后,可以使用break语句使流程跳出switch结构,即终止switch语句的执行(最后一个分支可以不用break语句)。,(6)case后面如果有多条语句,不必用括起来。,(7)多个case可以共用一组执行语句。(注意break使用的位置),switch语句说明,(5)执行完一个case后面的语句后,流程控制转移到下一个c,42,switch 语句应用举例,#include,#include,extern serial_initial( );,void main( ),int a,b;,serial_initial( );,printf(“please input b=”);,scanf(“%d”,switch (b),case 0: a=1;,case 1: a=3;,case 2: a=5;,default: a=7;,printf(“n a=%d,b=%d”,a,b);,while(1);,switch 语句应用举例#include,43,3、循环语句,许多问题的求解归结为重复执行的操作,比如数值计算中的方程迭代求根,非数值计算中的对象遍历。重复执行就是循环。重复工作是计算机特别擅长工作之一。,重复的动作是受控制的,比如满足一定条件继续做,一直做直到某个条件满足,做多少次结束。也就是说重复工作需要进行控制-循环控制。,3、循环语句,44,(一) while语句(当型循环),(一) while语句(当型循环),45,注意事项,(1)while语句的特点是先计算表达式的值,然后根据表达式的值决定是否执行循环体中的语句。因此,如果表达式的值一开始就为“假”,那么循环体一次也不执行。,(2)当循环体为多个语句组成,必须用括起来,形成复合语句。,(3)在循环体中应有使循环趋于结束的语句,以避免“死循环”的发生。,注意事项(1)while语句的特点是先计算表达式的值,然后根,46,while语句应用举例,例:利用while语句,编写程序计算1+2+3+,+100。,流程图,while语句应用举例例:利用while语句,编写程序计算1,47,(二)do-while语句(直到型循环),(二)do-while语句(直到型循环),48,执行流程,执行流程,49,说明,(1)do-while循环,总是先执行一次循环体,然后再求表达式的值,因此,无论表达式是否为“真”,循环体至少执行一次。,(2) do-while循环与while循环十分相似,它们的主要区别是:while循环先判断循环条件再执行循环体,循环体可能一次也不执行。do-while循环先执行循环体,再判断循环条件,循环体至少执行一次。,说明(1)do-while循环,总是先执行一次循环体,然后再,50,(三)for语句(当型循环),(三)for语句(当型循环),51,for循环执行过程,for循环执行过程,52,for循环的执行流程,for循环的执行流程,53,注意,(1)for循环中语句可以为语句体,但要用“”和“”将参加循环的语句括起来。,(2)for循环中的“初始化表达式”(表达式1)、“循环条件表达式” (表达式2)和“增量表达式” (表达式3)都是选择项,即可以缺省,但“;”不能缺省。省略了初始化表达式,表示不对循环控制变量赋初值。省略了条件表达式,则不做其它处理时便成为死循环。省略了增量,则不对循环控制变量进行操作,这时可在语句体中加入修改循环控制变量的语句。,(3)for语句可以有多层嵌套。,注意,54,几种循环的比较,1、循环变量初始化:,while和do-while循环,循环变量初始化应该在while和do-while语句之前完成;而for循环,循环变量的初始化可以在表达式1中完成。,2、循环条件:,while和do-while循环只在while后面指定循环条件;而for循环可以在表达式2中指定。,几种循环的比较1、循环变量初始化:,55,几种循环的比较,3、循环变量修改使循环趋向结束:,while和do-while循环要在循环体内包含使循环趋于结束的操作;for循环可以在表达式3中完成。,4、while和for循环先测试表达式,后执行循环体,而do-while是先执行循环体,再判断表达式。(所以while,for循环是典型的当型循环,而do-while循环可以看作是直到型循环)。,几种循环的比较3、循环变量修改使循环趋向结束:,56,几种循环的比较,5、三种基本循环结构一般可以相互替代,不能说哪种更加优越。具体使用哪一种结构依赖于程序的可读性和程序设计者个人程序设计的风格(偏好)。我们应当尽量选择恰当的循环结构,使程序更加容易理解,几种循环的比较5、三种基本循环结构一般可以相互替代,不能说哪,57,上机练习:,1、编写程序计算1+2+3+100。,2、用C语言完成流水灯实验。,上机练习:,58,(四)break 语句和continue语句,1、break语句,break语句的一般形式为:,break;,break语句的执行过程是:,终止对switch语句或循环语句的执行(跳出这两种语句),而转移到其后的语句处执行。,(四)break 语句和continue语句1、break语,59,2、continue语句,一般形式是 :,continue;,功能:,结束本次循环。,即跳过本层循环体中余下尚未执行的语句,,接着再一次进行循环条件的判定。,注意:执行continue语句并没有使整个循环终止。注意与break语句进行比较。,2、continue语句,60,break,continue主要区别,continue语句只终止本次循环,而不是终止整个循环结构的执行;,break语句是终止循环,不再进行条件判断。,break,continue主要区别,61,void main( ),while(),.,.,continue;,.,.,break;,void main( ),62,五、函数,C语言程序的架构是由函数所组成,其中函数main()最为重要。理论上我们可以把所有程序叙述全部放在main()函数中,但是这样会使程序看起来很没条理,而且有许多程序叙述会重复,所以当我们的程序越写越大时,我们必须试着将负责处理各种机能的程序叙述分别写成一个个不同的函数中,这样一来不但程序代码变的清楚明了,而且许多重复的地方,都可以调用相同的函数完成。,五、函数,63,C语言程序的结构如图所示。在每个程序中,主函数main是必须的,它是所有程序的执行起点,main函数只调用其它函数,不能为其它函数调用。其它函数没有主从关系,可以相互调用。所有函数都可以调用库函数。程序的总体功能通过函数的调用来实现。,f11( ),f11( ),f31( ),f1( ),f11( );,f2( ),f11( );,f22( );,main( ),f1( );,f2( );,C语言程序的结构如图所示。在每个程序中,主函数main是必须,64,使用函数的意义:,使用函数可以控制任务的规模, 使用函数可以控制变量的作用范围,使用函数,程序的开发可以由多人分工协作,使用函数,可以重新利用已有的、调式好的、成熟的程序模块,使用函数的意义:,65,函数定义的一般格式如下:,函数类型 函数名(形式参数表),形式参数说明,局部变量定义,函数体,return(返回值);,函数定义的一般格式如下:,66,格式说明:,1函数类型,函数类型说明了函数返回值的类型。(有返回类型 的函数可以放到的右边),2函数名,函数名是用户为自定义函数取的名字以便调用函数时使用。,3形式参数表,形式参数表用于列录在主调函数与被调用函数之间进行数据传递的形式参数。,4、无返回类型的为void型。函数中形式参数表可为空。,格式说明:,67,例:定义一个返回两个整数中最大值的函数max()。,int max(int x,int y),int z;,if(xy) z=x;,elsez=y;,return(z);,也可以用成这样:,int max(x,y),int x,y;,int z;,if,(,xy,),z=x;,elsez=y;,return(z);, 在keil中举例验证,例:定义一个返回两个整数中最大值的函数max()。,68,例:通过函数的参数可将前面的延时程序修改成可以调节延时量的函数。,void Delay1ms(unsigned int count),unsigned int i,j;,for(i=0;icount;i+),for(j=0;j120;j+);,void main(),P0_0=0;,Delay1ms(500);/500ms,P0_0=1;,P0_1=0;,Delay1ms(1000);/1S,P0_1=1; /这样可以根据需要设置延时量,比较灵活,例:通过函数的参数可将前面的延时程序修改成可以调节延时量的函,69,局部变量:,在一个函数内部说明的变量是内部变量,它只在该函数范围内有效。即只有在包含变量说明的函数内部,才能使用被说明的变量,在该函数之外就不能使用这些变量了。所以内部变量也称“局部变量”。,例如:,int f1(int a) /*函数f1*/, int b,c;,/*a,b,c作用域:仅限于函数f1()中*/,局部变量:,70,int f2(int x) /*函数f2*/, int y,z;,/*x,y,z作用域:仅限于函数f2()中*/,main(), int m,n;,/*m,n作用域:仅限于函数main()中*/,说明:, 主函数main()中定义的内部变量,也只能在主函数中使用,其它函数不能使用。同时,主函数中也不能使用其它函数中定义的内部变量。,int f2(int x) /*函数f2*/,71, 形参变量也是内部变量,属于被调用函数;实参变量,则是调用函数的内部变量。, 允许在不同的函数中使用相同的变量名,它们代表不同的对象,分配不同的单元,互不干扰,也不会发生混淆。, 在复合语句中也可定义变量,其作用域只在复合语句范围内。, 形参变量也是内部变量,属于被调用函数;实参变量,则是调用,72,全局变量,在函数之外定义的变量。(所有函数前,各个函数之间,所有函数后),全局变量作用域:从定义全局变量的位置起到本源程序结束为止。,全局变量,73,说明:,1、全局变量一旦定义后,任何函数都可以存取全局变量的值,即多个函数共享同一个变量,即值的共享性。,2、外部变量可加强函数模块之间的数据联系,但又使这些函数依赖这些外部变量,因而使得这些函数的独立性降低。,从模块化程序设计的观点来看这是不利的,因此不是非用不可时,不要使用外部变量。,3、在同一源文件中,允许外部变量和内部变量同名。在内部变量的作用域内,外部变量将被屏蔽而不起作用。,说明:,74,上机练习:,1、写一个函数,该函数返回三个数中最小的数,编程验证。,2、用函数的思想完成流水灯。,上机练习:,75,六、数组,数组是同一类型变量的有序集合,在内存中是连续存放的。,一维数组的定义,类型说明符 数组名元素个数;,如:int a50;,六、数组,76,各部分说明如下:,(1)“类型说明符”说明了数组中各个元素存储的数据的类型。,(2)“数组名”是整个数组的标识符,它的取名方法与变量的取名方法相同。,(3)“元素个数”,取值要为整型常量,必须用方括号“”括起来。用于说明该数组的长度,即该数组元素的个数。,(4)C语言中数组的下标是从0开始的。,(5)C规定在引用数组时,只能逐个引用数组中的各个元素,而不能一次引用整个数组。但如果是字符数组则可以一次引用整个数组。,各部分说明如下:,77,一维数组的初始化,int a5=1,2,3,4,5;/*给全部元素赋值*/,int b6=1,2,6;/*给部分元素赋值*/,int d10;d0=4;d1=6; /*定义完后再赋值*/,上例中数组a有5个元素分别为:a0,a1,a2,a3,a4,每个元素都可以作为一个int变量使用。,一维数组的初始化,78,字符数组,用来存放字符数据的数组称为字符数组,它是C语言中常用的一种数组。字符数组中的每一个元素都用来存放一个字符,也可用字符数组来存放字符串。字符数组的定义下一般数组相同,只是在定义时把数据类型定义为char型。,例:用字符数组存放字符串,char str20=“Hello”;,字符串以“0”作为结束符,因此:,str0=H,str1=e,str2=l,str3=l,str4=o,str5=0,字符数组,79,上机练习:,定义一个有10个元素的数组,随机设置初始值,编写程序,将10个元素进行降序排序。,上机练习:,80,编程规范,现在单片机的程序设计,C51已经得到广泛的推广和应用,算是单片机的主流设计程序,甚至可以说作为单片机开发人员必须要掌握的一门语言了。,作为一门工具,最终的目的就是实现功能。在满足这个前提条件下,我们希望我们的程序能很容易地被别人读懂,或者能够很容易地读懂别人的程序,在团体合作开发中就能起到事半功倍之效。在网上请求帮助时,如能以规范的写法贴出程序,网友会比较容易地明白你的问题,则会比较快的得到网友的帮助,否则让人看上半天也不明所以然,这样就达不到预期的效果了。因此,为了便于源程序的交流,减少合作开发中的障碍,说一下编程规范。,编程规范,81,一、注释,1、采用中文;,2、开始的注释:,文件(模块)注释内容:,公司名称、版权、作者名称、修改时间、模块功能、背景介绍等,复杂的算法需要加上流程说明;,例如:,/*/,/*公司名称: */,/*模 块 名: LCD 模块 LCD 型号:HD44780 */,/*创 建 人:XXX 日期:2001-06-08 */,/*修 改 人: 日期:2007-06-08 */,/*功能描述: */,/*其他说明: */,/*版 本:,/*/,一、注释,82,函数开头的注释内容:,函数名称、功能、说明 输入、返回、函数描述、流程处理、全局变量、调用样例等,复杂的函数需要加上变量用途说明;,/*,*,* 函 数 名: v_LcdInit,* 功能描述: LCD初始化,* 函数说明: 初始化命令:0x3c, 0x08, 0x01, 0x06, 0x10, 0x0c,* 调用函数: v_Delaymsec(),v_LcdCmd(),* 全局变量:,* 输 入: 无,* 返 回: 无,* 设 计 者:XXX 日期:2007-12-09,* 修 改 者:XXX 日期:2007-12-09,* 版 本:,*/,函数开头的注释内容:,83,3、程序中的注释内容:,修改时间和作者、方便理解的注释等。注释内容应简炼、清楚、明了,一目了然的语句不加注释。,3、程序中的注释内容:,84,二、命名:,命名必须具有一定的实际意义。,1、常量的命名:全部用大写。,2、变量的命名:,变量名加前缀,前缀反映变量的数据类型,用小写,反映变量意义的第一个字母大写,其他小写。,其中变量数据类型:,unsigned char 前缀 uc signed char 前缀 sc,unsigned int 前缀 ui signed int 前缀 si,unsigned long 前缀 ul signed long 前缀 sl,bit 前缀 b 指针 前缀 p,例:ucReceivData 接收数据,3、函数的命名:,函数名首字大写,若包含有两个单词的每个单词首字母大写。,二、命名:,85,三、编辑风格,1、缩进:缩进以 Tab 为单位,一个 Tab 为四个空格大小。预处理语句、全局数据、函数原型、标题、附加说明、函数说明、标号等均顶格书写。语句块的“”“”配对对齐,并与其前一行对齐;,2、空格:数据和函数在其类型,修饰名称之间适当空格并据情况对齐。关键字原则上空一格,,3、对齐:原则上关系密切的行应对齐,对齐包括类型、修饰、名称、参数等各部分对齐。,4、空行:程序文件结构各部分之间空两行,若不必要也可只空一行,各函数实现之间一般空两行5、修改:版本封存以后的修改一定要将老语句用/* */ 封闭,不能自行删除或修改,并要在文件及函数的修改记录中加以记录。,三、编辑风格,86,常见接口及其编程,一、键盘接口,键盘是由若干个按键组成的开关矩阵,是最简单的单片机输入设备,通过键盘输入数据或命令,实现简单的人机对话。,键盘分编码键盘和非编码键盘。键盘上闭合键的识别由专用的硬件编码器实现,并产生键编码号或键值的称为编码键盘,如计算机键盘.,而靠软件编程来识别的称为非编码键盘;,在单片机组成的各种系统中,用的最多的是非编码键盘。,常见接口及其编程一、键盘接口,87,非编码键盘有分为:独立键盘和行列式(又称为矩阵式)键盘。,在设计键盘接口时,解决以下几个问题:,(1)、开关状态的可靠输入可设计硬件去抖动电路或设计去抖动软件。,(2)、键盘状态的监测方法中断方式还是查询方式。,(3)、键盘编码方法。,非编码键盘有分为:独立键盘和行列式(又称为矩阵式)键盘。,88,1、独立键盘,1、独立键盘,89,按键在闭合和断开时,触点会存在抖动现象:,抖动时间长短和开关的机械特性有关,一般为5-10ms。,按键在闭合和断开时,触点会存在抖动现象:抖动时间长短和开关的,90,硬件去除抖动的方法:单稳延时电路。,为了保证CPU对键的闭合作一次仅一次处理,在软件中必须设置去除抖动,在键的稳定闭合或断开时读键的状态,并判断出键由闭合到释放时,在作键输入处理。,为了保证CPU对键的闭合作一次仅一次处理,在软件中必须设置,91,2、矩阵式键盘,2、矩阵式键盘,92,当键盘没键闭合时,所有的行线和列线断开。行线呈高电平。当某键闭合时,则该键所对应的行线与列线短路。,当键盘没键闭合时,所有的行线和列线断开。行线呈高电平。当某键,93,二、LED显示接口,1、LED显示器结构,LED显示器是单片机应用系统中常用的输出器件。它是由若干个发光二极管组成的。原理:当发光二极管导通时,相应的一个点或一个笔画发亮。控制不同组合的二极管导通,就能显示出各种字符。,二、LED显示接口,94,(,a)共阴极,(b)共阳极,(c)管脚配置,七段LED显示块,共阴极LED显示器的发光二极管的阳极为高电平时,二极管被点亮。,共阳极LED显示器的发光二极管的阴极为低电平时,二极管被点亮。,(a)共阴极 (b)共阳极 (c,95,a, b, c, d, e, f被点亮,a, b, c, d, e, f被点亮,共阴极段选码(高电平点亮):,3FH,Dp g f e d c b a,0 0,1 1 1 1 1 1,共阳极段选码(低点平点亮),:,C0H,Dp g f e d c b a,1 1,0 0 0 0 0 0,a, b, c, d, e, f被点亮a, b, c, d,96,7段LED字型码,7段LED字型码,97,“米”字段结构及外型图,“米”字段结构及外型图,98,“米”字段LED字型码,“米”字段LED字型码,99,LED显示器有两种方式:,(1)LED静态显示方式,(2)LED动态显示方式,静态显示:显示器显示某一个字符时,相应的,发光二极管恒定的导通或截至。,动态显示:显示器的各位轮流被点亮,对于显示器的每一位来说,每隔一段时间点亮一次。,LED显示器有两种方式:静态显示:显示器显示某一个字符时,相,100,四位静态LED显示器电路,(1)LED静态显示方式,四位静态LED显示器电路(1)LED静态显示方式,101,静态显示时,较小的电流就能得到较高的亮度且字符不闪烁。,缺点:每一位都需要一个8位输出口控制。当显示器位数比较少时,采用静态显示的方法是合适的。,静态显示时,较小的电流就能得到较高的亮度且字符不闪烁。,102,八位LED动态显示器电路,(2)LED动态显示方式,八位LED动态显示器电路 (2)LED动态显示方式,103,动态显示利用了LED显示器的余晖和人眼的视觉暂留功能可以达到各位同时显示的效果,但是必须保证扫描的速度足够快,否则字符会闪烁。,动态显示利用了LED显示器的余晖和人眼的视觉暂留功能可以达到,104,显示器的亮度相关的两个因素:,导通电流。,点亮时间和间隔时间的比例。,缺点:,动态显示的位数增多,将会占用大量cpu时间,因此动态显示的实质是以牺牲cpu时间来换取器件的减少。,缺点:,105,上机练习:,利用动态扫描方式在数码管上显示123456数值。,上机练习:,106,思考一个问题:,能不能通过软件方法实现一个发光二极管的亮度调节,思考一个问题:,107,三、PWM技术,脉宽调制(PWM:(Pulse Width Modulation)是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。,三、PWM技术,108,把一个正弦半波分作N等分,然后把每一等分的正弦曲线和横轴所包围的面积都用一个与此面积相等的等高矩形脉冲来代替,矩形脉冲的中点与正弦波每一等分的中点重合。由N个等幅而不等宽的矩形脉冲所组成的波形就与正弦的半周等效。,PWM基本原理,把一个正弦半波分作N等分,然后把每一等分的正弦曲线和横轴所包,109,LED亮度控制原理,LED一般是恒流操作的,如何改变亮度呢?可以用PWM控制,在一定的频率的方波中,调整高电平和低电平的占空比,即可实现。我们假设把一个频率周期分为10个时间等份,如果方波占空比是9:1,这就是一个比较暗的亮度,如果占空比为10:0,则为灭的。如果为0:10则为最亮。,实际上应用中,电视屏墙中的几十百万LED象素都是这样控制的,而且每一个象素都有红绿蓝3个LED,每个LED的亮度变化是几百到几百万的级别,以实现真彩色的显示。手机上背光灯的亮度变化也是这种工作方式,城市的LED彩灯也是PWM控制的。,LED亮度控制原理,110,上机调试程序,实现LED亮度渐亮,上机调试程序,实现LED亮度渐亮,111,四、LCD1602,工业字符型液晶,能够同时显示16x02即32个字符。(16列2行),四、LCD1602,112,1602LCD_cn.pdf,1602液晶说明.pdf,1602LCD_cn.pdf,113,LCD1602编程练习,驱动函数介绍:,驱动函数声明在LCD1602.H,1、extern void LCD_Initial();,LCD初使化函数,LCD使用前必须初使化,2、extern void GotoXY(unsigned int x, unsigned char y);,输出坐标定位:x:哪一列(0-15),y:哪一行(0,1),LCD1602编程练习,114,驱动函数介绍:,3、extern void PrintStr(unsigned char *str);,在当前坐标下输出一个字符串。,例:PrintStr(“Hello”);,4、extern void PrintInt(unsigned int value);,在当前坐标下输出一个数值。,例:PrintStr(88);,5、extern void Delay1ms(unsigned int count);,1ms延时函数/12M情况下大概不精确,驱动函数介绍:,115,练习:,编写程序在LCD屏上显示:Hello World!,练习:,116,五、时钟芯片DS1302,时钟芯片DS1302是DALLAS公司的一种具有涓细电流充电能力的电路,主要特点是采用串行数据传输,可为掉电保护电源提供可编程的充电功能,并且可以关闭充电功能。采用普通32.768kHz晶振。 它可以对年、月、日、周日、时、分、秒进行计时,且具有闰年补偿等多种功能。,DS1302中文资料.pdf,五、时钟芯片DS1302DS1302中文资料.pdf,117,DS1302编程练习,驱动函数介绍:驱动函数声明在DS1302.h中,1、extern unsigned char hour,min,sec,mon,date,year;,外部变量,用来存放读出的时间和日期。,2、extern void clock_initial(void);,DS1302初始化函数。只有初如化才可以使用。,DS1302编程练习,118,驱动函数介绍:,3、extern void read_clock(void) ;,时间和日期读取函数,写数据读取到变量hour,min,sec,mon,date,year;,4、extern void time_change(void);,时间和日期修改函数,方法为:先将要修改的数据存放到变量hour,min,sec,mon,date,year; 后直接调用此函数。,驱动函数介绍:,119,练习:,编写程序将时间和日期显示在LCD1602屏上。,练习:,120,六、温度传感器DS18b20,DS18B20数字温度传感器,该产品采用美国DALLAS公司生产的 DS18B20可组网数字温度传感器芯片封装而成,具有耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域。,电子产品设计大赛常用器件。,DS18B20中文资料.pdf,六、温度传感器DS18b20,121,DS18b20编程练习,驱动函数介绍:驱动函数声明在DS18b20.h中,1、extern uchar temp;,外部变量,用于存放读出的温度值。,2、extern void get_temper(void);,温度读取函数。将温度值存放到temp变量中,供程序使用,,DS18b20编程练习,122,练习:,编写程序将温度显示在LCD1602屏上。,练习:,123,项目实践,利用LCD1602、DS18B20、DS1302制作一个带温度显示的液晶时钟。,基本要求(必须完成):,1、可以显示时间:HH:MM:SS,日期:YYYY:MM:DD,2、可以将室温显示出来:TT,3、可以对时间进行调节,调节方法自定。,扩展功能(选择完成):,1、加入整点报时,2、加入闹钟功能,3、利用发光二极管进行装饰,项目实践,124,课后练习,第一个发光管以间隔200ms闪烁,8个发光管由上至下间隔1s流动,其中每个管亮500ms,灭500ms,亮时蜂鸣器响,灭时关闭蜂鸣器,一直重复下去。,8个发光管来回流动,第个管亮100ms,流动时让蜂鸣器发出“滴滴”声。,用8个发光管演示出8位二进制数累加过程。,8个发光管间隔200ms由上至下,再由下至上,再重复一次,然后全部熄灭再以300ms间隔全部闪烁5次。重复此过程。,间隔300ms第一次一个管亮流动一次,第二次两个管亮流动,依次到8个管亮,然后重复整个过程。,间隔300ms先奇数亮再偶数亮,循环三次;一个灯上下循环三次;两个分别从两边往中间流动三次;再从中间往两边流动三次;8个全部闪烁3次;关闭发光管,程序停止。,课后练习第一个发光管以间隔200ms闪烁,125,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > PPT模板库


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!