问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

51单片机流水灯如何通过两个按键启动和停止 ,怎么停止

发布网友 发布时间:2022-04-23 05:39

我来回答

5个回答

热心网友 时间:2023-10-16 21:25

// 改了一下试试

#include<reg52.h> //包含 reg52.h 这个头文件

#include<intrins.h>

#define led P2//

char i;

sbit k1=P3^6; //启动按键

sbit k2=P3^7;//停止按键

bit  s=0;        //  启停标志

char a[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //LED灯的数组

void delay1s(void); //延时函数

void liushuideng(); //流水灯的循环

void main()

{

led=~0xff;

k1=1;

while(1)

{

if(k1==0)  

{      

s = 1 ;

}

if(k2==0)

s = 0 ;

led=~0xff;

}  

if(s==1)

{

i = i + 1 ;

if(i==8){i=0;}

led=~a[i];//LED灯通过遍历数组产生变化

delay1s();//延时500ms

}

}

}

void delay1s(void) //误差 -0.000000000227us

{

unsigned char a,b,c;

for(c=13;c>0;c--)

for(b=247;b>0;b--)

for(a=142;a>0;a--);

_nop_(); //if Keil,require use intrins.h

}

热心网友 时间:2023-10-16 21:26

#include<reg52.h> //包含 reg52.h 这个头文件
#include<intrins.h>
#define led P2//

sbit k1=P0^0; //启动按键
sbit k2=P0^1;//停止按键
void delay1s(void); //延时函数

void liushuideng(); //流水灯的循环

void main()
{
led=~0xff;
k1=1;
while(1)
{
if(k1==0)
{
liushuideng();
if(k2==0)break;
}
}
}

void delay1s(void) //误差 -0.000000000227us
{
unsigned char a,b,c;
for(c=13;c>0;c--)
for(b=247;b>0;b--)
for(a=142;a>0;a--);
_nop_(); //if Keil,require use intrins.h
}

void liushuideng()
{
char i;
char j=0;
char a[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //LED灯的数组

while(1)
{
if(j<2) //循环的次数
{
for(i=0;i<8;i++) //循环i;i+1
{
led=~a[i];//LED灯通过遍历数组产生变化
delay1s();//延时500ms
if(k2==0)return;
}
j++;//循环次数累加
}
led=~0xff;
if(k1!=1&&j!=0)
{
j=0;
}
}
}

热心网友 时间:2023-10-16 21:26

由于流水灯一个循环时间很长,在此期间按下按键是没有响应的
可以用中断的方法或将按键检测插入到 流水灯的延时过程中
void main()
{
led=~0xff;
k1=1;
while(1)
{
if(k1==0)
{
delayms(10);
if(k1==0) flag=1;
}
if(flag==1)liushuideng();
}
}
流水灯不要死循环,因主程序就 是一个大循环程序
将按键2的检测加入for循环中
for(i=0;i<8;i++) //循环i;i+1
{
led=~a[i];//LED灯通过遍历数组产生变化
if(k2==0)
{delayms(10);if(k2==0) flag=0;break}
delayms(250);//延时250ms
if(k2==0)
{delayms(10);if(k2==0) flag=0;break}
delayms(250);//延时250ms
}追问怎么用中断的方式??

热心网友 时间:2023-10-16 21:27

#include "reg51.h" /* 此文件中定义了单片机的一些特殊功能寄存器 */
#include <intrins.h>
typedef unsigned int int16_t; /* 对数据类型进行声明定义 */
typedef unsigned char int8_t;

#define LED P2
/**************端口定义************************************************/
sbit Key_B=P3^3; //外部中断1,HC6800-ES-V2.0板子是独立按键K4键
/*********变量定义******************************************/
bit Start=0;

void IntConfiguration()//外部中断设置子函数
{
IT1=1;
EX1=1;
EA=1;
}

void delay( int16_t i )
{

while ( i-- );

}

void LSD ( )
{
int8_t i=0;
int8_t LED_Last=0;

LED=0xfF;
for(i=0;i<=7;i++)
{
LED=LED<<1;
// LED_Last=LED;

delay(50000);
}
}

void main()
{
IntConfiguration();
while(1)
{
while (Start)
{
LSD ( );
}
LED=0xff;
}
}

void Int1(void) interrupt 2//外部中断1的中断服务函数
{
delay(50000);
Start=~Start;
IE0=0;
}

热心网友 时间:2023-10-16 21:27

楼主 带带我
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
word2010插入尾注时自动带出的一根线怎么删除 如何取消Word2010的尾注横线? 拔丝山药的做法大全 拔丝山药的家常做法 哪个季节去婺源最好,婺源周边游哪里好 江西婺源茶业职业学院院校代码 婺源属于哪个省市 一个两位数除以它的反序数所得的商数恰好等于余数,试求这个两位数。 502除以一个数,除到商是7余数是多少 52除以一个数,余数最大的是多少。 员工随意不上班违法吗怎么举报 怎么报名? 装傻和真傻的区别是撒??? stc单片机不能启动的原因 政府办的ETC在那里领? 真傻的英语怎么读? 如何用设计单片机电路控制电机启动 怎么判断一个人是真傻还是装傻 etc怎么办理的? 单片机冷启动什么意思 真傻和装傻的性格是什么? 单片机 启动程序 装傻和真傻的区别 怎样网上报名? 单片机的按键启动和复位电路图 大智若愚和真傻的区别是什么? 什么是单片机冷启动 用qq注册的梦幻西游怎么登陆网易 真傻和装傻有什么区别 stc单片机如何冷启动? 如何我的qq号登陆不了梦幻西游 装傻和真傻,真的不一样! 真傻是幸福! 装傻是外在幸福,内心悲哀! 办了鲁通信用卡,怎样得到etc 单片机的启动代码start.s,汇编写的,并没有说地址是在什么位置,怎么可以保证这段代码不是在中断区域。 真傻和装傻有什么区别? 怎么报名呢? 单片机控制电动机启动的优缺点? 真傻和假傻的区别是什么? 为什么单片机启动定时器要在主函数装初值? 如何判断一个人是真傻还是假傻 怎样报名? 单片机中TCON和TMOD寄存器如何控制 怎样判断一个人是真傻还是假傻 装傻和真傻有啥区别吗? 如何报名? 简述单片机串行口的工作方式 12星座中谁是装傻,谁是真傻 怎样在网上报名? 装傻和真傻怎么辨别 怎么区分装傻和真傻? 如何判定一个人是不是真傻还是故意针对?