欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機按鍵實現一個LED1燈的翻轉等功能的程序問題

[復制鏈接]
跳轉到指定樓層
樓主
ID:630714 發表于 2019-10-27 23:41 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
1.按鍵k2實現一個LED1燈的翻轉
2.按鍵k3按下計時,松開按鍵,單片機串口發送按下的時間(單位ms)
3.LED2閃爍,周期為2s,其中亮1.5秒,滅0.5秒,要求時間準確。
第三個實現不了
# include<reg52.h>
# define uint unsigned int
# define uchar unsigned char

sbit key2=P3^4;
sbit key3=P3^6;
sbit LED1=P1^0;
sbit LED2=P1^1;

uint count1=0;
uint count2=0;

void delay(uint i)
{
        while(--i);        
}

void init()
{
        TMOD=0x21;
        TH0=0xfc;
        TL0=0x17;
        TH1=0xfd;
        TL1=0xfd;
        TR1=1;
        TR0=1;
        SM0=0;
        SM1=1;
        EA=1;
        ET0=1;
        ET1=1;
        ES=1;
}

void main()
{
        init();
        while(1)
        {
                if(key2==0)
                {
                        delay(10);
                        LED1=~LED1;
                        while(!key2);
                }
                if(key3==0)
                {        
                        while(!key3)
                        {
                                TH0=0xfc;
                                TL0=0x17;
                                count1++;
                        }
                        SBUF=count1;
                        if(TI==1)
                        {
                                TI=0;
                                count1=0;
                        }
                }               
        }        
}
void timer() interrupt 1
{
         TH0=0xfc;
         TL0=0x17;
         count2++;
         TF0=0;
         if(count2==500)
          LED2=~LED2;
         if(count2==2000)
         {
          LED2=~LED2;
          count2=0;
         }
}

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

使用道具 舉報

沙發
ID:332444 發表于 2019-10-28 09:04 | 只看該作者
周期為2秒的話邏輯應該這樣修改 if(count2==2000)count2=0; if(count2>=1500) LED2=~LED2;
回復

使用道具 舉報

板凳
ID:213173 發表于 2019-10-28 10:06 | 只看該作者
給你改寫,你試試。串口只能一次發送一個字節,uint count1=0; 16位數據需要分兩次發送。
  1. #include<reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char

  4. sbit key2=P3^4;
  5. sbit key3=P3^6;
  6. sbit LED1=P1^0;
  7. sbit LED2=P1^1;

  8. uint count1=0;
  9. uint count2=0;
  10. uchar dat_A,dat_B;
  11. bit flag=0;

  12. void delay(uint i)
  13. {
  14.         while(--i);        
  15. }

  16. void init()
  17. {
  18.         TMOD=0x21;
  19.         TH0=0xfc;                //1毫秒@11.0592MHz
  20.         TL0=0x66;
  21.         TH1=0xfd;
  22.         TL1=0xfd;
  23.         SM0=0;
  24.         SM1=1;
  25.         TR0=1;
  26.         TR1=1;
  27.         EA=1;
  28.         ET0=1;
  29. }

  30. void SendData(uchar dat)
  31. {
  32.         SBUF = dat; //發送當前數據
  33.         while(!TI);        //等待發送完畢
  34.         TI = 0;                //清除發送標志
  35. }

  36. void main()
  37. {
  38.         init();
  39.         while(1)
  40.         {
  41.                 if(key2==0)
  42.                 {
  43.                         delay(1000);
  44.                         if(key2==0)
  45.                         {
  46.                                 LED1=~LED1;
  47.                                 while(!key2);
  48.                         }
  49.                 }
  50.                 if(key3==0)
  51.                 {        
  52.                         delay(1000);
  53.                         if(key3==0 && flag==0)
  54.                                 flag=1;
  55.                 }
  56.                 else
  57.                 {
  58.                         if(flag==1)
  59.                         {
  60.                                 EA=0;//關中斷
  61.                                 flag=0;
  62.                                 dat_A=count1;   //分解低8位
  63.                                 dat_B=count1>>8;//分解高8位
  64.                                 count1=0;
  65.                                 SendData(dat_A);//發送低8位
  66.                                 SendData(dat_B);//發送高8位
  67.                                 EA=1;//開中斷
  68.                         }
  69.                 }               
  70.         }        
  71. }
  72. void timer() interrupt 1
  73. {
  74.         TH0=0xfc;
  75.         TL0=0x66;
  76.         count2++;
  77.         if(count2<1500)
  78.                 LED2=0;
  79.         else LED2=1;
  80.         if(count2>=2000)
  81.                 count2=0;

  82.         if(flag==1)
  83.                 count1++;       
  84. }
復制代碼
回復

使用道具 舉報

地板
ID:630714 發表于 2019-10-28 22:24 | 只看該作者
wulin 發表于 2019-10-28 10:06
給你改寫,你試試。串口只能一次發送一個字節,uint count1=0; 16位數據需要分兩次發送。

感謝感謝大佬為什么原來的第三問實現不了
回復

使用道具 舉報

5#
ID:213173 發表于 2019-10-29 16:38 | 只看該作者
99899245 發表于 2019-10-28 22:24
感謝感謝大佬為什么原來的第三問實現不了

單獨使用T0中斷的閃爍燈程序可以完成,但這樣寫代碼有漏洞。因為你開了沒有必要的ET1=1;ES=1; 雖然沒有寫T1中斷程序和串口中斷程序,但T1約2us周期的高速中斷請求會與T0中斷沖突,有可能錯過 if(count2==2000)而跑飛。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表