单片机应用技术-项目3.中职课件电子教案.ppt
项目项目3 制作跑马灯制作跑马灯 项目描述:项目描述:v项目描述:项目描述:让8只LED灯依次从上到下(或从左到右)不断循环显示(每次一只亮)。一一 能力培养目标能力培养目标 1.能编写简单C51程序 2.能掌握不同进制间的转换 3.能领会C51程序基本结构 二二 学习组织形式学习组织形式 采取以小组为单位互助学习,有条件的每人一台电脑,条件有限的可以两人合用一台电脑。用仿真实现所需的功能后如果有实物板(或自制硬件电路)可把程序下载到实物上再运行、调试,学习过程鼓励小组成员积极参与讨论。三三 项目实施过程项目实施过程 (一)创建硬件电路 实现此项目的电路原理图 开始流水灯状态1:1111 1 110LED,保持几百毫秒流水灯状态2:1111 1101LED,保持几百毫秒流水灯状态3:1111 1011LED,保持几百毫秒流水灯状态4:1111 0111LED,保持几百毫秒流水灯状态5:1110 1111LED,保持几百毫秒流水灯状态6:1101 1111LED,保持几百毫秒流水灯状态7:1011 1111LED,保持几百毫秒流水灯状态8:0111 1111LED,保持几百毫秒图3-2 跑马灯程序源流程图(二)程序编写1、流程图2、编写的程序如下1.#include 2.#define LED P13.void delay()4.5.unsigned int t;/定义t 为无符号整形变量6.t=0;7.while(t30000)t+;/每循环一次t加1,直到t大于等于30000退出8.1.main()/主函数2.3.while(1)4.5.LED=0Xfe;/跑马灯状态1:1111 11106.delay();7.LED=0Xfd;/跑马灯状态1:1111 11018.delay();9.LED=0Xfb;/跑马灯状态1:1111 101110.delay();11.LED=0Xf7;/跑马灯状态1:1111 011112.delay();13.LED=0Xef;/跑马灯状态1:1110 111114.delay();15.LED=0Xdf;/跑马灯状态1:1101 111116.delay();17.LED=0Xbf;/跑马灯状态1:1011 111118.delay();19.LED=0X7f;/跑马灯状态1:0111 111120.delay();21.22.(三)创建程序文件并生成(三)创建程序文件并生成.HEX文件文件 打开MEDWIN,新建项目文件“P3”,创建程序文件“Proj3.C”,输入上述程序,然后按工具栏上的“产生代码并装入”按钮(或按CTRL+F8),如果编译发现错误需对程序进行修改,直到编译成功,此时将在对应项目文件夹的OUTPUT子目录中生成目标文件“P3.HEX”。(四)运行程序观察结果(四)运行程序观察结果 在Proteus中打开项目3设计电路“proj3.DSN”,把已编译所生成的“P3.HEX”文件下载到单片机中,再运行同时观察结果。3.1 C51中常用的进制中常用的进制 要使用计算机处理信息,首先必须要使计算机能够识别它们。由于计算机硬件是由电子元器件组成的,而电子元器件大多都有两种稳定的工作状态,可以很方便地用来表示“0”和“1”。3.1.1 进位计数制进位计数制一二进制 平时我们习惯的是十进制数,“逢十进一,借一当十”是十进制的特点。对二进制数,“逢二进一,借一当二”便是二进制数的特点。通常在表示二进制数据时在其最后加B作为后缀以示同其它进制数的区别,如101B。二十六进制数 十六进制数是“逢十六进一,借一当十六”。十六进制的数码有16个,除09外、分别用A、B、C、D、E、F对应十进制的10、11、12、13、14、15,这里字母不分大小写。平时在表示十六进制数时一般在最后面加上后缀H,十进制数(可以不加后缀或加后缀D)10=AH,而在C语言中要写成0 x0A(或0 x0a),其中“0 x”表示该数为十六进制数。下表为1位十六进制数所对应的十进制和二进制数。二二、十十、十六十六进制之间的关系进制之间的关系 十六进制十六进制十进制十进制二进制二进制十六进制十六进制十进制十进制二进制二进制0 00 0000000008 88 8100010001 11 1000100019 99 9100110012 22 200100010A A1010101010103 33 300110011B B1111101110114 44 401000100C C1212110011005 55 501010101D D1313110111016 66 601100110E E1414111011107 77 701110111F F1515111111113.1.2 不同进制间的互换不同进制间的互换一二进制与十六进制数的互换 二进制与十六进制数的互换很有规律,每4位二进制数完全与1位十六进制数相对应,并遵循8421规则,如上表所示,因此它们通过口算可以得到。v做一做:(1)11011010110B=(?)H (2)7C6BH=(?)B二二进制、十六进制数转换成十进制数 二进制、十六进制数转换为十进制数十分简单,可以采用按权展开相加法。v做一做:(1)1101101B=(?)D (2)7CH=(?)D三十进制数转换成二进制、十六进制数 十进制数转换为二进制、十六进制数,其整数转换与小数转换的规则不同,需要分开进行转换。十进制整数转换为二进制(或十六进制数)整数,采用除(或除16)取余倒序排列法。即将十进制数的商反复整除以(或除16),直到商等于零为止,再把各次整除所得的余数从后往前连接起来,就可得到相应的二进制(或十六进制数)整数。而十进制小数转换为二进制(或十六进制数)小数,采用乘(或乘16)取整顺序排列法。例:(1)23(?)B (2)188(?)即:(1)23(10111)B (2)188(BC)Hv做一做:(1)74(?)B (2)370(?)Hv温馨提示:从上所述可以看出,十进制数与二、十六进制数的互换一般要通过计算得到,比较麻烦,不过在计算机中可以用windows系统自带的计算器方便地进行不同进制整数之间的转换,而在C51中经常用到的基本都是整数。3.2 C程序基本结构程序基本结构 C程序的基本结构可分为顺序程序、分支程序和循环程序。顺序程序中的各语句是自上而下依次执行,分支程序是要根据具体情况来决定执行的路线,而循环程序则是要对某一程序段反复执行若干次 3.2.1 分支程序设计分支程序设计 分支程序是根据条件语句(分支语句)的真或假来选择执行某条语句,在C语言中构成分支的语句有if语句和 switch语句。一if语句if语句有3种格式:格式格式功能功能格式格式1if(条件表达式)语句(条件表达式)语句若表达式的结果为真则执行若表达式的结果为真则执行语句,否则跳过语句,否则跳过格式格式2if(条件表达式)语句(条件表达式)语句1else语句语句2若表达式的结果为真则执行若表达式的结果为真则执行语句语句1,否则执行语句,否则执行语句2格式格式3if(条件表达式(条件表达式1)语)语句句1else if(表达式(表达式2)语)语句句2else if(表达式(表达式m)语)语句句melse 语句语句n若表达式若表达式1的值为真则执行语的值为真则执行语句句1,否则若表达式,否则若表达式2的值的值为真则执行语句为真则执行语句2,依次判断,所列出的条件依次判断,所列出的条件均不满足则执行语句均不满足则执行语句n 登记成绩时要把百分制折算成等级制,现要求把某同学的分数fs折算成对应的等级dj,规则为:大于等于90分为A(优)、小于90而大于等于75为B(良好)、小于75而大于等于60为C(及格)、小于60为D(不及格),运行结果同时反映在A、B、C、D四盏灯上,v#include v#define uchar unsigned charvsbit leda=P14;sbit ledb=P15;vsbit ledc=P16;sbit ledd=P17;vuchar dj,fs=92;vmain()/主函数vv if(fs=90)v/对应等级Avdj=A;vleda=0;vledb=ledc=ledd=1;v v else if(fs=75)v /对应等级Bvdj=B;vledb=0;vleda=ledc=ledd=1;vv else if(fs=60)v /对应等级Cvdj=C;vledc=0;vledb=leda=ledd=1;vv else v /对应等级Dvdj=D;vledd=0;vledb=ledc=leda=1;vvwhile(1);v vswitch语句语句 对多分支的处理对多分支的处理switch语句比语句比if语句的嵌套具语句的嵌套具有更好的可读性,其形式如下:有更好的可读性,其形式如下:switch(表达式)(表达式)case 常量表达式常量表达式1:语句语句1;break;case 常量表达式常量表达式2:语句语句2;break;case 常量表达式常量表达式3:语句语句3;break;.case 常量表达式常量表达式m:语句语句m;break;default:语句:语句nv用用switch语句改写上面程序语句改写上面程序 v#include v#define uchar unsigned charvsbit leda=P14;sbit ledb=P15;vsbit ledc=P16;sbit ledd=P17;vuchar dj,fs=59;vmain()/主函数vvswitch(fs/5)/每5分一个段vvcase 20:/对应分数100v case 19:/对应分数(100-95 v case 18:/对应分数(95-90v /对应等级Av dj=A;v leda=0;v ledb=ledc=ledd=1;v break;v v case 17:/对应分数(90-85v case 16:/对应分数(85-80v case 15:/对应分数(80-75v /对应等级Bv dj=B;v ledb=0;v leda=ledc=ledd=1;v break;v vcase 14:/对应分数(75-70v case 13:/对应分数(70-65v case 12:/对应分数(65-60 v /对应等级Cv dj=C;v ledc=0;v ledb=leda=ledd=1;v break;v vdefault:v v/其余的就是小于60分的,对应等级Dv dj=D;v ledd=0;v ledb=ledc=leda=1;vvvwhile(1);v 3.2.2 循环程序设计 循环是反复执行某一部分程序段的操作,在C51中构成循环控制的语句有while、do-while、for等语句。一一while语句语句 while(表达式表达式)语句语句表达式为真?表达式为真?循环体语句循环体语句while语句语句是否例如:unsigned char i=50,sum;while(i-)sum=sum+i;v温馨提示:对while(1)之类的循环语句,因其循环条件为永真,所以一般需要在循环体内用if语句加以判断,满足一定条件时执行break语句才能退出循环。二二do-while语句语句do-while语句语句一般形式为:do 语句 while(表达式);表达式为真?循环体语句do-while语句是否v三三for语句语句for语句一般形式:语句一般形式:for(循环变量初值;循环条件;循环变量增值)(循环变量初值;循环条件;循环变量增值)语句语句求循环变量初值循环条件为真吗?循环体语句循环变量增值否(为0)是(非0)退出循环图3-6vmain()/主函数vv unsigned char k,t;/定义2个无符号的字符型变量v while(1)v v k=0 x01;/k初值为0000 0001vfor(t=0;t8;t+)/循环8次vv LED=k;/k按位取反后赋给LED,每次只有一位为低电平 v delay();v k=k1;/k向左移一位,k每次只有一位为1v v v 四break 与continue语句vbreak语句的作用是用于强行退出循环体,其格式为:vbreak;vcontinue语句的作用是结束本次循环,即跳过循环体中下面的语句,并跳转到下一次循环周期。其格式为:vcontinue;vbreak 与continue语句的区别是:continue语句只结束本次循环,而不是终止整个循环的执行,而break语句则是结束整个循环过程,续而执行循环的后继语句。