A. 51单片机通过外部中断和开关控制LED闪亮
是岩核瞎不是按一下开关触发中断粗空,使LED闪烁,氏薯再按一下,LED熄灭?
LED EQU P1.0
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP EXT0
ORG 0030H
MAIN:
MOV TMOD,#01H
MOV TH0,#HIGH(65536-41667)
MOV TL0,#LOW(65536-41667)
SETB ET0
SETB EA
SETB EX0
SETB IT0
CLR A
SJMP $
EXT0:
CPL TR0
RETI
T0ISR:
CLR TR0
MOV TH0,#HIGH(65536-41667)
MOV TL0,#LOW(65536-41667)
SETB TR0
INC A
CJNE A,#4,T0E
CLR A
CPL LED
T0E:
RETI
END
B. 51单片机外部中断0流水灯设计
以下是根据题目要求撰写的AT89S52单片机汇编语言程序,用于控制8个发光二极管由上而下或由下而上手高轮流点亮:
; 定义常量DELAY_TIME equ 1000 ; 延时时间为1秒LED_NUM equ 8 ; 发光二极管数目为8; 定义端口地址P1 equ 90h ; 定义P1口为90h; 初始化程序
org 0
ljmp main; 函数:延时指定时间(以1毫秒为单位)delay:
push acc ; 保存寄存器现场
push b push dptr mov dptr, #DELAY_TIMEdelay_1:
mov b,#2 ; 预置初值delay_2:
djnz b,delay_2 ; 倒计时
djnz dptr,delay_1 pop dptr ; 恢复寄存器现场
pop b pop acc ret ; 返回调用程序; 主程序main:
mov P1, #0FFh ; 将P1所有引脚设置为输出,LED全部熄灭
mov R1, #LED_NUM ; 初始化计数器loop:
clr c ; 清零进位标志
mov A, #7Fh ; 将始发位置设为P1.7处
rrc A ; 位置右移一位
add A, R1 ; 加上族禅计数器值
clr P1.7 ; 关闭首灯
; 将位置A的引脚设置为高电平,打开对应LED灯
mov P1, A
cjne R1, #1, next
; 若计数器为1,则改变点亮方向
mov R2, #1
mov R3, #1 wait:
call delay ; 延时
djnz R3, wait
; 改变计数器值
add R1, R2
anl R1, #0fh
sjmp loopnext:
dec R1
sjmp loop
该程序通过轮流点亮8个发光二极管,并且每次按下K1后,点亮的方向会反转。其中,利用了延时函数wait和循环计数器R1、R2和R3来实现轮流点亮和切换方向的功能。请注意设置端口P1为输出方式。如果需要对程序进行优化,可以使用定时器中断代替程序延时函数,以提高程序的可靠性和稳定性。
大家点点关注,后续有疑问可毕穗尺直接评论区问我,有空的话会给大家整理更详细的信息~
C. 51单片机 我想要用串口中断实现流水灯的点亮 我这个代码为什么实现不了 流水灯不变
可能是数字的问题,如果是以十进制方大做式发送的话1相当于0x31,所以你将串口助手里盯吵面的格式改为凯仿侍16进制。
D. 51单片机定时中断控制灯亮度怎么调
1、在设置好TCON(IT0/1=0/1)寄存器,IE寄存器后旁册当设定的外部中断电平被拉低时会执行中断程序,中断程序执旅皮行完毕后回到原程序执行处继续执行。
2、外部中断TCON设置:IT0/1=0(低电平触发:持续低电运镇宏平则一直持续触发中断)/1(负跳沿触发:电平被拉低后执行中断程序,中断程序执行完毕后返回之前程序运行到的位置)。
E. 51单片机定时中断控制灯亮度怎么调
51单片机怎坦唯样控制LED的光亮度
pwm,用定时器T1溢出做pwm周期,在每次T1开始计数时触发输出,软件边增1计数边检查溢出标志。如果软件计数满则清输出,否则直到溢出清输出、清软件计数满值。改变软件计数满值就能改变亮度。
51单片机输出pwm波控制led灯亮度
频率50HZ,周期是20ms
看你调节的精度 如定时器定时1ms,高电平宽度一次变化是5%
如果想要调节精度脊旁高,定时器定时时间小,就要频繁地发生中断,会影响主程序的运行
如 要求占空比每步调节为1%,则定时器就要定时200us,对于CpU的影响就比较大了
这时自动重装模式可以缩短中断程序占用时间,但如果再提高PWM的频率,自动重装模式也十分吃力,因此许多增强型51单片机有硬件PWM功能
单片机控制led亮度
LED是电流控制器件, 而不能说成电压控制,调节电压的大小也能控制啊(电压越大亮度超高),
1、PWM是脉冲宽度调制信号,注意其中的“宽度”,就是脉冲的高电平的时间。PWM信号调节LED亮度时,信号频率是不变的,改变的是脉冲的高电平的时间,即LED的导通时间。这种信号调节亮度相当于调节LED的平均电流,所以电流会变化。
2、从LED的V-I特性可知,其曲线是非线性的,0.1V的电压可造成100~200mA的If的变化,不易控制;另外,LED具有负温度系数特性,所以,一般将LED说成是电流控制型器件。至于你将让野培LED串接在电源模块上,当输出电压恒定时,是恒压源驱动LED吧,这样调节LED亮度时,需要对输出电压进行分压,以降低LED的压降才能改变其亮度,恒压源的电流是有一个最大输出值的,不能调节的,不知你用什么方法调节其输出电流的?
3、用MCU比较方便,成本是稍高,也可以用模拟电子线路产生相应的PWM信号。
F. 51单片机两个定时器中断写了个呼吸灯程序,怎么调试出来是小灯闪烁程序,新手求指教。
程序太乱,只用一个定时器就可以
如定时100us 中断一次 20次是2 ms 即周期是2 ms
中断一次计数变量a加一,并且与另一变量b(1到20)比较,如果a>b,则输出高电平,反之则输出低电平 a=20时清0
主程序中可不断改变b的值,先由大到 小 再由小到大,就是呼吸灯了
如延时200ms改变一次b的值 则呼吸周期大约是8秒
G. 51 单片机上电后自动进中断
你可以把低电平触发变换为下降沿触发,如拍乎这样不容易误触发,而且贺汪一次下降沿就触发一次,渣悉不会重复进入中断,你可以试试
H. 汇编语言 51单片机,外部中断控制流水灯
ORG 0000H ; 试试这个 流水灯的编码随便改
LJMP MAIN
ORG 0003H
LJMP LINT0
ORG 000BH
LJMP LT0ZD
ORG 0030H
MAIN: MOV SP, #60H
MOV TMOD, #00H
MOV IE, #81H
MOV TL0, #(8192-2500)MOD 32
MOV TH0, #(8192-2500)/32
SETB TR0
MOV R5, #20
LOOP: MOV R3, #48
CJNE R3, #0, $
LJMP LOOP
LINT0: CPL ET0
RETI
LT0ZD: PUSH PSW ; T0 中断
PUSH ACC
MOV TL0, #(8192-2500)MOD 32
MOV TH0, #(8192-2500)/32
DJNZ R5, LT0Z2
MOV R5, #30 ; 可以调整速度
MOV A, R3
LCALL LSDIN
MOV P1, A
DEC R3
LT0Z2: POP ACC
POP PSW
RETI
LSDIN: MOVC A,@A+PC
RET
LSDBM: DB 11111110B,11111101B,11111011B,11110111B ; 流水灯的编码1
DB 11101111B,11011111B,10111111B,01111111B
DB 01111111B,10111111B,11011111B,11101111B
DB 11110111B,11111011B,11111101B,11111110B
DB 11111100B,11111001B,11110011B,11100111B ; 流水灯的编码2
DB 11001111B,10011111B,00111111B,01111110B
DB 01111110B,00111111B,10011111B,11001111B
DB 11100111B,11110011B,11111001B,11111100B
DB 11111000B,11110001B,11100011B,11000111B ; 流水灯的编码3
DB 10001111B,00011111B,00111110B,01111100B
DB 01111100B,00111110B,00011111B,10001111B
DB 11000111B,11100011B,11110001B,11111000B
END
I. 51单片机按键中断控制流水灯
按键接在外中断脚上,外中断触发模式设为下降沿模式,即 IT0=1;或 IT1=1; ,在中断函数里调用流水灯函数或直接把代码写在中断函数里
J. 高分求:51单片机外部中断,灯先从左往右亮,第一次有按键按下在从右往左亮,第二次有按键按下从左往右
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar i,a,b=0,c=0,num;
void Delay(uint x)//延时函数
{
uchar s;
while(x--)
{
for(s=125;s>0;s--);
}
}
void main()
{
a=0x01;
P2=a;
EA=1;//开总中断
EX0=1;//开外部中断0
IT0=1;//跳变沿触发
for(i=7;i>0;i--)//上电后灯先从左向右亮
{
Delay(100);
a=_crol_(a,1);
P2=a;
}
while(1);
}
void Init0() interrupt 0
{
b++;
c++;
if(b==0)//检测是否按薯行键
return;
b=0;//按键后置0
if(c&0x01)//如果是奇数键冲次按键,给num赋值为0
num=0;
else//如果是偶数次按键,给num赋值为1
num=1;
switch(num)
{
case 0:
for(i=7;i>0;i--)//灯从右向左亮
{
a=_cror_(a,1);
P2=a;
Delay(100);
}break;
case 1:
for(i=7;i>0;i--)//灯从左向右亮
{
a=_crol_(a,1);
P2=a;
Delay(100);
}break;
}
}
刚写完 仿真也OK 不知道稿手歼能否帮助到你