久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2907|回復: 19
打印 上一主題 下一主題
收起左側

單片機呼吸燈程序總是跑飛,C語言全局變量和靜態變量的設置,大神們幫忙看看呢

  [復制鏈接]
回帖獎勵 15 黑幣 回復本帖可獲得 5 黑幣獎勵! 每人限 1 次
跳轉到指定樓層
樓主
ID:336670 發表于 2022-1-20 23:15 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
這是我自己寫的可切換的呼吸燈程序,請大神們幫忙看看中斷函數里面的靜態變量設置有沒有必要呢,還有就是現在可以正常切換,但是開發版上運行的時候偶爾會卡住或者是連著切換,這是怎么回事呢

單片機源程序如下:
/*自由切換呼吸燈小程序*/      
#include"reg51.h"
sbit led_green=P2^0;        //定義綠燈為P2.0端口
sbit led_red  =P2^1;        //定義紅燈為P2.1端口
sbit led_switch=P2^7; //按鍵檢測狀態燈,當按鍵按下,此燈點亮
sbit key                        =P3^2;        //定義模式切換開關
unsigned char r=0;                //定義切換變量
unsigned int cycle=800;//定義閃爍頻率為800HZ


void delay(unsigned int x)        //延時函數
{
        unsigned int a;
        for(a=x;a>0;a--)
        {
                ;
        }
}


void led_green_flicker()//綠燈閃爍程序
{
        unsigned int a;
        for(a=cycle;a>0;a--)//閃爍頻率
        {
                led_green=0;
                delay(a);//燈亮時間,每進入一次FOR循環,綠燈滅的時間減1;
                led_green=1;
                delay(cycle-a);//燈滅時間,每進入一次FOR循環,綠燈亮的時間加1;
        }
        led_green=1;
        delay(50000);
        for(a=cycle;a>0;a--)//閃爍頻率
        {
                led_green=1;
                delay(a);//燈亮時間,每進入一次FOR循環,綠燈滅的時間減1;
                led_green=0;
                delay(cycle-a);//燈滅時間,每進入一次FOR循環,綠燈亮的時間加1;
        }
        led_green=0;
        delay(50000);
}
void led_red_flicker()//紅燈閃爍程序
{
        unsigned int a;
        for(a=cycle;a>0;a--)//閃爍頻率
        {
                led_red=0;
                delay(a);//燈亮時間,每進入一次FOR循環,紅燈滅的時間減1;
                led_red=1;
                delay(cycle-a);//燈滅時間,每進入一次FOR循環,紅燈亮的時間加1;
        }
        led_red=1;
        delay(50000);
        for(a=cycle;a>0;a--)//閃爍頻率
        {
                led_red=1;
                delay(a);//燈亮時間,每進入一次FOR循環,紅燈滅的時間減1;
                led_red=0;
                delay(cycle-a);//燈滅時間,每進入一次FOR循環,紅燈亮的時間加1;
        }
        led_red=0;
        delay(50000);
}
/**********************
按鍵延時函數,暫時未用到
***********************
void delay1(        unsigned int a)
{
        while(a--);
}
*/
void main()
{      
        led_green=1;
        led_red=1;
        IT0=1;//跳變沿出發方式(下降沿)
        EX0=1;//打開INT0的中斷允許。      
        EA=1;//打開總中斷      
        while(1)
        {
                switch(r)                //根據變量選擇運行的呼吸燈顏色,閃爍呼吸燈前先熄滅所有LED燈
                {
                        case 0:{P2=0XFF;led_green_flicker();break;}
                        case 1:{P2=0XFF;led_red_flicker();break;}
                        case 2:{P2=0XFF;led_green_flicker();P2=0XFF;;led_red_flicker();P2=0XFF;;break;}
                }
        }
}
void Int0()        interrupt 0//                外部中斷0函數,實現按鍵檢測和變量切換
{
        static s;                                        //設置一個靜態變量J宮每次進入中斷函數都是上一次退出時的值,如果不設置,直接使用全局變量,主函數里switch就不能切換


        if(key==0)
        {
                led_switch=0;                //當檢測按鍵按下,按鍵狀態燈點亮,
                while(!key);                // 當按鍵松開,按鍵狀態燈熄滅,并且開關切換變量加1;
                led_switch=1;
                        s=s+1;
                        r=s;                                       
                        if(s>=3)
                        {
                                s=0;
                        }
        }
}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:301191 發表于 2022-1-21 15:25 | 只看該作者
頂一下
回復

使用道具 舉報

板凳
ID:161164 發表于 2022-1-21 15:31 | 只看該作者
1. 部分代碼被吃了,請重貼
2. 不要用delay!不要用delay!不要用delay!看到delay(50000)就腦殼痛
回復

使用道具 舉報

地板
ID:336670 發表于 2022-1-21 18:56 | 只看該作者

不要水貼,看到水貼就腦殼痛
回復

使用道具 舉報

5#
ID:336670 發表于 2022-1-21 18:57 | 只看該作者
lkc8210 發表于 2022-1-21 15:31
1. 部分代碼被吃了,請重貼
2. 不要用delay!不要用delay!不要用delay!看到delay(50000)就腦殼痛

我看沒有代碼被吃呢,還有不用delay()用什么呢
回復

使用道具 舉報

6#
ID:161164 發表于 2022-1-21 22:48 | 只看該作者
老二不怕黑 發表于 2022-1-21 18:57
我看沒有代碼被吃呢,還有不用delay()用什么呢

中斷函數缺了個"}"

以下是不用Delay和中斷的流水燈代碼
你可以參考一下
  1. #include <reg52.h>

  2. typedef         unsigned char        u8;  //0 to 255
  3. typedef         unsigned int        u16;  //0 to 65535
  4. typedef         unsigned long        u32;  //0 to 4294967295

  5. sbit KEY_35 = P3^5;
  6. sbit KEY_36 = P3^6;
  7. sbit KEY_37 = P3^7;
  8. u8 mode = 0;
  9. u16 TMR_XX_PRE = 6000;
  10. void key_Proc()
  11. {
  12.         static u16 Delay_XD=0;
  13.         if(!KEY_35 || !KEY_36 || !KEY_37)
  14.         {
  15.                 if(Delay_XD<0xFFFF)Delay_XD++;
  16.                 if(Delay_XD==250)
  17.                 {
  18.                         if(!KEY_35)
  19.                         {
  20.                                 mode = ++mode %4;                               
  21.                         }
  22.                         if(!KEY_36)
  23.                         {
  24.                                 TMR_XX_PRE -= 500;       
  25.                                 if(TMR_XX_PRE < 1000)TMR_XX_PRE = 1000;                               
  26.                         }
  27.                         if(!KEY_37)
  28.                         {
  29.                                 TMR_XX_PRE += 500;       
  30.                                 if(TMR_XX_PRE > 9000)TMR_XX_PRE = 9000;                               
  31.                         }
  32.                 }
  33.         }
  34.         else
  35.                 Delay_XD = 0;
  36. }
  37. void Led_Flow()
  38. {
  39.         static u16 TMR_XX_ACC;
  40.         static u8 index = 0;
  41.         if(++TMR_XX_ACC >= TMR_XX_PRE)
  42.         {TMR_XX_ACC=0;
  43.                 switch (mode)
  44.                 {
  45.                         case 0:
  46.                                 P1 = ~(0x01 << index);
  47.                                 index = ++index %8;
  48.                                 break;
  49.                         case 1:
  50.                                 P1 = ~(0x80 >> index);
  51.                                 index = ++index %8;
  52.                                 break;
  53.                         case 2:
  54.                                 if(index < 8)
  55.                                         P1 &= ~(0x01 <<index);
  56.                                 else
  57.                                         P1 |= (0x01 <<(index-8));
  58.                                 if(++index >15)
  59.                                 {
  60.                                         index = 0;
  61.                                 }
  62.                                 break;
  63.                 }
  64.         }
  65. }
  66. void main()
  67. {
  68.     while (1)
  69.     {
  70.                         key_Proc();
  71.                         Led_Flow();
  72.     }
  73. }
復制代碼
回復

使用道具 舉報

7#
ID:453974 發表于 2022-1-25 16:02 | 只看該作者
第一點,你需要加一個消除機械抖動的延時,仿真里面沒有機械抖動,實物上是有機械抖動的
第二點,感覺你那個靜態變量是不必要的,讓led_switch自加,然后直接對它進行判斷
第三點,感覺你的程序寫的很亂,里面延時或者其他的變量有沖突,建議轉換一下編程思路或者做好按鍵按下后變量清除的代碼
回復

使用道具 舉報

8#
ID:844772 發表于 2022-1-25 16:18 | 只看該作者
我也覺得主要問題是按鍵沒有消抖,還有是進入中斷沒有關中斷,抖動導致重復進入,那個靜態變量沒用,而且又沒賦初值。
回復

使用道具 舉報

9#
ID:883031 發表于 2022-1-25 17:22 | 只看該作者
開關都是有抖動的,需要去抖,不然的話會出現多次出現下降沿,重復中斷的現象;蛘哌M入中斷后,先將中斷關掉,處理完再打開。
回復

使用道具 舉報

10#
ID:883242 發表于 2022-1-25 21:17 | 只看該作者
static s;  
你確定這句話能通過編譯?
回復

使用道具 舉報

11#
ID:718536 發表于 2022-1-26 00:14 | 只看該作者
PWM調光就不要用硬延時了好不?直接一個震蕩周期變量,一個占空比變量。一個增量標志,一個減量標志,例如
  pwm++;
if(pwm>100)
{
pwm=0;
if(max==0){zkb++;}
if(max==1){zkb--;}
if(zkb==100){max=1;}
if{zkb==0}{max=0;}
}
if(pwm>zkb) LED1=0;else LED1=1;
回復

使用道具 舉報

12#
ID:336670 發表于 2022-2-8 11:14 來自手機 | 只看該作者
suqianfu 發表于 2022-1-26 00:14
PWM調光就不要用硬延時了好不?直接一個震蕩周期變量,一個占空比變量。一個增量標志,一個減量標志,例如
...

能幫忙加個注釋嗎,看起來有點惱火,謝謝咯
回復

使用道具 舉報

13#
ID:718536 發表于 2022-3-6 00:37 | 只看該作者
void main()     //主循環
{  
  pwm++;           //震蕩周期變量
  if(pwm>100)     //如果數值大于100
{
pwm=0;             //周期歸零
if(max==0){zkb++;}      //MAX占空比漸加漸減標志位 默認max為0.每一周期占空比漸加
if(max==1){zkb--;}        //MAX占空比漸加漸減標志位 如果max為1.每一周期占空比漸減
if(zkb==100){max=1;}  //如果占空比的值為100      標志位MAX置為1.漸減
if{zkb==0}{max=0;}     //如果占空比的值為0         標志位MAX置為0.漸加
}
if(pwm>zkb){LED1=0;} //判斷周期值是否大于占空比,如果大于占空比,LED點亮
else LED1=1;               //否則LED滅燈。
}

這樣就可以實現呼吸燈的效果了

這幾個關鍵參數可以在頭文件建立,也可以在主循環建立。
回復

使用道具 舉報

14#
ID:1008524 發表于 2022-3-6 13:45 | 只看該作者
按鍵消抖這段程序特別重要
回復

使用道具 舉報

15#
ID:61261 發表于 2022-3-7 08:31 | 只看該作者
有沒有進入到死循環的可能呢
回復

使用道具 舉報

16#
ID:1009605 發表于 2022-3-11 00:05 | 只看該作者
suqianfu 發表于 2022-3-6 00:37
void main()     //主循環
{  
  pwm++;           //震蕩周期變量

怎么樣才能實現流水的效果呢
回復

使用道具 舉報

17#
ID:743654 發表于 2022-3-11 09:10 | 只看該作者
/***********************
PWM-呼吸燈
*************************/
#include<reg52.h>

#define led P2

unsigned char t_count ; //累計每個周期中斷次數的個數,滿20清零,20*100us=2ms(pwm的周期)
unsigned int count ;  //累計占空比需要修改(增加還是減少)的中斷次數的個數        1200*100us=120ms
unsigned char t ;  //累計高電平的個數
bit flag ; //標志位 0增加,1減少

void timer0init(void)
{
        EA = 1;
        TMOD = 0X02;
        TH0 = 0Xa3;
        TL0 = 0Xa3;
        ET0 = 1;
        TR0 = 1;
}

void main(void)
{
        t_count = 0;
        count = 0;
        t =10;           //占空比總50%開始
//        led = 1;

        timer0init();
       while(1);
}
/*每100us進入一次中斷*/
void timer0() interrupt 1
{
   t_count++;
   count++;

   if(t_count == t)        
    {
             P2 = 0x00;
    }
        if(t_count == 19)
        {
           t_count = 0;
           P2 = 0xff;
        }


        if((count == 1200)&&(flag == 0))
         {
               count = 0;
               t++;
               if(t == 19)        //增加最大占空比 95%
                 {
                   flag = 1;
                 }
         }

        if((count ==1200)&&(flag == 1))
         {
                count = 0;
                     t--;
                    if(t ==10)        //減小到最低占空比 50%
                   {
                         flag = 0;
                   }
     }

}

回復

使用道具 舉報

18#
ID:382454 發表于 2022-3-11 16:17 | 只看該作者
回復

使用道具 舉報

19#
ID:488334 發表于 2022-3-12 03:06 | 只看該作者
老二不怕黑 發表于 2022-1-21 18:57
我看沒有代碼被吃呢,還有不用delay()用什么呢

delay能不用就不用,這個東西對程序來說弊大于利,可以用定時器設置一個時間標志位,當標志位置1了,就可以進去程序里面,否則退出
回復

使用道具 舉報

20#
ID:879348 發表于 2022-3-12 11:48 | 只看該作者
如果主循環沒有阻塞,可以把函數放主循環,不然只能放定時器中斷,把lpwm的值控制LED

void showled(void)
{
static byte lpwmcnt=0,lpwm=0;
static byte scnt=0,dir=0;
scnt++;
if(scnt>100)
{
scnt=0;
if(dir)
{if(lpwm<0xff)lpwm++;else dir=0;}
else
{if(lpwm>10)lpwm-=2;else dir=1; }


}

}
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产在线视频在线观看 | 在线免费观看亚洲 | 国产精品免费一区二区三区四区 | 国产精品高潮呻吟久久av黑人 | 欧美在线一区二区视频 | 精品一区二区三区不卡 | 免费观看的黄色网址 | 日韩精品一二三区 | 久久伊人亚洲 | 日韩有码一区二区三区 | 热99| 中文字幕av一区 | 成人在线免费视频 | 久草欧美视频 | 色在线视频网站 | 国产精品一区二区免费看 | 欧美日韩国产一区二区 | 福利久久| 巨大荫蒂视频欧美另类大 | 91av久久久 | 国产精品成人一区二区三区 | 久久r精品 | 日本免费一区二区三区 | 波多野结衣中文字幕一区二区三区 | 成人在线观看免费 | 国产精品久久久久久久久久 | 久久精品国产久精国产 | 国产精品久久久久999 | 亚洲国产欧美在线 | 日本久久久久久 | 中文精品视频 | 黄色国产在线视频 | 999国产视频 | 午夜在线视频 | 欧美不卡视频一区发布 | 成人黄色网址大全 | 欧美日韩国产一区二区三区不卡 | 激情网五月天 | 亚洲日韩第一页 | 91精品国产自产在线老师啪 | 污污免费网站 |