原创 EDN51实验板程序之--超级流水灯4

2008-4-16 15:56 3158 7 13 分类: MCU/ 嵌入式

    到这里,这个流水灯的题目就全部完成了,因为最近公司事情比较多,所以就不写流程图这部分了,大家可以自己分析看看,如果有疑问可以给我发邮件,后面可能会写温度传感器或者是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();
 
 }
}
  

文章评论6条评论)

登录后参与讨论

用户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

请问一下你这几个流水灯的实验,用的晶振是多少MHZ的?

用户479881 2008-5-21 17:21

谢谢博主! 请问一下你这几个流水灯的实验,用的晶振是多少MHZ的?

用户142361 2008-4-22 11:14

太感谢了。

用户1322401 2007-8-19 22:37

由于这里空间有限图片上传不了,请登陆http://hi.baidu.com/ytfm
那里可以看到图片!
相关推荐阅读
用户42640 2012-03-28 09:28
评论:@小野兽的小草窝 博客中提到的“【博客 大赛】虚焊,你伤不起~~”
这个确实很重要,不起眼的问题会折腾人很久 ...
用户42640 2010-11-05 14:14
怎样用Realview MDK生成bin文件?
怎样用Realview MDK生成bin文件?       使用RVCT的fromelf.exe工具进行转换。也就是说首先将源文件编译链接成*.axf的文件,然后使用fromelf.exe工具将*....
用户42640 2010-10-28 21:35
新塘M051中文技术参考手册
  今天无意中在网上看到的,这个要比研讨会上光盘上提供的那个中文版详细很多,看了一下,就是英文手册的完整翻译版 需要的朋友可以到这里下载:http://www.wang1jin.com/bbs/vie...
用户42640 2010-10-26 16:50
保护三极管基础
这次出现的问题是使用了ULN2003,由于直接用它的输入级接入模块的输入端,因此出现了问题。 由于电缆上存在分布电感和分布电容,因此很容易出现耦合,在ISO7637的实验中,存在高频脉冲250V,20...
用户42640 2010-08-10 09:04
广岛无冤魂
1945年8月6日,美国的B-29“空中堡垒”轰炸机向日本广岛投下代号为”男孩”(Boy)的原子弹,实施了人类首次核轰炸。 总听到有些人(尤其是中国人)说,战争是日本军国主义者全面发动的,日本人民是受...
用户42640 2010-07-15 16:59
RT-Thread学习笔记--- 初步认识RT-Thread
最近对RT-Thread很感兴趣,准备学习一下,硬件使用安富莱开发板2.0。软件使用keil MDK   RT-Thread的目录结构 其中Bsp是针对各个具体的平台,可以认为是用户代码。为了方...
我要评论
6
7
关闭 站长推荐上一条 /2 下一条