‘壹’ 51单片机如何使用定时器让LED亮一会灭一会
用定时器定时20ms,再用软件计数25次,计满后用一条口线执行一条CPL指令即可,比如说:CPL P1.0。
如有帮助请采纳,或点击右上角的满意,谢谢!!
‘贰’ 怎样用51单片机定时器点亮一个led灯
sbit LED =P1^0;//定义LED管脚
uchar a=0;//计中断次数的变量
void main(void)
{
TMOD=0x10; //定时器1工作在定时方式1
TH1=(65536-50000)/256; //定时50毫秒
TL1=(65536-50000)%256;
ET1=1;EA=1;
TR1=1;
while(1);
}
void timer1(void) interrupt 3//中断子程序
{
TH1=(65536-50000)/256; //定时50毫秒
TL1=(65536-50000)%256;
a++;
if(a==20){a=0;LED=!LED;}//20次是1s LED亮灭
}
‘叁’ 51单片机如何用一个定时器当多个延时电路用, 就是按下开关一 ,亮三秒。 按下开关二,灯泡亮五秒。
没想法就不会有创新,你的想法就很好。像这种亮灯的程序,对时间要求不是那么严格(如果极其严格就没法实现),那么可以采用如下方法实现你的要求:
//假设晶振12MHZ,按键输入P1.0,P1.1,P1.2;LED控制P2.0,P2.1,P2.2,都是低电平有效
#include "reg51.h"
unsigned int YSJS1=0;
unsigned int YSJS2=0;
unsigned int YSJS3=0;
sbit KEY1=P1^0;按键
sbit KEY2=P1^1;按键
sbit KEY3=P1^2;按键
sbit LED1=P2^0;灯
sbit LED2=P2^1;灯
sbit LED3=P2^2;灯
void Timer1Init(void) //500微秒@12.000MHz
{
AUXR &= 0xBF; //定时器时钟12T模式
TMOD &= 0x0F; //设置定时器模式
TMOD |= 0x10; //设置定时器模式
TL1 = 0x0C; //设置定时初值
TH1 = 0xFE; //设置定时初值
TF1 = 0; //清除TF1标志
ET1 = 1; //使能定时器1中断
TR1=1; //定时器1开始计时
EA =1; //开总中断
}
void main(void)
{
LED1=1;
LED2=1;
LED3=1;
KEY1=1;
KEY2=1;
KEY3=1;
Timer1Init()
while(1)
{
if(KEY1==0)
{
YSJS=6000;
LED1=0;
}
if(KEY2==0)
{
YSJS=10000;
LED2=0;
}
if(KEY3==0)
{
YSJS=16000;
LED3=0;
}
}
}
void TIMER1(void) interrupt 3 //定时器1中断函数使用默认寄存器组
{
TH1 = 0XFE; //定时器1定时时间=500us
TL1 = 0X0C;
if(YSJS1!=0)
{
YSJS1--;
}
else LED1=1;
if(YSJS2!=0)
{
YSJS2--;
}
else LED2=1;
if(YSJS2!=0)
{
YSJS2--;
}
else LED2=1;
}
‘肆’ 用定时器实现51单片机上LED灯每隔两秒亮暗闪烁
你用的是几个灯啊?比如说8个灯吧,用p0口,
就是直接讲p0口与led直接相连就行了啊,注意led的另一端要接在一起,共地或者高电平都可以,但是为了保护led,最好在每个小灯上串上一个电阻(若单片机采用的是5v电压,电阻可选用500欧左右的就可以了),以减小通过led的电流。剩余的就是单片机的最小系统了,没什么好说的吧,就是晶振,复位而已。
程序嘛,也很简单啊,你说用定时器,每个两秒如果单纯用一个定时器的话肯定不够用的,要结合循环判断语句,比如你采用12m的晶振,并且将定时中断时间定为50ms,那么设置一个变量,每20次就是一秒了,所以40次就是两秒。这样的话,每个40次就让led的状态(用0和1表示亮与灭)改变就可以了。main函数中应该设置一个死循环函数,可用while(1),让单片机不断的循环工作。
‘伍’ 用51单片机的定时器实现LED灯逐一点亮,间隔一秒。要求拨动控制开关可以控制灯的方向。
嘿嘿 这个俺可以帮你解答
1 利用定时计数器0 工作在方式2 定时50毫秒 结合软件计数器(初始值选20)
允许定时计数器中断
2 设计一个定时器0的中断服务程序 每50毫秒 就中断 在中断程序中软件计数器减1
当减到0时,表示1秒时间到 (重新送初始值20)
判断拨动开关状态 如果为低低电平 则选择控制LED的端口内容左移一位
如果为高低电平 则选择控制LED的端口内容右移一位
即可实现对流水灯的方向控制。
呵呵 满意 就选满意回答哦
‘陆’ 51单片机用定时器,怎么编程流水灯一秒闪烁一次,
先写一个延时子函数delay,延时时间1秒。然后写LED=0;delay(1);LED=1;这样就可以做到一亮一灭,再把这段程序加入到循环中就可以,循环函数很简单不用再说了吧,如果还不懂回复我给你程序
‘柒’ 51单片机定时器定时 2秒灯亮 3秒灯灭,如此循环
如果想实现无限循环那就采用死循环方式,可以无限的循环如while(1){};然后设定定时器定时时间为1s(此值需要根据单片机确定是否可以设定这么大),其次,设定一个变量对时间进行计数,根据计数情况做出相应的改变,程序可以这样设定:
unsigned
char
gucledstatus
=
0x00;
//全局变量,表示灯当前的状态
0为灭,1为亮
volatile
unsigned
int
gustimecnt;
//全局变量对时间计数
int
main()
{
//增加定时器初始化并开放中断
while(1)
{
if(gucledstatus
==
0x01)
//当前为亮状态
{
if(gustimecnt
>=
7200)
//两个小时时间到
{
gustimecnt
=
0x00;
//清零
gucledstatus
=
0x00;
//灯为灭状态
//此处加程序代码,控制灯为灭的状态
}
else
{
//此处加程序代码,控制灯为亮的状态,此处会重复执行,可以进行控制
}
}
else
if(gucledstatus
==
0x00)
//灯为灭的状态
{
if(gustimecnt
>=
3600)
//1个小时
{
gustimecnt
=
0x00;
gucledstatus
=
0x01;
//亮状态
//增加程序代码,控制灯亮
}
else
{
//增加程序代码,控制灯灭,此处会重复执行,可以进行控制
}
}
}
return
0;
}
在中断函数中,对gustimecnt进行递增即可!
‘捌’ 51单片机 定时器问题 (LED小灯 每隔一秒亮灭一次)
TF0 初始值为0。
TR0 = 1; //启动计数器0
启动后,TH0TL0就会自动加一。
如下:
B800
B801
B802
……
当加到0000时,TF0就自动为1。
‘玖’ 51单片机 定时器
试分析你的程序。你的time0中断里面只有pp++,也就是在第一次灭了以后,pp是20000,而这个时候你没有对pp清零,pp还会一直+下去,20001,20002,20003……一直循环下去,如果p变量无界的话,你这个程序就只能亮一次,灭一次,以后就再也亮不起来了,但为什么过了好多秒又亮了呢?因为pp的类型是uint,可以查得uint型变量的最打值是65535,如果pp=65535的时候,再+1的话,pp就变成了0,而这个时候再过1秒钟,LED就亮了起来了,而pp从20000到65535需要大概4.5秒,再从0到10000又需要大概1秒,所以需要大概5.5秒!
改正方法:
再你的time0中断里加入判断,如果pp>20000,则将pp清零,也就是在pp++后加入
if (pp>20000) pp=0;
这样应该就正常了,试验一下吧,如果对您有用,请麻烦点击一下【采纳】,你我才都能得到知道经验,谢啦~
‘拾’ 求实现51单片机按下按钮LED灯亮1秒后熄灭
外部中断的优先级是高于定时器中断的。首先是触发外部中断嘛,在外部中断程序里面开定时器中断,定时器设置为50ms,这个直接装初值大概46000(晶振12m)的样子,具体你自己算一下。然后在调用定时器中断程序里面肯定是要有个标志位的,这个标志位会累加n个定时器时间直到8s,然后在这个定时器中断程序里面不断检测3.2口电平就行了,如果变回高电平就把灯在点亮(比如在这句直接将flag赋到设定的技术最大值)就行了。最好用下降沿触发,低电平触发容易出问题总感觉,可能你程序逻辑是完全正确的,但是仿真或者实物的时候会出问题。