单片机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语言的基本的内容,需要对循环,条件等比较熟悉,源码和仿真图都上了,可以用来复习并且给需要的人一些参考吧。

另外,代码并不是最优的,有更好的意见欢迎交流。

猜你喜欢

转载自blog.csdn.net/honorwh/article/details/80414058