单片机实验与课程设计
关注:168 答案:3 手机版
解决时间 2021-02-22 11:33
- 提问者网友:雨份凉伴
- 2021-02-22 08:29
编写程序,当外部中断1响应后,让8个LED灯交替闪烁(第1,3,5,7个LED灯亮1s后,第2,4,6,8个LED灯亮1s,轮流闪烁)
最佳答案
- 二级知识专家网友:不了解我就别说我变了
- 2021-02-22 09:19
在外部中断里面定义一个变量,
//晶振 12MHz
#include<reg52.h>
//定时50ms
#define TH = (65536 - 50000)>>8 // 高位初值;
#define TL = (65536 - 50000)%256// 低位初值;
#define LED P0 //设高电平点亮LED;
unsigned char timer_cnt = 0;
unsigned char extern_flag = 0;
bit timer_1sflag;
void main()
{
TMOD = 0x10;//使用定时器1
EA = 1;
ET1 = 1;
TR1 = 1;
TH1 = TH;// 高位初值;
TL1 = TL;// 低位初值;
EX0 = 1;//开启外部中断;
while(1)
{
if(extern_flag)
{
if(timer_1sflag)LED = 0x55;
else LED = ~LED;//按位取反即可;
}
}
}
void timer1() interrupt 3
{
TH1 = 0x3C;
TL1 = 0x0B0;
timer_cnt++;
if(timer_cnt > 20)
{
timer_cnt = 0;
timer_1sflag = !timer_1sflag;
}
}
void Extern() interrupt 2 using1//中断向量符号为2;
{
extern_flag = 1;
}
请采纳,参考!
//晶振 12MHz
#include<reg52.h>
//定时50ms
#define TH = (65536 - 50000)>>8 // 高位初值;
#define TL = (65536 - 50000)%256// 低位初值;
#define LED P0 //设高电平点亮LED;
unsigned char timer_cnt = 0;
unsigned char extern_flag = 0;
bit timer_1sflag;
void main()
{
TMOD = 0x10;//使用定时器1
EA = 1;
ET1 = 1;
TR1 = 1;
TH1 = TH;// 高位初值;
TL1 = TL;// 低位初值;
EX0 = 1;//开启外部中断;
while(1)
{
if(extern_flag)
{
if(timer_1sflag)LED = 0x55;
else LED = ~LED;//按位取反即可;
}
}
}
void timer1() interrupt 3
{
TH1 = 0x3C;
TL1 = 0x0B0;
timer_cnt++;
if(timer_cnt > 20)
{
timer_cnt = 0;
timer_1sflag = !timer_1sflag;
}
}
void Extern() interrupt 2 using1//中断向量符号为2;
{
extern_flag = 1;
}
请采纳,参考!
全部回答
- 1楼网友:輓畱嶼赱
- 2021-02-22 11:13
//假设晶振12MHZ,P1控制LED低电平亮
#include "reg51.h"
unsigned int YSJS=0;
void main(void)
{
TMOD |= 0x10; //定时器1工作于方式1,16位定时器
TH1 = 0xFF; //定时器1定时时间=500uS
TL1 = 0x06;
ET1 = 1; //使能定时器1中断
IT1=1; //负跳变触发
EX1=1; //开外部中断1
EA =1; //开总中断
P1 = 0xFF;
while(1)
{
}
}
void INT0() interrupt 0
{
P1 = 0x55;
TR1 = 1; //开启定时器1
}
void TIMER1(void) interrupt 3 //定时器1中断函数使用默认寄存器组
{
TH1 = 0xFF; //定时器1定时时间=500us
TL1 = 0x06;
YSJS++;
if(YSJS==2000) //500uS*2000=1000000us=1s
{
P1 = P1 & 0xFF;
YSJS = 0
}
}
- 2楼网友:有你才幸福
- 2021-02-22 09:50
你写的要求太宽泛,我就随便给你两个,你参考下,根据你的题目修改下,这你应该可以的吧 总结随便找点,我也不知道你的具体要求,就不发了 给你个流水灯的,循环点亮程序 org 0000h jmp main org 0030h main: mov a,#0ffh clr c rlc a; mov p2,a call delay loop: mov r2,#07h loop1: rlc a mov p2,a call delay djnz r2,loop1 mov r2,#07h ;设置右移次数7次 loop2: rrc a ;右移1位 mov p2,a ;输出到p2 call delay ; djnz r2,loop2 ;右移7次 jmp loop delay: mov r7,#20 ;延时0.3s d1: mov r6,#30 d2: mov r5,#250 djnz r5,$ djnz r6,d2 djnz r7,d1 ret end 数码管的,可以循环显示012345678abcdef的,共阳极接法 org 0000h ljmp main org 0030h main: nop start: mov r2,#0 mov r5,#16 next: mov dptr,#tab mov a,r2 movc a,@a+dptr mov p2,a inc r2 lcall delay loop: djnz r5,next mov r5,#16 mov r2,#0 jmp start delay: mov r0,#10 ;延时0.5s delay0: mov r7,#100 delay1: mov r6,#250 djnz r6,$ djnz r7,delay1 djnz r0,delay0 ret tab: db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h db 88h,83h,0c6h,0a1h,86h,8eh end
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!