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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2654|回復: 8
收起左側

單片機LED流水燈 求實現思路

[復制鏈接]
ID:968157 發表于 2021-9-25 13:28 | 顯示全部樓層 |閱讀模式
由于本論壇禁止直接求程序,禁止伸手黨,所以向大家請教一下大致的實現方法與思路,理清頭緒后我自己來寫程序去實現,謝謝大家

P0口接八個紅色發光LED,P1.0,P1.1,P1.2分別接三個按鍵,上電后流水燈自上往下,延時2秒閃爍。
P1.0按鍵控制流水燈工作模式,每按一次改變一次流水燈閃爍模式,從上至下,再按一次,改為從下至上閃爍。
P1.1 按一次,閃爍時延加0.5秒,最慢閃爍為4秒。
P1.2按一次,閃爍時延減0.5秒,最快閃爍為0.5秒)

回復

使用道具 舉報

ID:517951 發表于 2021-9-28 14:04 | 顯示全部樓層
delay(unsigned char time)
{
   for (;time;time--)
  ;
}

按不同的鍵,time取不同的值,就可以改變間隔時間了

回復

使用道具 舉報

ID:969030 發表于 2021-9-29 11:06 | 顯示全部樓層
無非就是切換函數,延遲,這不挺簡單的嗎
回復

使用道具 舉報

ID:57657 發表于 2021-9-29 13:47 | 顯示全部樓層
rayin 發表于 2021-9-28 14:04
delay(unsigned char time)
{
   for (;time;time--)

延時建議用定時器中斷,軟件延時誤差不好計算。
回復

使用道具 舉報

ID:23640 發表于 2021-9-29 14:00 | 顯示全部樓層
npn 發表于 2021-9-29 13:47
延時建議用定時器中斷,軟件延時誤差不好計算。

題主剛開始學就別為難他了,簡單點先把功能做出來
回復

使用道具 舉報

ID:23640 發表于 2021-9-29 14:19 | 顯示全部樓層
unsigned char TEMP;
unsigned int timeout=0;
while(1)
{
        for(i=0;i<8;i++)
        {
                switch(mode)//暫定3個模式
                {
                        case 0:P0=TEMP;TEMP=TEMP<<i;
                                break;
                        case 1:P0=TEMP;TEMP=TEMP>>i;
                                break;       
                }
                delayms(timeout);       
        }
        keyval = keyscan();//按鍵掃描
        if(keyval==1)//模式鍵
        {
                mode++;
                if(mode>1)mode=0;
                switch(mode)
                {
                        case 0:TEMP=0X01;
                                break;       
                        case 1:TEMP=0X80;
                                break;
                }       
        }
        else if(keyval==2)//加鍵
        {
                timeout+=500;       
        }
        else if(keyval==3)//減鍵
        {
                timeout-=500;       
        }
}
回復

使用道具 舉報

ID:800529 發表于 2021-9-29 14:57 | 顯示全部樓層
6樓給出了實現程序,要想時間準,可以考慮改為定時器中斷模式。
回復

使用道具 舉報

ID:57657 發表于 2021-9-29 16:59 | 顯示全部樓層
  1. #include "reg51.h"
  2. #include "intrins.h"
  3. #define U8 unsigned char
  4. #define U16 unsigned int
  5. sbit sKEY0 = P1 ^ 0;
  6. sbit sKEY1 = P1 ^ 1;
  7. sbit sKEY2 = P1 ^ 2;
  8. bit key0, key1, key2;
  9. U8 k0ms, k1ms, k2ms;        //3個按鍵按下的時間(毫秒) 按下計數 松開清0
  10. U16 delay = 500; //流水燈延時(毫秒)
  11. bit lr = 0;     //流水燈方向

  12. void InitTimer0(){
  13.     TMOD = 0x01;
  14.     TH0 = 0x0FC;
  15.     TL0 = 0x18;
  16.     EA = 1;
  17.     ET0 = 1;
  18.     TR0 = 1;
  19. }

  20. void main(){
  21.     InitTimer0();
  22.     while (1) {
  23.         if (sKEY0 == 0) {
  24.             lr = !lr;
  25.             while (sKEY0 == 0);
  26.         }
  27.         if (sKEY1 == 0) {
  28.             if (delay < 4000) delay += 500;
  29.             while (sKEY1 == 0);
  30.         }
  31.         if (sKEY2 == 0) {
  32.             if (delay > 500) delay -= 500;
  33.             while (sKEY2 == 0);
  34.         }
  35.     }
  36. }

  37. void Timer0Interrupt() interrupt 1 {        //12Mhz 1mS 定時器中斷
  38.     static U8 a = 1;
  39.     static U16 ms = 0;
  40.     TH0 = 0x0FC;
  41.     TL0 = 0x18;
  42.     if (sKEY0) {k0ms = 0;}else{if (k0ms != 0xFF) {k0ms++;}}
  43.     if (sKEY1) {k1ms = 0;}else{if (k1ms != 0xFF) {k1ms++;}}
  44.     if (sKEY2) {k2ms = 0;}else{if (k2ms != 0xFF) {k2ms++;}}
  45.     key0 = !(k0ms >= 25);       //按鍵消抖25毫秒
  46.     key1 = !(k1ms >= 25);
  47.     key2 = !(k2ms >= 25);
  48.     if (++ms >= delay) {
  49.         ms = 0;
  50.         P0 = ~a;
  51.         a = lr ? _cror_(a, 1) : _crol_(a, 1);
  52.     }

  53. }
復制代碼
回復

使用道具 舉報

ID:161164 發表于 2021-9-30 10:21 | 顯示全部樓層
不用定時器版本,誤差2.5%
  1. #include <reg52.h>

  2. typedef         unsigned char        u8;  //0 to 255
  3. typedef         unsigned int        u16;  //0 — 65535
  4. typedef         unsigned long        u32;  //0 — 4294967295
  5. sbit KEY_0 = P1 ^ 0;
  6. sbit KEY_1 = P1 ^ 1;
  7. sbit KEY_2 = P1 ^ 2;
  8. sbit Sys_HB = P3^7;       
  9. u16 TMR_ms_ACC = 0;
  10. u8 Delay_XD = 0;                      //消抖計數
  11. u16 Flash_delay = 2000, TMR_Flash_ACC;
  12. bit Swap;

  13. void main()
  14. {u8 i;
  15.     while (1)
  16.     {
  17.         if(TMR_ms_ACC)TMR_ms_ACC--;
  18.         if(!TMR_ms_ACC)
  19.         {   TMR_ms_ACC = 45;
  20.                                                 if(TMR_Flash_ACC)TMR_Flash_ACC--;
  21.                                                 if(!TMR_Flash_ACC)
  22.                                                 {   TMR_Flash_ACC = Flash_delay;
  23.                                                                 if(Swap)
  24.                                                                 {
  25.                                                                         P0 = 0x80 >> i;
  26.                                                                 }else
  27.                                                                 {
  28.                                                                         P0 = 0x01 << i;
  29.                                                                 }i = (++i) % 8;
  30.                                                 }
  31.                                                 Sys_HB ^= 1;//輸出系統周期,計算TMR_ms_ACC
  32.         }
  33.         if(!KEY_0 || !KEY_1 || !KEY_2)
  34.         {
  35.             if(Delay_XD < 0xFF)Delay_XD++;
  36.             if(Delay_XD == 250)                      //消抖
  37.             {
  38.                 if(!KEY_0)
  39.                                                                 {
  40.                                                                         Swap ^= 1;
  41.                                                                 }
  42.                 if(!KEY_1)
  43.                                                                 {
  44.                                                                         if (Flash_delay < 4000)
  45.                                                                                 Flash_delay += 500;
  46.                                                                 }
  47.                 if(!KEY_2)
  48.                                                                 {
  49.                                                                         if (Flash_delay > 500)
  50.                                                                                 Flash_delay -= 500;
  51.                                                                 }
  52.             }
  53.         }
  54.         else                                                        //按鍵抬起
  55.             Delay_XD = 0;                                      //Delay_XD清0

  56.     }
  57. }
復制代碼




回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人精品久久 | 成人久久网 | 中文字幕在线观看日韩 | 亚洲国产成人在线观看 | 欧美一级欧美三级在线观看 | 国产精品视频偷伦精品视频 | 日韩不卡一区二区 | 日韩成人在线免费视频 | 天天综合亚洲 | 日韩中文在线观看 | 久草在线青青草 | 欧美啪啪网站 | 黄色一级免费观看 | 国产欧美日韩在线一区 | 欧美日韩激情 | 久久久久国产精品午夜一区 | 欧美激情久久久 | 三级在线观看 | 国产色婷婷精品综合在线播放 | 一级毛片免费完整视频 | 伊人伊人伊人 | 麻豆精品一区二区三区在线观看 | 国产精品视频在线播放 | 亚洲精品久久久久中文字幕二区 | 怡红院怡春院一级毛片 | 四虎最新 | 波多野吉衣久久 | 久久久久久久国产 | 久久大全 | 欧美亚洲一区二区三区 | 欧美一区久久 | 国产精品久久久久久久久久久久久 | 一区二区在线 | 日本亚洲一区二区 | www.操.com| 欧美日韩视频一区二区 | 一区二区电影 | 久久久久亚洲精品 | 日本一区二区三区四区 | 国产中文在线观看 | 国产成人精品视频在线观看 |