51单片机用一个按键控制8个LED灯的闪烁,每次在按键按下四次后8个LED每隔0.5秒闪烁十次

概要

  用一个按键控制8个LED灯的闪烁,每次在按键按下四次后8个LED每隔0.5秒闪烁十次(4个LED亮4个LED灭),然后全部熄灭。下一次再按下四次按键后,LED再闪烁十次,如此重复。按键控制和0.5秒间隔控制,请用定时计数器中断方式进行,可不考虑按键抖动,时钟频率为12MHz。

请用PROTEUS绘制原理图,编写程序,给出程序和运行截图。

代码

提示:这里可以添加技术名词解释

#include <REGX52.H>
#include <intrins.h>

#define u8 unsigned char  //定义字符类型
#define u16 unsigned int
#define led P2   //定义IO口P2为led
#define led_out 0xAA 
u8 x = led_out;
u8 state = 0;
bit flag = 0;

void Delay(u16 xms)
{
	unsigned char i, j;
	while(xms--)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	}
}
void init()//初始化,即打开各中断开关
{
	 TMOD &= 0xF0;		//设置定时器模式
	 TMOD |= 0x01;		//设置定时器模式
	 TH0=0xFC; //定时器0装初值 
     TL0=0x18; //同上
     IT0=1;//外部中断0为跳变沿触发方式
     EA=1;//开总中断
     EX0=1;//打开外部中断0
	 TR0=1;//打开定时器0运行开关
	 IP=0x01;//设置int0优先级为高,与PX0=1;等效
}
void int0() interrupt 0  //外部中断0的执行程序。
{ 							   			
	switch(state)
	{
		case 0:	if(!P3^2){ flag = 0; state = 2;}else{flag = 0; state = 0;} break;
		case 1: if(!P3^2){ flag = 0; state = 2;}else{flag = 0; state = 1;}  break;
		case 2: if(!P3^2){ flag = 0; state = 3;}else{flag = 0; state = 2;}  break;	
		case 3: if(!P3^2){ flag = 0; state = 4;ET0=1;x = led_out;}else{flag = 0; state = 3;} break;
		//状态3打开定时器中断 led灯初始化
		case 4: if(!P3^2){ flag = 1; state = 1;}else{flag = 0; state = 4;}  break;
		//状态4,标志位拉高
	}
}
void t0() interrupt 1  //定时器
{   
	static unsigned int T0Count1,T0Count2;
	 TH0=0xFC; //定时器0装初值 
     TL0=0x18; //同上
     T0Count1++; //记录定时器经过的时间
	 T0Count2++;
	if(T0Count1 >= 500)		//每0.5S闪烁一次
	{
		x = _crol_(x,1);	//每0.5S位移一次,实现0.5S闪烁1次
		T0Count1 = 0;
	}else
	{
		x = x;
	}
	if(T0Count2 >= 10000) //5S闪烁10次
	{
		x = 0xff;		  //熄灭LED灯
		T0Count2 = 0;
		ET0 = 0;		 //关闭中断
	}
}

void main()//主函数
{
	init();	  //初始化
	while(1)
	{
		if(flag)	//标志信号位高电平时,点亮led灯
		{
			led = x;	
		}
		else
			led = 0xff;
	}
}

PROTEUS仿真

提示:这里可以添加技术细节

例如:

小结

小作业

单片机技能操作题(c语言语句) 1. 设计一个程序,让P1.0LED每隔大约1切换一次状态(亮灭交替)。 2. 使用P0口的8LED,从左到右依次点亮后熄灭,形成一个流水效果,周期为大约2。 3. 编写一个程序,使P2口的8LED以大约0.5周期从右到左依次点亮,最后全部熄灭。 4. 实现P1口的8LED同时闪烁闪烁间隔大约15. 让P1.0和P1.1的LED交替闪烁,频率为每1次。 6. 编写程序,使P2口的LED每隔0.1按“0→1→3→7→15→31→63→127→2550”的二进制模式变化。 7. 设计一个“追逐”:P1口的LED从左到右点亮,同时最左边的LED熄灭,循环往复。 8. 实现P0口的LED以“全亮→全灭→左半亮→右半亮”的模式循环,周期为1。 9. 用P3口的8LED模拟二进制计数器,从0递增到255后归零。 10. 让P1口的LED循环切换切换一次方向(正向流水→反向流水交替)。 11. 使用P0口的数码管循环显示:1→2→3。 12. 实现P1口的LED以“全亮→左半边闪烁→右半边闪烁→全灭”的模式循环。 13. 编写程序,使P3口的LED以“随机数字”模式工作:一直连续生成随机数字n,电量任意连续的n个led。 14. 设计一个“交通”:用P1口的3个LED模拟红黄绿的循环(红→绿→黄→红)。 15. 实现P0口的8LED以“波浪形”流动(三个相邻的LED同时亮,左→中→右→中→左,一直循环)。 16. 让P2口的LED每隔1切换一次亮度模式(全亮、左半亮、右半亮,一直循环)。 17. 设计一个“倒计时”:用P0口的LED8位全亮开始,每隔1灭掉一位。 18. 让P1口的LEDLED点亮个数实现倒计时(8→7→……→0)。 19. 使用数码管,让P0口显示数字“3”。 20. 编写程序,让P0口连接的数码管动态显示“0→1→2→…→9→0”的循环。 21. 用P1口的8位静态驱动数码管,显示0-9循环。 22. 编写程序,使数码管以“随机数字”模式工作,一直连续显示0~9之间的随机数字。 23. 连接一个按键到P3.0口,按下后P1.0LED点亮,松开后熄灭。 24. 用两个独立按键控制两个LED按键1控制P1.0按键2控制P2.0)。
最新发布
04-03
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学渣_小强

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值