1. 程式人生 > >微控制器I/O口控制實驗

微控制器I/O口控制實驗

實驗內容:

利用P1口做輸出口,接八隻發光二極體,編寫程式是發光二極體迴圈點亮或者具有一定的花樣。

1.第一個發光二極體以間隔200ms閃爍;

2.8個發光二極體由上至下間隔,1s流動,其中每個管亮500ms,滅500ms,亮時蜂鳴器響,滅時關閉蜂鳴器,一直重複下去;

3.8個發光二極體來回流動,每個管亮100ms,流動時讓蜂鳴器發出“滴滴”聲;

4.用8個發光二極體演示出8位二進位制數累加過程,結合兩個開關(一加一減)實現加減運算;

5.8個發光二極體間隔200ms由上至下,再由下至上,再重複一次,然後全部熄滅再以300ms間隔全部閃爍5次,重複此過程;

6.間隔300ms第一次一個管亮流動一次,第二次兩個管亮流動,依次到8個管亮,然後重複此過程;

7.間隔300ms先奇數亮再偶數亮,迴圈三次,一個燈上下迴圈三次,兩個分別從兩邊往中間流動三次,再從中間往兩邊流動三次,8個全部閃爍3次,關閉發光管,程式停止。

模擬圖:


1.第一題簡單,不上程式碼了><

2.原始碼:

#include <reg52.h>   
#include <intrins.h>
#define uchar unsigned char
sbit buzzer=P3^7;                                //定義引腳
void delay(uchar z)                               //延時函式
{
uchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void main()
{
uchar a,i;
while(1)
{
a=0xfe;
for(i=0;i<8;i++)
{P1=a;
buzzer=0;
delay(250);
P1=0xff;                                //起到消隱作用
buzzer=1;
delay(250);
a=_crol_(a,1);                        //左移函式
}
}
}

3.原始碼:

#include <reg52.h>   
#include <intrins.h>
#define uchar unsigned char
sbit buzzer=P3^7;
void delay(uchar z)
{
uchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void main()
{
uchar a,i;
while(1)
{
a=0xfe;                    //第一個燈先亮
for(i=0;i<8;i++)
{
P1=a;
buzzer=0;
delay(250);
buzzer=1;
delay(250);
a=_crol_(a,1);
}
a=0x7f;                    //倒數第一個燈先亮,形成來回流動
for(i=0;i<8;i++)
{
P1=a;
buzzer=0;
delay(250);
buzzer=1;
delay(250);
a=_cror_(a,1);
}
}

}

4.原始碼:

#include<reg52.h>  
#include<intrins.h>   
#define uchar unsigned char  
void delay(uchar z)  
{     
uchar x,y;
for(x=z;x>0;x--)
  for(y=110;y>0;y--); 
}
void main()      
{
uchar a;
while(1)        
{
  a++;
  P1=~a;                    //按位取反
  delay(200);
}

}

5.原始碼:

#include<reg52.h>  
#include<intrins.h>  
#define uchar unsigned char  
uchar aa;  
void delay(uchar z);  
void main()  
{  
    uchar i,j,k;  
    while(1)  
    {  
        for(i=0;i<2;i++)  
        {  
            aa=0xfe;  
            for(j=0;j<7;j++)  
            {  
                P1=aa;  
                delay(200);  
                aa=_crol_(aa,1);  
            }  
            aa=0x7f;  
            for(k=0;k<7;k++)  
            {  
                P1=aa;  
                delay(200);  
                aa=_cror_(aa,1);           
            }  
        }  
        P1=0xff;  
        for(j=0;j<10;j++)  
        {  
              
            P1=~P1;                      //按位取反,則實現一亮一滅;
            delay(300);  
        }  
    }  
}  
void delay(uchar z)  
{  
        uchar x,y;  
        for(x=0;x<z;x++)  
        for(y=0;y<110;y++);  
  

}  

6.原始碼:

#include <reg52.h>  
#include <intrins.h>  
#define uc unsigned char  
void delay(uc);  
uc a,b,c,d,x,y,e;  
void main()  
{  
 while(1)
 {  
 e=1;  
 for(a=1;a<=8;a++)
 {   
 b=9-a;
 c=0xff;
 e=e*2; 
 d=c-e+1;  
 while(b)  
 {  
 P1=d;  
 delay(300);  
 d=_crol_(d,1);  
 b--;  
 }  
 }  
 }  
}  
void delay(uc k)  
{  
 for(x=k;x>0;x--)  
 for(y=110;y>0;y--);  

}  

7.原始碼:

#include<reg52.h>
#include<intrins.h>
#include<stdlib.h>
#define uchar unsigned char
#define uint  unsigned int
#define led P1
void delay(uint i);
void main()

    while(1)
    {
        uchar leddata;
        uchar ci;
        uchar one;
        uchar cs;
P1=0xff;
        for(ci=0;ci<3;ci++)
        {   leddata=0xaa;
            led=leddata;
            delay(300);
            leddata=0x55;
            led=leddata;
            delay(300);
         }
         for(ci=0;ci<3;ci++)
         {
            leddata=0xfe;
            led=leddata;
            delay(1000);
            for(one=0;one<7;one++)
            {
                led=(led<<1)+1;
                delay(1000);
            }
            while(one==7)
            {
                for(one=7;one>0;one--)
                {
                    led=(led>>1)+128;
                    delay(1000);
                }
                break;
            }
        }
        for(cs=0;cs<3;cs++)
        {
            uchar code led2[]={0xe7,0xdb,0xbd,0x7e};
            uchar deng;
            uchar linshi;
            for(linshi=0;linshi<4;linshi++)
            {
                deng=linshi;
                led=led2[deng];
                delay(1000);
            }
        }
        for(cs=0;cs<3;cs++)
        {
            uchar code led2[]={0x7e,0xbd,0xdb,0xe7};
            uchar deng;
            uchar linshi;
            for(linshi=0;linshi<4;linshi++)
            {
                deng=linshi;
                led=led2[deng];
                delay(1000);
            }
        }
        for(ci=0;ci<3;ci++)
        {leddata=0x00;
        led=leddata;
        delay(1000);
        leddata=0xff;
        led=leddata;
        delay(1000);
        }while(1);
    }

}
void delay(uint i)
{
    uchar j;
    for(;i>0;i--)
        for(j=115;j>0;j--)
        {;}

}

本次實驗總結:

點亮流水燈及其花樣是微控制器入門的第一次實驗,接下來會繼續整理其他實驗,這裡用到的微控制器c語言的基本的內容,需要對迴圈,條件等比較熟悉,原始碼和模擬圖都上了,可以用來複習並且給需要的人一些參考吧。

另外,程式碼並不是最優的,有更好的意見歡迎交流。