【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();
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/102475.html
標籤:其他
上一篇:mbedtls | 01 - 移植mbedtls庫到STM32的兩種方法
下一篇:基于windows API 的基于表單、訊息回圈、事件驅動的 Windows C語言風格的Windows 程式實驗報告
