单片机花样流水灯设计

2024-09-17

单片机花样流水灯设计(共5篇)

单片机花样流水灯设计 篇1

随着人们生活环境的不断改善和美化, 在许多场合可以看到彩色霓虹灯。LED彩灯由于其丰富的灯光色彩, 低廉的造价以及控制简单等特点而得到了广泛的应用。用彩灯来装饰已经成为一种时尚。但是目前市场上各式各样的LED彩灯控制器大多数是用全硬件电路实现, 电路结构复杂、功能单一, 这样一来制成品只能按照固定的模式闪亮, 不能根据不同场合、不同时间段的需要来调节亮灯时间、模式等动态参数。这种彩灯控制结构往往芯片过多、电路复杂、功率损耗大。此外从功能效果上看, 亮灯模式少而且样式单调, 缺乏用户的可操作性, 影响亮灯效果, 因此有必要对现有的彩灯控制器进行改进。

1 设计方案

本次设计有下列要求:第一, 自动控制多路彩灯按预设的花型进行变换, 按下不同开关要求变换不同的花型, 例如从上到下一盏一盏点亮;第二, 花型种类不少于五种, 花型自拟;第三, 分别用快慢两种节拍实现花型交换, 总清零开关控制电路的初始状态。

1.1 硬件设计

1.1.1 硬件说明

按照单片机系统扩展与系统配置情况, 单片机应用系统可分为最小系统、最小功耗系统以及典型系统等。89C51单片机是本次设计运用的主要元件, 流水灯控制设计是用单片机最小应用系统, 即为有LED、晶振、复位电路、电源等电路和软件组成的单个单片机。电路焊接:制造电子产品的重要手段。主要涉及到的硬件有AT89C51单片机、LED、晶振、电阻、开关、电容等。

1.1.2 芯片介绍-AT89C51 (见图1)

1.1.3 引脚说明

引脚是单片机和外界进行通信的通道连接点, 用户只能通过引脚组建控制系统。从应用的角度来看, 引脚的应用是单片机应用的一个重要基础。因此熟悉引脚是学习应用单片机的基础。

主电源引脚:VCC (40脚) :接+5V电源。VSS (20脚) :接地。时钟引脚 (18, 19脚) :提供单片机的时钟控制信号, 18脚为片内晶振电路的输入端, 19脚为片内晶振电路的输出端。可编程输入/输出引脚 (32根) :AT89C51单片机有4组8为可编程I/O口, 分别为P0、P1、P2、P3口, 每个口有8位 (8根引脚) , 共32根。每一根引脚都可以编程, 比如用来控制电机、交通灯等, 开发产品时就是利用这些可编程引脚来实现我们想要的功能。控制引脚 (4根) , RST/VPD (9脚) :复位引脚, 引脚上出现2个机器周期的高电平将使单片机复位;ALE/-PROG (30脚) :地址所存允许信号;-PSEN (29脚) :外部存储器读选通讯信号;-EA/VPP (31脚) :程序存储器的内外部选通, 接低电平从外部程序存储器读指令, 如果接高电平则从内部程序存储器读指令。

1.2 软件编程设计

本次花样流水灯设计主要基于单片机的设计, 通过编写汇编语言进行编译、输出hex文件。

本次程序主要用CJNE来判断哪个按键被按下, 然后跳到相应的程序入口地址, 执行指令。程序最开始将0FFH赋值给P1口、寄存器A, 应用比较不跳转指令将A和0FEH进行比较, 若Key1键被按下, 即P1.0口为低电平, 则程序继续执行下去, LCALL K1, 跳转到K1子程序, 将07FH赋给A, A传到P2口, 所以第一盏灯先亮, 再将数值进行右移一位, 就实现了第二盏灯点亮, 一次执行下去, 从上到下每盏灯一次点亮, 为保证时间上的足够, 必须调用延时子程序。再用JNB指令比较, 如果Key2键被按下, 则再跳转到相应的子程序下去, 否则继续持续第一种花型。如若需要增大或减小灯光闪烁的时间, 则需按下Key6键, 本次设计只能变换2种间隔时间。

2 详细方案设计

2.1 软件程序设计介绍

单片机的应用系统由硬件和软件组成, 需要编写程序控制单片机管脚电平的高低变化, 来实现LED的一亮一灭。软件编程是单片机应用系统中的一个重要组成部分, 也是本次设计的重点和难点。下面着重介绍本次设计的工作原理。程序开始就将0FFH给P1口, 即将信号输入给P1口, P1口又将数据送入寄存器A, 再将A中数据和给定数据0FEH相比较。如果Key1键被按下则不跳转, 直接执行下面的程序, 即跳转到K1子程序中去;如果Key1键没被按下, 即P1口输入的信号与0FEH不一样, 则进行跳转, 程序会跳转到S1子程序, 在S1子程序中依旧是比较输入信号与0FDH是否相等。总的来说, 这里应用的CJNE指令是用来判断Key1-Key5哪个键被按下, 以跳到相应的子程序中去, 硬件电路表现为由开关控制花样的变换。以下是Key1-Key5被按下的判断:Key1是否被按下, 则P1口输入数据与#11111110b进行比较, 相同则继续K1, 否则跳转到S1;S1:Key2是否被按下, 则P1口输入数据与#11111101b进行比较, 相同则执行K1, 否则跳转到S2;S2:Key3是否被按下, 则P1口输入数据与#11111011b进行比较, 相同则执行K2, 否则跳转到S3;S3:Key4是否被按下, 则P1口输入数据与#11110111b进行比较, 相同则执行K3, 否则跳转到S4;S4:Key5是否被按下, 则P1口输入数据与#11110111b进行比较, 相同则执行K5, 否则跳转到MAIN主程序;此时P1口数据为0FFH。

2.2 硬件程序设计

硬件工作原理。单片机: (1) XTAL1、XTAL2接外部晶振。 (2) P1.0~P1.4端口外接开关, 为输入信号的接收;P2.0~P2.7端口外接LED串联电阻, 为外部信号的输出。低电平有效。 (3) RST接复位信号。晶振电路:由两个电容和一个1MHZ的晶振部分, 主要给单片机提供基本的时钟信号。复位电路:由两个电阻, 一个开关, 一个电容组成, 主要用于电路的复位部分。开关电路:由6个开关组成, 一端接地, 另一端接单片机的I/O口, 用于控制单片机输出的选择。LED电路:由8个LED和电阻组成, 一端接高电平, 另一端接单片机的输出部分;电阻用来保护LED, 为保护电阻。P2口输出的高低电平来控制LED的点亮或熄灭。

3 结语

经过努力, 我终于完成了这次课程设计。花样流水灯的制作相对于别的设计来说, 已经相当简单, 既没有中断的设置, 也没有计数、定时部分, 子程序之间的跳转也是比较简单的, 仿真效果图出来了, 当时还是比较高兴的。

通过设计, 我增强了对单片机的理解, 学会查找资料, 遇到问题, 解决问题, 学会单片机的设计。更加详细地了解了51单片机内部结构以及个I/O口的应用, 信号的输入输出等, 并且参与实物的制作, 动脑又动手, 在制作实物的过程中, 布线以及焊接, 以及可能由于焊锡过多会导致电路被短的问题, 都让我学到了很多知识, 很多经验。

这次的设计, 问题还是有的, 比如LED灯高低电平的选择, 以及保护电阻的选取, 刚开始在LED灯外接了1K左右电阻, 可是发现灯不会亮, 但是P2口有信号输出, 然后我以为是高低电平接反了, 换了方向后LED依旧没有亮, 又考虑到是LED可能接错, 换了别样颜色的LED灯, 还是没亮, 最后查了资料, 才知道可能是保护电阻的问题, 改小电阻值, LED亮起, 我想这就是一个实验的过程。

在此单片机的设计中, 我还设想能加入中断和定时部分, 比如按下其中一个键后, 在闪烁一定的花型后自动跳入另外一种花型, 过一段时间又跳到再一种花型按下别的键又是别样的花型组合, 使该花样流水灯更加完善, 更加绚烂!或者是, 设计一个图案, 随着时间, 一个图案会在一个屏幕上流动。

参考文献

[1]肖洪兵.跟我学用单片机[M].北京:北京航空航天大学出版社, 2002.8.

[2]夏继强.单片机实验与实践教程[M].北京:北京航空航天大学出版社, 2001

单片机花样流水灯设计 篇2

这篇文章已经浏览了:233次

这里本站向大家介绍单片机几款流水灯设计程序

51单片机流水灯C语言源程序 ********************************** 文件名称:flash_led.c

文件说明:流水灯C程序

编写日期:2006年10月5日

程序说明:MCU采用AT89S51,外接12M晶振,P1口输出

****************************************************** #include //51系列单片机定义文件

#define uchar unsigned char //定义无符号字符

#define uint unsigned int //定义无符号整数

void delay(uint);//声明延时函数

void main(void)

{

uint i;

uchar temp;

while(1)

{

temp=0x01;

for(i=0;i<8;i++)//8个流水灯逐个闪动

{

P1=~temp;

delay(100);//调用延时函数

temp<<=1;

}

temp=0x80;

for(i=0;i<8;i++)//8个流水灯反向逐个闪动

{

P1=~temp;

delay(100);//调用延时函数

temp>>=1;

}

temp=0xFE;

for(i=0;i<8;i++)//8个流水灯依次全部点亮

{

P1=temp;

delay(100);//调用延时函数

}

temp=0x7F;

for(i=0;i<8;i++)//8个流水灯依次反向全部点亮

{

P1=temp;

delay(100);//调用延时函数

temp>>=1;

}

}

}

void delay(uint t)//定义延时函数

{

register uint bt;

for(;t;t--)

for(bt=0;bt<255;bt++);

}

/************************************************************ *89C51、S51单片机32个IO口流水灯测试程序

*Flash0、1、2、3分别对应单片机的P0、1、2、3四个口

*a程序对应流水灯从全灭到一个一个亮

*b程序对应流水灯从全亮到一个一个灭

*2006-7-26 10:57,OK!

*************************************************************/ #include

#include

#include

#define uchar unsigned char

#define uint unsigned int

#define TimeDelay 60000

void delay(uint n);

void Flash0a(void);

void Flash0b(void);

void Flash1a(void);

void Flash1b(void);

void Flash2a(void);

void Flash2b(void);

void Flash3a(void);

void Flash3b(void);

/************************************************************ *Function: 主函数

*Return:

*Modify:

*************************************************************/ void main(void)

{

while(1)

{

Flash1b();

Flash1a();

delay(TimeDelay);

delay(TimeDelay);

Flash0b();

Flash0a();

Flash2b();

Flash2a();

Flash1b();

Flash1a();

Flash3b();

Flash3a();

}

}

/************************************************************ *Function: 延时

*parameter:

*Return:

*Modify:

*************************************************************/ void delay(uint n)

{

while(n!=0)

{

n--;

}

}

void Flash0a(void)

{

uchar i;

uchar Temp;

Temp = 0x80;

for(i=0;i<8;i++)

{

P0 = ~Temp;

delay(TimeDelay);

Temp = Temp >> 1;

}

P0 = 0xff;

}

void Flash0b(void)

{

uchar i;

uchar Temp;

Temp = 0x80;

for(i=0;i<8;i++)

{

P0 = Temp;

delay(TimeDelay);

Temp = Temp >> 1;

}

P0 = 0;

}

void Flash1a(void)

{

uchar i;

uchar Temp;

P1 = 1;

Temp = 0x80;

for(i=0;i<8;i++)

{

P1 = ~Temp;

delay(TimeDelay);

Temp = Temp >> 1;

}

P1 = 0xff;

}

void Flash1b(void)

{

uchar i;

uchar Temp;

P1 = 1;

Temp = 0x80;

for(i=0;i<8;i++)

{

P1 = Temp;

delay(TimeDelay);

Temp = Temp >> 1;

}

P1 = 0;

}

void Flash2a(void)

{

uchar i;

uchar Temp;

P2 = 1;

Temp = 0x80;

for(i=0;i<8;i++)

{

P2 = ~Temp;

delay(TimeDelay);

Temp = Temp >> 1;

}

P2 = 0xff;

}

void Flash2b(void)

{

uchar i;

uchar Temp;

P2 = 1;

Temp = 0x80;

for(i=0;i<8;i++)

{

P2 = Temp;

delay(TimeDelay);

Temp = Temp >> 1;

}

P2 = 0;

}

void Flash3a(void)

{

uchar i;

uchar Temp;

P3 = 1;

Temp = 0x80;

for(i=0;i<8;i++)

{

P3 = ~Temp;

delay(TimeDelay);

Temp = Temp >> 1;

}

P3 = 0xff;

}

void Flash3b(void)

{

uchar i;

uchar Temp;

P3 = 1;

Temp = 0x80;

for(i=0;i<8;i++)

{

P3 = Temp;

delay(TimeDelay);

Temp = Temp >> 1;

}

P3 = 0;

}

===========

;P1口八个LED灯做三路流水灯实验

;***************************************************************;* Date : 2008.6.20 *

;* 网站单片机学习资料同步更新,敬请新老朋友随时关注 *

;***************************************************************

ORG 0000H

LJMP MAIN

ORG 030H

MAIN:MOV P1,#0DBH;11011011--0为亮,1为灭

ACALL DELAY

MOV P1,#06DH;01101101

ACALL DELAY

MOV P1,#0B6H;10110110

ACALL DELAY

AJMP MAIN

DELAY:MOV R7,#255;延时子程序

D1: MOV R6,#255

D2: DJNZ R6,D2

DJNZ R7,D1

RET

基于单片机的精确定时流水灯设计 篇3

1 分析设计

本文利用的是AT89C51单片机, 带有2个定时/计数器, T0和T1。有四种工作方式。

方式0:13位定时/计数方式;方式1:16位定时/计数方式;方式2:8位自动重装初值定时/计数方式;方式3:T0分为两个独立的8位定时/计数器, T1停止工作。本文采用定时方式, 产生0.05S的时间基准。可选择T0定时/计数器, 使其工作在方式1。计数初值确定按公式 计算[1]。fosc为单片机晶振频率, 为12MHZ。t为定时时间, 本设计中为0.05s。代入计算可得a=0x3CB0。这样设定后, T0每隔0.05s会溢出一次, 计算T0的溢出次数, 就可以实现精确定时。本设计拟采用每隔1s对流水灯进行一次控制, 即溢出20次对流水灯发出一次控制信号。只要改变控制信号, 就可以实现对流水灯的准确定时控制。

2 详细设计

2.1 硬件电路设计

元件清单:AT89C51单片机、LED灯7个。

本设计利用Protues软件进行硬件电路的仿真设计。单片机采用AT89C51, 利用单片机内部晶振, 可以通过软件设定单片机的晶振频率为12MHZ以满足设计要求。流水灯采用LED灯。单片机的P1口为准双向口, 可以直接驱动LED灯。

2.2 软件设计

软件设计采用C51程序编写。使流水灯工作方式为:第一秒钟L1, L3亮, 第二秒钟L2, L4亮, 第三秒钟L5, L7亮, 第四秒钟L6, L8亮, 第五秒钟L1, L3, L5, L7亮, 第六秒钟L2, L4, L6, L8亮, 第七秒钟八个LED灯全亮, 第八秒钟全灭, 以后又从头开始, L1, L3亮, 然后L2, L4亮……一直循环下去。

源程序清单如下:

inta=20, b=8;//a为计数变量, b为工作状态变量

{TH1=0X3C;//设定定时器1工作方式, 方式1

IE=0X88;//开中断

time1 () interrupt3using1//中断函数

a--;

3 功能调试

将源程序在Keiluvision4中生成可执行文件。在Protues中将可执行文件加载到单片机中, 点击运行, 观察LED灯的亮灭。可以看到每隔1SLED灯变换一种状态, 且与软件设定的功能一致。

4 结束语

本文利用单片机自带的定时器实现了精确定时, 并对流水灯实现了控制。对工业控制领域中的实时性问题作出了探索。

摘要:利用单片机定时器的定时功能, 设计了一种可以实现精确定时的流水灯。并利用Protues实现了仿真。

关键词:定时器,流水灯,单片机

参考文献

基于单片机的流水灯的设计与实现 篇4

所谓的流水灯是指一组在控制系统的控制下按照设定的顺序和时间来发亮和熄灭的灯。要完成流水灯的制作需要硬件电路板和相应驱动程序。

硬件电路由两部分组成,第一部分是开发系统组件模块——单片机AT89C52, 第二部分是灯光控制模块——8个发光二极管。P1口控制的发光二极管是流水灯的控制对象,利用这个控制对象实现流水灯的效果。具体电路设计如图1示:

原理图包括两个部分,第一个是单片机及其工作电路;第二部分是P1口控制的发光二极管电路。

1单片机及其工作电路

1.1单片机

单片微型计算机简称单片机,是典型的嵌入式微控制器(Microcontroller Unit), 单片机芯片常用英文字母的缩写MCU表示单片机,单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。单片机由运算器、控制器、存储器、输入输出设备构成,相当于一个微型的计算机(最小系统),和计算机相比,单片机缺少了外围设备等。概括的讲:一块芯片就成了一台计算机。

AT89C52是Atmel公司生产的8051内核,具有8K内部程序存储器的MCS-51系列单片机。图2是一款40引脚的双列直插式封装AT89C52芯片。

1.2单片机工作电路

单片机是一种大规模的数字集成电路,它的基本工作条件是电源、复位信号和时钟信号,只有具备了这些条件,单片机才能进行工作。这三个基本工作条件对应的电路分别是工作电压、时钟电路和复位电路。

(1)工作电压

单片机内部有各种电路,这些电路在工作时需要提供电源。图1中,单片机AT89C52,40脚为电源正极引脚(VCC), 20脚为电源负极引脚(VSS)。电源正极引脚一般接5V电源,负极引脚接地。工作电压负责VDD和VSS引脚之间施加的5V电源电压分配到单片机内的各个功能电路。

(2)时钟电路

为了让单片机的内部电路有序、有节拍地工作,需要为这些电路提供时钟脉冲信号,让时钟信号来控制它们的工作。18、19脚为时钟信号引脚(XTAL2、 XTAL1)。最常用的电路接法如图1所示: 在XTAL1和XTAL2之间外界一个晶振(Y1)和两个电容(C1、C2)到地,与片内电路共同构成一个时钟振荡器。振荡频率取决于外接石英晶体振荡器元件固有频率, 常选取12MHZ或6MHZ的晶振。

(3)复位电路

单片机复位电路就好比电脑的重启部分,当电脑在使用中出现死机,按下重启按钮电脑内部的程序从头开始执行。单片机也一样,当单片机系统在运行中,受到环境干扰出现程序跑飞的时候,按下复位按钮内部的程序自动从头开始执行。 MCS-51系列单片机采用高电平复位,即外接复位电路给复位引脚(AT89C52的9脚RST)送入高电平信号后,就可以对单片机内部电路进行复位了。

在单片机系统中,系统上电启动的时候复位一次,当按键按下的时候系统再次复位,如果释放后再按下,系统还会复位。 所以可以通过按键的断开和闭合在运行的系统中控制其复位。

单片机的复位电路如图1所示,在接通+5V电源的瞬间,由于C3来不及充电, 其两端电压UC3为0V,电阻R两端的电压UR为5V(UC1 +UR=5V),即单片机的9脚为高电平,该高电平信号进入9脚,对内部电路进行复位,该内部电路都进入初始状态。随着+5V电源对C3不断充电, C3两端的电压迅速上升,而R两端的电压则迅速下降,当C3两端电压充到+5V时,R两端电压为0V,单片机9脚变成0V,复位完成,单片机的内部电路开始工作。由于该复位过程在单片机接通电源时就会自动进行,故称为上电复位。

如果单片机工作不正常,可按一下复位开关S1,在按下开关时,+5V电源通过R加到9脚,9脚为高电平,该高电平对内部电路进行复位,使内部电路全部回到初始状态,当S断开时,9脚变成低电平, 复位结束,单片机内部电路全部恢复到起始状态,然后重新开始工作。该复位过程称作手工复位。

2 P1口控制的发光二极管电路及软件编程

原理图中D1到D8是8个发光二极管,它们的阳极分别接到+5V的电源上, 它阴极分别通过一个1K的电阻接到P1口的各个引脚上。流水灯就是利用这8个发光二极管来实现的控制效果。关键的问题是如何点亮这些灯,又怎么样把它熄灭,从而实现流水灯的效果。

亮灯灭灯原理分析:以D1灯为例来分析,D1的阳极接到+5V电源上,D1阳极处在高电位“1”,若从P1^0送出低电平“0”,根据二极管单向导电性,D1是导通点亮的;若从P1^0送出高电平“1”,D1的两端都处在高电平,根据发光二极管原理,这时D1是截止熄灭的。从第一亮、灭分析,我们可以得出一个结论:P1^0=0,则灯亮;P1^0=1,则灯灭。这就变成了亮灯置0,灭灯置1。这给我们后面编程控制提供了一个思路,或者是一个方法。

如果让八盏等熄灭,根据前面的分析,我们只要把P1=11111111B,即P1=0xff;,送到P1口上。主函数是这样编写的:

#include // 包含定义单片机的头文件

void main() // 主函数

{

While(1) // 循环语句

{

P1=0xff; // 将P1.0---P1.7全置

“1”

}

}

这是灭灯控制。如果我想点亮第一个灯呢?根据刚才的原理,只要把P1=0xfe, 即P1=11111110B送到P1口上,第一盏灯是会亮的,为什么呢?因为0xfe用二进制表示出来就是11111110,高7位是7个1, 最低位是0,而且最低位刚好是P1^0,因此P1.0对应的D1灯是亮的。这就是用0xfe控制第一盏等点亮。

程序的编写参照刚才灭灯控制可以这样编写:

#include // 包含定义单片机的头文件

void main() // 主函数

{

while(1) // 循环语句

{

P1=0xfe; // 将P1.0清“0”(低电平),其余全部置1(高电平)

}

}

头文件和主函数,主函数里面还是用到循环语句把0xfe语句送给P1端口, 将P1.0清“0”(低电平),其余全部置1(高电平),因此对应第一盏灯亮,其余灯全部灭。这是点亮第一盏灯。

同样的方法,同样的道理我们可以点亮第二盏、第三盏、第四盏、第五盏、第六盏、第七盏、第八盏。这个过程中单片机P1口对应的数制如下表1所示:

只要依次按顺序点亮各盏灯,并且同时维持亮一段时间,所呈现出来的效果就是流水灯效果。因此,程序编写完全可以采用如下图3这样的方法来编写。

首先,设计一子函数用于延时调用, 然后是主函数,主函数里面嵌套一个循环语句,在循环语句里面分别点亮第一盏灯,亮0.5S,然后是熄灭第一盏灯,点亮第二盏灯,亮0.5S,以此类推第三、第四、第五、第六、第七、第八。具体程序如下所示:

单片机花样流水灯设计 篇5

51单片机的教学我们用的是现成的实验板,如图1所示的实验板,,芯片用STC90C516RD+,把该板子 用一根usb转串口的导线和电脑相连(如图2所示),既可以下载hex代码,又可以直接给单片机实验板供电。在做项目之前的准备工作是:

1、给开发单片机的电脑安装usb转串口驱动程序;

2、给开发单片机的电脑安装开发软件KeilμVision4 ;

3、给开发单片机的电脑安装hex代码下载软件stc-isp-15xx-v6.68 ;

4、给开发单片机的电脑安装绘制电路的软件Altium Designer 6。

选择这些软件时特别注意使用较新的版本,以适应目前的主流计算机操作系统win7的兼容性。

教学组织上,在上课之初,已经把学生按照单片机学习规律和学校的学习条件,分为两人一组的项目小组,硬件配置:一个试验箱,两台安装好需要软件的台式win7系统的电脑。两人一组的项目小组并没有明确的分工,主要还是每人独立完成,遇到困难,相互讨论,合作攻克难关。

本次课前,学生已经学习过用AltiumDesigner 6仿照实验板的电路图设计了单片机最小系统及流水灯应用电路,流水灯应用电路如图3所示。

2 项目要求

日常生活中随处可见色彩斑澜、不断变换样式的霓虹灯。本项目要求用STC90C516RD+单片机已经设计好的硬件电路——8盏不同颜色的LED

灯,模仿大街上的霓虹灯,设计C语言图3流水灯应用电路程序,实现8盏LED灯象行云流水般亮灭闪烁。

任务一:明确流水灯的设计要求:模仿大街上霓虹灯的8盏LED灯我们实际是接在P0口上。我们把任务细化:点亮其中的一盏灯,比如P07口的LED8。

任务二:我们熄灭刚才点亮的这盏灯PO7口的LED8。

任务三:我们依次点亮PO0口的LED1,熄灭PO0口的LED1;点亮PO1口的LED2,熄灭PO0口的LED2……点亮PO7口的LED8,熄灭PO7口的LED8。重复第三个小任务,直到断电。

任务拓展:增加显示花式。显示花式自定义。比如说,实现流水灯从一端显示到另一端,显示到底时,再反过来,从终端显示到开始端。再比如说,还可以调整变化每盏流水灯的亮灭时间。

教学时间:两课时。

教学准备:电子课件等。

教学过程:

复习,导入新课:

请大家把上次课已经完成的流水灯硬件设计——电路原理图打开。

请大家回答:1. 这个电路图中包含哪些模块?

单片机最小系统

复位电路模块

振荡电路模块

电源接口模块

STC90C516的31号引脚接电源正极

单片机应用电路

流水灯应用电路

请大家回答:2. 如何能使发光二极管亮灭?

发光二极管具有二极管的通性:正向导通,反向截止。发光二极管导通时亮,截止时灭。

请大家回答:3. 如何能使发光二极管正向导通和反向截止?

发光二极管的阳极已经通过J9这个接插件连接了电源 +5V,已经不能随便控制它了。那么从发光二极管的阴极看,我们可以通过51单片机STC90C516的P0口给它赋值,使它为高电平或者低电平,高电平时,发光二极管截止,二极管熄灭;低电平时,发光二极管导通,二极管亮。

3 项目实施

教师演示,学生模仿:请大家打开KeilμVision4,建立好流水灯的项目,给项目组里添加好C代码文件。现在开始第一个任务,如何设计C语言程序,能使这个灯点亮?请大家一起来看代码,听老师讲解,一起动手做一做。

第一条语句,是一个包含头文件的编译预处理命令。51单片机的头文件完全是依赖于所选用的单片机型号,我们刚才选择了Atmel公司的AT89C51芯片,所以此处对应的头文件可以选择AT89X51.H、AT89X52.H、AT89X55.H等。

第二条语句,定义了两个无符号整型变量,以用于延时for语句变量。请问同学们,为什么要延时,不延时行不行?

从第三条语句到第9条语句,是main函数。大家仔细观察,main函数中只有一个while(1),这是每一个嵌入式系统必备的死循环,至少需要一个,根据实际情况可以有多个。在这个while(1)的死循环中,我们点亮LED8。大家注意点亮灯的方式,就是给它对应的单片机I/O口赋值0,点亮灯后,用两个for语句嵌套延时。

最后编译程序,调试程序,直到生成HEX代码。

教师讲解完后,在教室巡视,查看、指导学生熟悉keil软件,编写调试代码。

在每一个项目小组都生成HEX代码后,教师演示指导学生用USB线连上单片机实验板和电脑,打开STC-ISP(V6.68) 这款下载HEX代码的软件,按照软件指示,选择:

单片机型号:STC90C516RD+

串口号:COMx

最高波特率和最低波特率可以选择默认

打开HEX代码

下载

如图5所示。这款HEX代码下载软件也是非常清晰地指示了使用方法,而且还有很多的其它资料可供参考。

下载成功后,大家会看到实验板上的LED8灯亮了。

那么对于任务二,教师启发,引导学生自己完成。

对于任务三,已经有学生捷足先登了。由于是沿袭了任务一,任务二的思路,所以代码较长。能不能使代码精简呢?试试以下的思路:

延时用一个延时子函数来代替两个for语句的嵌套。

给单片机赋值摒弃按位赋值,取之以按字节赋值。如下所示:

P0=0xfe;

delay(10);

……

在老师的启发指导,学生之间的相互协作下,也胜利地完成了任务三。

那么,对于任务拓展,学生的思路就开阔好多,他们再参照教材和讲义,已经有好几种方案出现,并实践检验是可行的。

4 项目评价

在项目实施过程中,通过老师的检查,指导,已经对同学们的实践做出了指导和建议性评价,同学们在实践过程中也给了项目组评价、其他组成员评价。

在项目(分项目)结束时,教师要求做的好的同学演示自己的成果,并给予经验分享。由教师给大家作总结性评价,并作纸质版记录。以作为平时成绩。

5 布置作业

两节课的课时结束了,但是这个项目并没有结束。给学生布置作业,以便于巩固今天所掌握的知识和技能,利于下节课继续深入做项目。

在学生自己的电脑上完成任务拓展,并生成HEX代码。把keil所建的工程打包发我邮箱。由于学生没有试验箱,所以不强求下载到实验板上验证。

把今天的课堂按照固定的格式做个小结,交纸质版作业。

摘要:在项目实施过程中,通过老师的检查,指导,对同学们的实践做出了指导和建议性评价,同学们在实践过程中也给了项目组评价、其他组成员评价。

上一篇:生物力学固定技术下一篇:外墙保温工程施工技术