单片机c语言编了个流水灯,用按键怎么实现它暂停。

单片机c语言编了个流水灯,用按键怎么实现它暂停。,第1张

实现流水灯的方式有很多种(中断,定时器,延时等等),看用哪种方式,最简单的是延时做流水灯,那么在死循环里面增加按键检测,判断出有按键按下来时,再进入死循环,程序不往下走就可以暂停,再按跌出死循环。

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

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

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

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

void main(void)

{

uint i;

uchar temp;

uint Flag1=0;  按键标志位bai

uint Flag2=0;

while(1)

{

Flag1 = keyscan();

if(Flag1==1)(Flag2=~Flag2); //如果一旦检测到一次按键扫描就把标志位2 打开;再次就关闭;

if(Flag2==1)// 如果标志位打开就开始流水灯

{

temp=0x01;

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

{

P1=~temp;

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

temp<<=1;

}

}

扩展资料:

单片机编程就是硬件是单片机,基于单片机进行的程序开发,在有周围外设支持的情况下,用软件来控制的部分通过单片机编程来实现。单片机能识别的语言是硬件语言即汇编,因此编程就是围绕汇编来实现,有直接用汇编程序来编写的,但是较难调试的编写,特别是一上规模就更不易实现,因此常用高级语言来写然后通过编译器转化成汇编。

参考资料来源:百度百科-单片机C语言编程

流水灯就是51单片机控制led灯依次点亮的控制方式。具体程序如下:

ORG 0000H ;复位启动

AJMP START ;

ORG 001BH ;T1中断

AJMP T1INT ;

;定义变量========================

YSJS EQU 30H;延时计数器

LED EQU 31H;LED控制缓冲器

;主程序==========================

START: MOV LED,#0FEH ;初始化数据

MOV YSJS,#0 ;

MOV TMOD,#10H ;定时器1工作于方式1,16位定时器

MOV TL1,#0B0H ;设置定时初值

MOV TH1,#3CH ;定时时间=50mS

SETB ET1 ;使能定时器1中断

SETB TR1 ;启动定时器1

SETB EA ;开总中断

MOV P1,LED ;初始化流水灯

LOOP: JMP LOOP ;循环等待中断

T1INT: PUSH PSW ;定时器1中断程序

PUSH ACC ;保护现场

MOV TH1,#3CH ;定时时间=50mS

MOV TL1,#0B0H ;

INC YSJS ;

PUSH ACC ;保护ACC

MOV A,YSJI ;

CJNE A,#2,QT1 ;50mS2=100mS

MOV P1,LED ;

MOV A,LED ;

RL A ;累加器A的值循环左移1位

MOV LED,A ;

MOV YSJS,#0 ;

QT1: POP ACC ;恢复现场

POP PSW ;

RETI ;返回主程序

END ;汇编程序结束

扩展资料:

实现流水灯的三个方法:

第一种,总线方法实现流水灯。这是一种比较笨但又最易理解的方法,采用顺序程序结构,用位指令控制P1口的每一个位输出高低电平,加上延时函数,即可控制每个LED灯的亮灭。

第二种,移位方法实现流水灯采用循环程序结构编程。首先在程序开始给P10口送一个低电平,其它位为高。然后延时一段时间再让低电平往高位移动,这样就实现“流水”的效果了。

第三种,库函数实现流水灯。利用左移函数进行。

//单片机流水灯程序,是学习单片机的最简单的程序。

//流水灯

#include <REG51h>  //51头文件

#define DY_PORT P1 //设置LED连接的I/O组

#define DY_SPEED  100 //设置每一个明亮级的停留时间(值域:0~65535)

void delay (unsigned int a){ // 1ms延时程序

unsigned int i;

while( --a != 0){

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

}    

}

void main(void){

unsigned int i;

unsigned int temp;

while(1){

temp=0x01;

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

DY_PORT=~temp;

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

temp<<=1;

}

temp=0x80;

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

DY_PORT=~temp;

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

temp>>=1;

}

temp=0xFE;

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

DY_PORT=temp;

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

temp<<=1;

}

temp=0x7F;

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

DY_PORT=temp;

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

temp>>=1;

}

}

}

#include <reg51h>

#include<intrinsh>

#define uchar unsigned char

uchar j,temp;

void delay(unsigned int ms)

{

uchar t;

while(ms--)

for(t=0;t<123;t++);

}

void main()

{

P1=0xff;

delay(500);

temp=0xfe; //有点怪,led接在P23~P26

for(j=0;j<4;j++)

{

P1=temp;

delay(500);

temp=_crol_(temp,1);

}

P1=0xff;

while(1);

}

单片机中流水灯控制:

硬件连接很简单,只要将8个LED指示灯接在P1口上

另一端通过220欧姆的电阻接+5V电源上,就可以了。

主要靠软件控制,简单的可以使用左移或右移指令,将低电平0

逐渐移入寄存器中,即控制LED指示灯逐渐一个一个地点亮或一个一个地熄灭。

复杂点:

可以进行花式流水控制。

例如:

可以由两边逐渐向内点亮

然后再由内逐渐向外一个一个熄灭。

还可以由由内逐渐向两边内点亮

然后再由两边渐向内逐一个一个熄灭。

在程序的实现上

可以把各种花式流水的P1口亮灭状态字

事先定义成数组

然后每隔一定的时间

取出送P1口显示。

呵呵

俺只提供给你一个号的算法

程序就自己动手自立更生吧

满意

就选满意回答

#include <reg52h>

void delay(unsigned int cnt)

{

while(--cnt);

}

main()

{

P1=0xfe;//给初始化值

while(1)

{

delay(30000);

P1<<=1;//左移一位

P1|=0x01;//最后一位补1

if(P1==0x7f)

{

delay(30000);

P1=0xfe;

}

}

}

#include

"reg52h"

#include

"intrinsh"

//循环移动函数要用到的头文件

void

Delay(unsigned

int

t)

//延时子程序

{

unsigned

i;

while(t--!=0)

{

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

{;}

}

}

void

main(void)

{

unsigned

char

temp,num1,num2;

P0=0xff;

//LED初始化

起始状态

P2=0xff;

while(1)

//大循环

{

temp=0xfe;

//送给P0口的初值

点亮一侧第一个灯

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

//循环体用于循环左移用

循环8次

{

P0=temp;

//给P0

P2=0xff;

//P2控制的灯灭

Delay(100);

//延时

temp

=

_crol_(temp

,

1);

//执行一次循环就循环左移一位

与汇编的

RL功能相同

}

temp=0x7f;

//送给P0口的初值

点亮另一侧第一个灯

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

{

P0=temp;

P2=0xff;

Delay(100);

temp

=_cror_(temp,1);

//循环右移

同RR

下面的就是控制P2口了

同上面类似

}

//这个程序实现的效果是:先让P0口控制的LED自右向左点亮(只亮一个灯)再自左向右点亮

然后就是P2口

temp=0xfe;

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

{

P2=temp;

P0=0xff;

Delay(100);

temp

=

_crol_(temp

,

1);

}

temp=0x7f;

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

{

P2=temp;

P0=0xff;

Delay(100);

temp

=_cror_(temp,1);

}

}

}

以上就是关于单片机c语言编了个流水灯,用按键怎么实现它暂停。全部的内容,包括:单片机c语言编了个流水灯,用按键怎么实现它暂停。、51单片机中如何用汇编语言编写流水灯、求52单片机流水灯程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/9709620.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存