我是一名多年的单片机工程师,下面的程序你参考一下
效果图
程序如下:
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uint i;
uchar j;
void delay_ms(uint k) //延时子程序
{
for(i=0;i<k;i++)
{
for(j=0;j<230;j++)
{
;
}
}
}
main()
{
uchar a,b;
P1=0xfe;
delay_ms(500);
b=P1;
while(1)
{
for(a=0;a<3;a++)
{
b=_crol_(b,1);
P1=b;
delay_ms(500);
}
P1=0xf0;
delay_ms(500);
P1=0xfe;
delay_ms(500);
b=P1;
}
}
如果你想学习更多单片机和程序的知识,可以看看我整理好的“17个实验学会单片机”,百度一下“17个实验学会单片机”就可以看到在首页了。
流水灯程序设计
很简单啊
你没有说是用C语言编写还是用汇编啊
(汇编我还没学)
=======================
电路可以这样设计,
①P3口接4*4矩阵键盘或是直接接8个按键。
②P0口、P2口 合起来共16个I/O口,直接接16个发光二级管。
注意I/O口接三极管的负极,三极管正极串上一个1K的保护电阻,然后接+5V。
别忘了P2口的上拉电阻,用10*8的排阻就行(排阻公共端接+5V)
其他的就是复位电路、晶振、电源、程序下载口了,都比较简单,而且都是固定模式。
指示灯直接用发光二级管串分压电阻接到电源就行了。
电源可以用7805稳压(输入电压>5V时),或者直接用5V电就行了。
=====================================================================
写程序方面:
数量比较多,流水灯设计宜用位操作,
①流水灯
for(i=0;i<7;i++)
{
P2=~pow(2,i);delay(500);
}
这样就是8位流水灯了
剩下的8个一样。
delay是一个延时函数,就是让单片机空转消耗时间,可以这样
delay(int time)
{int x=0,y=0;
for(x=0;x<time;x++)
for(y=0;y<100;y++);
}
②16灯逐个点亮。
P2=0xff;(开始8个灯都灭)
for(i=0;i<7;i++)
{
P2=P2--;(每次点亮一盏灯)
delay(500);
}
这样就可以8位的流水灯
另外8个接下来一样的方法点亮,
这样就是16灯逐个点亮。
============
③逐渐点亮一个灯
用延时长短来控制
sbit P20=P2^0;
int m=500
for(i=0;i<500;i++)
{
P20=1;delay(m);(灭P2.0口的灯)
P20=0;delay(500-m);(亮P2.0口的灯)
m--;
}
这样就可以500级渐亮一个灯了。
渐灭类似。
④ A-D-A
循环可以用for()来实现
或者直接来有条件跳转。
goto就行了
=========================
说的比较零碎,自己整合一下就OK;
解释一下这个流水灯程序
#include<reg51.h> //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; //将temp取反再赋值给P1口
delay(100); //调用延时函数
temp<<=1; 流水灯左移
}
temp=0x7F; //给初值,第一个灯亮。
for(i=0;i<8;i++) //8个流水灯依次反向全部点亮
{
P1=temp; //将temp赋给P1
delay(100); //调用延时函数
temp>>=1; //流水灯右移
}
}
}
void delay(uint t) //定义延时函数
{
register uint bt;
for(;t;t--)
for(bt=0;bt<255;bt++);
}
temp 是自己定义的。名字可以随便取,没实际意义。是一个中间变量。。。
流水灯闪烁PLC程序图
拿走,不用谢
请在此输入您的回答
请问,哪个是计数器版,哪个是定时器版
定时器版的,没写计数器
用keil写的来回流水灯程序,要求左右来回的
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
void DelayMS(uint x)
{
uchar t;
while(x--)
{
for(t=120;t>0;t--);
}
}
void main()
{
uchar i;
P2=0x01;
while(1)
{
for(i=7;i>0;i--)
{
P2=_crol_(P2,1);
DelayMS(150);
}
for(i=7;i>0;i--)
{
P2=_cror_(P2,2);
DelayMS(150);
}
}
}
不懂就问,要根据你电路图的连接来适当调整管脚定义。更多
把这个写成左右的流水灯怎么写?
你写的有点啰嗦了,j和k要了干嘛,
还有_crol_是循环左移,你移完了不延时的话也看不出来啊,所以要用一个for循环,每移动一次就延时一次。
把我上面程序里的P2改成P1就可以了。
可不可以把每步的意思告诉我
#include <reg52.h>
#include <intrins.h>//这个就是循环移位的头文件
#define uchar unsigned char//这个应该知道的吧
#define uint unsigned int
void DelayMS(uint x)//延时函数
{
uchar t;
while(x--)
{
for(t=120;t>0;t--);
}
}
void main()
{
uchar i;
P2=0x01;//给P2管脚赋值,P2连的是发光二极管
while(1)
{
for(i=7;i>0;i--)//移7次
{
P2=_crol_(P2,1);//循环左移,每次移一位
DelayMS(150);//延时一下,这样人眼就能看出来,不延时的话人眼不能识别,机器处理的太快
}
for(i=7;i>0;i--)
{
P2=_cror_(P2,2);//循环右移,每次2位
DelayMS(150);
}
}
}
一键多控流水灯汇编语言怎么写,软件是keil
一键多空流水灯汇编语言程序编写方法是:设置一个变量,来检测按键的次数,从而控制程序分支来达到控制不同流水灯的效果例如:
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN:
MOV R6,#0FEH
MOV R7,#0
LOOP:
JB P1.0,LOOP1
JNB P1.0,$
INC R7
CJNE R7,#2,LOOP1
MOV R7,#0
LOOP1: ;奇数次按键左向流水灯
MOV A,R7
JNZ LOOP2
MOV A,R6
MOV P0,A
RL A
MOV R6,A
LCALL DELAY
SJMP LOOP
LOOP2: ;偶数次按键右向流水灯
MOV A,R6
MOV P0,A
RR A
MOV R6,A
LCALL DELAY
LJMP LOOP
DELAY:
MOV R2,#200
DL1:
MOV R3,#250
DJNZ R3,$
DJNZ R2,DL1
RET
END
如何用单片机简单制作一个流水灯
工具:STC系列51单片机、串口转换器(USB转TTL 或232转TTL)
材料:实验板一块(可以买现成的,也可以买面包板自己搭建),电阻、LED灯 若干,5V电源等。
以下程序可以直接用Keil C 直接编译执行。
//可以通过左移函数_crol_()和右移函数_cror_()来实现LED等的来回流动。
//具体实现方法可以参考如下程序:
#include<reg51.h>
#include<intrins.h>
#defineuintunsignedint
#defineucharunsignedchar
voiddelay(uinta);
voidmain()
{
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毫秒
voiddelay(uinta)
{
uintx,y;
for(x=a;x>0;x--)
for(y=110;y>0;y--);
}
转载请注明出处51数据库 » 流水灯软件 单片机流水灯程序
经肛鉆



