微控制器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語言的基本的內容,需要對迴圈,條件等比較熟悉,原始碼和模擬圖都上了,可以用來複習並且給需要的人一些參考吧。
另外,程式碼並不是最優的,有更好的意見歡迎交流。