如何用单片机简单制作一个流水灯
工具:STC系列51单片机、串口转换器(USB转TTL 或232转TTL)
材料:实验板一块(可以买现成的,也可以买面包板自己搭建),电阻、LED灯 若干,5V电源等。
以下程序可以直接用Keil C 直接编译执行。
//可以通过左移函数_crol_()和右移函数_cror_()来实现LED等的来回流动。
//具体实现方法可以参考如下程序:
#include <reg51.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
void delay(uint a)
void main()
{
P1=0xfe
while(1)
{
// 向左循环点亮LED
for(i=0 i<7 i++)
{
P1=_crol_(P1,1) // 左移一位,点亮下一位LED
delay(55)
}
// 向右循环点亮LED
for(i=0 i<7 i++)
{
P1=_cror_(P1,1) // 右移一位,,点亮上一位LED
delay(55)
}
}
}
// 延时函数,延时a毫秒
void delay(uint a)
{
uint x,y
for(x=ax>0x--)
for(y=110y>0y--)
}
单片机流水灯C语言程序的源代码如下:
#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=0i<8i++) //8个流水灯逐个闪动
{
P1=~temp
delay(100)//调用延时函数
temp<<=1
}
temp=0x80
for(i=0i<8i++) //8个流水灯反向逐个闪动
{
P1=~temp
delay(100)//调用延时函数
temp>>=1
}
temp=0xFE
for(i=0i<8i++) //8个流水灯依次全部点亮
{
P1=temp
delay(100)//调用延时函数
temp<<=1
}
temp=0x7F
for(i=0i<8i++) //8个流水灯依次反向全部点亮
{
P1=temp
delay(100)//调用延时函数
temp>>=1
}
void delay(uint t) //定义延时函数
{
register uint bt
for(tt--)
for(bt=0bt<255bt++)
}
扩展资料
51单片机流水灯的源代码如下
#include<reg51.h>
#include<intrins.h>
void delay(int a)
{
int i
while(a--)for(i=0i<110i++)
}
main()
{
int i
while(1)
{
P0=0xfe
for(i=0i<8i++)
{
P0=_crol_(P0,1)
delay(500)
}
}
}
电路的核心部分是AT89C2051单片机,前面提到它有Pl和P3两组I/O口,我们这里只用到Pl口,共8个引脚。图中Cl、R9组成典型的上电复位(即在加电时单片机复位)电路,XTAL、C2、C3与AT89C2051片内振荡电路组成时钟振荡器。值得注意的是,C2、C3的容量不能与图中数值偏差太大,否则可能引起不起振或振荡不稳定。XTAL的频率可以在4-20MHz之间,不过,频率的变化会导致程序运行速度的变化,这样就需要调整延时子函数的参数。事实上,不调整参数亦可,只是此时延迟时间不再是1秒,其延迟时间会随着XTAL频率的降低而增加。
二、软件部分
本程序包含两个函数,一个是主函数,另一个是延时子函数。源程序如下(为了便于讲解,我们为每行程序加上了编号):
程序各行作用如下:
00行:把AT89C2051的头文件“AT89x051.H”包含进来。
01行:声明Delay()延时子函数,该函数有一个无符号整型参数k,同时函数前面的void表明函数不返回函数值。
02行:延时子函数的开始,同时声明两个无符号整型变量i和j。
不过请注意,这里没有象上期的程序一样,把表示函数开始的“{”单独成行,而是把下一行写在一起了。事实上,写C程序的时候,可以把多行写作一行,C编译器只要遇到分号就认为是一行语句的结束。
当然,我们不能因为C程序有这个特点,就随意把多行合作一行书写,实际书写C程序的时候,还是要养成良好的程序书写习惯,按照约定俗成的原则来书写。
03行:声明for()循环。这个循环的初始条件是i=0,终止条件是i<k,循环计数是每循环一次,用手计数的变量i加1。因此,这个循环的循环次数就是k次。这样,只要改变k的值(即改变Delay()延时子函数的参数k的值),就可以很容易地控制循环次数,从而获得不同的延时时间。
04行:声明嵌套在03循环中的一个新的for()循环,这个循环与上一个循环相似,其循环次数是120次。本循环与上一个循环嵌套后,使得总的循环次数达120×k次。
05行:第一个分号,表示L条空语句,占用一个机器时间,以实现延时的目的。后面的两个“}”中,第一个“}”是04行for()循环的结束标志,程序遇到它时,将自动返回04行,使用于循环计数的变量j加1,同时判断j是否小于120,如果否,则转入05行;第二个是03行for()循环的结束标志,程序遇到它则会返回03行
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define led_data P0 //数据口定义
//延时程序
void delay(uint a)
{
uint i,j
for(i=ai>0i--)
{
for(j=4000j>0j--)
}
}
//主程序
void main()
{
while(1)
{
led_data=0xdb
delay(5) //延时一段
led_data=0x6d
delay(5)//延时一段
led_data=0xb6
delay(5) //延时一段
}
}
功能 :p0口八个灯作3路跑马灯
LED_DATA EQU P0 数据口定义
ORG 0000H
LJMP MAIN
ORG 030H
MAIN: MOV LED_DATA,#0DBH 11011011--零为亮
ACALL DELAY 延时一段
MOV LED_DATA,#06DH 01101101
ACALL DELAY 延时一段
MOV LED_DATA,#0B6H 10110110
ACALL DELAY 延时一段
AJMP MAIN 跳转回主程序
DELAY: MOV R7,#255 延时子程序
D1: MOV R6,#255
D2: DJNZ R6,D2
DJNZ R7,D1
RETEND
你没有说是用C语言编写还是用汇编啊
(汇编我还没学)
=======================
电路可以这样设计,
①P3口接4*4矩阵键盘或是直接接8个按键。
②P0口、P2口 合起来共16个I/O口,直接接16个发光二级管。
注意I/O口接三极管的负极,三极管正极串上一个1K的保护电阻,然后接+5V。
别忘了P2口的上拉电阻,用10*8的排阻就行(排阻公共端接+5V)
其他的就是复位电路、晶振、电源、程序下载口了,都比较简单,而且都是固定模式。
指示灯直接用发光二级管串分压电阻接到电源就行了。
电源可以用7805稳压(输入电压>5V时),或者直接用5V电就行了。
=====================================================================
写程序方面:
数量比较多,流水灯设计宜用位操作,
①流水灯
for(i=0i<7i++)
{
P2=~pow(2,i)delay(500)
}
这样就是8位流水灯了
剩下的8个一样。
delay是一个延时函数,就是让单片机空转消耗时间,可以这样
delay(int time)
{int x=0,y=0
for(x=0x<timex++)
for(y=0y<100y++)
}
②16灯逐个点亮。
P2=0xff(开始8个灯都灭)
for(i=0i<7i++)
{
P2=P2--(每次点亮一盏灯)
delay(500)
}
这样就可以8位的流水灯
另外8个接下来一样的方法点亮,
这样就是16灯逐个点亮。
============
③逐渐点亮一个灯
用延时长短来控制
sbit P20=P2^0
int m=500
for(i=0i<500i++)
{
P20=1delay(m)(灭P2.0口的灯)
P20=0delay(500-m)(亮P2.0口的灯)
m--
}
这样就可以500级渐亮一个灯了。
渐灭类似。
④ A-D-A
循环可以用for()来实现
或者直接来有条件跳转。
goto就行了
=========================
说的比较零碎,自己整合一下就OK;
{
TH0=(65536-45872)/256 //50ms中断一次
TL0=(65536-45872)%256
pp++
}
程序如下:
#include <reg52.h>
sbit led1 = P2^0
sbit led2 = P2^1
sbit led3 = P2^2
sbit led4 = P2^3。
让电子信息技术与单片机技术相融合,有效提高了单片机应用效果。作为计算机技术中的一个分支,单片机技术在电子产品领域的应用,丰富了电子产品的功能,也为智能化电子设备的开发和应用提供了新的出路,实现了智能化电子设备的创新与发展。
从二十世纪九十年代开始,单片机技术就已经发展起来,随着时代的进步与科技的发展,目前该技术的实践应用日渐成熟,单片机被广泛应用于各个领域。现如今,人们越来越重视单片机在智能电子技术方面的开发和应用,单片机的发展进入到新的时期。
无论是自动测量还是智能仪表的实践,都能看到单片机技术的身影。当前工业发展进程中,电子行业属于新兴产业,工业生产中人们将电子信息技术成功运用。
LJMP MAIN
ORG 000BH
LJMP T0ISR
ORG 0030H
MAIN:
MOV TMOD,#01H
MOV TH0,#HIGH(65536-50000)
MOV TL0,#LOW(65536-50000)
SETB TR0
SETB ET0
SETB EA
MOV R2,#10
MOV A,#0FFH
MOV P1,A
SJMP $
T0ISR:
CLR TR0
MOV TH0,#HIGH(65536-50000)
MOV TL0,#LOW(65536-50000)
SETB TR0
DJNZ R2,T0E
MOV R2,#10
CLR C
RLC A
MOV P1,A
JNZ T0E
MOV A,#0FFH
T0E:
RETI
END
2、使用keil4软件进行流水灯程序的编辑。
3、方法一编写程序采用的是左移函数(_crol_(a,b))和右移函数(_cror_(a,b))的方法,需在前加上头文件#include。方法二是一个比较笨的方法,需要计算出每个灯亮的位编码。
4、总结:单片机流水灯的设计分为两个步骤,第一步是原理图的绘制;第二步是keil4流水灯控制程序的编写。在写程序的时候最好使用第一种方法,采用位移函数来进行流水灯的设计。