❶ 如何用单片机一个按钮开关控制3个灯3种效果。流水。闪烁。还有一直亮。用keil编程。
下面是用C51编写的简单程序:
#include <reg51.h>
#include <intrins.h>
sbit io_Key = P1 ^ 1;
sbit led1 = P1 ^ 2;
sbit led2 = P1 ^ 3;
sbit led3 = P1 ^ 4;
unsigned char ucCount = 0;
bit flag05s = 0;
//---------------------------------
void delay125us(void) //@12.000MHz
{
unsigned char i;
i = 60;
while (--i);
}
void Timer0Init(void) //10毫秒@12MHz
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0xF0; //设置定时初值
TH0 = 0xD8; //设置定时初值
TR0 = 1; //开定时器0
ET0 = 1; //开定时器0中断
EA = 1; //开总中断
}
//T0中断用来计数器溢出
void zd0(void) interrupt 1
{
TL0 = 0xF0; //设置定时初值
TH0 = 0xD8; //设置定时初值
if(++ucCount >= 50)
{
ucCount = 0;
flag05s = 1; //g_flag05s = isYes定时0.52秒到,用于测量周期延时
}
}
void main(void)
{
unsigned char CountTemp = 0, ucState = 0;
Timer0Init();
while(1)
{
//-------------------------------
//简单的按键检测程序:
io_Key = 1;
_nop_();
if( io_Key == 0 )
{
CountTemp = 0;
do
{
delay125us();
if( io_Key != 0 ) break;
} while(++CountTemp > 160); // 延时20ms去抖动
if(CountTemp > 160)//如果按键时间有效,改变状态
{
switch(ucState)
{
case(0):
{
ucState = 1;
led1 = 0;
led2 = 0;
led3 = 0;
}
break;
case(1):
{
ucState = 2;
led1 = 0;
led2 = 0;
led3 = 0;
}
break;
case(2):
{
ucState = 0;
led1 = 0;
led2 = 1;
led3 = 1;
}
break;
}
while(io_Key == 0); //等待按键释放
}
}
//------------------------------
//每0.5秒改变一下LED状态
if(flag05s == 1)
{
flag05s = 0;
switch(ucState)
{
case(0):
{
led1 = !led1;
led2 = !led2;
led3 = !led3;
}
break;
case(1):
{
bit ledTemp = led1;
led1 = led2;
led2 = led3;
led3 = ledTemp;
}
break;
//LED常亮可以忽略改变LED状态
/*
case(2):
{
led1 = 0;
led2 = 0;
led3 = 0;
}
break;
*/
}
}
}
}
//-----------------------------------------------
//上面程序中有很多地方可以优化,这里只是给出一个参考供学习。
❷ 51单片机如何用一个定时器当多个延时电路用, 就是按下开关一,灯泡亮三秒。 按下开关二,灯泡亮五秒。
使用单片机的定时器来实现不同的延时效果,是一个常见的技术应用。具体来说,可以通过配置定时器产生一个秒周期的时间基准,然后利用计数器来累计时间。这个计数器可以设置为从1开始计数到任意数值,比如10000或者1000000,也可以实现循环计数,即计数到100后重新从1开始。在按下开关一的时候,我们记录下当前的计数器值作为K1,同时点亮灯泡;当计数器值达到K1+3时,灯泡会熄灭。
同样的方法可以应用于开关二的延时控制。按下开关二时,同样记录下当前的计数器值作为K2,然后点亮灯泡;当计数器值达到K2+5时,灯泡会熄灭。这样,通过调整K1和K2的值,可以实现不同延时时间的需求。
值得注意的是,这种方法的关键在于定时器的配置和计数器的使用。首先,需要设置定时器的定时周期,使其能够产生秒级别的基准时间。然后,通过软件编程的方式,实现对计数器的初始化和计数操作。当计数器达到预设值时,触发相应的输出控制逻辑,实现灯泡的点亮和熄灭。
这种实现方式不仅灵活,而且能够有效地利用单片机的资源。通过调整定时器的配置和计数器的数值,可以轻松实现多种延时效果,满足不同的应用需求。这对于开发需要多种延时控制功能的项目来说,是一种非常实用的技术手段。
总之,利用单片机的定时器来实现延时控制是一种高效且灵活的方法。通过合理配置定时器和计数器,可以方便地实现不同延时时间的需求,满足各种应用场景的要求。
❸ 51单片机如何用一个按键控制一段程序的运行与停止
1、创建项目文件。
6、当按下一个按键时,关闭灯,整个程序运行,再按一次,程序停止。
❹ 51单片机C语言程序
//你原来的b2,b2都是死循环,这是不行的,只有主函数才可以死循环。
//你的主函数结构也有问题。
//为你增加了一个按键检测的函数。
//下列程序通过了实验测试。
//b1输出的周期大约0.9s。
//b2输出的周期大约0.6s。
//K为触动开关,reg为红灯,bice为绿灯,b1、b2 各为一个方波,
//按第一次触动开关时红灯亮宽态、b1输出,
//按第二次绿灯亮、为b2输出,
//按第三次都关闭.
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
uint a;
void b1();
void b2();
sbit t = P1^0;
sbit k = P3^5;
sbit reg = P3^3;
sbit bice = P3^2;
void delay(uchar z)
{
uint x,y;
for(x = z; x > 0; x--) for(y = 110; y > 0; y--);
}
bit key()
{
bit kkk;
kkk = k; //读入按键.
if(kkk == 1) return 0;//没有按下.
delay(5); //延时.
if(k == kkk) return 1;//两次相等.
return 0;
}
void main()
{
while(1) {
P3 = 0xff;
while(!key()); //静等按下第一次.
reg = 0;
bice = 1;
while(!key()) b1(); //没有按下第二宴碰次就循环等待.
reg = 1;
bice = 0;
while(!key()) b2(); //没有按下第三慎祥源次就循环等待.
}
}
void b1()
{
P1 = 0xfe; a = 50000; while(a--);
P1 = 0xff; a = 50000; while(a--);
}
void b2()
{
P1 = 0xfe; a = 30000; while(a--);
P1 = 0xff; a = 30000; while(a--);
}
❺ 用51单片机读取拨码开关的C程序,两个8421拨码开关
假如DIP开关接P1,共8位,检测后通过串口发送出去。
#include<reg51.h>
main()
{
TMOD=0x20;
SCON=0x50;
TH1=0xfd;
TL1=0xfd;
TR1=1;
TI=0;
while(1)
{
if(P1!=0xff)
{
SBUF=P1;
while(!TI);
TI=0;
}
}
}
❻ 用51单片机的输出的模拟信号,即0,1怎么控制电动机的开关,电动机的电
首先,51单片老颤机的输出的0,1,不叫模拟信号,叫数字信号,或脉冲信号。
这很简单的。
用指含陆单片机一个引脚控制一个三极管,唯顷三极管控制一个继电器,再由继电器控制电机。
如下图