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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 13071|回復: 25
收起左側

一道單片機題,控制兩個LED燈輪流亮滅,求大佬給個大致算法

  [復制鏈接]
ID:417624 發表于 2018-10-29 23:08 | 顯示全部樓層 |閱讀模式
要求實現以下要求:(STC89C51單片機板子)
1.控制兩個LED燈輪流亮滅;
2.初始設定A燈與B燈等時間亮滅,A燈點亮時間+B燈點亮時間=1s;
3.隨后A燈點亮時間逐漸增加,B燈點亮時間逐漸減少,當B燈點亮時間小于某一闕值時,B燈點亮時間增加,同時A燈減少。(每次修改的步進為100ms,門闕值指定為100ms)如此循環;
4.定時器隨意,模式隨意,盡量不用中斷

本人小白,沒學幾天,資質平庸,剛了一個下午實在想不出,缺一個基本思路,求大佬指教


回復

使用道具 舉報

ID:94031 發表于 2018-10-30 08:32 | 顯示全部樓層
will(1)
{
if(dir==0) {
    A燈點亮
    延時m秒
    B燈點亮
    延時1-m秒
   m=m+0.1;
   if(m>1){m=1;dir=1}
  }
else
{
    A燈點亮
    延時m秒
    B燈點亮
    延時1-m秒
    m=m-0.1;
   if(m==0){m=0;dir=0}
  }


}


回復

使用道具 舉報

ID:320306 發表于 2018-10-30 08:43 | 顯示全部樓層
就是A加B等于1S,A的時間到900MS之后,就減小,每次100MS,到100MS之后就增加,不用管B,B就等于1S-A的時間。
回復

使用道具 舉報

ID:41713 發表于 2018-10-30 08:48 | 顯示全部樓層
用定時器吧,根據晶振,用STC自帶的軟件算一下初值,還有一個系統的累加計算你要的闕值,判斷一下就OK的。具體程序自己想吧,初學者要學會一個功能一個功能的去試,人中找到成就感,并逐步提高。
回復

使用道具 舉報

ID:415338 發表于 2018-10-30 08:52 | 顯示全部樓層
我覺得簡單一點,直接使用if   else再加幾個延時就OK了,用定時器的話,外加中斷,在中斷還是用if else,中斷蠻簡單的,一一對應就行
回復

使用道具 舉報

ID:308437 發表于 2018-10-30 09:05 | 顯示全部樓層
你這個定時器都可以不用,A和B都用一個延時函數就可以了。時間改變就是改延時函數的變量
回復

使用道具 舉報

ID:417736 發表于 2018-10-30 09:30 | 顯示全部樓層
B燈 1S減一次 ,減到 100后 ,下一秒開始增加,A燈減少
回復

使用道具 舉報

ID:417727 發表于 2018-10-30 09:30 | 顯示全部樓層
延時函數就可以了
回復

使用道具 舉報

ID:276663 發表于 2018-10-30 09:36 | 顯示全部樓層
  1. //首先你做一個延時函數
  2. void delay_1ms(void);
  3. //然后做一個延時函數
  4. void delay_Nms(unsigned int Value)
  5. {
  6.     while(Value--)delay_1ms();
  7. }

  8. //定義時間變量
  9. unsigned int TimeA=20;
  10. unsigned int TimeB=1000-TimeA;
  11. //定義方向變量
  12. unsigned char Direction = 1;
  13. //然后在主循環里就可以。
  14. while(1)
  15. {
  16.     if(Direction)        // LEDA時間增加
  17.     {           
  18.                 TimeA++;
  19.                 TimeB = 1000-TimeA;
  20.                 if (TimeA>=980)
  21.                 {
  22.                         Direction = 0;
  23.                 }
  24.     }
  25.     else                        // LEDA時間減少   
  26.     {
  27.             TimeA--;
  28.             TimeB = 1000-TimeA;
  29.             if (TimeA <=20)
  30.             {
  31.                     Direction = 1;                   
  32.             }
  33.     }
  34.     LEDA = 0; LEDB = 1;        // A燈亮B燈滅
  35.     delay_Nms(TimeA);
  36.     LEDA = 1; LEDB = 0;        // A燈滅B燈亮
  37.     delay_Nms(TimeB);
  38. }
復制代碼
回復

使用道具 舉報

ID:276663 發表于 2018-10-30 09:36 | 顯示全部樓層
我程序里面寫的是步進1ms應該能看懂吧
回復

使用道具 舉報

ID:417624 發表于 2018-10-30 10:55 來自手機 | 顯示全部樓層
IdeaMing 發表于 2018-10-30 09:36

老哥,延時函數看懂了,但我主要想練一下定時器,如果用定時器的話,應該怎么寫呢?(    )
回復

使用道具 舉報

ID:417624 發表于 2018-10-30 10:57 來自手機 | 顯示全部樓層
zsyzdx 發表于 2018-10-30 08:43
就是A加B等于1S,A的時間到900MS之后,就減小,每次100MS,到100MS之后就增加,不用管B,B就等于1S-A的時間 ...

判斷條件怎么設置啊?(((//Д//)))
回復

使用道具 舉報

ID:225048 發表于 2018-10-30 11:23 | 顯示全部樓層
最簡單的就是加個延時
回復

使用道具 舉報

ID:225048 發表于 2018-10-30 11:23 | 顯示全部樓層
加個延時就好了
回復

使用道具 舉報

ID:417841 發表于 2018-10-30 11:39 | 顯示全部樓層
will(1)
{
if(dir==0) {
    A燈點亮
    延時m秒
    B燈點亮
    延時1-m秒
   m=m+0.1;
   if(m>1){m=1;dir=1}
  }
else
{
    A燈點亮
    延時m秒
    B燈點亮
    延時1-m秒
    m=m-0.1;
   if(m==0){m=0;dir=0}
  }


}
回復

使用道具 舉報

ID:417914 發表于 2018-10-30 15:01 | 顯示全部樓層
如果只是單純的實現題目要求的話,用延時函數就可以,用方法的話還是用學一下定時器中斷計時
回復

使用道具 舉報

ID:410942 發表于 2018-10-30 17:06 | 顯示全部樓層
你或者參照pwm這個程序,然后改改參數CYCLE=600的數值。應該可以的。
/*-----------------------------------------------

------------------------------------------------*/
#include<reg52.h> //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義

sbit LED0=P1^0;// 用sbit 關鍵字 定義 LED到P1.0端口,LED是自己任意定義且容易記憶的符號
sbit LED1=P1^1;

void Delay(unsigned int t); //函數聲明
/*------------------------------------------------
                    主函數
------------------------------------------------*/
void main (void)
{
                  
unsigned int CYCLE=600,PWM_LOW=0;//定義周期并賦值
while (1)         //主循環
  {
LED0=1;
Delay(60000);        //特意加延時,可以看到熄滅的過程
for(PWM_LOW=1;PWM_LOW<CYCLE;PWM_LOW++){ //PWM_LOW表示低
//電平時間,這個循環中低電平時長從1累加到CYCLE(周期)的值,即600次

                   LED0=0;        //點亮LED  
                   Delay(PWM_LOW);//延時長度,600次循環中從1加至599
                   LED1=1;        //熄滅LED
              Delay(CYCLE-PWM_LOW);//延時長度,600次循環中從599減至1
     
   }
LED0=0;
for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW--){ //與逐漸變亮相反的過程

                   LED1=0;
                   Delay(PWM_LOW);
                   LED0=1;
              Delay(CYCLE-PWM_LOW);
     
   }
                     //主循環中添加其他需要一直工作的程序
  }
}
/*------------------------------------------------
延時函數,含有輸入參數 unsigned int t,無返回值
unsigned int 是定義無符號整形變量,其值的范圍是
0~65535
------------------------------------------------*/
void Delay(unsigned int t)
{
while(--t);
}
回復

使用道具 舉報

ID:417624 發表于 2018-10-30 18:02 | 顯示全部樓層
這是我編的程序,感覺挺對的,但實際卻是兩個燈閃爍時間一樣,為什么啊?
#include<reg51.h>
#include<stdio.h>

sbit ledA=P2^0;
sbit ledB=P2^1;
typedef unsigned int u16;
typedef unsigned char u8;


void main()
{
u16 i=0;
u16 b=2000;
u16 c=0;
   ledA=0;
   ledB=1;
   TMOD|=0X02;  //工作方式2
   TH0=0X06;        //0.25ms一次
   TL0=0X06;
   TR0=1;
   
           while(1){       
        if(TF0==1)
         {
          TF0=0;
          i++;}

                  while(b<4000){       
                if(i==b){
                i=0;
                ledA=~ledA;
                ledB=~ledB;               
                }
                if(i==4000-b){
                 ledA=~ledA;
                ledB=~ledB;
                i=0;               
                }
                b=b+400;          
        }
         b=b-800;
                   while(b>0){
                 if(i==b) {
                                         i=0;
                ledA=~ledA;
                ledB=~ledB;
               
                }
                if(i==4000-b){
                 ledA=~ledA;
                ledB=~ledB;
                i=0;
                 }
                 b=b-400;
                 } b=b+800;}           }
                        
回復

使用道具 舉報

ID:418122 發表于 2018-10-30 19:46 | 顯示全部樓層
用個延時函數,在while循環里先點亮再延時再滅掉延時
回復

使用道具 舉報

ID:418171 發表于 2018-10-30 21:10 | 顯示全部樓層
可以參考SPWM波的程序吧
回復

使用道具 舉報

ID:276663 發表于 2018-10-31 09:43 | 顯示全部樓層
y352715553 發表于 2018-10-30 10:55
老哥,延時函數看懂了,但我主要想練一下定時器,如果用定時器的話,應該怎么寫呢?(    )

你能不能別眼高手低,就用延時的你實現了嗎?
然后,你條件里寫了,定時器隨意。大家都覺得用延時函數就行了。
定時器的話就是把延時用定時器處理。
回復

使用道具 舉報

ID:417624 發表于 2018-10-31 12:41 | 顯示全部樓層
IdeaMing 發表于 2018-10-31 09:43
你能不能別眼高手低,就用延時的你實現了嗎?
然后,你條件里寫了,定時器隨意。大家都覺得用延時函數就 ...

很抱歉,老哥,是我表意不明,我說的定時器隨意是定時器1或定時器0都行,我也不是眼高手低,延時函數的程序我之前就已經編過了。。。
回復

使用道具 舉報

ID:375201 發表于 2018-10-31 13:25 | 顯示全部樓層
加個延時
回復

使用道具 舉報

ID:89515 發表于 2018-10-31 15:32 | 顯示全部樓層
y352715553 發表于 2018-10-30 18:02
這是我編的程序,感覺挺對的,但實際卻是兩個燈閃爍時間一樣,為什么啊?
#include
#include

你用查詢的方式,那用定時器還有什么意義。……用中斷,在中斷函數里設定你需要的單位時間,然后在主函數里更改你需要的時間值。但是你的led兩個狀態時間值不一樣,所以必須分開,if-else語句就可以了,在里面設定不同的時間值,并設定一個交替執行的標志就可以。大家都叫你用軟件延時函數,因為那樣更好理解,而且你這個確實沒必要,也沒有意義。表面上看起來像模擬PWM,實際上又不是,所以………………
回復

使用道具 舉報

ID:418559 發表于 2018-10-31 15:41 | 顯示全部樓層
加個延時函數
回復

使用道具 舉報

ID:417624 發表于 2018-11-2 12:27 | 顯示全部樓層
#include <reg51.h>
#include<math.h>
typedef unsigned int u16;          
typedef unsigned char u8;

sbit led1=P2^0;
sbit led2=P2^1;
u16 b=2000;
u16 shuZu;
u16 ciShu=0;
u16 k;
u16 text[]={0,1,2,3,4,5,6,7,8,7,6,5,4,3,2,1,0,(-1),(-2),(-3),(-4),(-5),(-6),(-7),(-8),(-7),(-6),(-5),(-4),(-3),(-2),(-1)};
void InitTimer0(void)
{
TMOD = 0x02;
TH0 = 0x06;
TL0 = 0x06;//0.25ms中斷
EA = 1;
ET0 = 1;
TR0 = 1;
}

void main(void)
{
led1=0;
led2=1;
InitTimer0();
while(1);
}
void Timer0Interrupt(void) interrupt 1
{static int i=0;

i++;
if(i==b)
{led1=~led1;
led2=~led2;
i=0;

shuZu=ciShu%32;
k=text[shuZu];
b=b+pow((-1),(ciShu+1))*400*k;
ciShu++;

}
}

終于跑出來了,雖然用了中斷。。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美午夜视频 | 韩日精品视频 | 成人av一区| 亚洲成人精品国产 | 国产欧美精品一区二区三区 | 亚洲精品大全 | 婷婷色国产偷v国产偷v小说 | 国产精品亚洲综合 | 久久久久久久av麻豆果冻 | 日韩在线精品视频 | 99影视| 91精品国产综合久久小仙女图片 | 美女亚洲一区 | 日韩看片 | 免费成人高清在线视频 | 亚洲精品视频一区 | 中文字幕一区二区三区在线观看 | 亚洲男女视频在线观看 | 国产精品一区一区三区 | 欧美精品二区 | 亚洲一区二区免费视频 | 三级av在线| 欧美13videosex性极品 | 精品一区av| 精品久久1 | 日韩免费视频 | 欧美一二三区 | 一区二区三区在线电影 | 97伦理影院 | 香蕉大人久久国产成人av | 久久人人爽人人爽人人片av免费 | 一二三四在线视频观看社区 | 91xxx在线观看 | 亚洲日本中文字幕在线 | 91精品国产综合久久久久久丝袜 | 国产精品国产三级国产播12软件 | 国产99精品 | 欧美黄在线观看 | 一区二区在线 | 成人福利网站 | 久久这里只有精品首页 |