一、功能实现:
要求P3.4接一个按键,P1接8个灯,当按键按下3次后,8个灯实现流水灯效果,每个灯亮2s,灭2s。注意:计数器用T0,工作方式2,软件启动方式;定时器用T1,工作方式1,软件启动方式。
二、C51代码:
#include <reg52.h>
//定时器用T1,工作方式1,定时2s
void time2s()
{
unsigned int i;
for(i=0;i<40;i++) //定时器一次定时50ms,n那么40次就是2000ms,也就是2s,满足题目要求的时间
{
TH1=(65536-50000)/256; //方式1最大值为2^16,即65536,50ms即是要数50000次,所以(65536-50000)/256为初值的高位
TL1=(65536-50000)%256; //方式1最大值为2^16,即65536,50ms即是要数50000次,所以(65536-50000)%256为初值的低位
TR1=1; //开启定时器1
while(!TF1); //查询是否计满50000次,也即是按键是否已经到了50ms,定时满50ms后TF1自动置1,跳出while循环
TF1=0; //将已自动置1的TF1清零
}
}
void main()
{
unsigned char w,k;
TMOD=0X16; //计数器用T0,工作方式2,软件启动方式;定时器用T1,工作方式1,软件启动方式。
TH0=256-3; //工作方式2,TH0和TL0初值都一样
TL0=256-3;
TR0=1; //启动T0计数器
while(1)
{
while(!TF0); //查询是否计满3次,也即是按键是否已经按下了3次,计满3次TF0自动置1,跳出while循环
TF0=0; //将已自动置1的TF0清零
w=0x01;
for(k=0;k<8;k++)//8个灯的流水灯效果
{
P1=~w; //1111 1110 低电平点亮第一个灯,亮2s
time2s( );
P1=0XFF; //1111 1111 全为高电平,所有灯熄灭,灭2s
time2s( );
w<<=1; //w依次左移,比如原来为0000 0001,循环一次后变为0000 0010,以此类推
}
}
}