【单片机】C52单片机上用两个以上按键实现流水灯控制

【单片机】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流水灯从中间到两边
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值