用 AT89C52 使 LED 闪亮的程序

发布者:花海鱼最新更新时间:2018-05-09 来源: eechina关键字:AT89C52  LED  闪亮 手机看文章 扫描二维码
随时随地手机看文章

电路:P0.0、P0.1 分别外接一个 LED,输出高电平时,LED 发光。
   P2.0 外接一个按键。
请“不用延时程序”写个这样的程序:
当按键不按的时候,LED(D1)先以1秒的时间快闪三下,然后再以3秒的时间慢闪三下。
若按下按键后,LED(D2)先以1秒的时间快闪三下,然后再以3秒的时间慢闪三下。
是不用“不用延时程序”写的哦。(*^__^*)……

问题补充: 请用C语言写。
当按键按下、松开,都应该立即转到相应的 LED 先以1秒的时间快闪三下,然后再以3秒的时间慢闪三下。


;============================================
最佳答案:“不用延时程序”,就是要求用定时器控制时间,这和时钟程序的思路是相同的。
下列程序,已经调试成功:
//-----------------------------------------------
#include

unsigned char  n_25ms, M1_n, M2_n, Last_p2, in_p2;
unsigned char code  O_c[] = {
    0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00,
    0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00};
bit  TT_f;
//-----------------------------------------------
void main()  
{
    P0 = 0;
    TMOD = 0x01;
    TH0 = (65536 - 12500) / 256; //12.5ms@12MHz
    TL0 = (65536 - 12500) % 256;
    TR0 = 1;
    ET0 = 1;
    EA = 1;
    n_25ms = 0;
    M1_n = 0;
    TT_f = 0;
    Last_p2 = P2;
    while(1) ;
}
//-----------------------------------------------
void T0_INT() interrupt 1
{
    TH0 = (65536 - 12500) / 256; //12.5ms@12MHz
    TL0 = (65536 - 12500) % 256;
    n_25ms++;
//**********************************按键检测与状态的变换
    in_p2 = 8;
    if (P2 == 255)  in_p2 = 0;
    M2_n = 8;
    if (TT_f)  M2_n *= 3;
    if (P2 != Last_p2) {
      Last_p2 = P2;
      n_25ms = M2_n;
      M1_n = 0;
      TT_f = 0;
    }
//**********************************
    if (n_25ms == M2_n) {   //如果到预定的时间
      n_25ms = 0;           //清零
      M1_n++;               //输出下一个数据
      if (M1_n == 8) {      //输出8个了?
        M1_n = 0;           //清零
        TT_f = ~TT_f;       //变更状态
      }
      P0 = O_c[M1_n + in_p2];//输出数据
    }
}
//-----------------------------------------------
注意,P0口需要加上上拉电阻。
;============================================

;============================================
后记:

这个题目的要求有些令人费解,即要有定时中断,还有按键的检测,按键不变时,输出还要有两种花样。

有人给出了如下的建议:
-------------------------------------------------
用定时器吗!你先做出1秒的基准,3个基准就是3秒。
主函数用:
if(按键标志位位0) {
  for(循环3次) {点亮LED1,一秒后,灭LED1}
  for(循环3次) {等3秒,点亮LED1,3秒后,灭LED1}
else {
  for(循环3次) {点亮LED1,一秒后,灭LED1}
  for(循环3次) {等3秒,点亮LED2,3秒后,灭LED2}
}
没有写定时程序,自己写吧
回答者: ---------- | 四级 | 2011-9-29 11:19 
-------------------------------------------------
这个回答,缺少按键变化时,“即时”更改显示位置的功能,LED 闪烁的也明显不对。
这个回答,在主程序里面,放了这么多的循环!呵呵,这也太占用 CPU 的资源了。
这个回答,可以到原题网址看到原文。

做而论道写的程序,思路和定时时钟、定时的交通灯,基本一致。
在中断函数中,仅仅用下面几行,就进行了按键检测与状态的变换:

//**********************************按键检测与状态的变换
    in_p2 = 8;
    if (P2 == 255)  in_p2 = 0;
    M2_n = 8;
    if (TT_f)  M2_n *= 3;
    if (P2 != Last_p2) {
      Last_p2 = P2;
      n_25ms = M2_n;
      M1_n = 0;
      TT_f = 0;
    }
//**********************************

这些程序,每隔 12.5ms 才执行一遍,执行时,也用不上几十微秒,对系统资源的占用,是很微小的。
这样,主函数,就几乎可用全部的时间,执行各种程序。

做而论道编写的程序,完全没有使用那么多的循环,同样可以满足题目的要求,大家可以自己实验。

上述的程序是如何解释的,这就不好说了,读者的水平参差不齐,有缘者自己领会吧。
;============================================


关键字:AT89C52  LED  闪亮 引用地址:用 AT89C52 使 LED 闪亮的程序

上一篇:用 LCD1602 显示的秒表
下一篇:用C语言编程使51单片机的数码管左移循环显示

小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved