单片机实验报告流水灯实验总结(单片机流水灯实验报告问题小结)
单片机原理流水灯实验
单片机流水的实质是单片机各引脚在规定的时间逐个上电,使LED灯能逐个亮起来但过了该引脚通电的时间后便灭灯的过程,实验中使用了单片机的P2端口, 对8个LED灯进行控制,要实现逐个亮灯即将P2的各端口逐一置零,中间使用时间间隔隔开各灯的亮灭。使用r1或rra实现位的转换。
单片机流水灯+数码管实验
额,程序之前没仿真过,有点错误,现在可以了
#includereg52.h
#define?uchar?unsigned?char
#define?uint?unsigned?int
unsigned?a=0,b=0,counter=0;
unsigned?char?SEG1[?]?=?{0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
unsigned?char?SEG2[?]?=?{0x03,0x06,0x0C,0x18,0x30,0x60,0x0C,0x81};
unsigned?char?SEG3[?]?=?{0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
unsigned?char?SEG4[?]?=?{0x01,0x02,0x04,0x08,0x30,0x60,0x0C,0x81};
sbit?P31?=?P3^1;
sbit?P30?=?P3^0;
void?Timer0Init(void)?interrupt?3?//定时器1
{
counter++;
if(counter==2000)???//定时器定时250us,故4000次中断就表示1秒钟到达
{
counter=0;
a++;
b++;
if(a==8)?a=0;
if(b==256)b=0;
EA=1;
}
}
void?init()
{
TMOD?=?0x20;
EA=1;
TH1=6;
TL1=6;
TR1=1;
ET1=1;
}
void?disp()
{
if?(P30==0P31==0)?{P1?=?SEG1?[a];}
if?(P30==1P31==0)?{P1?=?SEG2?[a];}
if?(P30==0P31==1)?{P1?=?SEG3?[a];}
if?(P30==1P31==1)?{P1?=?SEG4?[a];}
P2=b;
}
main()
{
init();
while(1)
{
disp();
}
}
单片机:16个发光二极管组成的流水灯实验
电路图注意:1、P0口里应加上排阻,图里我没画出来。
2、单片机最小系统所需的晶振、复位电路我也没画。
临时帮你做的图,写的程序,细节就不是很完善啦,凑合着看吧!!
下面是程序,_crol_()函数是让temp的值左移一位的即执行一次该函数,temp的值由11111110到11111101,再执行一次是11111011……
_cror_()是右移。
#includereg51.h
#includeintrins.h//包含对_crol_(),_cror_()函数的说明的头文件
unsigned?char?temp,i;
void?delay(unsigned?int?z)//延时子程序,晶振11.0592M时延时大概1毫秒
{
unsigned?int?x?,y;
for(x=z;x0;x--)
for(y=110;y0;y--);
}
void?main()
{
while(1)
{
temp=0xfe;
for(i=0;i8;i++)//流水灯从P0^0口到P0^7口
{
P0=temp;
temp=_crol_(temp,1);
delay(5);
}
i=0;
temp=0xfe;
for(i=0;i8;i++)//流水灯从P1^0口到P1^7口
{
P1=temp;
temp=_crol_(temp,1);
delay(5);
}
i=0;
temp=0x7f;
for(i=0;i8;i++)//流水灯从P1^7口到P1^0口
{
P1=temp;
temp=_cror_(temp,1);
delay(5);
}
i=0;
temp=0x7f;
for(i=0;i8;i++)//流水灯从P0^7口到P0^0口
{
P0=temp;
temp=_cror_(temp,1);
delay(5);
}
i=0;
}
}
单片机流水灯实验
RL 是循环左移, A(n+1) - A(n), A(0) - A(7)
RR 是循环右移, A(n) - A(n+1), A(7) - A(0)
看来是LZ没有完全理解汇编指令,呵呵,这个程序的整个过程,如果是低电平亮的话,让整个过程中,始终只有1个灯亮起,其他都灭