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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

師傅們幫忙看看單片機是STC15F104W怎么不運行呢

[復制鏈接]
跳轉到指定樓層
樓主
ID:63317 發表于 2025-6-13 10:40 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
按鍵按一次一分鐘定時再按一次是3分鐘定時控制P3^3口
單片機是STC15F104W
#include<reg51.h>

#define uchar unsigned char
#define uint unsigned int

sbit key = P3^2; // 按鍵連接在P3.2引腳
sbit led = P3^3; // LED連接在P3.3引腳
uchar key_press_count = 0; // 按鍵按下次數
bit timer_running = 0; // 定時器運行狀態
uint timer_count = 0; // 定時計數
uchar timer_mode = 0; // 定時模式,0表示未設置,1表示1分鐘,2表示3分鐘

// 定時器初始化函數
void Timer0Init()
{
    TMOD &= 0xF0; // 清除定時器0的模式位
    TMOD |= 0x01; // 設置定時器0為模式1(16位定時器)
    TH0 = (65536 - 50000) / 256; // 設置定時初值,定時50ms(假設12MHz晶振)
    TL0 = (65536 - 50000) % 256;
    ET0 = 1; // 開啟定時器0中斷
    TR0 = 0; // 關閉定時器0
}

// 定時器0中斷服務函數
void Timer0_ISR() interrupt 1
{
    TH0 = (65536 - 50000) / 256; // 重新加載定時初值
    TL0 = (65536 - 50000) % 256;
    if(timer_running) // 如果定時器正在運行
    {
        timer_count++; // 增加計數
        if(timer_mode == 1 && timer_count >= 120000) // 1分鐘定時
        {
            timer_running = 0; // 停止定時器
            timer_count = 0; // 清零計數
            led = 0; // 關閉LED
        }
        else if(timer_mode == 2 && timer_count >= 360000) // 3分鐘定時
        {
            timer_running = 0; // 停止定時器
            timer_count = 0; // 清零計數
            led = 0; // 關閉LED
        }
    }
}

// 按鍵掃描函數
void key_scan()
{
    if(key == 0) // 檢測按鍵是否按下
    {
        delay(10); // 消抖
        if(key == 0)
        {
            while(!key); // 等待按鍵釋放
            key_press_count++; // 增加按鍵次數
            if(key_press_count == 1) // 第一次按下按鍵
            {
                timer_mode = 1; // 設置定時模式為1分鐘
            }
            else if(key_press_count == 2) // 第二次按下按鍵
            {
                timer_mode = 2; // 設置定時模式為3分鐘
            }
            if(timer_mode > 0) // 如果設置了定時模式
            {
                timer_running = 1; // 啟動定時器
                timer_count = 0; // 清零計數
                led = 1; // 打開LED
            }
        }
    }
}

// 延時函數
void delay(uint z)
{
    uint x, y;
    for(x=z; x>0; x--)
        for(y=110; y>0; y--);
}

void main()
{
    Timer0Init(); // 初始化定時器
    EA = 1; // 開啟總中斷
    led = 0; // 初始化LED狀態為關閉
    while(1)
    {
        key_scan(); // 按鍵掃描
    }
}

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

使用道具 舉報

沙發
ID:592807 發表于 2025-6-13 13:55 | 只看該作者
if可以單獨用  if...else...可以組合用  if...else if....else也可以組合用,但是呢你if...else if...肯定是不行的,你按一下按鍵你的key_press_count度不知道變成多少了,

評分

參與人數 1黑幣 +11 收起 理由
WFX777888 + 11 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

板凳
ID:1153069 發表于 2025-6-13 16:11 | 只看該作者
key_press_count有清零嗎,按兩次以上的時候都沒有執行語句了
回復

使用道具 舉報

地板
ID:1133081 發表于 2025-6-13 17:30 | 只看該作者
  1. //按鍵按一次一分鐘定時再按一次是3分鐘定時控制P3^3口
  2. //單片機是STC15F104W
  3. #include<reg51.h>

  4. #define uchar unsigned char
  5. #define uint unsigned int

  6. sbit key = P3^2; // 按鍵連接在P3.2引腳
  7. sbit led = P3^3; // LED連接在P3.3引腳
  8. uchar key_press_count = 0; // 按鍵按下次數
  9. //bit timer_running = 0; // 定時器運行狀態
  10. uint timer_count = 0; // 定時計數
  11. //uchar timer_mode = 0; // 定時模式,0表示未設置,1表示1分鐘,2表示3分鐘

  12. // 定時器初始化函數
  13. void Timer0Init()//50ms @11.0592
  14. {
  15.     TMOD = 0x01;
  16.     TH0 = 0x4C;
  17.     TL0 = 0x00;
  18.     EA = 1;
  19.     ET0 = 1;
  20.     TR0 = 1;
  21. }
  22. // 延時函數
  23. void delay(uint z)
  24. {
  25.     uint x, y;
  26.     for(x=z; x>0; x--)
  27.         for(y=110; y>0; y--);
  28. }

  29. // 按鍵掃描函數
  30. void key_scan()
  31. {
  32.         if(key == 0) // 檢測按鍵是否按下
  33.         {
  34.                 delay(10); // 消抖
  35.                 if(key == 0)
  36.                 {
  37.                         key_press_count++; // 增加按鍵次數
  38.                         if(key_press_count>2)
  39.                                 key_press_count=0;
  40.                         if(key_press_count>0 && key_press_count<3)
  41.                                 led = 1;
  42.                         else led = 0;
  43.                         while(!key); // 等待按鍵釋放
  44.                 }
  45.         }
  46. }
  47. void main()
  48. {
  49.     Timer0Init(); // 初始化定時器
  50.     led = 0; // 初始化LED狀態為關閉
  51.     while(1)
  52.     {
  53.         key_scan(); // 按鍵掃描
  54.     }
  55. }
  56. // 定時器0中斷服務函數
  57. void Timer0Interrupt(void) interrupt 1
  58. {
  59.     TH0 = 0x4C;
  60.     TL0 = 0x00;
  61.     if(key_press_count!=0) // 如果定時器正在運行
  62.     {
  63.         timer_count++; // 增加計數
  64.         if(key_press_count == 1 && timer_count >= 120000) // 1分鐘定時
  65.         {
  66.             timer_count = 0; // 清零計數
  67.                                 key_press_count=0;
  68.             led = 0; // 關閉LED
  69.         }
  70.         else if(key_press_count == 2 && timer_count >= 360000) // 3分鐘定時
  71.         {
  72.                                 timer_count = 0; // 清零計數
  73.                                 key_press_count=0;
  74.                                 led = 0; // 關閉LED
  75.         }
  76.     }
  77.     else
  78.         {
  79.         timer_count = 0; // 清零計數
  80.         led = 0; // 關閉LED
  81.         }
  82. }
復制代碼

評分

參與人數 1黑幣 +11 收起 理由
WFX777888 + 11 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

5#
ID:1034262 發表于 2025-6-13 21:17 | 只看該作者
先讓定時器中斷取反一個IO,示波器觀察,看中斷正常了沒有?
回復

使用道具 舉報

6#
ID:63317 發表于 2025-6-14 06:27 | 只看該作者

還是不好用啊感覺定時器沒工作呢
回復

使用道具 舉報

7#
ID:63317 發表于 2025-6-14 06:28 | 只看該作者
coody_sz 發表于 2025-6-13 21:17
先讓定時器中斷取反一個IO,示波器觀察,看中斷正常了沒有?

沒有示波器師傅
回復

使用道具 舉報

8#
ID:1133081 發表于 2025-6-14 17:41 | 只看該作者
WFX777888 發表于 2025-6-14 06:27
還是不好用啊感覺定時器沒工作呢

你原來程序里定時器沒有打開進不了中斷并且還有其他邏輯問題,所以不能正常工作。修改后的程序是經過仿真確認的。如果還不行要查電路是否正確。
回復

使用道具 舉報

9#
ID:63317 發表于 2025-6-15 05:29 | 只看該作者
WL0123 發表于 2025-6-14 17:41
你原來程序里定時器沒有打開進不了中斷并且還有其他邏輯問題,所以不能正常工作。修改后的程序是經過仿真 ...

電路就帶個指示燈 按鍵被按下指示燈亮了 就是沒有延時關閉
回復

使用道具 舉報

10#
ID:1007932 發表于 2025-6-16 02:16 | 只看該作者
  1. //按鍵按一次一分鐘定時再按一次是3分鐘定時控制P3^3口
  2. //單片機是STC15F104W
  3. #include<reg51.h>
  4. #include<intrins.h>
  5. #define uchar unsigned char
  6. #define uint unsigned int

  7. sbit key = P3^2; // 按鍵連接在P3.2引腳
  8. sbit led = P3^3; // LED連接在P3.3引腳
  9. uchar key_press_count = 0; // 按鍵按下次數
  10. //bit timer_running = 0; // 定時器運行狀態
  11. uint timer_count = 0; // 定時計數
  12. //uchar timer_mode = 0; // 定時模式,0表示未設置,1表示1分鐘,2表示3分鐘
  13. // 定時器初始化函數
  14. void Timer0Init()//50ms
  15. {
  16.     TMOD = 0xF0;
  17.     TH0 = (65536 - 50000) / 256;
  18.     TL0 = (65536 - 50000) % 256;
  19.     EA         = 1;
  20.     ET0 = 1;
  21.                 TF0        =        0;
  22.     TR0 = 0;
  23. }
  24. // 延時函數50MS
  25. void delay()
  26. {
  27.         unsigned char data i, j, k;
  28.         i = 3;
  29.         j = 72;
  30.         k = 161;
  31.         do
  32.         {
  33.                 do
  34.                 {
  35.                         while (--k);
  36.                 } while (--j);
  37.         } while (--i);
  38. }
  39. // 按鍵掃描函數
  40. void key_scan()
  41. {
  42.         if(key == 0) // 檢測按鍵是否按下
  43.         {
  44.                 delay(); // 消抖
  45.                 if(key == 0)
  46.                                                                 while(!key); // 等待按鍵釋放
  47.                 {
  48.                         key_press_count++; // 增加按鍵次數
  49.                         if(key_press_count==1){
  50.                                                                                                                                 timer_count=1200;
  51.                                 led = 1;
  52.                                                                                                                                 TR0 = 1;
  53.                                                                                                         }
  54.                                                                                                 else if(key_press_count==2){
  55.                                                                                                                                 timer_count=3600;
  56.                                 led = 1;
  57.                                                                                                                                 TR0 = 1;
  58.                                                                                                         }
  59.                                                                                                 else        {
  60.                                                                                                                                 key_press_count=0;
  61.                                                                                                                                 timer_count = 0;
  62.                                                                                                                                 led = 0;
  63.                                                                                                                                 TR0 = 0;
  64.                                                                                                         }
  65.                 }
  66.         }
  67. }
  68. void main()
  69. {
  70.     Timer0Init(); // 初始化定時器
  71.     led = 0; // 初始化LED狀態為關閉
  72.     while(1)
  73.     {
  74.         key_scan(); // 按鍵掃描
  75.     }
  76. }
  77. // 定時器0中斷服務函數
  78. void Timer0Interrupt(void) interrupt 1
  79. {
  80.                 timer_count--;
  81.                 if(timer_count==0)
  82.                         {
  83.                                         TR0=0;
  84.                                         led=0;
  85.                         }
  86. }
復制代碼

代碼BUG有點多,定時器是50ms中斷一次,1min=60S=1200x50ms,不是120000。∵有你中斷一直沒關,就這樣吧,我這個是調試時用的,按第二次一直有個短脈沖,可能是杜邦線當按鍵的原因,你可以把延時消抖可以改小點。然后感覺思路有點問題,中斷函數應該盡可能短,建議把定時器設置為16位自動重裝模式,使用標志位或者像我那樣控制,然后用switch把值給timer_count,定時器的開關一定要準,不然會軟件定時一樣誤差比較大,然后記得給定時器中斷關掉,最后建議重構。

評分

參與人數 1黑幣 +11 收起 理由
WFX777888 + 11 OK謝謝

查看全部評分

回復

使用道具 舉報

11#
ID:1133081 發表于 2025-6-16 06:57 | 只看該作者
WFX777888 發表于 2025-6-15 05:29
電路就帶個指示燈 按鍵被按下指示燈亮了 就是沒有延時關閉

問題是你的定時時間變量timer_count不能超過65535,否則停不了。我測試時只用120和360來驗證的。你改為12000和36000試試。
回復

使用道具 舉報

12#
ID:63317 發表于 2025-6-16 07:00 | 只看該作者
WFX777888 發表于 2025-6-15 05:29
電路就帶個指示燈 按鍵被按下指示燈亮了 就是沒有延時關閉

運行了謝謝時間應該是1200
回復

使用道具 舉報

13#
ID:63317 發表于 2025-6-16 07:01 | 只看該作者
一事無成 發表于 2025-6-16 02:16
代碼BUG有點多,定時器是50ms中斷一次,1min=60S=1200x50ms,不是120000。∵有你中斷一直沒關,就這樣 ...

運行了謝謝師傅
回復

使用道具 舉報

14#
ID:63317 發表于 2025-6-16 21:02 | 只看該作者
WL0123 發表于 2025-6-16 06:57
問題是你的定時時間變量timer_count不能超過65535,否則停不了。我測試時只用120和360來驗證的。你改為12 ...

弄好了謝謝
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

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