使用c51编写1.P1 口做输出口,去驱动发光二极管。 2.P3 口作输入口,为按键的输入。 3.采用中断方式实现以下功能: (1)程序启动时,8 只发光二极管闪烁。按一次按键 K1,发光二极管流水显示(循环 3 次),然后发光二极管回到闪烁状态。按一次按键 K2,发光二极管流水全亮(保 持 10 秒),然后发光二极管回到闪烁状态; (2)按键 K2 不能打断按键 K1 的功能
时间: 2024-03-08 18:50:58 浏览: 71
好的,这是一个关于C51单片机的问题,下面是一个简单的实现代码,仅供参考:
```
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit P1_0 = P1^0;
sbit P1_1 = P1^1;
sbit P1_2 = P1^2;
sbit P1_3 = P1^3;
sbit P1_4 = P1^4;
sbit P1_5 = P1^5;
sbit P1_6 = P1^6;
sbit P1_7 = P1^7;
sbit P3_0 = P3^0;
sbit P3_1 = P3^1;
uchar count = 0; // 计数器
uchar flag = 0; // 标志位,用于判断按键功能
void Delay(uint ms) // 延时函数
{
uint i,j;
for(i=ms;i>0;i--)
for(j=114;j>0;j--);
}
void Flowing() // 流水灯显示
{
P1_0 = 1; P1_1 = 0; P1_2 = 0; P1_3 = 0; P1_4 = 0; P1_5 = 0; P1_6 = 0; P1_7 = 0; Delay(500);
P1_0 = 0; P1_1 = 1; P1_2 = 0; P1_3 = 0; P1_4 = 0; P1_5 = 0; P1_6 = 0; P1_7 = 0; Delay(500);
P1_0 = 0; P1_1 = 0; P1_2 = 1; P1_3 = 0; P1_4 = 0; P1_5 = 0; P1_6 = 0; P1_7 = 0; Delay(500);
P1_0 = 0; P1_1 = 0; P1_2 = 0; P1_3 = 1; P1_4 = 0; P1_5 = 0; P1_6 = 0; P1_7 = 0; Delay(500);
P1_0 = 0; P1_1 = 0; P1_2 = 0; P1_3 = 0; P1_4 = 1; P1_5 = 0; P1_6 = 0; P1_7 = 0; Delay(500);
P1_0 = 0; P1_1 = 0; P1_2 = 0; P1_3 = 0; P1_4 = 0; P1_5 = 1; P1_6 = 0; P1_7 = 0; Delay(500);
P1_0 = 0; P1_1 = 0; P1_2 = 0; P1_3 = 0; P1_4 = 0; P1_5 = 0; P1_6 = 1; P1_7 = 0; Delay(500);
P1_0 = 0; P1_1 = 0; P1_2 = 0; P1_3 = 0; P1_4 = 0; P1_5 = 0; P1_6 = 0; P1_7 = 1; Delay(500);
}
void Interrupt0() interrupt 0 // 外部中断0,K1按下
{
Delay(10); // 延时去抖动
if(P3_0 == 0 && flag == 0) // 检测按键状态
{
flag = 1; // 标志位置1
for(count=0;count<3;count++) // 循环3次
{
Flowing(); // 流水灯显示
}
P1_0 = 0; P1_1 = 0; P1_2 = 0; P1_3 = 0; P1_4 = 0; P1_5 = 0; P1_6 = 0; P1_7 = 0; // 发光二极管回到闪烁状态
}
}
void Interrupt3() interrupt 3 // 外部中断1,K2按下
{
Delay(10); // 延时去抖动
if(P3_1 == 0 && flag == 0) // 检测按键状态
{
flag = 1; // 标志位置1
while(1) // 循环10秒
{
P1_0 = 1; P1_1 = 1; P1_2 = 1; P1_3 = 1; P1_4 = 1; P1_5 = 1; P1_6 = 1; P1_7 = 1; // 发光二极管全亮
Delay(1000); // 延时1秒
P1_0 = 0; P1_1 = 0; P1_2 = 0; P1_3 = 0; P1_4 = 0; P1_5 = 0; P1_6 = 0; P1_7 = 0; // 发光二极管熄灭
Delay(1000); // 延时1秒
if(P3_1 == 0) // 检测按键状态
{
flag = 1; // 标志位置1
break; // 跳出循环
}
}
P1_0 = 0; P1_1 = 0; P1_2 = 0; P1_3 = 0; P1_4 = 0; P1_5 = 0; P1_6 = 0; P1_7 = 0; // 发光二极管回到闪烁状态
}
}
void main()
{
P1 = 0xff; // 初始化发光二极管状态为闪烁
EX0 = 1; // 允许外部中断0
IT0 = 1; // 设置外部中断0为下降沿触发
EX1 = 1; // 允许外部中断1
IT1 = 1; // 设置外部中断1为下降沿触发
EA = 1; // 允许中断
while(1) // 循环闪烁
{
P1_0 = ~P1_0; P1_1 = ~P1_1; P1_2 = ~P1_2; P1_3 = ~P1_3; P1_4 = ~P1_4; P1_5 = ~P1_5; P1_6 = ~P1_6; P1_7 = ~P1_7;
Delay(500);
}
}
```
上述代码中使用了两个外部中断,其中外部中断0对应K1按键,外部中断1对应K2按键。当按键被按下时,会进入相应的中断服务程序中执行相应的操作。使用标志位可以避免两个按键的功能相互干扰。另外,流水灯显示和全亮都使用了一个循环控制。如果需要更改流水灯显示的速度和亮灭时间,可以修改延时函数的参数。
阅读全文