[51单片机]灯闪烁及流水灯

麻了...为什么Markdown编辑器一复制粘贴就无了...

单片机依旧使用的是普中-单核-A2。


#include "reg52.h"
#include "intrins.h"//左右移函数所在的头文件

/* 函数声明 */

void delay_ms(int n);//延时1ms
void delay_us(int i);//延时10us
void water_lamp_1();//位定义流水灯
void water_lamp_2();//总线法流水灯
void water_lamp_3();//左移右移符流水灯
void water_lamp_4();//左移右移函数流水灯
void water_lamp_5();//往复流水灯1
void water_lamp_6();//往复流水灯2
void water_lamp_7();//往复流水灯3
void breathing_light1();//呼吸灯
void the_lamp_flashes_1();//灯闪烁1
void the_lamp_flashes_2();//灯闪烁2

/* 变量声明 */

sbit LED0 = P2^0;
sbit LED1 = P2^1;
sbit LED2 = P2^2;
sbit LED3 = P2^3;
sbit LED4 = P2^4;
sbit LED5 = P2^5;
sbit LED6 = P2^6;
sbit LED7 = P2^7;

/*
 *函数名称:main()
 *函数功能:执行函数
 *输入参数:无
 *返回参数:无
 *注意事项:
 */
void main()
{
	while(1)
	{
		the_lamp_flashes_2();
	}
		
}


/*
 *函数名称:delay_ms()
 *函数功能:延时1ms
 *输入参数:n
 *返回参数:无
 *注意事项:
 */

void delay_ms(int n)
{
    int j;
    while(n--)
    {
        for(j = 0;j <= 125;j++);
    }
}

/*
 *函数名称:delay_us()
 *函数功能:延时10us
 *输入参数:i
 *返回参数:无
 *注意事项:
 */
void delay_us(int i)
{
    while(i--);
}


/*
 *函数名称:water_lamp_1
 *函数功能:位定义法流水灯
 *输入参数:无
 *返回参数:无
 *注意事项:
 */

void water_lamp_1()
{
	LED0 = 0;	delay_ms(200);LED0 = 1;
	LED1 = 0;	delay_ms(200);LED1 = 1;
	LED2 = 0;	delay_ms(200);LED2 = 1;
	LED3 = 0;	delay_ms(200);LED3 = 1;
	LED4 = 0;	delay_ms(200);LED4 = 1;
	LED5 = 0;	delay_ms(200);LED5 = 1;
	LED6 = 0;	delay_ms(200);LED6 = 1;
	LED7 = 0;	delay_ms(200);LED7 = 1;
}

/*
 *函数名称:water_lamp_2
 *函数功能:总线法流水灯
 *输入参数:无
 *返回参数:无
 *注意事项:
 */

void water_lamp_2()
{
	P2 = 0xfe;//1111 1110
	delay_ms(200);
	P2 = 0xfd;//1111 1101
	delay_ms(200);
	P2 = 0xfb;//1111 1011
	delay_ms(200);
	P2 = 0xf7;//1111 0111
	delay_ms(200);
	P2 = 0xef;//1110 1111
	delay_ms(200);
	P2 = 0xdf;//1101 1111
	delay_ms(200);
	P2 = 0xbf;//1011 1111
	delay_ms(200);
	P2 = 0x7f;//0111 1111
	delay_ms(200);
}

/*
 *函数名称:water_lamp_3
 *函数功能:左移右移符流水灯
 *输入参数:无
 *返回参数:无
 *注意事项:
 */

void water_lamp_3()
{
	char j;
	P2 = 0xfe; //1111 1110
	delay_ms(500);
	for(j = 0;j < 8;j++)
	{
		P2 = ~P2;//取反0000 0001...
		P2 = P2 << 1;//左移一位0000 0010
		P2 = ~P2;//取反1111 1101...
		delay_ms(200);
	}
}

/*
 *函数名称:water_lamp_4
 *函数功能:左移右移函数流水灯
 *输入参数:无
 *返回参数:无
 *注意事项:
 */
void water_lamp_4()
{
	  int i = 0;
		P2 = 0xfe;
//    for(i = 0;i < 8;i++)
//    {
//			P2 = _crol_(P2,1);//右移函数
//			delay_ms(300);
//    }
    for(i = 0;i < 8;i++)
    {
        P2 = _cror_(P2,1);//左移函数
        delay_ms(300);
    }
}

/*
 *函数名称:water_lamp_5
 *函数功能:往复流水灯
 *输入参数:无
 *返回参数:无
 *注意事项:
 */
void water_lamp_5()
{
	int i;
	P2 = 0xfe;
	delay_ms(200);
	for(i = 0;i < 8;i++)
	{ 
		P2 = P2 << 1 | 0x01;//1111 1100|0000 0001 = 1111 1101
		delay_ms(200);
	}
	
	P2 = 0x7f;
	for(i = 0;i < 8;i++)
	{
		P2 = P2 >> 1 | 0x80;//0011 1111|0111 1111 = 1011 1111
		delay_ms(200);
	}
}

/*
 *函数名称:water_lamp_6
 *函数功能:往复流水灯
 *输入参数:无
 *返回参数:无
 *注意事项:
 */
void water_lamp_6()
{
	int i = 7;
	int k;
	P2 = 0xfe;
	delay_ms(200);
	while(i--)
	{ 
		k = P2 >> 7;//0000 0001
		P2 = P2 << 1 | k;//1111 1100|0000 0001=1111 1101
		delay_ms(200);
	}
	i = 7;
	while(i--)
	{
		k = P2 << 7;
		P2 = P2 >> 1 | k;
		delay_ms(200);
	}
}

/*
 *函数名称:water_lamp_7
 *函数功能:往复流水灯
 *输入参数:无
 *返回参数:无
 *注意事项:共阳极:对数组内的十六进制数取反
 *          共阴极:直接用
 */

void water_lamp_7()
{
	int n;
	unsigned char str[8] = { 0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80 };
													/*0000 0001
														0000 0010
														0000 0100	
														0000 1000
														0001 0000
														0010 0000
														0100 0000
														1000 0000
													*/
	for( n = 0;n < 8;n++)
	{
		P2 = ~str[n];
		delay_ms(200);
	}
	for(n = 7;n >= 0;n--)
	{
		P2 = ~str[n];
		delay_ms(200);
	}
}

/*
 *函数名称:breathing_light1()
 *函数功能:呼吸灯
 *输入参数:无
 *返回参数:无
 *注意事项:延时函数时间不能过大,过大会表现为灯闪烁
 */
void breathing_light1()
{
	int i;
	for(i = 0;i < 500;i++)//高电平逐渐增加,低电平逐渐减少,灯越来越暗
	{
		P2 = 0x00;
		delay_us(i);
		P2 = 0xff;
		delay_us(500 - i);
	}
	for(i = 500;i >= 0;i--)//高电平逐渐增加,低电平逐渐减少,灯越来越暗
	{
    P2 = 0x00;
		delay_us(i);
		P2 = 0xff;
		delay_us(500 - i);
	}
}

/*
 *函数名称:the_lamp_flashes_1()
 *函数功能:灯闪烁
 *输入参数:无
 *返回参数:无
 *注意事项:
 */
void the_lamp_flashes_1()
{
	LED0 = 1;LED1 = 1;LED2 = 1;LED3 = 1;LED4 = 1;LED5 = 1;LED6 = 1;LED7 = 1;
	delay_ms(200);
	LED0 = 0;LED1 = 0;LED2 = 0;LED3 = 0;LED4 = 0;LED5 = 0;LED6 = 0;LED7 = 0;
	delay_ms(200);
}
/*
 *函数名称:the_lamp_flashes_2()
 *函数功能:灯闪烁
 *输入参数:无
 *返回参数:无
 *注意事项:
 */
void the_lamp_flashes_2()
{
	P2 = 0x00;
	delay_ms(200);
	P2 = 0xff;
	delay_ms(200);
//	P2 = ~P2;
//	delay_ms(200);
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值