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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3782|回復: 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;
         }
}

回復

使用道具 舉報

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位數據需要分兩次發送。

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

使用道具 舉報

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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 九九免费在线视频 | 喷水毛片| 99精品视频在线观看免费播放 | 欧美极品在线观看 | 特黄特黄a级毛片免费专区 av网站免费在线观看 | 在线观看成人精品 | 很黄很污的网站 | 国产精品色哟哟网站 | 91视频亚洲| 久久伊人精品 | 91精品久久久久久久久 | 国产精品久久久久久久久久免费看 | 日韩亚洲欧美综合 | av大片 | 免费一区二区三区 | 91视频网址| 福利一区视频 | 成人精品毛片国产亚洲av十九禁 | 在线一区视频 | 成人欧美日韩一区二区三区 | av在线一区二区三区 | 欧州一区二区三区 | 一区二区三区四区在线视频 | 黑人巨大精品欧美一区二区免费 | 国产男女视频网站 | 一级毛片色一级 | 国产精品视频免费观看 | 中文一区 | 亚洲免费观看视频 | 极品销魂美女一区二区 | 成人国产精品久久久 | 国产一区二区高清在线 | 凹凸日日摸日日碰夜夜 | 国产日韩视频在线 | 国久久 | 欧美在线资源 | 国产成人精品视频在线观看 | 婷婷久久精品一区二区 | 天天插日日操 | 欧美国产视频一区二区 | 亚洲国产成人精品女人久久久 |