在外部中断0输入引脚和外部中断1输出引脚各接一个按钮开关控制p1口八个LED灯在外部中断0输入引脚和外部中断1输出引脚各接一个按钮开关控制p1口八个LED灯 上电时led自上而下呈流水灯显示 外部中断0使用电平触发按钮按下上面四只灯闪烁五次外部中断1使用跳沿触发按下按钮下面四只灯闪烁五次
以下是8051单片机的程序代码:
#include <reg52.h> // 引入单片机头文件
sbit LED1 = P1^0; // 定义P1口的LED灯 sbit LED2 = P1^1; sbit LED3 = P1^2; sbit LED4 = P1^3; sbit LED5 = P1^4; sbit LED6 = P1^5; sbit LED7 = P1^6; sbit LED8 = P1^7;
sbit KEY1 = P3^2; // 定义外部中断0的按钮开关 sbit KEY2 = P3^3; // 定义外部中断1的按钮开关
void delay(unsigned int t) // 定义延时函数 { unsigned int i, j; for(i=0; i<t; i++) { for(j=0; j<120; j++); } }
void main() { unsigned int i; unsigned char count1 = 0; // 定义计数器1 unsigned char count2 = 0; // 定义计数器2 unsigned char flag1 = 0; // 定义标志位1 unsigned char flag2 = 0; // 定义标志位2
TMOD = 0x01; // 设置定时器0为模式1
TH0 = 0xFC; // 设置定时器0的初始值为0xFC67
TL0 = 0x67;
ET0 = 1; // 打开定时器0中断允许
EA = 1; // 打开总中断允许
TR0 = 1; // 启动定时器0
while(1)
{
if(flag1 == 1) // 如果标志位1为1,则执行外部中断0的操作
{
count1++;
if(count1 <= 5) // 如果计数器1小于等于5,则执行闪烁操作
{
LED1 = ~LED1;
LED2 = ~LED2;
LED3 = ~LED3;
LED4 = ~LED4;
delay(500);
}
else // 如果计数器1大于5,则复位计数器1和标志位1
{
count1 = 0;
flag1 = 0;
}
}
if(flag2 == 1) // 如果标志位2为1,则执行外部中断1的操作
{
count2++;
if(count2 <= 5) // 如果计数器2小于等于5,则执行闪烁操作
{
LED5 = ~LED5;
LED6 = ~LED6;
LED7 = ~LED7;
LED8 = ~LED8;
delay(500);
}
else // 如果计数器2大于5,则复位计数器2和标志位2
{
count2 = 0;
flag2 = 0;
}
}
if(KEY1 == 0) // 如果外部中断0的按钮按下,则设置标志位1为1
{
delay(10); // 延时去抖动
if(KEY1 == 0)
{
flag1 = 1;
}
while(KEY1 == 0); // 等待按钮松开
}
if(KEY2 == 0) // 如果外部中断1的按钮按下,则设置标志位2为1
{
delay(10); // 延时去抖动
if(KEY2 == 0)
{
flag2 = 1;
}
while(KEY2 == 0); // 等待按钮松开
}
}
}
void timer0() interrupt 1 // 定义定时器0中断服务函数 { static unsigned char num = 0; // 定义静态变量num TH0 = 0xFC; // 重新设置定时器0的初始值为0xFC67 TL0 = 0x67; num++; // 每进入一次中断服务函数,num加1 if(num == 10) // 如果num等于10,则执行流水灯操作 { LED1 = 1; delay(100); LED2 = 1; delay(100); LED3 = 1; delay(100); LED4 = 1; delay(100); LED5 = 1; delay(100); LED6 = 1; delay(100); LED7 = 1; delay(100); LED8 = 1; delay(100); LED8 = 0; delay(100); LED7 = 0; delay(100); LED6 = 0; delay(100); LED5 = 0; delay(100); LED4 = 0; delay(100); LED3 = 0; delay(100); LED2 = 0; delay(100); LED1 = 0; delay(100); num = 0; // 复位num } }
原文地址: https://www.cveoy.top/t/topic/bW70 著作权归作者所有。请勿转载和采集!