内容正文:
任务4 流水指示灯设计与制作
单片机技术与应用
项目一 智能车间指示系统设计与制作
任务4 流水指示灯设计与制作
虚拟仿真
方案设计
任务拓展
实物联调
总结评价
任务引入
【基础任务要求】利用数组实现8个LED发光二极管从右至左依次点亮、8个LED全亮、8个LED全灭的效果。
任务4 流水指示灯设计与制作
虚拟仿真
方案设计
任务拓展
实物联调
总结评价
任务引入
任务实现四步骤
绘制控制电路图
搭接硬件电路
硬件设计
调试控制电路
调试控制程序
软硬件调试
仿真运行
在单片机开发板上运行
仿真运行
绘制流程图
用数组和循环语句编程实现流水灯控制
软件设计
01
02
03
04
重点、难点
难点
虚拟仿真
方案设计
任务拓展
实物联调
总结评价
任务引入
STC89C52
单片机
时钟电路
复位电路
电源电路
发光二极管电路
系统框图
任务4 流水指示灯设计与制作
虚拟仿真
方案设计
任务拓展
实物联调
总结评价
任务引入
任务名:流水指示灯设计与制作
元件名称 图片 型号 数量 Proteus中的名称
单片机芯片 AT89C51 1 AT89C51
晶振 12MHZ 1 CRYSTAL
电容 22pF 2 CAP
电解电容 22μf/16V 1 CAP-ELEC
电阻 1KΩ 1 RES
电阻 50Ω 8 RES
发光二极管 8 LED-RED
元器件选型
虚拟仿真
方案设计
任务拓展
实物联调
总结评价
任务引入
硬件电路图
任务4 流水指示灯设计与制作
虚拟仿真
方案设计
任务拓展
实物联调
总结评价
任务引入
硬件设计-绘电路
细致
规范
严谨
小锦囊
电路绘制规范:
用统一规定的元件符号
尽量避免导线的交叉
导线要求横平竖直
设置元器件参数
元件放在编辑区内
虚拟仿真
方案设计
任务拓展
实物联调
总结评价
任务引入
软件设计
如何用数组编程实现8个发光二极管从右至左点依次点亮
、全亮、全灭效果?
1
重点、难点
虚拟仿真
方案设计
任务拓展
实物联调
总结评价
任务引入
控制程序设计
1
0
P3.0
0
0
0
0
0
0
P3.1
P3.2
P3.3
P3.4
P3.5
P3.6
P3.7
0
1
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
0
1
1
1
1
1
1
1
1
1
0
0
0
0
0
0
0
0
0x01
0x02
0x04
0x08
0x10
0x20
0x40
0x80
0xff
0x00
虚拟仿真
方案设计
任务拓展
实物联调
总结评价
任务引入
一、数组定义
数组:是数目固定、数据类型相同的若干个变量的有序集合。
unsigned char led[10]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0xff,0x00};
数据类型
数组名
数组长度
数组元素
知识链接
虚拟仿真
方案设计
任务拓展
实物联调
总结评价
任务引入
数组必须先定义、后使用。
数据类型 数组名[常量表达式][,数组名2[常量表达式2]……];
(1)”数据类型”是指数组元素的数据类型。
(2) 数组名,必须遵循标识符命名规则;存放的是一个地址常量,它代表整个数组的首地址。
(3)“常量表达式” 可以是常数和符号常量、不能包含变量,其值指数组元素个数(又称数组长度) 。
虚拟仿真
方案设计
任务拓展
实物联调
总结评价
任务引入
例如:
unsigned char led[8];
int scores[16];
#define student 16
unsigned int k;
unsigned char led[k];
int scores[student];
Χ
√
虚拟仿真
方案设计
任务拓展
实物联调
总结评价
任务引入
#include<reg51.h>
unsigned char led[ ]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0xff,0x00};
void delay(unsigned int k ); //函数声明
void main( )
{ unsigned char i;
while(1)
{ for(i=0;i<10;i++)
{ P3=led[i];
delay(1000);
}
}
}
void delay(unsigned int k ) //函数定义
{
unsigned int i, j;
for(i=0;i<100;i++)
for(j=0;j<k;j++);
}
虚拟仿真
方案设计
任务拓展
实物联调
总结评价
任务引入
二、数组初始化
给数组中的元素赋值,叫做数组初始化。
数组初始化
数组定义时初始化
赋值语句初始化
虚拟仿真
方案设计
任务拓展
实物联调
总结评价
任务引入
unsigned char led[ ]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0xff,0x00};
定义数组
初始化
unsigned char led[ ]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0xff,0x00};
led[0]
led[1]
led[2]
led[3]
led[4]
led[5]
led[6]
led[7]
led[8]
led[9]
虚拟仿真
方案设计
任务拓展
实物联调
总结评价
任务引入
数据类型 数组名[常量表达式]={初值表};
unsigned char led[ ]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0xff,0x00};
unsigned char led[10];
led[0]=0x01;
led[1]=0x02;
led[2]=0x04;
led[3]=0x08;
led[4]=0x10;
led[5]=0x20;
led[6]=0x40;
led[7]=0x80;
led[8]=0xff;
led[9]=0x00;
虚拟仿真
方案设计
任务拓展
实物联调
总结评价
任务引入
允许只给部分元素赋初值。
例如:int score[5]={75,80,85,90};
int score[5];
score[0]=75;
score[1]=80;
score[2]=85;
score[3]=90;
score[4]=0;
虚拟仿真
方案设计
任务拓展
实物联调
总结评价
任务引入
三、一维数组元素的引用
0x01
0x02
0x04
0x08
0x10
0x20
0x40
0x80
0xff
0x00
00000001
00000010
00000100
00001000
00010000
00100000
01000000
10000000
11111111
00000000
虚拟仿真
方案设计
任务拓展
实物联调
总结评价
任务引入
unsigned char led[ ]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0xff,0x00};
每一个数组元素都用
数组名和唯一的下标来表示。
数组名[下标]
数组元素下标从0开始到(元素个数-1)
使用循环程序处理数组
0x01
0x02
0x04
0x08
0x10
0x20
0x40
0x80
0xff
0x00
led[0]
led[1]
led[2]
led[3]
led[4]
led[5]
led[6]
led[7]
led[8]
led[9]
存储器
led
led+1
led+2
led+3
led+4
led+5
led+6
led+7
led+8
led+9
细致
三、一维数组元素的引用
虚拟仿真
方案设计
任务拓展
实物联调
总结评价
任务引入
unsigned char led[ ]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0xff,0x00};
定义数组
数组初始化
unsigned char led[ ]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0xff,0x00};
led[0]
led[1]
led[2]
led[3]
led[4]
led[5]
led[6]
led[7]
led[8]
led[9]
使用循环程序处理数组
三、一维数组元素的引用
虚拟仿真
方案设计
任务拓展
实物联调
总结评价
任务引入
四、循环结构
虚拟仿真
方案设计
任务拓展
实物联调
总结评价
任务引入
1、for语句
虚拟仿真
方案设计
任务拓展
实物联调
总结评价
任务引入
1、for语句
for(循环变量赋初值;循环条件;循环变量增值)
表达式可以部分或全部缺省,但其间的分号不能省略
{
循环体;
}
仅有1条语句,
可省略大括号
虚拟仿真
方案设计
任务拓展
实物联调
总结评价
任务引入
虚拟仿真
方案设计
任务拓展
实物联调
总结评价
任务引入
#include<reg51.h>
unsigned char led[ ]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0xff,0x00};
void delay(unsigned int k ); //函数声明
void main( )
{ unsigned char i;
while(1)
{ for(i=0;i<10;i++)
{ P3=led[i];
delay(1000);
}
}
}
虚拟仿真
方案设计
任务拓展
实物联调
总结评价
任务引入
void delay(unsigned int k ) //延时函数
{
unsigned int i, j;
for(i=0;i<100;i++)
for(j=0;j<k;j++);
}
虚拟仿真
方案设计
任务拓展
实物联调
总结评价
任务引入
for语句中的三个表达式都是可选项,可以省略,但必须保留“;”
虚拟仿真
方案设计
任务拓展
实物联调
总结评价
任务引入
#include<reg51.h>
unsigned char led[ ]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0xff,0x00};
void delay(unsigned int k ); //函数声明
void main( )
{ unsigned char i;
while(1)
{
i=0;
for(;i<10;i++)
{ P3=led[i];
delay(1000);
}
}
}
void delay(unsigned int k ) //延时函数
{
unsigned int i, j;
for(i=0;i<100;i++)
for(j=0;j<k;j++);
}
虚拟仿真
方案设计
任务拓展
实物联调
总结评价
任务引入
#include<reg51.h>
unsigned char led[ ]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0xff,0x00};
void delay(unsigned int k ); //函数声明
void main( )
{ unsigned char i;
while(1)
{
i=0;
for(;i<10;)
{ P3=led[i];
delay(1000);
i++;
}
}
}
void delay(unsigned int k ) //延时函数
{
unsigned int i, j;
for(i=0;i<100;i++)
for(j=0;j<k;j++);
}
虚拟仿真
方案设计
任务拓展
实物联调
总结评价
任务引入
2.while语句
while(循环条件)
{
循环体;
}
虚拟仿真
方案设计
任务拓展
实物联调
总结评价
任务引入
while语句-先判断后执行
特点:当表达式的值一开始就为假时,循环体一次也不会执行。
有言在先
虚拟仿真
方案设计
任务拓展
实物联调
总结评价
任务引入
#include<reg51.h>
unsigned char led[ ]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0xff,0x00};
void delay(unsigned int k ); //函数声明
void main( )
{ unsigned char i;
while(1)
{
i=0;
while(i<10)
{ P3=led[i];
delay(1000);
i++;
}
}
}
void delay(unsigned int k ) //延时函数
{
unsigned int i, j;
for(i=0;i<100;i++)
for(j=0;j<k;j++);
}
虚拟仿真
方案设计
任务拓展
实物联调
总结评价
任务引入
3.do-while语句
do
{
循环体;
}while(循环条件);
分号不能缺
虚拟仿真
方案设计
任务拓展
实物联调
总结评价
任务引入
先斩后奏
do-while语句-先执行后判断
特点:循环体至少会被执行一遍。
3.do-while语句
虚拟仿真
方案设计
任务拓展
实物联调
总结评价
任务引入
#include<reg51.h>
unsigned char led[ ]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0xff,0x00};
void delay(unsigned int k ); //函数声明
void main( )
{ unsigned char i;
while(1)
{
i=0;
do
{ P3=led[i];
delay(1000);
i++;
} while(i<10);
}
}
void delay(unsigned int k ) //延时函数
{
unsigned int i, j;
for(i=0;i<100;i++)
for(j=0;j<k;j++);
}
虚拟仿真
方案设计
任务拓展
实物联调
总结评价
任务引入
进阶任务-多种效果流水指示灯控制
设计要求:利用单片机实现8个LED发光二极管构成的流水灯的亮点左移动、亮点右移动、暗点左移动、暗点右移动。
虚拟仿真
方案设计
任务拓展
实物联调
总结评价
任务引入
每天学习一点点,变成更好的自己
单片机技术与应用
数组实现彩灯控制系统设计
Lavf58.42.100
$$