【C語言】51微控制器流水燈(西北工業大學電子實習)

2020-09-21 13:00:23

【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();
	}
}