找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1766|回复: 6
收起左侧

为什么LED闪烁程序在单片机主循环里面不按设定次数闪烁

[复制链接]
ID:1065749 发表于 2023-7-7 09:01 | 显示全部楼层 |阅读模式
/*----------------------------------------------------------
  单片机采用stc8h1k28 32PIN 按键接P37,闪烁LED接P03
  功能:按下按键,LED闪烁4次,然后熄灭。           
------------------------------------------------------------*/
#include "stc8h.h"
//#include "Led.h"

sbit Led1=P0^3;
sbit Led2=P0^2;
sbit Key=P2^3;
sbit Key1=P3^7;

unsigned char B_400ms;
unsigned char Key_lock=0;
unsigned char Key_cnt=0;
unsigned char Key_Num=0;

void Timer0Init(void)                //1毫秒@11.0592MHz
{
        AUXR |= 0x80;                //定时器时钟1T模式
        TMOD &= 0xF0;                //设置定时器模式
        TL0 = 0xCD;                //设置定时初始值
        TH0 = 0xD4;                //设置定时初始值
//        TF0 = 0;                //清除TF0标志
        ET0=1;
        TR0 = 1;                //定时器0开始计时
        EA=1;
}

void delay_ms(unsigned int t)
{        
        while(t--)
        {
          ;
        }
}

void led_flash(unsigned char i)   //LED闪烁间隔400/2 ms
{
//   unsigned char m;
//         for(m=0;m<=i;m++)
         while(i--)
         {
           if(B_400ms==1)
                 {
                   B_400ms=0;
                         Led1=~Led1;
                 }
         }
}

void KeyScan(void)    //按键扫描
{
    if(Key1 == 1)
    {      
            Key_cnt=0;
            Key_lock = 0;                  //设置按键状态,防止重复触发
    }
                 else if(Key_lock==0)
                                {
                                        Key_cnt++;  
                                             if(Key_cnt>=20)
                                                         {
                                                             Key_cnt=0;
                                                                   Key_lock=1;
                                                                   Key_Num=1;                                                                 
                                                         }
                                }
}

void Key_service()    //按键服务函数
{
   if(Key_Num==1)
         {
            Key_Num=0;      //添加这行LED常亮,去掉LED闪烁不停
                  led_flash(4);     
         }
}

void main()
{
  P_SW2|=0x80;
        P0M1=0;
        P0M0=0;
        P2M1=0;
        P2M0=0;
        P3M1=0;
        P3M0=0;
        P3PU=0x80;         //P37内部电阻上拉

        Timer0Init();      
        delay_ms(1000);

        while(1)
        {
                Key_service();
                Led2=0;
        }
}

void TIM0_ISR() interrupt 1
{
  static unsigned int cnt;
        KeyScan();
        cnt++;
        if(cnt>=400)
        {
          cnt=0;
                B_400ms=1;               
        }
        TL0 = 0xCD;                //设置定时初始值
        TH0 = 0xD4;                //设置定时初始值
}

回复

使用道具 举报

ID:56665 发表于 2023-7-7 11:11 | 显示全部楼层
在主程序循环里要对这个闪烁还要设定一个停止条件
回复

使用道具 举报

ID:712097 发表于 2023-7-7 11:24 | 显示全部楼层
看起来程序没问题呀,不过感觉程序可以简化,直接在定时器中断里面翻转IO就可以了。
回复

使用道具 举报

ID:1065749 发表于 2023-7-7 13:57 | 显示全部楼层
chxelc 发表于 2023-7-7 11:24
看起来程序没问题呀,不过感觉程序可以简化,直接在定时器中断里面翻转IO就可以了。

我想灯在按键按下后只闪烁4次,但是这个程序闪烁次数不可调,一直在闪烁,可能程序写法还是有问题。
回复

使用道具 举报

ID:161164 发表于 2023-7-7 15:38 | 显示全部楼层
闪烁4次,是 led_flash(8);
led_flash()函数改为
2023-07-07_153143.png




回复

使用道具 举报

ID:213173 发表于 2023-7-7 16:01 | 显示全部楼层
18689719961 发表于 2023-7-7 13:57
我想灯在按键按下后只闪烁4次,但是这个程序闪烁次数不可调,一直在闪烁,可能程序写法还是有问题。
  1. /*----------------------------------------------------------
  2.   单片机采用stc8h1k28 32PIN 按键接P37,闪烁LED接P03
  3.   功能:按下按键,LED闪烁4次,然后熄灭。           
  4. ------------------------------------------------------------*/
  5. #include "stc8h.h"

  6. sbit Led1=P0^3;
  7. sbit Key1=P3^7;

  8. unsigned char temp;
  9. bit flag;
  10. bit key_sign;

  11. void Timer0Init(void)                //1毫秒@11.0592MHz
  12. {
  13.         AUXR |= 0x80;                //定时器时钟1T模式
  14.         TMOD &= 0xF0;                //设置定时器模式
  15.         TL0 = 0xCD;                //设置定时初始值
  16.         TH0 = 0xD4;                //设置定时初始值
  17.         TF0 = 0;                //清除TF0标志
  18.         TR0 = 1;                //定时器0开始计时
  19.         ET0=1;
  20.         EA=1;
  21. }

  22. void KeyScan(void)    //按键扫描
  23. {
  24.         if(!Key1 && !key_sign)
  25.         {      
  26.                 key_sign=1;
  27.                 Led1=0;//低电平亮
  28.                 temp=7;
  29.         }
  30. }

  31. void main()
  32. {
  33.         P0M1=0;
  34.         P0M0=0;
  35.         P2M1=0;
  36.         P2M0=0;
  37.         P3M1=0;
  38.         P3M0=0;       
  39.         Timer0Init();
  40.         while(1)
  41.         {
  42.                 KeyScan();
  43.         }
  44. }

  45. void TIM0_ISR() interrupt 1
  46. {
  47.         static unsigned int cnt;
  48.         if(key_sign && temp>0)
  49.         {
  50.                 if(++cnt>=400)
  51.                 {
  52.                         cnt=0;
  53.                         Led1=~Led1;
  54.                         if(--temp==0)
  55.                                 key_sign=0;

  56.                 }
  57.         }
  58. }
复制代码
回复

使用道具 举报

ID:56665 发表于 2023-7-7 16:05 | 显示全部楼层
lkc8210 发表于 2023-7-7 15:38
闪烁4次,是 led_flash(8);
led_flash()函数改为

按你说的修改真的可以了,while(i--)和while(i)  i--,区别有这么大。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表