其他分享
首页 > 其他分享> > C51 流水灯的三个实验

C51 流水灯的三个实验

作者:互联网

ISIS仿真电路如图

编程环境Keil uv5

 

 

 1.直接流水灯从D0到D11依次亮起,循环不止。

#include<reg51.h>
#define uchar unsigned char
    void delay()
    {
        uchar i,j;
        for(i=0;i<25;i++)
        for(j=0;j<255;j++);
    }
    void main()
    {
        uchar i,temp,temp2;
        while(1)
        {
            P1=0xff;
            temp=0x01;
            for(i=0;i<8;i++)
            {
                P0=~temp;
                delay();
                temp=temp<<1;
            }
            P0=~temp;
            temp2=0x01;
            for(i=0;i<4;i++)
            {
                P1=~temp2;
                delay();
                temp2=temp2<<1;
            }
            
        }
    }

2.键控流水灯,按下反向

#include<reg51.h>
#define uchar unsigned char
    void delay()//延时函数
    {
        uchar i,j;
        for(i=0;i<25;i++)
        for(j=0;j<255;j++);
    }
    
    void main()
    {
        uchar i,temp,temp2,temp3,flag=1;//temp是P0口的反电位,temp2是P1口的反电位,temp3是P2口的输入电位,flag是流水灯方向状态
        while(1)
        {        
            temp=0x01;//第一组第一个灯准备亮起
            if(flag==0)//如果逆时针
                temp=0x80;//第一组最后一个灯准备亮起
            for(i=0;temp!=0x00;i++)//移位到没有灯亮起结束循环
            {
                P0=~temp;//第一组灯亮
                delay();//延时
                P2=0xff;//要检测的端口先上高电位
                temp3=P2&0x0f;//与运算屏蔽低四位带来的影响
                if(temp3==0x0e)//第一个建按下的值
                {temp=temp>>1;flag=0;}
                else
                {temp=temp<<1;flag=1;}
            }
            P0=0xff;
            temp2=0x01;//第二组同上
            if(flag==0)
                temp2=0x08;
            for(i=0;temp2!=0x00&&temp2!=0x10;i++)
            {
                P1=~temp2;
                delay();
                P2=0xff;
                temp3=P2&0x0f;
                if(temp3==0x0e)
                {temp2=temp2>>1;flag=0;}
                else
                {temp2=temp2<<1;flag=1;}
            }
            P1=0xff;
        }
    }
        

3.键控流水灯

不按不亮,按k1顺时针,按k2逆时针,按k3停止.

这个没有设计完好,按k1k2的时候循环是从头开始的,而且停下来的点不会熄灭.而且还无奈使用了goto函数.

#include<reg51.h>
#define uchar unsigned char
    void delay()
    {
        uchar i,j;
        for(i=0;i<25;i++)
        for(j=0;j<255;j++);
    }
    void main()
    {
        uchar i,temp,temp2,temp3,flag=0;
        while(1)
        {
            P2=0xff;
            temp3=P2&0x0f;
            loop:
            if(temp3==0x0e)
                flag=1;
            if(temp3==0x0d)
                flag=2;
            if(temp3==0x0b)
                flag=0;
            switch(flag){
                case 1:
                    while(1)
                    {        
                        temp=0x01;
                        for(i=0;temp!=0x00;i++)
                        {
                            P0=~temp;
                            P2=0xff;
                            temp3=P2&0x0f;
                            if(temp3==0x0e||temp3==0x0d||temp3==0x0b)
                                goto loop;
                            delay();
                            P2=0xff;
                            temp3=P2&0x0f;
                            if(temp3==0x0e||temp3==0x0d||temp3==0x0b)
                                goto loop;
                            temp=temp<<1;
                        }
                        P0=0xff;
                        temp2=0x01;
                        for(i=0;temp2!=0x00&&temp2!=0x10;i++)
                        {
                            P1=~temp2;
                            P2=0xff;
                            temp3=P2&0x0f;
                            if(temp3==0x0e||temp3==0x0d||temp3==0x0b)
                                goto loop;
                            delay();
                            P2=0xff;
                            temp3=P2&0x0f;
                            if(temp3==0x0e||temp3==0x0d||temp3==0x0b)
                                goto loop;
                            temp2=temp2<<1;
                        }
                        P1=0xff;
                    }
                    break;
                case 2:
                    while(1)
                    {
                        temp2=0x08;
                        for(i=0;temp2!=0x00&&temp2!=0x10;i++)
                        {
                            P1=~temp2;
                            P2=0xff;
                            temp3=P2&0x0f;
                            if(temp3==0x0e||temp3==0x0d||temp3==0x0b)
                                goto loop;
                            delay();
                            P2=0xff;
                            temp3=P2&0x0f;
                            if(temp3==0x0e||temp3==0x0d||temp3==0x0b)
                                goto loop;
                            temp2=temp2>>1;
                        }
                        P1=0xff;
                        temp=0x80;
                        for(i=0;temp!=0x00;i++)
                        {
                            P0=~temp;
                            P2=0xff;
                            temp3=P2&0x0f;
                            if(temp3==0x0e||temp3==0x0d||temp3==0x0b)
                                goto loop;
                            delay();
                            P2=0xff;
                            temp3=P2&0x0f;
                            if(temp3==0x0e||temp3==0x0d||temp3==0x0b)
                                goto loop;
                            temp=temp>>1;
                        }
                        P0=0xff;
                    }
                    break;
                default:
                    break;}
                }
                    
        
    }

 

标签:P2,delay,C51,temp,uchar,temp3,实验,流水,0xff
来源: https://www.cnblogs.com/halfgong/p/13772659.html