1.流水灯

1.流水灯

题目:使用独立按键切换流水灯的不同模式,AT89S51单片机的P0.0-P0.7接八个发光二极管L1-L8,P1.4-P1.7接了四个开关K1-K4,编程按下K1,流水灯自上而下,按下K2,流水灯自下而上,按下K3,流水灯的L1、L3、L5、L7依次点亮,按下K4,流水灯的L2、L4、L6、L8依次点亮。

仿真
在这里插入图片描述

代码
#include <reg52.h>
#define uint unsigned int //定义单元的无符号整数
#define uchar unsigned char//表示之后代码中的“uchar”全部代表“unsigned char”
void delay(uint ms)
{
uint t;
while(ms–)
{
for(t=0;t<112;t++)
{
}
}
}
sbit k=P1^4;
void main()
{
while(1)
{
switch(P1)
{

	 case 0xef:
	P0=0xfe;
	delay(200);	 //点亮第一个灯
	P0=0xfd;
	delay(200);	 //点亮第二个灯
	P0=0xfb;
	delay(200);	 //点亮第三个灯
	P0=0xf7;
	delay(200);	 //点亮第四个灯
	P0=0xef;
	delay(200);	 //点亮第五个灯
	P0=0xdf;
	delay(200);	 //点亮第六个灯
	P0=0xbf;
	delay(200);	 //点亮第七个灯
	P0=0x7f;
	delay(200);	 //点亮第八个灯
	break; 
	 case 0xdf:
	P0=0x7f;
	delay(200);	 //点亮第八个灯
	P0=0xbf;
	delay(200);	 //点亮第七个灯
	P0=0xdf;
	delay(200);	 //点亮第六个灯
	P0=0xef;
	delay(200);	 //点亮第五个灯
	P0=0xf7;
	delay(200);	 //点亮第四个灯
	P0=0xfb;
	delay(200);	 //点亮第三个灯
	P0=0xfd;
	delay(200);	 //点亮第二个灯
	P0=0xfe;
	delay(200);	 //点亮第一个灯
	break;
	case 0xbf:
	P0=0xfe;
	delay(200);	 //点亮第一个灯
	P0=0xfb;
	delay(200);	 //点亮第三个灯
	P0=0xef;
	delay(200);	 //点亮第五个灯
	P0=0xbf;
	delay(200);	 //点亮第七个灯
	break;
	case 0x7f:
	P0=0xfd;
	delay(200);	 //点亮第二个灯
	P0=0xf7;
	delay(200);	 //点亮第四个灯
	P0=0xdf;
	delay(200);	 //点亮第六个灯
	P0=0x7f;
	delay(200);	 //点亮第八个灯
	break; 

}
}
}

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,您的问题是如何利用定时/计数器设计流水灯控制程序,实现流水灯从高位到低位移位操作,同时根据不同的序号采用不同的时间间隔。 首先,我们可以采用单片机的定时/计数器模块来实现时间间隔的控制。不同的序号可以通过程序中的条件语句来进行判断和区分。 下面是一个基于51单片机流水灯控制程序,代码中使用了定时/计数器模块和移位操作: ```c #include <reg51.h> // 定义流水灯的初始值为0x80 unsigned char light = 0x80; void Timer0Init(void) { TMOD = 0x01; // 定时器0工作在模式1:16位定时器模式 TH0 = 0xFC; // 定时器0的高8位初始值 TL0 = 0x67; // 定时器0的低8位初始值 TR0 = 1; // 启动定时器0 ET0 = 1; // 打开定时器0中断 EA = 1; // 打开总中断 } void Timer0() interrupt 1 { static unsigned char cnt = 0; // 根据不同的序号采用不同的时间间隔 if(light == 0x01 || light == 0x10 || light == 0x100 || light == 0x1000) { TH0 = 0xFF; TL0 = 0x9C; } else if(light == 0x10000 || light == 0x100000 || light == 0x1000000 || light == 0x10000000) { TH0 = 0xFF; TL0 = 0x38; } else { TH0 = 0xFC; TL0 = 0x67; } cnt++; if(cnt == 2) // 控制流水灯移位的速度 { cnt = 0; light >>= 1; // 右移一位 if(light == 0) // 判断流水灯是否已经全部灭掉 { light = 0x80; // 重新从最高位开始 } } } void main() { Timer0Init(); while(1) { P1 = light; // 输出流水灯的状态到P1 } } ``` 在程序中,定时/计数器模块的初始化函数 `Timer0Init` 中,我们设置了定时器0的工作模式为16位定时器模式,定时器0的初值为0xFC67,定时器0的中断使能,以及总中断使能。 在定时器0中断服务函数 `Timer0()` 中,我们首先根据不同的序号设置不同的时间间隔,然后每次中断计数器 `cnt` 加1,当计数器累加到2时,即控制流水灯移位速度的计数器达到设定值时,我们执行一次右移一位的操作,如果流水灯已经全部灭掉了,则将其重新从最高位开始。最后,我们在主程序中不断地将流水灯的状态输出到P1。 这样,我们就通过定时/计数器模块和移位操作,实现了根据不同的序号采用不同时间间隔的流水灯控制程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值