今天来写一篇关于定时器控制流水灯的博客,关于流水灯,我之前的博客有一篇是写过的,但是仅仅只是八个流水灯,本来并不打算写这篇文章,但是当写代码时,发现了自己对定时器以及其中断的应用并不是很娴熟,所以就觉得应该再写这么一篇博客,来让自己熟悉熟悉这方面的知识。
首先,这篇博客用的还是定时器T0 工作方式1 仿真工具还是使用了PROTEUS.
同时,在建立流水灯样式时,建立了相关的两个数组,如果想要修改发光样式,只需修改数组里面的内容即可。注:流水灯数组为代码中的 temp 和 temp2。
#include "reg51.h"
#define u8 unsigned char
u8 temp[]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00}; //建立一个数组,控制二极管发光样式,可修改
u8 temp2[]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00};建立一个数组,控制二极管发光样式,可修改
u8 ms_50;
u8 i;
u8 j;
void init() //定时器初始化
{
TMOD=0x01; //定时器T0方式一
TH0=(65536-50000)/256; //填装初值
TL0=(65536-50000)%256;
EA=1; //开总中断
ET0=1; //打开定时器T0的中断
TR0=1;
}
void time0() interrupt 1 //定时器T0..中断配置函数
{
TH0=(65536-50000)/256; //重装初值
TL0=(65536-50000)%256;
ms_50++;
if(ms_50>9)
{ms_50=0; //定时500ms
P1=temp2[j]; //P1口发光样式
j++;
if(j>15) j=0;
P2=temp[i]; //P2口发光样式
i++;
if(i>15) i=0;
}
}
void main()
{
init();
while(1)
{
;
}
}
仿真图如下:
在我写这篇博客时,发现一个问题,那就是在中断函数中做的事情太多,既有计时功能,又有其他控制led如何发光,我想之所以在这块能够正常显示,是因为所写的函数并不是很复杂。但是考虑到如果led的数目过多的话,可能中断就会出现错误,所以我再次建议,如果需要控制更多的led或者进行更多的功能,最好重新书写与led有关的功能函数,中断函数仅仅只做标记。