1、按钮S0接在51单片机的 P3.3(INT1)引脚上,P1口接了8个发光二极管,编程实现:初始状态时,LED0灯亮,其它灯灭,利用S0按钮控制P1口的灯(中断方式),要求每按一下就点亮一盏灯( 前面点亮的保持点亮的状态 )
代码:
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar ledstatus_1;
uchar ledstatus_2;
bit flag; //标志位,中断后赋予1
uint i=0;
void wint1() interrupt 2
{
flag=1;
}
void main()
{
/*中断初始化*/
IT1=1;
EX1=1; EA=1;
ledstatus_1=0xfe; //开始LED灯的状态
P1=ledstatus_1;
while(1)
{
if(flag)
{
if(i<7) //用于判断是否是否进行了一轮
{ //即当灯全亮后恢复开始的状态
ledstatus_2=_crol_(ledstatus_1,1); //ledstatus_2保存ledstatus_1循环左移后的数
ledstatus_2=ledstatus_2&ledstatus_1; //进行相与,这样就可以保持低位灯不灭
P1=ledstatus_2;
ledstatus_1=ledstatus_2;
flag=0;
i=i+1;
}
else
{
ledstatus_1=0xfe;
P1=ledstatus_1;
flag=0; //这个恢复后需要将标志位设位0
i=0; //否则一轮后的初始状态就会出现两个灯亮
}
}
}
}
电路图:

2、按钮S0接在51单片机的 P3.3(INT1)引脚上,P1口接了8个发光二极管,编程实现:初始状态时,P1口控制的灯按一定的频率闪烁;按一下S0,触发 外部中断1(INT1),实现单灯 右移 (即按LED7至LED0的顺序依次点亮)3圈结束,恢复初始状态。
代码:
#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
#define LED P1
void delay(int xms) //延时函数
{
uint i,j;
for(i=0;i<xms;i++)
for(j=0;j<120;j++);
}
void right(int x) //右移
{
int i,j;
for(i=0;i<x;i++)
{
LED=0x7f;
for(j=0;j<7;j++)
{
delay(250);
LED=_cror_(LED,1); //循环右移
}
delay(250);
}
}
void my_interrupt() interrupt 2 //中断函数
{
unsigned saveLED=LED; //储存中断前LED状态
right(3); //调用单灯右移3圈
LED=saveLED; //写回中断前LED状态
}
void main()
{
/*中断初始化*/
IT1=1;
EX1=1; EA=1;
LED=0X00;
while(1)
{
delay(250);
LED=~LED; //开始LED等闪烁
}
}
电路图:

3、51单片机的P1.7引脚外接一个发光二极管D1,P3.2(INT0)引脚外接信号发生器(Single generator)。编程实现:首先通过P1.7口点亮发光二极管D1,然后信号发生器每输入10个脉冲触发一次中断,使D1灯亮、灭交替一次。
代码:
#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
#define LED P1
void delay(int xms) //延时函数
{
uint i,j;
for(i=0;i<xms;i++)
for(j=0;j<120;j++);
}
void left(int x) //左移
{
int i,j;
for(i=0;i<x;i++)
{
LED=0xfe;
for(j=0;j<7;j++)
{
delay(250);
LED=(LED<<1)|0x01; //左移
}
delay(250);
}
}
void right(int x) //右移
{
int i,j;
for(i=0;i<x;i++)
{
LED=0x7f;
for(j=0;j<7;j++)
{
delay(250);
LED=(LED>>1)|0x80; //右移
}
delay(250);
}
}
void my_int_right(void) interrupt 2 //中断函数
{
unsigned saveLED=LED; //储存中断前LED状态
right(3); //调用单灯右移3圈
LED=saveLED; //写回中断前LED状态
}
void my_int_left(void) interrupt 0 //中断函数
{
unsigned saveLED=LED; //储存中断前LED状态
left(3); //调用单灯右移3圈
LED=saveLED; //写回中断前LED状态
}
void main()
{
/*中断初始化*/
IT1=1;
EX1=1;
IT0=1;
EX0=1;
EA=1;
IP=0x04;
LED=0X00;
while(1)
{
delay(250);
LED=~LED; //开始LED等闪烁
}
}
电路图:

4、P1口接8个发光二极管,P3.2和P3.3接两个按钮开关模拟两个外部中断源。平常8个灯以一定频率闪烁,按键S0按下触发中断,控制8个灯左移(即按D1至D8的顺序依次点亮)3圈,按键S1按下触发中断,控制8个灯右移(即按D8至D1的顺序依次点亮)3圈(右移的中断优先级高于左移)。
代码:
#include<reg51.h>
#define uint unsigned int
sbit P1_7=P1^7;
uint i = 0; //脉冲计数
void interrupt0() interrupt 0 using 2
{
i++;
if(i==10) //10个脉冲亮灭循环一次
{
i=0;
P1_7=~P1_7;
}
}
void main()
{
EA=1; //中断允许
IT0=1; //脉冲触发
EX0=1; //外部中断0
P1_7=0; //led灯初始状态
do{}while(1);
}
电路图:

所有代码和电路图:https://download.youkuaiyun.com/download/qq_43556844/15087408
1万+

被折叠的 条评论
为什么被折叠?



