【C语言】51单片机流水灯(西北工业大学电子实习)

【C语言】51单片机流水灯(西北工业大学电子实习)

基础知识

&:按位与
|:按位或
~:按位取反
^:按位异或

举例说明:
A=1 1 0 0 1 1 0 0
B=1 1 1 1 0 0 0 0

A&B=1 1 0 0 0 0 0 0
A|B=1 1 1 1 1 1 0 0
~A=0 0 1 1 0 0 1 1
A^B=0 0 1 1 1 1 0 0

循环左移_crol_和循环右移_cror_:
单片机有一个库文件已经写好了移位函数,储存在#include<intrins.h>库文件里。
变量=crol(变量名,移动位数)
P0= 0xfe; // 1111 1110
P0=crol(P0,1);
此时,P0=0xfd;//1111 1101



七道题目的实现效果

演示效果图



完整代码

#include <reg51.h>              //51单片机头文件
#include <intrins.h>            //包含循环移位指令的头文件

#define uchar unsigned char     //宏定义 unsigned char 为 uchar
#define uint  unsigned int      //宏定义 unsigned int  为 uint

sbit k1 = P3 ^ 2;
sbit k2 = P3 ^ 3;
sbit k3 = P3 ^ 4;
sbit k4 = P3 ^ 5;

void delay_us(uint us)          //延时子程序
{
    
    
	uint a;                     //声明变量a取值为0-65535
	for(a=0;a<us;a++);
}

void start_1()                  //第一题
{
    
    
	uchar a,b;
    b=0xfe;                     //1111 1110
    for(a=0;a<7;a++)            //从右到左
    {
    
    
		P0 = b;
		delay_us(50000);
		b=_crol_(b,1);
	}
	for(a=0;a<7;a++)            //从左到右
	{
    
    
		P0 = b;
		delay_us(50000);
		b=_cror_(b,1);
	}
}

void start_2()                 //第二题
{
    
    
	uchar a,b;
	b=0xfe;                    //1111 1110
	for(a=0;a<7;a++)           //从右到左
	{
    
    
		P0 = 0xe7 & b;         //1110 0111 & b
		delay_us(50000);
		b=_crol_(b,1);
	}
	for(a=0;a<7;a++)           //从左到右
    {
    
    
		P0 = 0xe7 & b;         //1110 0111 & b
		delay_us(50000);
		b=_cror_(b,1);
	}
}

void start_3()                //第三题
{
    
     
	uchar a,b,c;
	b=0x7f;                   //0111 1111
	c=0xfe;                   //1111 1110
	for(a=0;a<3;a++)          //从两边到中间
    {
    
    
		P0 = b & c;
		delay_us(50000);
		b=_cror_(b,1);
		c=_crol_(c,1);
	}
	for(a=0;a<3;a++)          //从中间到两边
    {
    
    
		P0 = b & c;
		delay_us(50000);
		b=_crol_(b,1);
		c=_cror_(c,1);
	}
}

void start_4()               //第四题
{
    
    
	uchar a;
    for(a=0;a<8;a++)         //从左到右依次亮起
	{
    
    
		P0 = 0x7f >> a;      //0111 1111 >> a
		delay_us(50000);
	}
	for(a=0;a<8;a++)         //从右到左依次灭掉
    {
    
    
		P0 = ~(0xff<<a);     //1111 1111 << a 按位取反
		delay_us(50000);
	}
}

void start_5()               //第五题
{
    
    
	uchar a,b,c,d;
    c=0xff;                  //1111 1111
    for(i=0;i<9;i++)
	{
    
    
		b=0xfe;              //1111 1110
		for(a=0;a<8;a++)
		{
    
    
			P0= b & c;
			delay_us(50000);
			b=_cror_(b,1);
		}
		c=c<<1;
	}
}

void start_6()              //第六题
{
    
    
	uchar a,b,c,d,e;
	b=0xfe;                 //1111 1110
	for(d=0;d<9;d++)
	{
    
    
		if(e>0)
		{
    
    
			b=_cror_(b,1);
		}
		a=0xfe;             //1111 1110
		for(e=0;e<d+1;e++)
		{
    
    
			P0= c;
			delay_us(50000);
			a=_cror_(a,1);
			c= a & b;
		}
	}
}


void start_7()             //第七题
{
    
    
	uint  a=0;
	uint  b=500;
	uchar c=0x00;          //0000 0000
	uchar d=0xff;          //1111 1111

	while(b)
	{
    
    
		P0= c;
		delay_us(b--);
		P0= d;
		delay_us(a++);
	}

	while(a)
	{
    
    
		P0= c;
		delay_us(b++);
		P0= d;
		delay_us(a--);
	}
}


void main()
{
    
    
	if(k1==0)
	{
    
    
		start_1();
		start_2();
		start_3();
		start_4();
		start_5();
		start_6();
		start_7();
	}
}
		

猜你喜欢

转载自blog.csdn.net/weixin_43767920/article/details/108684799