单片机(AT89C51)的仿真实验——流水灯和逐一闪烁灯(输入与输出)

编程入门 行业动态 更新时间:2024-10-08 10:34:34

<a href=https://www.elefans.com/category/jswz/34/1769836.html style=单片机(AT89C51)的仿真实验——流水灯和逐一闪烁灯(输入与输出)"/>

单片机(AT89C51)的仿真实验——流水灯和逐一闪烁灯(输入与输出)

单片机的仿真实验——流水灯和逐一闪烁灯(输入与输出)

在进行仿真实验前必须先装了软件,一个是单片机仿真软件(ISIS 7 Professional)和单片机写程序的软件(Keil uVision4),一个写程序一个烧程序。如果没装的可以私聊我。

流水灯的实现(正向的流水灯):

原理:

P1初始值是:1111 1111和temp(0000 0001)异或等于以后  P1=1111 1110使得第一个灯亮着,

进入循环0000 0001左移一位得到0000 0010,然后再和P1(1111 1110)异或等于以后  P1=1111 1100使得第一个灯和第二个灯都亮着,下面也是如此往复的循环,一盏一盏的连着点亮就实现了流水灯,然后一盏接着一盏的灭掉。

#include<reg51.h>
void delay02s(void)                    //延时函数的定义申明
{
unsigned char i,j,k;for(i=20;i>0;i--)for(j=20;j>0;j--)for(k=248;k>0;k--);
}
void main(void)
{char temp;char i;while(1){temp=0x01;for(i=0;i<8;i++)        {P1^=temp;              //异或等于的运算使得可以保留前一次的结果delay02s();            //延时函数temp=temp<<1;          //左移实现} }
}

 法二:

#include<reg51.h>
unsigned char code Tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char i;
void delay02s(void)
{
unsigned char i,j,k;for(i=20;i>0;i--)for(j=20;j>0;j--)for(k=248;k>0;k--);
}
void main(void)
{while(1){if(i<8){P1=Tab[i];delay02s();i++;}elsei=0;}
}

流水灯的实现(反向的流水灯):

原理和正向的流水灯雷同。

#include<reg51.h>
void delay02s(void)                 //延时函数的定义申明
{
unsigned char i,j,k;for(i=20;i>0;i--)for(j=20;j>0;j--)for(k=248;k>0;k--);
}
void main(void)
{char temp;char i;while(1){temp=0x80;for(i=0;i<8;i++){P1^=temp;              //异或等于的运算使得可以保留前一次的结果delay02s();            //延时函数temp=temp>>1;          //右移实现} }
}

逐一闪烁灯(1.暴力代码

原理:

直接把八个灯的接口全部定义一遍,然后在循环中写入各个接口的关闭和打开的代码,再在中间加入延时函数。比较的暴力,容易理解,容量大。

#include<reg51.h>
sbit  P1_0=P1^0;
sbit  P1_1=P1^1;
sbit  P1_2=P1^2;
sbit  P1_3=P1^3;
sbit  P1_4=P1^4;
sbit  P1_5=P1^5;
sbit  P1_6=P1^6;
sbit  P1_7=P1^7;void delay02s(void)             //延时函数的定义申明
{unsigned char i,j,k;for(i=20;i>0;i--)for(j=20;j>0;j--)for(k=248;k>0;k--);
}
void main(void)
{int i=0;while(1){P1_0=0;                 //第一盏灯的开启delay02s();             //延时函数   P1_0=1;                 //第一盏灯的关闭delay02s();P1_1=0;delay02s();P1_1=1;delay02s();P1_2=0;delay02s();P1_2=1;delay02s();P1_3=0;delay02s();P1_3=1;delay02s();P1_4=0;delay02s();P1_4=1;delay02s();P1_5=0;delay02s();P1_5=1;delay02s();P1_6=0;delay02s();P1_6=1;delay02s();P1_7=0;delay02s();P1_7=1;delay02s();}
}

 

逐一闪烁灯(2.借鉴流水灯的做法)

原理:

在循环中P1被赋值,temp=0x01(0000 0001)进行了取反的操作使得P1=1111 1110,就可以点亮第一个灯了

temp左移一位得到(temp=0000 0010)进行取反的操作使得P1=1111 1101,就可以点亮第二个灯了

下面就是循环的操作不难理解。

#include<reg51.h>
void delay02s(void)
{
unsigned char i,j,k;for(i=20;i>0;i--)for(j=20;j>0;j--)for(k=248;k>0;k--);
}
void main(void)
{char temp;char i;while(1){temp=0x01;for(i=0;i<8;i++)        {P1=~temp;                //取反等于,使得灯可以一盏一盏的点亮delay02s();             temp<<=1;} //反向的逐一点亮/*temp=0x80;for(i=0;i<8;i++){P1^=temp;delay02s();temp=temp>>1;} */}
}

No pains no results

更多推荐

单片机(AT89C51)的仿真实验——流水灯和逐一闪烁灯(输入与输出)

本文发布于:2024-02-07 03:00:21,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1752696.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:单片机   流水

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!