【单片机】C52单片机上用两个以上按键实现流水灯控制
本文主要介绍在C52单片机中断中,如何使用两个以上的外部按键实现流水灯控制!
在满足以下条件时,你的学习效果最佳:
1、开发环境中安装了keil(单片机程序开发工具)、proteus(仿真软件)
2、有一定c语言使用基础、有一定单片机电路基础
一、proteus电路图设计
1、电路图展示
2、外部按键描述
这里涉及到我们的第一个问题多,如何在只有两个外部中断的C52开发板上接入3个按键。这里我们选择的解决方案时将第三个按键接到定时/计数器T0(P3.4)引脚上。
二、程序控制代码
#include <reg51.h>
#include <intrins.h>
char led[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //流水灯低位向高位
char led2[]={0xe7,0xdb,0xbd,0x7e}; //流水灯中间向两边
int flag = 0; //0:流水灯停止 1:流水灯从低位到高位 2:流水灯从中间向两边
int index = 0; //索引P0口的高低电平状态
key1() interrupt 0{
flag = 1;
}
key2() interrupt 2{
flag = 0;
}
key3() interrupt 1{
flag = 2;
}
void delay_ms(int a)
{
int i,j;
for(i=0;i<a;i++)
{
for(j=0;j<1000;j++) _nop_();
}
}
void main(void)
{
//初始化中断
EA = 1;
EX0 = 1;
EX1 = 1;
ET0 = 1;
IT0 = 0;
IT1 = 0;
TMOD = 0x06; //定时计数器T0,采用方式二启动
TH0 = TL0 = 0xff;
TR0 = 1;
//
while(1) {
switch (flag){
case 0:
P0 = 0xff;
break;
case 1:
index = 0;
while(flag == 1){
P0 = led[index++%8];
delay_ms(10);
}
break;
case 2:
index = 0;
while(flag == 2){
P0 = led2[index++%4];
delay_ms(10);
}
break;
}
};
}
三、结果测试用例
将程序输出为hex文件后,导入仿真电路运行,点击三个按钮效果如下:
按钮 | 效果 |
---|---|
按键1 | 流水灯从低位到高位 |
按键2 | 流水灯停止 |
按键3 | 流水灯从中间到两边 |