开发板示意图
![](https://img-blog.csdnimg.cn/2020110314403192.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xpbmdkb25nMjQ=,size_16,color_FFFFFF,t_70)
使用for循环做延时函数,单项流水灯:
代码:
#include <reg52.h>
sbit ADDR0 = P1^0; //位定义,相当于给P1^0口取一个别名
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
void main()
{
unsigned char cnt = 0;
unsigned int i = 0;
ENLED = 0;
ADDR3 = 1;
ADDR2 = 1;
ADDR1 = 1;
ADDR0 = 0;
while(1)
{
P0 = ~(0x01 << cnt);
for(i=0; i<20000; i++);
cnt ++;
if(cnt==8)
{
cnt = 0;
}
}
}
效果截图:
使用定时器T0查询实现流水灯,代码:
#include <reg52.h>
sbit ADDR0 = P1^0; //位定义,相当于给P1^0口取一个别名
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
unsigned char THR0,TLR0;
void ConfigTimer(unsigned long ms);
void main()
{
unsigned char cnt = 0;
unsigned int i = 0;
ENLED = 0;
ADDR3 = 1;
ADDR2 = 1;
ADDR1 = 1;
ADDR0 = 0;
ConfigTimer(2);
TMOD = TMOD & 0xF0;
TMOD = TMOD | 0x01; //设置定时器模式1 ,不影响高四位
TH0 = THR0;
TL0 = TLR0;
TR0 = 1;
while(1)
{
if(TF0==1)
{
TF0 = 0;
TH0 = THR0;
TL0 = TLR0;
i++;
if(i==1000) //每2s移动一个点亮小灯
{
i = 0;
P0 = ~(0x01 << cnt);
cnt ++;
if(cnt==8)
{
cnt = 0;
}
}
}
}
}
void ConfigTimer(unsigned long ms)
{
unsigned long temp;
temp = 65536 - ms*11059200/1000/12; //ms最大定时71ms
THR0 = (unsigned char)(temp>>8); //取计数值高八位 ,计数值不会超过65535,最多占用16位。
TLR0 = (char)temp; //取计数值低八位
}
使用定时器T0中断实现流水灯,代码:
#include <reg52.h>
sbit ADDR0 = P1^0; //位定义,相当于给P1^0口取一个别名
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
unsigned char THR0,TLR0;
unsigned char flags = 0;
void ConfigTimer(unsigned long ms);
void main()
{
unsigned char cnt = 0;
unsigned int i = 0;
ENLED = 0;
ADDR3 = 1;
ADDR2 = 1;
ADDR1 = 1;
ADDR0 = 0;
ConfigTimer(2); //计算定时2ms,需要赋的初值,存在在 THR0,TLR0中
TMOD = TMOD & 0xF0;
TMOD = TMOD | 0x01; //设置定时器模式1 ,不影响高四位
TH0 = THR0; //定时器赋初值
TL0 = TLR0;
EA = 1; //使能总中断
ET0= 1; //使能T0中断
TR0 = 1; //启动定时器T0
while(1)
{
static unsigned char i = 0;
if(flags)
{
flags = 0;
P0 = ~(0x01<<i);
i++;
if(i==8)
{i = 0;}
}
}
}
void ConfigTimer(unsigned long ms)
{
unsigned long temp;
temp = 65536 - ms*11059200/1000/12; //ms最大定时71ms
THR0 = (unsigned char)(temp>>8); //取计数值高八位 ,计数值不会超过65535,最多占用16位。
TLR0 = (char)temp; //取计数值低八位
}
void InterruptTimer0() interrupt 1
{
static unsigned int cnt = 0;
TH0 = THR0;
TL0 = TLR0;
cnt++;
if(cnt>=500) //定时1s
{
cnt = 0;
flags = 1;
}
}
流水灯左移到头接着右移,右移到头再左移,使用定时器中断
代码:
#include <reg52.h>
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
unsigned char flags = 0;
unsigned char dir = 0;//方向标志:0位左移,1为右移
unsigned char THR0,TLR0;
void ConfigTimer(unsigned long ms);
void main()
{
unsigned char cnt = 0;
unsigned int i = 0;
ENLED = 0;
ADDR3 = 1;
ADDR2 = 1;
ADDR1 = 1;
ADDR0 = 0;
ConfigTimer(2); //计算定时2ms,需要赋的初值,存在在 THR0,TLR0中
TMOD = TMOD & 0xF0;
TMOD = TMOD | 0x01; //设置定时器模式1 ,不影响高四位
TH0 = THR0; //定时器赋初值
TL0 = TLR0;
EA = 1; //使能总中断
ET0= 1; //使能T0中断
TR0 = 1; //启动定时器T0
while(1)
{
static unsigned char i = 0;
if(flags)
{
flags = 0;
if(dir == 0) //方向标志dir,左移
{
P0 = ~(0x01<<i);
i++;
if(i==8)
{
dir = 1;
i = 1; //写成1,防止最左侧小灯亮2s
}
}
else //方向标志dir,右移
{
P0 = ~(0x80>>i);
i++;
if(i==8)
{
dir = 0;
i = 1; //写成1,防止最右侧小灯亮2s
}
}
}
}
}
void ConfigTimer(unsigned long ms)
{
unsigned long temp;
temp = 65536 - ms*11059200/1000/12; //ms最大定时71ms
THR0 = (unsigned char)(temp>>8); //取计数值高八位 ,计数值不会超过65535,最多占用16位。
TLR0 = (char)temp; //取计数值低八位
}
void InterruptTimer0() interrupt 1
{
static unsigned int cnt = 0;
TH0 = THR0;
TL0 = TLR0;
cnt++;
if(cnt>=500) //定时1s
{
cnt = 0;
flags = 1; //1s时间到标志
}
}