到这里,这个流水灯的题目就全部完成了,因为最近公司事情比较多,所以就不写流程图这部分了,大家可以自己分析看看,如果有疑问可以给我发邮件,后面可能会写温度传感器或者是RS232应用部分的程序,
在下面的程序里要注意中断部分使用的工作寄存器组,不能使用0,会出错
/****************************************************************************
* (C) Copyright 2008,单片机初学者
* All Rights reserved.
* 项 目 名 称 : EDN51超级流水灯
* 本 文件名称 : ledshow3.c
* 完 成 作 者 : 好心情 QQ:15942526 cat_li8953#qq.com (为了避免垃圾文件,
* 所以把@改成了#,如果要用邮件联系,请自己改一下^_^)
* 当 前 版 本 : V1.0
* 完 成 日 期 : 2008年4月7日
* 描 述 :
* 此程序实现,8个灯从第一个开始依次渐亮,直到最后一个。再从最
* 后一个起渐暗,直到第一个。如此循环往复。这才是真正的流水灯
*
* 我 的 博 客 : http://blog.ednchina.com/cat_li/
*****************************************************************************/
# include <reg51.h>
/****************************定义一下,方便使用*******************************/
# define led P0 //led接在P0口
# define Ton 40 //基准脉宽0.04ms
# define true 1
code unsigned char stop[3] _at_ 0x3B; //Mon51用,绝对地址引用
unsigned char LEDflag = 0; //全局变量,最大255,保存T0中断次数
static unsigned char ledon[8] = {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
/*****************************************************************************
** 函数名称: timer_init()
** 入口参数:无
** 出口参数:无
** 功能描述: 定时器初始化,T0模式2,8为自动载入
*****************************************************************************/
void timer_init() //定时器初始化
{
TMOD = 0x02; //T0 方式2,8位自动载入
TH0 = 256 - Ton; //T0初始值
TL0 = 256 - Ton; //重载值
TR0 = true; //启动T0
ET0 = true; //开T0,T1中断
EA = true; //全局中断允许
}
/*****************************************************************************
** 函数名称: time0_int()
** 入口参数:中断1
** 出口参数:无
** 功能描述: 使用工作组3,使用工作组0的时候会出错,根据反汇编分析,应该是中断和led
** show的函数用了同一组寄存器,导致变量被修改,程序运行混乱
*****************************************************************************/
void time0_int() interrupt 1 using 3 //T0中断函数,中断1,使用工作组3
{
LEDflag++; //修改LEDflag
}
/*****************************************************************************
** 函数名称: led_show4()
** 入口参数:无
** 出口参数:无
** 功能描述: 声明临时变量i,j,j用来控制数组ledon的下标,点亮不同的led,i用来控制
** 亮度, 实现led亮度渐变
*****************************************************************************/
led_show4()
{
unsigned char i = 0,j = 0; // i初始化
for(j = 0;j<=7;j++){
i = 0; // i初始化
while(i!=255) // 由暗变亮
{
if(LEDflag == 0) // 点亮
{
led = ledon[j];
}
if(LEDflag == i) // 熄灭
{
led = 0xff;
}
if(LEDflag == 255) //修改变量
{
i++;
}
}
}
for(j=7;j>=0;j--){
i = 0; // i初始化
while(i!=255) // 由亮变暗
{
if(LEDflag == 0) // 熄灭
{
led = 0xff;
}
if(LEDflag == i) // 点亮
{
led = ledon[j];
}
if(LEDflag == 255) //修改变量
{
i++;
}
}
}
}
void main()
{
timer_init();
while(1)
{
led_show4();
}
}
用户1335339 2009-12-1 12:22
huli184_389376486 2008-7-4 10:54
用户1099353 2008-5-29 19:23
用户479881 2008-5-21 17:22
用户479881 2008-5-21 17:21
用户142361 2008-4-22 11:14
用户1322401 2007-8-19 22:37
那里可以看到图片!