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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

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

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


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

使用道具 舉報

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

使用道具 舉報

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

#include "reg52.h"               

typedef unsigned int u16;
typedef unsigned char u8;

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

/*******************************************************************************
* 函 數 名         : delay
* 函數功能                   : 延時函數,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();
        }               
}


回復

使用道具 舉報

地板
ID:496512 發表于 2019-3-23 05:37 | 只看該作者
已經實現了,按住三秒后亮五秒后滅,只剩下一下問題了:

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

#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();
        }               
}


回復

使用道具 舉報

5#
ID:496512 發表于 2019-3-23 05:39 | 只看該作者
不對,剛又試了下,現在是只要按一下鍵,就執行
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;
回復

使用道具 舉報

6#
ID:451718 發表于 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--)       //這行的執行沒有加判斷,每次循環都會執行這個5秒延時后,再改變led的狀態
                                for(j=110;j>0;j--);
                        led=1;
                }
                while(!k1);         
                {
                        led=1;
                }
        }               
}

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



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

使用道具 舉報

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

你用delay延時再怎么折騰都是枉費心機,要用定時器!給你改好了,根據晶振頻率選擇定時器重載值。
  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;//消抖計數變量
  8. u16 num=0;        //定時計數變量
  9. bit sign=0; //啟動標志

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

  26. void main()
  27. {        
  28.         Timer0Init();
  29.         while(1)
  30.         {        
  31.                 if(TF0==1)
  32.                 {
  33.                         TF0=0;                        //清除TF0標志
  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. }
復制代碼
回復

使用道具 舉報

8#
ID:451718 發表于 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--)       //這行的執行沒有加判斷,每次大循環都會執行這個5秒延時
                                for(j=110;j>0;j--);
                        led=1;
                }
                while(!k1);         
                {
                        led=1;
                }
        }               
}

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


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

使用道具 舉報

9#
ID:18297 發表于 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;         //定時累加計數
  9. u8 flag=0;               //3s的延時開和5s延時關閉標志
  10. u8 start_flag=0;         //開始定時的標志,0是允許定時輸出,1表示已經定時輸出。
  11. void delay(u16 i)        //鍵盤防止抖動延時標志
  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;              //當前是延時打開
  31.                         time0_on();          //定時器開。
  32.                 }
  33. }
  34. void led_off()             //按鍵釋放處理程序
  35. {
  36.                 led=1;                 //LED關閉
  37.           TR0=0;                                                                 //定時器關閉
  38.           start_flag=0;          //允許輸出復位
  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--;                       //計數器自減
  62.           if(time_count==0)                   //計數器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;                      //延時完成關閉定時器0
  74.                                           led=1;                      //led滅
  75.                                         break;
  76.                                                
  77.                         }
  78.                 }          
  79. }
  80. void main()
  81. {        
  82.                 while(1)
  83.     {        
  84.         keypros();                       //按鍵處理
  85.     }               
  86. }
復制代碼
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品91av| 91视频国产一区 | 别c我啊嗯国产av一毛片 | 欧美一区二区三区久久精品 | 国产伦精品一区二区 | 日韩精品免费 | 精品欧美一区二区久久久伦 | 人人草天天草 | 97国产精品视频人人做人人爱 | 黄色片在线观看网址 | 一区视频| 亚洲国产精品第一区二区 | 中文字幕 欧美 日韩 | 国产精品视频在线播放 | 久久久人成影片一区二区三区 | 91久久 | 天天天堂 | 欧美精品一区三区 | 日韩精品免费在线观看 | 特黄毛片 | 日韩精品中文字幕在线 | 午夜一区| 国产精品免费小视频 | 国产做a爱片久久毛片 | 青青草社区 | 国产在线高清 | 国产精品永久久久久久久www | 欧美日韩在线视频观看 | 国产一级特黄视频 | 琪琪午夜伦伦电影福利片 | 欧美激情精品久久久久久变态 | 国产精品成人在线播放 | 中文字幕欧美日韩一区 | 国产成人精品网站 | 99热视| 密桃av| 国产一区二区在线91 | 日韩精品免费视频 | 亚洲黄色av | 国产一区二区三区在线观看免费 | 久久久观看|