导航:首页 > 操作系统 > 单片机灭灯

单片机灭灯

发布时间:2022-10-03 02:14:22

A. 求实现51单片机按下按钮LED灯亮1秒后熄灭

外部中断的优先级是高于定时器中断的。首先是触发外部中断嘛,在外部中断程序里面开定时器中断,定时器设置为50ms,这个直接装初值大概46000(晶振12m)的样子,具体你自己算一下。然后在调用定时器中断程序里面肯定是要有个标志位的,这个标志位会累加n个定时器时间直到8s,然后在这个定时器中断程序里面不断检测3.2口电平就行了,如果变回高电平就把灯在点亮(比如在这句直接将flag赋到设定的技术最大值)就行了。最好用下降沿触发,低电平触发容易出问题总感觉,可能你程序逻辑是完全正确的,但是仿真或者实物的时候会出问题。

B. 要求用51单片机控制8个LED亮灭的原理图+程序+解说

本来以为这个程序很简单的,没想到写了快三个小时。哎学艺不精啊。贴出来给你研究吧。我不想做过多的解释了,我是按我理解的你出的题目做的,可能和你的本意不是很一样,
1、依次亮,依次灭:从一个灯亮到全亮,再到全灭,每次改变一个灯亮灭
2、奇偶号灯间隔亮灭:隔一个灯亮一个灯亮灯时间为1s,没有灯全灭的时候
3、依次闪烁、切换时间为3秒,闪烁时间为2秒,我理解的是,没三秒钟有一个灯在闪烁,其中有一秒钟是灭灯状态
程序中使用了P1口与8个发光二极管相连,具体电路图你网络一下吧,还有使用了一个按键,该按键与P3.7相连,低电平为按下状态。
程序如下:
#include <reg52.h>
#include <intrins.h>

/*变量声明:
i、j、k都是记录计时器溢出次数的变量,
stat是记录当前显示状态的变量,由按键key控制
temp是状态2中保护P1口状态的变量*/

unsigned char i=0,j=0,k=0,stat=0,temp;
bit flag=1; //状态1处于灭灯还是亮灯状态的变量,1为依次亮灯,0为依次亮灯
sbit key=P3^7; //按键控制
void init(); //初始化函数
void delay(unsigned int N); //延时函数
void keyscan(); //键盘扫描函数

void main()
{
init();

while (1)
{
switch (stat)
{
case 0: //0方案
if(i==20&&flag)
{
i=0;
P1=P1<<1; //依次亮灯
temp=P1;
if(temp==0)
{
flag=0;
}
}
if(i==20&&!flag)
{
i=0;
if(P1==0xff)
{
flag=1;
P1=0xfe;
}
if(!flag)
{
P1=P1<<1; //依次灭灯
temp=P1;

P1=temp+1;
}

}
break;
case 1: //2方案
if(i==20)
{
i=0;
P1=~P1; //去反后亮灯状态为灭灯,P1初值取0x55或0xaa,奇偶交替亮灯
}
break;
case 2: //3方案
if(j==60)
{
P1=temp;
P1=_crol_(P1,1);
temp=P1; //保护P1口亮灯状态
k=0;
j=0;
}

//闪烁部分,应该可以优化
if(k<5)
{
P1=0xff;
}
else if(k>=5&&k<10)
{
P1=temp;
}
else if(k>=10&&k<15)
{
P1=0xff;
}
else if(k>=15&&k<20)
{
P1=temp;
}
else if(k>=20&&k<25)
{
P1=0xff;
}
else if(k>=30&&k<35)
{
P1=temp;
}
else if(k>=35&&k<40)
{
P1=0xff;
}
//-----------------------------------
break;
}
keyscan();
}
}

void init()
{
TH0=0x3c; //定时器赋初值定时时间50ms
TL0=0xB0;
TMOD=0x01; //设置定时器工作方式为方式1
EA=1; //开总中断
ET0=1; //开中断允许位
TR0=1; //定时器计数

P1=0xfe; //这里假设led灯与P1口相连并且
//低电平有效

}
void delay(unsigned int N)
{
int i,j;
for (i=0;i<N;i++);
for (j=0;j<110;j++);
}
void keyscan()
{
if(!key)
{
delay(10); //消抖
if(!key); //确认有键按下
stat++;
if(stat==3)
{
stat=0;
}

//右键按下复位
i=0;
j=0;
k=0;
TH0=0x3c;
TL0=0xB0;
switch (stat)
{
case 0:
P1=0xfe;
flag=1;
stat=0;
break;
case 1:
P1=0x55;
break;
case 2:
P1=0xfe;
temp=P1;
break;
}
//-----------------------------------
while(!key) //此循环中的函数和主函数中的显示函数是同一个
//用于长按键的显示,可以去掉,去掉长按键不会正常显示,松开按键后正常
{
switch (stat)
{
case 0:
if(i==20&&flag)
{
i=0;
P1=P1<<1;
temp=P1;
if(temp==0)
{
flag=0;
}
}
if(i==20&&!flag)
{
i=0;
if(P1==0xff)
{
flag=1;
P1=0xfe;
}
if(!flag)
{
P1=P1<<1;
temp=P1;

P1=temp+1;
}

}
break;
case 1:
if(i==20)
{
i=0;
P1=~P1;
}
break;
case 2:
if(j==60)
{
P1=temp;
P1=_crol_(P1,1);
temp=P1;
k=0;
j=0;
}

if(k<5)
{
P1=0xff;
}
else if(k>=5&&k<10)
{
P1=temp;
}
else if(k>=10&&k<15)
{
P1=0xff;
}
else if(k>=15&&k<20)
{
P1=temp;
}
else if(k>=20&&k<25)
{
P1=0xff;
}
else if(k>=30&&k<35)
{
P1=temp;
}
else if(k>=35&&k<40)
{
P1=0xff;
}
break;
}
}
}
}

void timer0() interrupt 1
{
TH0=0x3c;
TL0=0xB0; //溢出后重新赋初值
//定时器中断时间为50ms
i++; //20次中断时间为1s
j++; //40次中断时间为2s
k++; //60次中断时间为3s
}

有什么不懂的可以网络Hi我

C. 单片机指示灯闪下就灭了是坏了

可能是程序导致的,硬件设计不够合理时,刚加电的时候就有这个现象,比如设计一个IO口驱动LED,高点亮,但程序初始化时灭灯,那么刚加电,单片机复位与程序初始化期间,灯就会闪一下。

D. 单片机红绿灯问题 东西南北灯初始全处于亮灯状态,设置一个按键,当按下按键时,东西南北所有信号灯全灭

好的,,我给你做。

E. 单片机原理流水灯实验

单片机流水的实质是单片机各引脚在规定的时间逐个上电,使LED灯能逐个亮起来但过了该引脚通电的时间后便灭灯的过程,实验中使用了单片机的P2端口, 对8个LED灯进行控制,要实现逐个亮灯即将P2的各端口逐一置零,中间使用时间间隔隔开各灯的亮灭。使用r1或rra实现位的转换。

F. 如何用51单片机实现像非诚勿扰节目那样灭灯与LED屏的同步

灯像一个按键,当灯灭时,用单片机检测,如果为低电平,来让led显示相应的内容 ,如果为高电平,再让led显示相应的内容

G. 单片机编程,控制LED延时亮灭的程序,

#include<reg51.h>
#include<INTRINS.h>
#defineu16unsignedint
#defineu8unsignedchar

#definePin00x01
#definePin10x02
#definePin20x04
#definePin30x08
#definePin40x10
#definePin50x20
#definePin60x40
#definePin70x80

sbitled1=P1^1;
sbitled2=P1^2;
sbitled3=P1^3;
sbitled4=P1^4;
sbitled5=P1^5;

sbitkg1=P3^1;
sbitkey2=P3^2;
sbitkey3=P3^3;

/****************************************/
voidinit() //初始化函数
{TMOD=0x01;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
EA=1;
ET0=1;

}

/////////////////////////
u8s(){//扫描按键
staticu8ms;
u8t=0;
// if(key1==0)t|=Pin1;
if(key2==0)t|=Pin2;
if(key3==0)t|=Pin3;
if(t!=0x00){
if(ms<100)ms++;
if(ms==5){
returnt;
}
}elsems=0;
return0x00;
}

///////////////////////


typedefstruct{
u16time;//n毫秒后
u8l; //亮的灯
u8m; //灭的灯
}ledcmd;

#defineLED_CMD_SIZE10
codeledcmdlcmd[]={
{0,Pin2,0},//0s后led2亮
{500,Pin4,0,},//0.5s后led4亮
{1000,0,Pin4},//1s后led4灭
{300,Pin3,0,},
{300,Pin4,0,},
{1000,0,Pin4,},
{300,0,Pin2,},
{200,Pin5,0,},
{40,0,Pin5|Pin3},
{500,0,Pin1},
};

voidled_l(u8v){//亮灯程序
P1=P1&(~v);
}
voidled_m(u8v){//灭灯程序
P1=P1|(v);
}


u8ledzt=0xff;//led任务zt为0xff表示待机
u16ledjs;//倒计时
voidled_start(){//启动程序
ledzt=0;
ledjs=lcmd[ledzt].time;
}
voidledcx(){//led流程程序
if(ledzt<LED_CMD_SIZE){
if((ledjs==0)&&(ledzt<LED_CMD_SIZE)){//计时到0
ledzt++;
if(ledzt!=LED_CMD_SIZE){
ledjs=lcmd[ledzt].time;
}
}
if(ledzt>1){//
led_l(lcmd[ledzt-1].l);
led_m(lcmd[ledzt-1].m);
}
}
}

/***********************************/
voidmain()//主函数
{
u8k;
init();//系统初始化
TR0=1;//定时器开始计时
while(1){
if(ledzt==0xff){led1=(kg1!=0);};//led不在运行状态时根据开关改变led1
k=s();//读取按键值
if((k&Pin2)!=0){//key2
if(led1==0&&ledzt==0xff){
led_start();
}
}
if((k&Pin3)!=0){//key3
ledzt=0xff;
led_m(Pin2|Pin4);
}
ledcx();
}

}


/****************************/
voidtimer0()interrupt1//1ms定时器
{
TH0=(65536-1000)/256;//重载初值
TL0=(65536-1000)%256;
if(ledjs>0)ledjs--;

}

H. 51单片机为什么要先按独立按键才能正常工作

51(开发板)中的数码管一次只能显示一位数,属于硬件限制,不能同时显示两位。在数码管上显示多位数只能靠高频率的刷新显示,在视觉上显示多位。所以可以定义一个变量i,按键i自加,然后用循环显示,循环次数为i。

根据提供的函数,表明你的板子LED是共阳极连接的,即LED阳极接到一起,每个LED阴极接IO口,这样当IO口为低电平时灯就点亮了。所以,程序一开始是亮灯而不是灭灯。sbit BY1=P3^4是一个位定义,意思是把单片机的P3.4口定义为BY1,以后对BY1进行操作就是对P3.4进行操作。

单片机

也被称为单片微控器,属于一种集成式电路芯片。在单片机中主要包含CPU、只读存储器ROM和随机存储器RAM等,多样化数据采集与控制系统能够让单片机完成各项复杂的运算,无论是对运算符号进行控制,还是对系统下达运算指令都能通过单片机完成。 由此可见,单片机凭借着强大的数据处理技术和计算功能可以在智能电子设备中充分应用。

I. 51单片机控制灯的开关程序并且可以自己改开关设定时间,程序怎么写啊

表述的不清楚,是要改开和关的时长?还是时刻(涉及到时钟)? 亮灭的时长大约几秒?单片机晶振是12MHZ?
定义两个寄存器,一个存放亮灯的时长,一个存放灭灯的时长。单片机的某三个I/O口接三个按键,其中一个负责切换亮灯、灭灯的设置选择;另两个按键按下时,单片机中断,一个按键是+,一个按键是- ,按键时,寄存器内的值做相应的+和- 运算,再把这两个值技术处理后,作为定时器的初始值,控制灯的亮与灭。

阅读全文

与单片机灭灯相关的资料

热点内容
鸿蒙系统怎么给App加速 浏览:189
女主叫男主三叔姓战 浏览:377
骁骑校全部小说顺序 浏览:394
如何将iphone手机照片转到安卓手机 浏览:31
从本地邮件到服务器是什么协议 浏览:226
外国片公交车男女主 浏览:234
瓦房店新玛特有电影院吗 浏览:933
免费观看网页版 浏览:622
叶子楣徐锦江演的电影 浏览:40
一级建造师法规pdf 浏览:496
phpshiro 浏览:161
无忧云服务器放行 浏览:634
免费最新大片观看网址 浏览:250
微信手势图标加密 浏览:746
存储服务器能干什么 浏览:785
c编辑软件怎么编译 浏览:597
hpc编译器论文 浏览:814
javac编译子目录下所有文件 浏览:430
卡友帮帮团是什么app 浏览:242
vnc启动命令 浏览:374