51单片机流水灯实现,编制程序,用PROTEUS绘制电路图,八个LED轮流点亮,每个时间只有一只点亮,点亮时间为1秒,其余熄灭。用一个按键控制流水灯的继续和暂停。

文章目录

概要

51单片机流水灯实现,编制程序,用PROTEUS绘制电路图,八个LED轮流点亮,每个时间只有一只点亮,点亮时间为1秒,其余熄灭。用一个按键控制流水灯的继续和暂停。

代码

#include <REGX52.H>
#include <intrins.h>
#define u8 unsigned char  //定义字符类型
#define u16 unsigned int
#define led  P2   //定义IO口P2为led	
bit k = 0;
u8 x = 0x01;
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
	 ET0 = 1;//打开定时器0中断开关
	 TR0 = 1;//打开定时器0运行开关
	 IP = 0x01;//设置int0优先级为高,与PX0=1;等效
}
void int0() interrupt 0  //外部中断0的执行程序。
{	
	Delay(20);
	if(!P3^2)
	{
		Delay(20);
		k = !k;	
	}		
}
void t0() interrupt 1  //定时器
{   
	static unsigned int T0Count;
	 TH0 = 0xFC; //定时器0装初值 
     TL0 = 0x18; //同上
     T0Count++; //记录定时器经过的时间
   if(T0Count >= 1000)//定时1秒后执行,T0Count=1000时约1秒
   {	   
	   if(!k)
	   {
		   x = _crol_(x,1);
		   T0Count=0; //重置定时,达到每一秒点亮一次的目的
	   }
	   else
	   {
		   x = x;
		   T0Count = T0Count;
	   }
	}
}
void main()
{
	init();	  //初始化
	while(1)
	{
		if(!k)	
			led = ~x;
		else
			led = led;
	}
}

仿真

  • 5
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Proteus软件中进行51单片机仿真时,我们可以使用8个LED实现一个循环点流水效果。具体步骤如下: 1.首先,我们需要在Proteus的工作区中添加一个51单片机,并连接好其供电和晶振。 2.接下来,我们需要添加8个LED,以模拟8个流水的效果。将它们连接到单片机的输出引脚上。为了简化连接,我们可以使用一个扩展芯片(如74595)来控制这些LED。 3.对于循环点的效果,我们需要在程序中设置一个循环来不断变化LED灭状态。可以通过移位运算来控制LED灭状态。 4.在程序中,我们可以使用一个变量来表示LED的状态,假设取值范围为0-7。通过对该变量的处理,可以实现循环点的效果。 5.在Proteus中,我们可以使用Proteus VSM来调试和验证程序的正确性。通过仿真,我们可以观察到LED依次点的效果,完成了流水的循环显示。 以流水以顺序点的方式为例,程序的基本思路如下: ``` #include <reg51.h> unsigned char led_status = 1; // 定义一个变量表示LED的状态,初始为第一个LED void delay(unsigned int t) // 定义一个延时函数 { unsigned int i, j; for (i = 0; i < t; i++) for (j = 0; j < 120; j++) ; } void main() { while (1) { P1 = ~(1 << (led_status - 1)); // 点对应的LED,其他LED熄灭 delay(1000); // 延时1秒,控制LED的速度 led_status++; // 将LED状态+1,实现流水的效果 if (led_status > 8) led_status = 1; // 当LED状态超过8时,重新从1开始 } } ``` 通过以上的操作步骤和程序设计,我们可以在Proteus实现一个8个LED依次循环点流水效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

学渣_小强

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

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

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

打赏作者

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

抵扣说明:

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

余额充值