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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索

51單片機電子鬧鐘 小白,求助

查看數: 435 | 評論數: 7 | 收藏 0
關燈 | 提示:支持鍵盤翻頁<-左 右->
    組圖打開中,請稍候......
發布時間: 2025-11-20 22:37

正文摘要:

由于本論壇禁止直接求程序,禁止伸手黨,所以向大家請教一下大致的實現方法與思路,理清頭緒后我自己來寫程序去實現,謝謝大家

回復

無效樓層,該帖已經被刪除
無效樓層,該帖已經被刪除
無效樓層,該帖已經被刪除
ID:155507 發表于 2025-11-22 15:11
下面是基于"KR-51開發板"(51單片機)的簡化電子鬧鐘核心C代碼框架,實現如下功能需求:  
- 當前時間/鬧鐘時間設定  
- 光敏控制數碼管背光  
- 按鍵切換/設置/加減  
- 蜂鳴器鬧鈴&LED閃爍

  1. /*
  2. 51單片機電子鬧鐘 KR-51開發板
  3. 實現功能:
  4. 1.可自主設定當前時間與鬧鐘時間,4位共陽數碼管
  5. 2.利用光敏傳感器實現有光時數碼管常亮,無光時,按下按鍵,數碼管亮起,可切換,查看當前時間與鬧鐘時間
  6. 3.鬧鐘時間到了,蜂鳴器響起同時,Led燈按 200ms頻率閃爍
  7. 1. 主要口線分配

  8. | 功能           | 單片機引腳    |
  9. |----------------|---------------|
  10. | 數碼管段選 a-f | P0.0~P0.7     |
  11. | 數碼管位選     | P2.0~P2.3     |
  12. | 蜂鳴器         | P2.5          |
  13. | LED            | P1.0          |
  14. | 光敏傳感器     | P1.7          |
  15. | 按鍵功能       | P3.2          |
  16. | 按鍵切換       | P3.3          |
  17. | 按鍵加         | P3.4          |
  18. | 按鍵減         | P3.5          |

  19. 使用說明

  20. - 按KEY_MODE切換顯示當前和鬧鐘時間。
  21. - 三個按鍵:KEY_ADD/KEY_SUB調節小時,KEY_FUNC調節分鐘。
  22. - 光敏自動調節背光,無光時按任一功能鍵亮屏。
  23. - 鬧鐘時間到,蜂鳴器響、LED閃;復位或重新設定可清除鬧鐘。



  24. 代碼邏輯清晰,各功能子模塊獨立,易于修改和維護。


  25. */


  26. #include <reg51.h>
  27. #define uint unsigned int
  28. #define uchar unsigned char

  29. // 段碼表
  30. uchar code seg_tab[10] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //共陽數碼管

  31. // 硬件口線映射
  32. sbit BUZZER = P2^5;     //蜂鳴器
  33. sbit LED    = P1^0;
  34. sbit LDR    = P1^7;     // 光敏
  35. sbit KEY_FUNC = P3^2;
  36. sbit KEY_MODE = P3^3;
  37. sbit KEY_ADD  = P3^4;
  38. sbit KEY_SUB  = P3^5;

  39. //主要數據結構
  40. // 任務標志
  41. bit alarm_flag = 0;
  42. bit display_flag = 1;    // 數碼管亮/滅
  43. bit key_enable_flag = 0; // 消抖允許
  44. uchar key_state = 0;     // 按鍵當前狀態

  45. // 時鐘及鬧鐘變量
  46. uchar hour=12, minute=0;
  47. uchar alarm_hour=6, alarm_minute=30;
  48. uchar display_mode=0; // 0:當前時間 1:鬧鐘時間
  49. uint  tcount=0;       // 定時器計數


  50. //時間與鬧鐘管理模塊

  51. void time_update(void) {
  52.     tcount++;
  53.     if(tcount >= 2400) {        //假設定時25ms; 2400*25ms=60s
  54.         tcount = 0;
  55.         minute++;
  56.         if(minute >= 60) {
  57.             minute = 0;
  58.             hour++;
  59.             if(hour >= 24) hour=0;
  60.         }
  61.         if(hour == alarm_hour && minute == alarm_minute) {
  62.             alarm_flag = 1; //鬧鐘觸發
  63.         }
  64.     }
  65. }

  66. void alarm_clear(void) {
  67.     alarm_flag = 0;
  68.     BUZZER = 0;
  69.     LED = 0;
  70. }


  71. //按鍵掃描與功能切換

  72. void key_scan(void) {
  73.     if(KEY_MODE == 0) {        // 切換顯示模式
  74.         while(KEY_MODE == 0);  //松手消抖
  75.         display_mode ^= 1;
  76.     }
  77.     if(display_mode == 0) {    //當前時間
  78.         if(KEY_ADD == 0) {     //小時加
  79.             while(KEY_ADD == 0);
  80.             hour++; if(hour > 23) hour=0;
  81.         }
  82.         if(KEY_SUB == 0) {     //小時減
  83.             while(KEY_SUB == 0);
  84.             if(hour == 0) hour=23; else hour--;
  85.         }
  86.         if(KEY_FUNC == 0) {    //分鐘加
  87.             while(KEY_FUNC == 0);
  88.             minute++; if(minute > 59) minute=0;
  89.         }
  90.     } else {                   //鬧鐘時間
  91.         if(KEY_ADD == 0) {
  92.             while(KEY_ADD == 0);
  93.             alarm_hour++; if(alarm_hour > 23) alarm_hour=0;
  94.         }
  95.         if(KEY_SUB == 0) {
  96.             while(KEY_SUB == 0);
  97.             if(alarm_hour == 0) alarm_hour=23; else alarm_hour--;
  98.         }
  99.         if(KEY_FUNC == 0) {
  100.             while(KEY_FUNC == 0);
  101.             alarm_minute++; if(alarm_minute > 59) alarm_minute=0;
  102.         }
  103.     }
  104. }


  105. //光敏及顯示管理子模塊
  106. void ldr_check(void) {
  107.     // 有光時一直亮,沒光時只在按鍵顯示
  108.     if(LDR == 1)
  109.         display_flag = 1;
  110.     else {
  111.         if(KEY_FUNC == 0) display_flag = 1;
  112.         else display_flag = 0;
  113.     }
  114. }


  115. //數碼管動態顯示模塊
  116. void display_time(uchar h, uchar m) {
  117.     uchar disp_buf[4],i;
  118.     disp_buf[0] = h / 10;
  119.     disp_buf[1] = h % 10;
  120.     disp_buf[2] = m / 10;
  121.     disp_buf[3] = m % 10;
  122.     for(i=0; i<4; i++) {
  123.         P2 = ~(1 << i);           // 位選P2.0~P2.3共陽
  124.         P0 = seg_tab[disp_buf[i]]; // 段選
  125.         // 若想顯示小數點或其它符號,可此處加處理
  126.         // 延時,用于刷新和消影
  127.     }
  128. }

  129. //鬧鐘蜂鳴/LED閃爍模塊
  130. void alarm_task(void) {
  131.     if(alarm_flag) {
  132.         BUZZER = 1;
  133.         // 200ms LED閃爍循環(簡單用定時來實現)
  134.         if(tcount % 8 < 4) LED = 1;
  135.         else LED = 0;
  136.     }
  137. }


  138. //定時器初始化與中斷服務
  139. void Timer0_Init(void) {
  140.     TMOD = 0x01;     //方式1 16位
  141.     TH0 = (65536-25000)/256;  //25ms
  142.     TL0 = (65536-25000)%256;
  143.     ET0 = 1; TR0 = 1; EA = 1;
  144. }

  145. void Timer0_ISR(void) interrupt 1 {
  146.     TH0 = (65536-25000)/256; TL0 = (65536-25000)%256;
  147.     time_update();     //更新時間,每25ms進一次
  148. }



  149. //主循環
  150. void main(void) {
  151.     Timer0_Init();
  152.     alarm_clear();
  153.     while(1) {
  154.         key_scan();
  155.         ldr_check();
  156.         if(display_flag) {
  157.             if(display_mode == 0) display_time(hour, minute);
  158.             else display_time(alarm_hour, alarm_minute);
  159.         } else {
  160.             //可以關閉數碼管
  161.             P0 = 0x00; P2 = 0x00;
  162.         }
  163.         alarm_task();
  164.         // 若需要按鍵消抖與顯示穩定可增加適度延時
  165.     }
  166. }


復制代碼






ID:584814 發表于 2025-11-22 12:00
啥也沒有開始問,就是想白嫖文檔的樣子。

ID:1133081 發表于 2025-11-21 21:45
20ms頻率閃爍你能看到閃?

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

Powered by 單片機教程網

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