在进行仿真实验前必须先装了软件,一个是单片机仿真软件(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
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
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>1; //右移实现
}
}
}
逐一闪烁灯(1.暴力代码)
原理:
直接把八个灯的接口全部定义一遍,然后在循环中写入各个接口的关闭和打开的代码,再在中间加入延时函数。比较的暴力,容易理解,容量大。
#include
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
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>1;
} */
}
}
No pains no results
作者:YYH-ZC