内容正文:
项目2 霓虹灯控制系统
任务2.2 流水灯控制系统
明确任务
在任务一中设计制作了一个LED灯的闪烁控制,本次任务做8个LED流水闪烁控制。要求每次只亮一个灯,从第1个开始亮,其它全灭;然后第2个灯亮,其它全灭;依次类推,第8个灯亮过之后,在转到第1个灯,循环不停。每个灯亮的间隔要求约0.5s。
任务:设计制作8个流水灯控制系统。
void main(void)
{
unsigned char i,j; //定义局部变量
while(1)
{
LED=0; //小灯亮
for(i=0;i<200;i++)
for(j=0;j<200;j++);
LED=1; //小灯灭
for(i=0;i<200;i++)
for(j=0;j<200;j++);
}
}
回顾任务2.1程序:
知识链接
一、C51程序设计--函数
所谓函数,是指可以被其他程序调用的具有特定功能的一段相对独立地程序。 C程序是由函数构成的。
从用户使用角度,可分为库函数和用户自定义函数。
库函数:由C系统提供,只需在程序前使用#include命令包含有该函数原型的头文件即可在程序中直接调用。
用户定义函数:由用户按需要写的函数。
返回值:分为有返回值函数和无返回值函数。
从主调函数和被调函数之间数据传送的角度:分为无参函数和有参函数两种。
所有的函数都是平行的,不能嵌套定义。但允许相互调用,也允许嵌套调用。
main 函数是主函数,它可以调用其它函数,而不允许被其它函数调用。 一个C源程序有且只有一个主函数。
函数定义的一般格式如下:
函数类型 函数名(形式参数列表) [interrupt m] [using n]
{
声明部分
可执行语句部分
return语句
}
函数类型:说明了函数返回值的数据类型。
函数名:用户为自定义函数取的名字,以便调用函数时使用,必须采用合法的标识符。
形式参数表:表用于列出在主函数与被调用函数之间进行数据传递的形式参数的数据类型和名称。每个参数有一个类型符和参数名组成,参数名也必须是合法的标识符。函数可以没有参数,参数列表写一个void,也可空着。
声明部分:主要完成变量的定义、对被调用函数时使用。
执行部分:由一系列语句组成,完成函数的具体功能设计。
return语句:使流程返回到调用处。函数的值通过return返回主调函数,函数的类型就是返回语句中表达式值的类型。一般格式为:
return 表达式;
在函数中允许有多个return语句,但每次调用只能有一个return语句被执行,因此只能返回一个函数值。
如果被调函数中return语句没有表达式,return语句可省略,函数无返回值,可以用void定义。
void delay (void)
{
unsigned char i, j; //定义局部变量
for(i=0;i<200;i++)
for(j=0;j<200;j++);
}
任务2.1中的延时程序部分可以定义成单独的一个函数。
函数调用的一般形式如下:
函数名(实际参数表列);
注:①无参数函数没有实参表列;
②有参数的函数调用,实际参数可以是常数、变量或其他构造类型数据及表达式。多个实参,用逗号隔开。函数调用中的实参与函数定义中的形参必须在个数、类型及顺序上严格保持一致。
函数调用的前提是被调用函数必须已定义过。
库函数:使用预处理命令“#include<**.h>将有关函数的信息包含到本文件中。
用户自定义函数:如果在函数定义之前调用,需要在主调函数中对被调函数进行声明。
函数声明一般形式如下:
[extern] 函数类型 函数名(形式参数表);
注:声明的函数不在文件内部,而在另一个文件中,声明时须带extern,指明使用函数在另一个文件中。 在同一文件中则不需要。
void main(void)
{
unsigned char i,j; //定义局部变量
while(1)
{
LED=0; //小灯亮
for(i=0;i<200;i++)
for(j=0;j<200;j++);
LED=1; //小灯灭
for(i=0;i<200;i++)
for(j=0;j<200;j++);
}
}
delay();
delay();
二、硬件电路
三、软件设计与编程
1.8个灯都采用位控制方式,方法同任务2.1一样,亮的灯输出0,灭的输出1.
位号 7 6 5 4 3 2 1 0 编码
第1个灯亮 1 1 1 1 1 1 1 0 0xFE
第2个灯亮 1 1 1 1 1 1 0 1 0xFD
第3个灯亮 1 1 1 1 1 0 1 1 0xFB
第4个灯亮 1 1 1 1 0 1 1 1 0xF7
第5个灯亮 1 1 1 0 1 1 1 1 0xEF
第6个灯亮 1 1 0 1 1 1 1 1 0xDF
第7个灯亮 1 0 1 1 1 1 1 1 0xBF
第8个灯亮 0 1 1 1 1 1 1 1 Ox7F
单击此处编辑母版文本样式
第二级
第三级
第四级
第五级
2. 字节输出控制。需要对输出进行编码,根据显示方式编码,如果改变显示方式只需改变编码即可。
while(1)
{
P1=0XFE; //第1个灯亮,其余灯灭
delay(); //延时
P1=0XFD; //第2个灯亮,其余灯灭
delay();
-----
-----
P1=0X7F; //第8个灯亮,其余灯灭
delay();
}
3 .字节编码利用数组来表示出来,利用C语言中的循环指令,修改为精简程序,提高程序阅读效果,提升代码效率。
数组是一种有序数据的集合。数组中每一个元素的类型相同。数组必须先定义后使用。一维数组的定义形式为:
类型说明符 数组名[常量表达式];
类型说明符:数组中各元素的数据类型;
数组名:用户定义的数组标示符;
常量表达式:表示数据元素的个数,也称为数组的长度。
数组中的元素用数组名和下标来唯一确定。
例如:
char a[10]; /*定义一个数组名a,有10个元素,每个元素的类 型均为char*/
下标从0开始顺序编号。因此数组a的10个元素分别是:a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7],a[8],a[9],它们按顺序占用连续的存储空间。
对数组的初始赋值,指按照数字大小依次为各个元素提供初始值,通过{ }中的数据序列提供,元素之间用逗号隔开。
可以只给出全部或是部分元素赋值,如果是部分数据则只给前面部分元素赋值,后面元素自动赋0值。
unsigned char a[5]={0,1,2,3,4};
如果不给可初始化的数组赋值则全部元素均为0值。
在定义数组时如果未指定数组大小,则根据给出的元素的个数来自行确定数组大小。
unsigned char a[ ]={0,1,2,3,4};
unsigned char code lsd[]={0XFE,0XFD,0XFB,0XF7,0XEF,0XDF,0XBF,0X7F};
//灯控制字节编码
void main(void)
{
unsigned char u;
while(1)
{
for(u=0;u<8;u++) //for循环,依次循环数组内字节编码
{
P1=lsd[u]; //根据编码不同灯亮不同
delay(); //延时
}
}
}
任务实施
1.学生分组,制定方案。
2.查阅资料,设计电路原理图,列出元件清单。
3.准备元件及工具,搭接电路。
4.注意安全。
评价总结
1.学生根据自己实施情况填写任务实施评价单。
2.组间互评,提出问题,解决问题。
3.回收元件及工具,清洁实施现场,6S标准。
4.知识整理总结。
$$