wwwxxx国产_337p日本欧洲亚洲大胆张筱雨_免费在线看成人av_日本黄色不卡视频_国产精品成熟老女人_99视频一区_亚洲精品97久久中文字幕_免费精品视频在线_亚洲色图欧美视频_欧美一区二三区

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

遙控音樂盒制作日志(二) 簡單定時器管理 附單片機程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:695961 發表于 2022-5-15 22:49 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
準備做一款遙控音樂盒,可以顯示時間,星期,定時,溫度,濕度等功能,同時使用串口接個藍牙就可以和手機通訊了。

時間相關的使用:DS1302

溫度和濕度使用:DHT11

顯示使用:12232

遙控使用了一款某寶上8塊錢包郵買的:2262/2272四路無線遙控套

上期實現了基本的演奏和遙控功能(上一曲,下一曲),詳細見論壇的帖子:
http://m.izizhuan.cn/bbs/dpj-220369-1.html
上期的主要功能是實現了曲譜的壓縮(曲譜是從論壇中搜得的,感謝作者提供),歌曲的演奏和遙控的控制。我使用的單片機有三個定時器,其中拿出來T2定時器用于演奏音樂,T0定時器用于控制每個節拍的演奏時間,由于要去抖,每次按鍵還需要軟件延時50ms,但是我發現,延時的過程中,會出現音樂變調,后面解釋變調的原因。T1留作波特率發生器。
我們大部分和外圍器件的交互都需要延時,少的像12232,只需要延時1ms就可以。多的如DS1302和DHT11那就得幾十毫秒。后期,要每秒鐘刷新一次時間,以及溫度和濕度,如果用定時器的話,肯定不夠用。如果延時的話,這些外圍設備的延時累積起來,這個時候要是演奏音樂,肯定會讓音樂跑調(因為延時的過程中,音樂的演示時間會被延時拉長)

51單片機不像STM32那樣可以使用官方提供的軟件定時器代碼,所以就自己動手寫了一個簡單的軟件定時器,配備上附加的tag字段,讓音樂演奏和按鈕去抖都使用軟件延時,軟件延時使用T0定義一個時間基時1.25ms(由于我將來要用串口通訊,所以使用11.0592的晶振,定為1.25ms的話誤差最,如果使用12M的晶振就可以把時間基時定為無誤差的1ms了),這樣以來,單片機全程沒有無意義的空轉延時函數,所有的延時全部使用軟件定時。單片機全部功能不卡頓。
這樣單片機先初始化軟件定時器,設定定時時間,開始定時器,定時器中斷到來時,所有定時器的value加1,判斷哪些定時器到時間了,到時間的執行回調。

定時器代碼如下:


timer.h
  1. #ifndef __TIMER_H__
  2. #define __TIMER_H__

  3. #include "fyexing.h"

  4. #define TIMER_COUNT         6                        // 定時器數量(0-3:btns  4:music  5:lcd)

  5. // 定時器初值(1.25ms, 110592)
  6. #define VAL_L                    0x80                // 設置定時初值(低)
  7. #define VAL_H                    0xFB                // 設置定時初值(高)

  8. typedef void(*TIMERS_CALLBACK)(uint8);        // 定時器回調函數

  9. typedef struct _TIMER
  10. {
  11.         BYTE      id;                // 定時器ID
  12.         BYTE      enabled;        // 是否啟動
  13.         uint16    count;        // 定時時間 = count * 1.25ms
  14.         uint16    value;        // 當前時間 = value * 1.25ms
  15.         uint8          tag;                // 定時器附加數據
  16.         //TIMERS_CALLBACK callback;                // 單個定時器回調
  17.         
  18. } TIMER, *PTIMER;

  19. extern TIMERS_CALLBACK timersCallback;        // 回調函數
  20. extern TIMER timers[TIMER_COUNT];                // 定時器數組

  21. PTIMER TimerInit(void *callback);            // 初始化定時器
  22. void TimerRun();                                                // 定時器運行

  23. #endif
復制代碼

timer.c
  1. #include "timer.h"

  2. // 定義定時器數組
  3. TIMER timers[TIMER_COUNT];
  4. uint8 timerEnabled = FALSE;                        // 定時器+1的開關
  5. TIMERS_CALLBACK timersCallback;                // 定時器回調函數

  6. // 初始化定時器
  7. PTIMER TimerInit(void *callback)
  8. {
  9.         int i;
  10.         
  11.         // 定時器回調函數
  12.         timersCallback = callback;
  13.         
  14.         // 初始化定時器組
  15.         for(i = 0; i < TIMER_COUNT; i++)
  16.         {
  17.                 timers[i].id = i;
  18.         }
  19.         
  20.         // 初始化T0(11.0592, 1.25ms)
  21.         EA = 0;                        // 關閉總中斷
  22.         
  23.         TMOD &= 0xF0;        // 設置定時器模式
  24.         TMOD |= 0x01;        // 設置定時器模式
  25.         TL0 = VAL_L;        // 設置定時初值
  26.         TH0 = VAL_H;        // 設置定時初值
  27.         ET0 = 1;                // 允許定時器0中斷
  28.         
  29.         EA = 1;                        // 允許總中斷
  30.         TR0 = 1;                // 啟動定時器0
  31.         
  32.         return &timers;
  33. }

  34. // 運行定時器
  35. void TimerRun()
  36. {
  37.         uint8 i;
  38.         if(!timerEnabled)
  39.                 return;
  40.         
  41.         timerEnabled = FALSE;
  42.         for(i = 0; i < TIMER_COUNT; i++)
  43.         {
  44.                 if(!timers[i].enabled)
  45.                         continue;
  46.                
  47.                 timers[i].value++;
  48.                 if(timers[i].enabled && timers[i].value >= timers[i].count)
  49.                 {
  50.                         timers[i].value = 0;
  51.                         
  52.                         // 單獨的回調
  53. //                        if(timers[i].callback)
  54. //                                timers[i].callback(i);
  55.                         
  56.                         // 全局回調
  57.                         if(timersCallback)
  58.                                 timersCallback(i);
  59.                 }
  60.         }
  61. }

  62. // T0中斷處理函數
  63. void tm0_isr() interrupt 1
  64. {
  65.         TL0 = VAL_L;                // 設置定時初值
  66.         TH0 = VAL_H;                // 設置定時初值
  67.         timerEnabled = TRUE;
  68. }
復制代碼

main.c
  1. //#include <intrins.h>
  2. //#include "STC89C5xRC.H"
  3. #include "fyexing.h"
  4. #include "timer.h"
  5. #include "music.h"
  6. #include "lcd1602.h"

  7. // 定時器回調
  8. void timerCallback(int8 id)
  9. {
  10.         uint8 btnIndex, keys;
  11.         
  12.         switch(id)
  13.         {
  14.                
  15.                 // 如果50ms后B還按下,則切換紅色的LED
  16.                 case 0:
  17.                 case 1:
  18.                 case 2:
  19.                 case 3:
  20.                         keys = BTNS;
  21.                         btnIndex = (keys >> id) & 0x01;
  22.                         if(btnIndex == 0)
  23.                                 timers[id].tag = 2;                        // 按下狀態
  24.                         else
  25.                                 timers[id].tag = 0;                        // 還原彈起狀態
  26.                         
  27.                         timers[id].enabled = FALSE;                // 關閉定時器
  28.                         break;
  29.                         
  30.                 // 音符演奏結束
  31.                 case 4:
  32.                         MusicHandle();                                        // 音樂軟中斷處理程序
  33.                         break;
  34.                
  35.                 // LCD1602
  36.                 case 5:
  37.                         Lcd1602Runting();
  38.                         break;
  39.         }
  40. }

  41. void key()
  42. {
  43.         uint8 i, btnIndex;
  44.         uint8 keys = BTNS;
  45.         
  46.         // 掃描按鍵
  47.         for(i = 0; i < 4; i++)
  48.         {
  49.                 btnIndex = (keys >> i) & 0x01;
  50.                
  51.                 // 檢測按鈕按是否下
  52.                 if(!timers[i].enabled && btnIndex == 0 && timers[i].tag == 0)
  53.                 {
  54.                         timers[i].count = 40;                // 定時50ms
  55.                         timers[i].value = 0;
  56.                         timers[i].tag = 1;                        // 按下狀態
  57.                         timers[i].enabled = TRUE;        // 啟動定時器
  58.                 }
  59.                
  60.                 // 松開按鈕,執行相應的命令
  61.                 if(btnIndex == 1 && timers[i].tag == 2)
  62.                 {
  63.                         switch(i)
  64.                         {
  65.                                 // A按鈕
  66.                                 case 0:
  67.                                         PreviousMusic();                // 上一首音樂;
  68.                                         break;
  69.                                 
  70.                                 // B按鈕
  71.                                 case 1:
  72.                                         NextMusic();                        // 下一首音樂;
  73.                                         break;
  74.                         }
  75.                         
  76.                         timers[i].tag = 0;                        // 彈起狀態
  77.                 }
  78.         }        
  79. }

  80. void main()
  81. {
  82.         TimerInit(timerCallback);        // 初始化定時器0,并初始化軟定時器
  83.         Lcd1602Init();                                // 初始化LCD1602
  84.         MusicInit();                                // 初始化音樂
  85.         
  86.         while(1)
  87.         {
  88.                 TimerRun();                // 運行定時器
  89.                 key();                        // 檢測按鍵
  90.         }
  91. }
復制代碼


評分

參與人數 1黑幣 +50 收起 理由
admin + 50

查看全部評分

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

使用道具 舉報

無效樓層,該帖已經被刪除
您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
午夜精品久久久久久久99老熟妇 | 日韩精品一区二区三区第95| 国产精品一区二区在线播放| 在线看片成人| 亚洲精品成人无限看| 日韩黄色大片| 欧美综合一区| 91麻豆国产自产在线观看亚洲| 任我爽精品视频在线播放| 动漫视频在线一区| 国产伦乱精品| 九九综合在线| sdde在线播放一区二区| 中文字幕av一区二区三区人妻少妇 | 日本一级在线观看| 国产精品天美传媒入口| 欧美成人精品福利网站| 露脸国产精品自产在线播| 欧美乱强性伦xxxxx| 牛人国产偷窥女洗浴在线观看| 欧美人与动性xxxxx杂性| 欧美最猛性xxxxx喷水| 精品a在线观看| 免费黄色大片| 2色视频网站| 成人综合av| 日韩中文字幕免费视频| 人妻熟女一二三区夜夜爱| 国产免费黄色| 精品国产一区二区三区不卡| 在线观看一区二区精品视频| 欧美乱妇15p| 欧美一二三四区在线| 亚洲女成人图区| 日韩视频免费在线| 91国语精品自产拍在线观看性色 | 亚洲人午夜精品| 久久精品国产精品亚洲| 欧美精品videosex性欧美| 亚洲精品欧美二区三区中文字幕| 午夜精品久久久久久久91蜜桃| 激情中国色综合| 亚洲一区二区三区四区五区中文| 国产精品伦子伦| 黄色片网站在线播放| 日韩美女视频网站| 亚洲一区二区三区网站| 男女啪啪无遮挡网站| 在线观看免费电影| 国产99re| 婷婷视频在线| 亚洲综合电影| japanese色系久久精品| 99久久婷婷这里只有精品 | 99精品视频在线免费播放 | 无码人妻丰满熟妇区五十路| heyzo久久| 视频在线观看91| www.66久久| 亚洲一区精品在线| 日韩一区二区电影在线| 久久精品国产成人| 国产在线不卡精品| 影音先锋欧美在线| 中文字幕亚洲欧洲| 亚洲女同二女同志奶水| 国产成人精品一区二区色戒| 99久9在线视频| 在线精品视频免费观看| 国产911在线观看| 国产狂喷白浆在线观看视频| 91av视频导航| 日本午夜精品理论片a级appf发布| 国产精品视频在线免费观看| 日韩一级片免费视频| 色综合久久久无码中文字幕波多| 成人18视频免费69| 国产浮力第一页| 啪啪av大全导航福利网址| 欧美jizzhd69巨大| japansex久久高清精品| 午夜日韩av| xfplay精品久久| 欧美色网站导航| 日韩中文字幕在线| 国产久一道中文一区| 欧美激情国产精品日韩| 天天摸日日摸狠狠添| 999久久久久久| 天天av天天爱| 丝袜在线视频| 欧美一性一交| 成人一区二区在线观看| 欧洲一区二区三区在线| 欧美精品久久久久a| 欧美日韩一区二 | 一区在线观看免费| 国产精品资源在线看| 国产精品久久久久久久久免费樱桃 | 69av视频在线| 香蕉av在线播放| 在线影视一区| 欧美日韩国产一区二区在线观看| 性一交一乱一区二区洋洋av| 亚洲另类在线一区| 亚洲视频在线看| 国产亚洲精品美女久久久m| 91小视频网站| 神马久久久久久久| 一区二区三区中文免费| 中文字幕99| 天天曰天天操| 91麻豆国产精品久久| www.97超碰| 操人视频在线播放| 欧美艳星kaydenkross| 亚洲国产激情| 亚洲高清不卡在线| 久久久亚洲欧洲日产国码aⅴ| 亚洲午夜在线观看| a资源在线观看| 欧美孕妇与黑人巨交| 国产素人视频在线观看| 国产精品成人a在线观看| 国产欧美日韩精品一区| 国产亚洲xxx| 亚洲一区二区三区欧美| 四虎成人免费影院| 豆国产97在线|亚洲| 色av手机在线| 亚洲人妖在线| 色综合久久99| 国产精品美女www| wwwwwxxxx日本| 国产草草影院ccyycom| 亚洲人av在线影院| 亚洲熟女少妇一区二区| 97视频一区| 色综合久综合久久综合久鬼88 | 欧美日韩国产亚洲沙发| 欧美黄色录像| 久久久国产一区二区三区四区小说 | 国产精品国产精品国产专区不蜜| www.欧美三级电影.com| 加勒比海盗1在线观看免费国语版| 免费人成视频在线| 97在线免费| 超碰成人97| 国产色产综合产在线视频| xvideos成人免费中文版| 在线成人av电影| 国产精品日日夜夜| 亚色视频在线播放| 国产剧情在线观看一区| 综合久久久久综合| 欧美主播福利视频| 欧美午夜aaaaaa免费视频| 国产精品热久久| 亚洲成人三级| 一区二区91| 日韩一区二区免费高清| 欧美日韩一区二区三区在线观看免 | 亚久久调教视频| 欧美日韩国产综合久久 | 国产精品爽黄69| 色哟哟网站在线观看| 久久综合香蕉| 日韩免费小视频| 不卡在线视频中文字幕| 欧美理论片在线观看| 天天爽天天爽夜夜爽| 天堂成人在线观看| 亚洲深夜视频| 91丨porny丨蝌蚪视频| 欧美成人精品三级在线观看| 天天视频天天爽| 中文有码在线| 91亚洲精品在看在线观看高清| 91日韩一区二区三区| 欧美黄色免费网站| 下面一进一出好爽视频| 最新国产麻豆精品| 亚洲伦理一区二区| 自拍av一区二区三区| 成人精品久久av网站| 99国产精品无码| 日韩中文字幕在线播放| 亚洲第一页综合| 激情久久五月天| 日本精品免费在线观看| 国产精品7m凸凹视频分类| 欧美日韩黄色影视| 麻豆一区二区三区在线观看| 国产极品久久久| 日本免费一区二区六区| 久久精品水蜜桃av综合天堂| 国产精品久久久久免费a∨| 国产三级黄色片| 在线观看av片| 老鸭窝91久久精品色噜噜导演| 亚洲国产欧美一区二区三区久久| 日韩av高清在线看片| 亚洲一级爰片777777| 99只有精品| 亚洲免费在线视频一区 二区| 日本小视频在线免费观看| 日韩精品极品视频| 国内老熟妇对白hdxxxx| 女人床在线观看| 一级片中文字幕| 成人影欧美片| 91网站最新网址| 91日本视频在线| 日本网站免费观看| 男人添女人下部高潮视频在线观看 | 国产精品高清在线观看| 成人做爰69片免网站| 免费播放片a高清在线观看| 久久99久久99| 国产精品18久久久久久麻辣| 亚洲国产精品久| 日本中文字幕在线2020| 中文字幕网站在线观看| 男男gay无套免费视频欧美| 日韩av最新在线观看| 亚洲AV无码国产精品午夜字幕| 日韩三级av在线播放| www黄色在线| 岛国片在线观看| 韩日精品在线| 久久久99久久精品女同性| 中日韩精品一区二区三区 | 国产一区二区三区四| 91国产高清在线| 搜索黄色一级片| 成人短视频在线| 欧美国产精品劲爆| 欧美亚洲免费在线| 免费男女羞羞的视频网站中文子暮| 久久电影在线| 欧美精品一区二区在线播放| 欧美aa国产视频| 久操手机在线视频| 国产私拍福利精品视频二区| 国产精品视频播放| 在线观看日韩av电影| 精品国产一区二区三区久久狼黑人| 青青草成人免费视频| 99re在线视频| 国产精品久久三区| 精品一区二区成人免费视频| 欧美黄网站色视频| 亚洲高清毛片| 欧美一区二区三区……| 9i精品福利一区二区三区| 欧美videos粗暴| 欧美一区二区性放荡片| 亚洲女人在线观看| 久久电影视频| 国产精品国产三级国产aⅴ中文 | 色欲无码人妻久久精品| 青青草在线视频免费观看| 91亚洲精品一区二区乱码| 精品国偷自产在线| 色www亚洲国产阿娇yao| 都市激情久久综合| 欧美性色xo影院| 免费一级特黄录像| 一级视频在线观看| 国产欧美精品一区二区色综合| 性欧美大战久久久久久久免费观看| 欧美日韩在线精品成人综合网| 欧美日韩日本国产亚洲在线| 68精品久久久久久欧美| 自拍偷拍福利视频| 综合亚洲色图| 欧美成人午夜剧场免费观看| 日本三级片在线观看| 深夜福利一区二区三区| 亚洲男人天堂古典| 精品无码久久久久久久久| 亚洲成人激情社区| 日韩免费电影一区| 中日韩精品一区二区三区| 国模私拍一区二区国模曼安| 精品视频免费看| 日本美女视频网站| 羞羞网站在线看| 在线观看区一区二| 国产人成视频在线观看| 色呦呦在线播放| 欧美日韩免费一区二区三区视频| 波多野结衣三级视频| 成人直播在线| 欧美日韩国产电影| 亚洲成人网在线播放| 综合毛片免费视频| 亚洲国产一区自拍| 在线观看欧美亚洲| xvideos入口| 91色视频在线| 日本免费不卡一区二区| 天堂中文在线视频| 一区二区久久久| 一级网站在线观看| 国产在线美女| 国产视频在线一区二区| 五月天综合激情网| jlzzjlzz亚洲女人| 国产精品三级美女白浆呻吟| 亚洲狠狠婷婷综合久久蜜桃| 麻豆视频一区二区| 亚洲一区三区电影在线观看| 污视频网站免费| 国产精品一区二区美女视频免费看| 欧美一区二区播放| 91 在线视频| 老司机在线精品视频| 午夜精品一区二区三区在线| www.xxx国产| 日韩1区2区3区| 性欧美精品一区二区三区在线播放| 明星乱亚洲合成图.com| 中文字幕中文乱码欧美一区二区| 成人性生交免费看| 九色porny丨国产首页在线| 亚洲丁香婷深爱综合| 性无码专区无码| 中文字幕一区二区三区乱码图片| 亚洲淫片在线视频| 黄色电影在线免费观看| ...av二区三区久久精品| 少妇丰满尤物大尺度写真| 日韩影片中文字幕| 久久精品免费电影| 日韩一卡二卡在线| www国产精品视频| 日韩不卡在线播放| 亚洲综合图色| 69国产精品成人在线播放| 亚洲av无码乱码在线观看性色| 欧美大片一区| 91精品视频免费| 国内一区二区三区精品视频| 久久草av在线| 在线一区日本视频| 黄色一级视频网站| |精品福利一区二区三区| 视频在线观看免费高清| 欧美成人性生活视频| 欧美女孩性生活视频| 天天干天天舔天天操| 日本黄色成人| 久久精品国产成人精品| 国产乱子伦精品无码码专区| 一区在线免费| 国产无套精品一区二区| 999sesese| 亚洲视频一区在线| 日韩av福利在线观看| 日本乱码一区二区三区不卡| 精品一区二区三区四区| 日日噜噜噜噜人人爽亚洲精品| 欧美综合另类| 91在线高清免费观看| 免费观看的黄色网址| 中文字幕乱码一区二区免费| 亚洲一级免费观看| 蜜桃视频www网站在线观看| 精品一区电影国产| 91久久精品国产91性色69| 亚洲日产国产精品| 日韩精品国内| 羞羞视频在线免费看| 在线观看一区二区视频| 青青草激情视频| 久久综合国产| 国产综合第一页| 视频免费观看| 在线一区二区三区| www.色小姐com| 99久久精品费精品国产风间由美| 91九色极品视频| 丁香综合在线| 午夜精品久久久久影视| 欧日韩不卡视频| 久久免费精品视频在这里| 国产精品区一区| 色老板在线视频| 欧美色图12p| 在线视频一区二区三区四区| 99精品视频免费观看| 亚洲欧美日韩不卡| 国产不卡在线| 一夜七次郎国产精品亚洲| 日韩一区二区三区不卡| 97精品超碰一区二区三区| 免费观看性欧美大片无片| 五月婷婷丁香色| 成人v精品蜜桃久久一区|