寒假无聊之定时器控制流水灯

今天来写一篇关于定时器控制流水灯的博客,关于流水灯,我之前的博客有一篇是写过的,但是仅仅只是八个流水灯,本来并不打算写这篇文章,但是当写代码时,发现了自己对定时器以及其中断的应用并不是很娴熟,所以就觉得应该再写这么一篇博客,来让自己熟悉熟悉这方面的知识。
首先,这篇博客用的还是定时器T0 工作方式1 仿真工具还是使用了PROTEUS.
同时,在建立流水灯样式时,建立了相关的两个数组,如果想要修改发光样式,只需修改数组里面的内容即可。注:流水灯数组为代码中的 temptemp2

#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有关的功能函数,中断函数仅仅只做标记。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值