用at89c52 . 两个按键,第一个按键按下不松开,第二个按键松开,实现第一种流水灯, 八个 LED 依次点亮,每次亮一个;第一个按键松开,第二个按键按下不松开,实 现第二种流水灯,八个 LED 依次灭一个,七个亮,一个灭电路连接方式
时间: 2024-04-05 18:02:08 浏览: 51
基于at89c52单片机的流水灯程序
以下是基于AT89C52单片机实现题目要求的电路连接方式和部分C语言代码:
![AT89C52单片机电路连接图](https://img-blog.csdnimg.cn/20211118130505409.png)
电路连接说明:
1. AT89C52单片机的P1口接8个LED灯,共阴极接法。
2. 第一个按键K1连接P3.0口,通过按下不松开可以触发中断服务程序。
3. 第二个按键K2连接P3.1口,通过松开可以触发中断服务程序。
4. 电路中还需要连接一个晶振电路,用于提供单片机的时钟信号。
C语言代码:
```c
#include <reg52.h>
// 定义P1口连接的8个LED灯
sbit LED1 = P1^0;
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;
// 定义延时函数,用于控制LED灯的亮灭时间
void Delay(unsigned int t)
{
unsigned int i, j;
for(i=0; i<t; i++)
for(j=0; j<120; j++);
}
void main()
{
// 初始化P1口为输出模式,初始值为全灭
P1 = 0xFF;
// 初始化P3口为输入模式,上拉电阻使K1和K2按键默认为高电平
P3 = 0xFF;
// 中断服务程序
void Int0() interrupt 0
{
// 判断K1按键是否按下
if(P3_0 == 0)
{
// 第一种流水灯:依次点亮8个LED灯
LED1 = 0;
Delay(100);
LED2 = 0;
Delay(100);
LED3 = 0;
Delay(100);
LED4 = 0;
Delay(100);
LED5 = 0;
Delay(100);
LED6 = 0;
Delay(100);
LED7 = 0;
Delay(100);
LED8 = 0;
Delay(100);
// 灯全灭,等待下一次按键触发
LED1 = 1;
LED2 = 1;
LED3 = 1;
LED4 = 1;
LED5 = 1;
LED6 = 1;
LED7 = 1;
LED8 = 1;
}
}
void Int1() interrupt 2
{
// 判断K2按键是否松开
if(P3_1 == 1)
{
// 第二种流水灯:依次灭掉8个LED灯
LED8 = 1;
Delay(100);
LED7 = 1;
Delay(100);
LED6 = 1;
Delay(100);
LED5 = 1;
Delay(100);
LED4 = 1;
Delay(100);
LED3 = 1;
Delay(100);
LED2 = 1;
Delay(100);
LED1 = 1;
Delay(100);
// 灯全亮,等待下一次按键触发
LED1 = 0;
LED2 = 0;
LED3 = 0;
LED4 = 0;
LED5 = 0;
LED6 = 0;
LED7 = 0;
LED8 = 0;
}
}
// 配置中断0和中断1的触发方式为下降沿触发
IT0 = 1;
IT1 = 1;
// 开启中断0和中断1
EX0 = 1;
EX1 = 1;
// 开启总中断
EA = 1;
while(1);
}
```
代码说明:
1. 定义P1口连接的8个LED灯的引脚,使用sbit关键字进行定义。
2. 定义延时函数Delay,用于控制LED灯的亮灭时间。
3. 在主函数中,初始化P1口为输出模式,初始值为全灭;初始化P3口为输入模式,上拉电阻使K1和K2按键默认为高电平。
4. 定义两个中断服务程序Int0和Int1,分别对应K1和K2按键触发的中断事件。
5. 在中断服务程序Int0中,判断K1按键是否按下,如果按下,则依次点亮8个LED灯,然后灯全灭,等待下一次按键触发。
6. 在中断服务程序Int1中,判断K2按键是否松开,如果松开,则依次灭掉8个LED灯,然后灯全亮,等待下一次按键触发。
7. 在主函数中,配置中断0和中断1的触发方式为下降沿触发,开启中断0和中断1,开启总中断。
8. 程序进入死循环,等待中断事件的触发。
阅读全文