找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

剛接觸單片機,如何編寫這個led控制小程序?頭好大

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:496512 發(fā)表于 2019-3-23 05:06 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
現(xiàn)在已經(jīng)會通過一或兩個按鍵實現(xiàn)點亮關(guān)閉LED了,也就是改變端口高低電平狀態(tài)。
然后現(xiàn)在想實現(xiàn)這么個東西,在程序里加入延時處理,具體內(nèi)容如下:
按住按鈕K(K1=0),3秒后,LED點亮(LED=0)5秒然后滅掉(LED=1)不再亮。任何時候一但松開K(K1=1),LED則一直是滅的(LED=1)
重點就是以上動作只有在K按住時才會執(zhí)行動作,一但松開則程序復(fù)位。而且延時我也不會寫。。。


頭好大
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:496512 發(fā)表于 2019-3-23 05:15 | 只看該作者
51單片機
回復(fù)

使用道具 舉報

板凳
ID:496512 發(fā)表于 2019-3-23 05:21 | 只看該作者
已經(jīng)實現(xiàn)了按住開燈,松開滅燈了,只剩下那個萬惡的延時程序了

#include "reg52.h"               

typedef unsigned int u16;
typedef unsigned char u8;

sbit k1=P3^4;
sbit led=P1^5;

/*******************************************************************************
* 函 數(shù) 名         : delay
* 函數(shù)功能                   : 延時函數(shù),i=1時,大約延時10us
*******************************************************************************/
void delay(u16 i)
{
        while(i--);       
}
void keypros()
{
        if(k1==0)       
        {       
                delay(1000);
                if(k1==0
                {
                        delay(300000);
                        led=0
                }
                while(!k1)
                {
                        led=1;
                }
        }               
}
void main()
{       
        while(1)
        {       
                keypros();
        }               
}


回復(fù)

使用道具 舉報

地板
ID:496512 發(fā)表于 2019-3-23 05:37 | 只看該作者
已經(jīng)實現(xiàn)了,按住三秒后亮五秒后滅,只剩下一下問題了:

不能實現(xiàn)松開按鍵LED瞬間滅!!
現(xiàn)在是一但點亮必須要等五秒才滅

#include "reg52.h"       
#define uint unsigned int

typedef unsigned int u16;          
typedef unsigned char u8;

sbit k1=P3^4;
sbit led=P1^5;
uint i,j;
                                                                                  
void delay(u16 i)
{
        while(i--);       
}

void keypros()
{
        if(k1==0)               
        {       
                delay(1000);  
                if(k1==0)
                {
                        for(i=3000;i>0;i--)
                                for(j=110;j>0;j--);
                        led=0;         
                        for(i=5000;i>0;i--)
                                for(j=110;j>0;j--);
                        led=1;
                }
                while(!k1);         
                {
                        led=1;
                }
        }               
}

void main()
{       
        while(1)
        {       
                keypros();
        }               
}


回復(fù)

使用道具 舉報

5#
ID:496512 發(fā)表于 2019-3-23 05:39 | 只看該作者
不對,剛又試了下,現(xiàn)在是只要按一下鍵,就執(zhí)行
for(i=3000;i>0;i--)
                                for(j=110;j>0;j--);
                        led=0;         
                        for(i=5000;i>0;i--)
                                for(j=110;j>0;j--);
                        led=1;
回復(fù)

使用道具 舉報

6#
ID:451718 發(fā)表于 2019-3-23 10:26 | 只看該作者
#include "reg52.h"        
#define uint unsigned int         

typedef unsigned int u16;         
typedef unsigned char u8;

sbit k1=P3^4;
sbit led=P1^5;
uint i,j;
                                                                                 
void delay(u16 i)
{
        while(i--);        
}

void keypros()
{
        if(k1==0)               
        {        
                delay(1000);                  //軟延時,消除按鍵抖動
                if(k1==0)                     
                {
                        for(i=3000;i>0;i--)              
                                for(j=110;j>0;j--);
                        led=0;                       
                        for(i=5000;i>0;i--)       //這行的執(zhí)行沒有加判斷,每次循環(huán)都會執(zhí)行這個5秒延時后,再改變led的狀態(tài)
                                for(j=110;j>0;j--);
                        led=1;
                }
                while(!k1);         
                {
                        led=1;
                }
        }               
}

void main()
{        
        while(1)
        {        
                keypros();
        }               
}



比較欣賞你的學(xué)習(xí)態(tài)度,敢于實踐,從小實驗開始,找樂趣,找動力。 你這個辦法是可以簡單實現(xiàn)你想要的功能,但是問題很多,單片機的功能遠不止如此。 延時和程序結(jié)構(gòu)也不是你這樣弄的。 試著用定時器去實現(xiàn)主功能延時,慢慢實踐,加油。
回復(fù)

使用道具 舉報

7#
ID:213173 發(fā)表于 2019-3-23 11:28 | 只看該作者
shyydy 發(fā)表于 2019-3-23 05:39
不對,剛又試了下,現(xiàn)在是只要按一下鍵,就執(zhí)行
for(i=3000;i>0;i--)
                                for(j=110;j>0;j--);

你用delay延時再怎么折騰都是枉費心機,要用定時器!給你改好了,根據(jù)晶振頻率選擇定時器重載值。
  1. #include "reg52.h"        
  2. //#define uint unsigned int
  3. typedef unsigned int u16;         
  4. typedef unsigned char u8;

  5. sbit k1=P3^4;
  6. sbit led=P1^5;
  7. u8  count=0;//消抖計數(shù)變量
  8. u16 num=0;        //定時計數(shù)變量
  9. bit sign=0; //啟動標(biāo)志

  10. /*
  11. void delay(u16 i)
  12. {
  13.         while(i--);        
  14. }
  15. */
  16. void Timer0Init()        //250微秒自動重載
  17. {
  18.         TMOD= 0x02;                //設(shè)置定時器模式
  19.         TL0 = 0x06;                //設(shè)置定時初值12.000MHz
  20.         TH0 = 0x06;                //設(shè)置定時重載值12.000MHz
  21. //        TL0 = 0x1A;                //設(shè)置定時初值11.0592MHz
  22. //        TH0 = 0x1A;                //設(shè)置定時重載值11.0592MHz
  23.         TF0 = 0;                        //清除TF0標(biāo)志
  24.         TR0 = 1;                        //定時器0開始計時
  25. }

  26. void main()
  27. {        
  28.         Timer0Init();
  29.         while(1)
  30.         {        
  31.                 if(TF0==1)
  32.                 {
  33.                         TF0=0;                        //清除TF0標(biāo)志
  34.                         if(k1==0)      //鍵按下
  35.                         {        
  36.                                 if(++count>=50 && sign==0)
  37.                                         sign=1;
  38.                         }
  39.                         else                      //鍵抬起
  40.                         {
  41.                                 count=0;
  42.                                 sign=0;
  43.                                 num=0;
  44.                                 led=1;
  45.                         }         
  46.                         if(sign==1)
  47.                         {
  48.                                 num++;
  49.                                 if(num>12000 && num<32000)
  50.                                         led=0;
  51.                                 else led=1;
  52.                                 if(num>32000)
  53.                                         num=32000;
  54.                         }
  55.                 }       
  56.         }               
  57. }
復(fù)制代碼
回復(fù)

使用道具 舉報

8#
ID:451718 發(fā)表于 2019-3-23 11:35 | 只看該作者
#include "reg52.h"        
#define uint unsigned int         

typedef unsigned int u16;         
typedef unsigned char u8;

sbit k1=P3^4;
sbit led=P1^5;
uint i,j;
                                                                                 
void delay(u16 i)
{
        while(i--);        
}

void keypros()
{
        if(k1==0)               
        {        
                delay(1000);                  //軟延時,消除按鍵抖動
                if(k1==0)                     
                {
                        for(i=3000;i>0;i--)              
                                for(j=110;j>0;j--);
                        led=0;                       
                        for(i=5000;i>0;i--)       //這行的執(zhí)行沒有加判斷,每次大循環(huán)都會執(zhí)行這個5秒延時
                                for(j=110;j>0;j--);
                        led=1;
                }
                while(!k1);         
                {
                        led=1;
                }
        }               
}

void main()
{        
        while(1)
        {        
                keypros();
        }               
}


看起來你的c語言功底還可以,只是對51不太了解。  在小實驗中找樂趣找動力,值得贊賞。  不過單片機的延時不是你這樣做的,你需要再深度了解一下定時器的使用。 按鍵的掃描,最好也用中斷來處理。
回復(fù)

使用道具 舉報

9#
ID:18297 發(fā)表于 2019-3-23 12:11 | 只看該作者
  1. #include "reg52.h"        
  2. #define uint unsigned int

  3. typedef unsigned int u16;         
  4. typedef unsigned char u8;

  5. sbit k1=P3^4;
  6. sbit led=P1^5;
  7. uint i,j;      
  8. u8 time_count=0;         //定時累加計數(shù)
  9. u8 flag=0;               //3s的延時開和5s延時關(guān)閉標(biāo)志
  10. u8 start_flag=0;         //開始定時的標(biāo)志,0是允許定時輸出,1表示已經(jīng)定時輸出。
  11. void delay(u16 i)        //鍵盤防止抖動延時標(biāo)志
  12. {
  13.         while(i--);        
  14. }
  15. void time0_on()
  16. {
  17.                 TMOD=0x01;            //定時器0 16位定時模式
  18.           TH0=(65536-50000)/256; //定時器0定時時間為50000us=50ms
  19.           TL0=(65536-50000)%256; //
  20.           EA=1;                  //總中斷允許
  21.           ET0=1;                                                                 //定時器0中斷允許
  22.                 TR0=1;                 //啟動定時器0
  23. }
  24. void led_output()   
  25. {
  26.           if(start_flag==0)      //判斷是否允許輸出
  27.           {       
  28.                         start_flag=1;        //start_flag=1,下次不能允許輸出
  29.                         time_count=60;       //60*50ms=3000S的延時打開LED
  30.                         flag=0;              //當(dāng)前是延時打開
  31.                         time0_on();          //定時器開。
  32.                 }
  33. }
  34. void led_off()             //按鍵釋放處理程序
  35. {
  36.                 led=1;                 //LED關(guān)閉
  37.           TR0=0;                                                                 //定時器關(guān)閉
  38.           start_flag=0;          //允許輸出復(fù)位
  39. }
  40. void keypros()             //按鍵處理程序
  41. {
  42.         if(k1==0)               
  43.         {        
  44.                 delay(1000);  //去抖動延時
  45.                 if(k1==0)
  46.                 {
  47.                        led_output();  //LED輸出處理
  48.                 }               
  49.         }  
  50.         else
  51.         {
  52.                                                 led_off();               //按鍵釋放處理程序
  53.                                           
  54.                                 }                                       
  55.                                
  56. }
  57. void t0_time(void)interrupt 1 using 0  //定時器0中斷處理程序
  58. {
  59.                 TH0=(65536-50000)/256;
  60.           TL0=(65536-50000)%256;              //重裝初值50000us=50ms
  61.           time_count--;                       //計數(shù)器自減
  62.           if(time_count==0)                   //計數(shù)器3s或5S到
  63.                 {
  64.                         switch(flag)                     
  65.                         {
  66.                                         case 0:                       //3S延時到
  67.                                                 flag=1;                     //切換到5S
  68.                                                 time_count=100;             //100*50ms=5s
  69.                                                 led=0;                      //led亮
  70.                                         break;
  71.                                         case 1:                       //5S延時到
  72.                                                 flag=0;                     //切換到3S
  73.                                           TR0=0;                      //延時完成關(guān)閉定時器0
  74.                                           led=1;                      //led滅
  75.                                         break;
  76.                                                
  77.                         }
  78.                 }          
  79. }
  80. void main()
  81. {        
  82.                 while(1)
  83.     {        
  84.         keypros();                       //按鍵處理
  85.     }               
  86. }
復(fù)制代碼
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表