实验内容:
利用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语言的基本的内容,需要对循环,条件等比较熟悉,源码和仿真图都上了,可以用来复习并且给需要的人一些参考吧。
另外,代码并不是最优的,有更好的意见欢迎交流。