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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2860|回復(fù): 19
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)呼吸燈程序總是跑飛,C語言全局變量和靜態(tài)變量的設(shè)置,大神們幫忙看看呢

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

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


void delay(unsigned int x)        //延時(shí)函數(shù)
{
        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);//燈亮?xí)r間,每進(jìn)入一次FOR循環(huán),綠燈滅的時(shí)間減1;
                led_green=1;
                delay(cycle-a);//燈滅時(shí)間,每進(jìn)入一次FOR循環(huán),綠燈亮的時(shí)間加1;
        }
        led_green=1;
        delay(50000);
        for(a=cycle;a>0;a--)//閃爍頻率
        {
                led_green=1;
                delay(a);//燈亮?xí)r間,每進(jìn)入一次FOR循環(huán),綠燈滅的時(shí)間減1;
                led_green=0;
                delay(cycle-a);//燈滅時(shí)間,每進(jìn)入一次FOR循環(huán),綠燈亮的時(shí)間加1;
        }
        led_green=0;
        delay(50000);
}
void led_red_flicker()//紅燈閃爍程序
{
        unsigned int a;
        for(a=cycle;a>0;a--)//閃爍頻率
        {
                led_red=0;
                delay(a);//燈亮?xí)r間,每進(jìn)入一次FOR循環(huán),紅燈滅的時(shí)間減1;
                led_red=1;
                delay(cycle-a);//燈滅時(shí)間,每進(jìn)入一次FOR循環(huán),紅燈亮的時(shí)間加1;
        }
        led_red=1;
        delay(50000);
        for(a=cycle;a>0;a--)//閃爍頻率
        {
                led_red=1;
                delay(a);//燈亮?xí)r間,每進(jìn)入一次FOR循環(huán),紅燈滅的時(shí)間減1;
                led_red=0;
                delay(cycle-a);//燈滅時(shí)間,每進(jìn)入一次FOR循環(huán),紅燈亮的時(shí)間加1;
        }
        led_red=0;
        delay(50000);
}
/**********************
按鍵延時(shí)函數(shù),暫時(shí)未用到
***********************
void delay1(        unsigned int a)
{
        while(a--);
}
*/
void main()
{      
        led_green=1;
        led_red=1;
        IT0=1;//跳變沿出發(fā)方式(下降沿)
        EX0=1;//打開INT0的中斷允許。      
        EA=1;//打開總中斷      
        while(1)
        {
                switch(r)                //根據(jù)變量選擇運(yùn)行的呼吸燈顏色,閃爍呼吸燈前先熄滅所有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函數(shù),實(shí)現(xiàn)按鍵檢測和變量切換
{
        static s;                                        //設(shè)置一個(gè)靜態(tài)變量J宮每次進(jìn)入中斷函數(shù)都是上一次退出時(shí)的值,如果不設(shè)置,直接使用全局變量,主函數(shù)里switch就不能切換


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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

不要水貼,看到水貼就腦殼痛
回復(fù)

使用道具 舉報(bào)

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

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

使用道具 舉報(bào)

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

中斷函數(shù)缺了個(gè)"}"

以下是不用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. }
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

7#
ID:453974 發(fā)表于 2022-1-25 16:02 | 只看該作者
第一點(diǎn),你需要加一個(gè)消除機(jī)械抖動(dòng)的延時(shí),仿真里面沒有機(jī)械抖動(dòng),實(shí)物上是有機(jī)械抖動(dòng)的
第二點(diǎn),感覺你那個(gè)靜態(tài)變量是不必要的,讓led_switch自加,然后直接對它進(jìn)行判斷
第三點(diǎn),感覺你的程序?qū)懙暮軄y,里面延時(shí)或者其他的變量有沖突,建議轉(zhuǎn)換一下編程思路或者做好按鍵按下后變量清除的代碼
回復(fù)

使用道具 舉報(bào)

8#
ID:844772 發(fā)表于 2022-1-25 16:18 | 只看該作者
我也覺得主要問題是按鍵沒有消抖,還有是進(jìn)入中斷沒有關(guān)中斷,抖動(dòng)導(dǎo)致重復(fù)進(jìn)入,那個(gè)靜態(tài)變量沒用,而且又沒賦初值。
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

11#
ID:718536 發(fā)表于 2022-1-26 00:14 | 只看該作者
PWM調(diào)光就不要用硬延時(shí)了好不?直接一個(gè)震蕩周期變量,一個(gè)占空比變量。一個(gè)增量標(biāo)志,一個(gè)減量標(biāo)志,例如
  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;
回復(fù)

使用道具 舉報(bào)

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

能幫忙加個(gè)注釋嗎,看起來有點(diǎn)惱火,謝謝咯
回復(fù)

使用道具 舉報(bào)

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

這樣就可以實(shí)現(xiàn)呼吸燈的效果了

這幾個(gè)關(guān)鍵參數(shù)可以在頭文件建立,也可以在主循環(huán)建立。
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

15#
ID:61261 發(fā)表于 2022-3-7 08:31 | 只看該作者
有沒有進(jìn)入到死循環(huán)的可能呢
回復(fù)

使用道具 舉報(bào)

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

怎么樣才能實(shí)現(xiàn)流水的效果呢
回復(fù)

使用道具 舉報(bào)

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

#define led P2

unsigned char t_count ; //累計(jì)每個(gè)周期中斷次數(shù)的個(gè)數(shù),滿20清零,20*100us=2ms(pwm的周期)
unsigned int count ;  //累計(jì)占空比需要修改(增加還是減少)的中斷次數(shù)的個(gè)數(shù)        1200*100us=120ms
unsigned char t ;  //累計(jì)高電平的個(gè)數(shù)
bit flag ; //標(biāo)志位 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進(jìn)入一次中斷*/
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;
                   }
     }

}

回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

delay能不用就不用,這個(gè)東西對程序來說弊大于利,可以用定時(shí)器設(shè)置一個(gè)時(shí)間標(biāo)志位,當(dāng)標(biāo)志位置1了,就可以進(jìn)去程序里面,否則退出
回復(fù)

使用道具 舉報(bào)

20#
ID:879348 發(fā)表于 2022-3-12 11:48 | 只看該作者
如果主循環(huán)沒有阻塞,可以把函數(shù)放主循環(huán),不然只能放定時(shí)器中斷,把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; }


}

}
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 四虎午夜剧场 | 中文字幕在线免费视频 | 97精品超碰一区二区三区 | 欧美精品一区三区 | 国产精品免费一区二区三区 | 久久久久久久久久久高潮一区二区 | 久久久久久国产精品 | 国产高清在线精品一区二区三区 | 国产激情小视频 | 欧美午夜一区 | 亚洲一区二区三区免费观看 | 亚洲一区 中文字幕 | 久久久久国产一区二区三区 | 国产精品视频999 | 亚洲91精品 | 亚洲成人二区 | 日韩中文字幕视频在线 | 亚洲视频 欧美视频 | 亚洲成人免费网址 | 宅男噜噜噜66一区二区 | 亚洲毛片在线观看 | 国产高清在线精品一区二区三区 | 亚洲一区有码 | 久久一| 五月精品视频 | 国产午夜视频 | 婷婷中文字幕 | 精品av| 午夜影院网站 | 日韩一区二区av | 日韩福利视频 | 亚洲高清成人 | 久草网站| 亚洲第一黄色网 | 香蕉久久久 | 91久久国产综合久久91精品网站 | 精品综合久久 | 99在线视频观看 | 精品国产欧美一区二区三区成人 | 亚洲日日 | 久久中文字幕一区 |