四種方法實作單片機雙向流水燈
? 本實驗使用AT89C51芯片的P1埠,連接8個發光二極管,電路中使用470Ω電阻保護電路,其中發光二極管正極連接電源,負極連接P1.0—P1.7,通過給P1口不同的值控制不同的燈亮,中間使用延時函式,延時500毫秒,實作流水效果,下面使用4種演算法實作雙向流水燈,
繪制的PROTEUS仿真電路圖

方法一:順序結構
#include<reg51.h>
void display(unsigned int a){
unsigned int i = 0;
unsigned int j = 0;
for(i; i < a; i++)
for(j; j < 24000; j++);//晶振24MHZ時約等于1毫秒
}
void main(){
int led[] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
while(1){//向下流水
P1=0xfe;
display(500);
P1=0xfd;
display(500);
P1=0xfb;
display(500);
P1=0xf7;
display(500);
P1=0xef;
display(500);
P1=0xdf;
display(500);
P1=0xbf;
display(500);
P1=0x7f;
display(500);
//向上流水
P1=0x7f;
display(500);
P1=0xbf;
display(500);
P1=0xdf;
display(500);
P1=0xef;
display(500);
P1=0xf7;
display(500);
P1=0xfb;
display(500);
P1=0xfd;
display(500);
P1=0xfe;
}
}
方法二:陣列結構
#include<reg51.h>
void display(unsigned int a){
unsigned int i = 0;
unsigned int j = 0;
for(i; i < a; i++)
for(j; j < 24000; j++);//晶振24MHZ時約等于1毫秒
}
void main(){
int i=0;
int led[] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
while(1){
for(i;i<=7;i++){//向下流
P1 = led[i];
display(500);
}
for(i=7;i>0;i--){//向上流
P1 = led[i];
display(500);
}
}
}
方法三:回圈移位
#include<reg51.h>
#include<intrins.h>
void display(unsigned int a){
unsigned int i = 0;
unsigned int j = 0;
for(i; i < a; i++)
for(j; j < 24000; j++);//晶振24MHZ時約等于1毫秒
}
void main()
{
unsigned char i,temp;
while(1)
{
temp=0xfe;
for(i=1;i<8;i++)
{
P1=temp;
display(500);
temp=_crol_(temp,1);
}
for(i=1;i<8;i++)
{
P1=temp;
display(500);
temp=_cror_(temp,1);
}
}
}
方法四:移位運算
#include<reg51.h>
#include<intrins.h>
void display(unsigned int a){
unsigned int i = 0;
unsigned int j = 0;
for(i; i < a; i++)
for(j; j < 24000; j++);//晶振24MHZ時約等于1毫秒
}
void main()
{
unsigned char i,temp;
while(1)
{
temp=0x01;
for(i=0;i<8;i++)
{
P1=~temp;
display(500);
temp=temp<<1;
}
temp=0x80;
for(i=0;i<8;i++)
{
P1=~temp;
display(500);
temp=temp>>1;
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/66751.html
標籤:其他
上一篇:2020研究生數模競賽思路
下一篇:INCA語言切換
