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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

求助各位大佬,這是用單片機定時器控制跑馬燈程序,不知道問題出在哪?

[復制鏈接]
跳轉到指定樓層
樓主
ID:695565 發表于 2020-3-1 00:52 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
單片機源程序如下:
#include<reg52.h>


typedef unsigned char u8;
typedef unsigned int u16;


void main(void)
{
        u8 led;
        u8 cnt;
        u8 num;

        TMOD=1;
        TH0=0XB8;    //20ms
        TL0=0X00;
        TR0=1;        //定時器開啟

        led=0xfe;
        num=8;
        while(num>0)
        {
                if(1==TF0)
                {
                        TF0=0;
                        TH0=0XB8;
                        TL0=0X00;
                        cnt++;
                        if(cnt>=50)
                        {
                                cnt=0;
                                P2=led;
                                led=led<<1;                //左移
                                led=led|0x01;
                                num--;
                                if(num==1)               
                                {
                                         num--;                 //8個led移動完畢,跳出while循環
                                }
                        }
                }
        }
        
        num=8;
        while(num>0)                                 //燒錄到開發板,現象也只運行的上面一段while循環
        {
                if(1==TF0)                                //調試到這里就進不去if判斷了,為什么?
                {
                        TF0=0;
                        TH0=0XB8;
                        TL0=0X00;
                        cnt++;
                        if(cnt>=50)                //1s移動一次
                        {
                                cnt=0;
                                P2=led;
                                led=led>>1;                //右移
                                led=led|0xfe;
                                num--;
                                if(num==1)
                                {
                                         num--;
                                }
                        }
                }
        }               
}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

來自 3#
ID:213173 發表于 2020-3-1 07:06 | 只看該作者
樓主的核心錯誤在這一條 led=led|0xfe; 如果改成 led=led|0x80; 右移后最高位補1就可以正常顯示。但總體來說程序結構明顯不合理。初始化完成以后所有程序都要約束在主循環while(1)中運行。改這樣試試:
  1. #include<reg52.h>

  2. typedef unsigned char u8;
  3. typedef unsigned int u16;
  4. #define led P2 //宏定義led=P2

  5. void main(void)
  6. {
  7.         u8 cnt,num;

  8.         TMOD=1;
  9.         TH0=0XB8;    //20ms
  10.         TL0=0X00;
  11.         TF0=0;
  12.         TR0=1;       //定時器開啟
  13.         led=0xfe;

  14.         while(1)
  15.         {
  16.                 if(TF0)
  17.                 {
  18.                         TF0=0;
  19.                         TH0=0XB8;
  20.                         TL0=0X00;
  21.                         cnt++;
  22.                         if(cnt>=50)
  23.                         {
  24.                                 cnt=0;
  25.                                 if(led==0xfe)
  26.                                 {
  27.                                         num=1;
  28.                                 }
  29.                                 if(led==0x7f)
  30.                                 {
  31.                                         num=0;
  32.                                 }
  33.                                 if(num==1)
  34.                                 {
  35.                                         led=led<<1|0x01;
  36.                                 }
  37.                                 if(num==0)
  38.                                 {
  39.                                         led=led>>1|0x80;
  40.                                 }
  41.                         }
  42.                 }
  43.         }
  44. }
復制代碼
回復

使用道具 舉報

沙發
ID:695565 發表于 2020-3-1 00:53 | 只看該作者
為啥表情包變這樣了……,跪求大佬幫幫忙
回復

使用道具 舉報

地板
ID:342451 發表于 2020-3-1 09:50 | 只看該作者
為啥你不直接用定時器中斷服務函數么?你這種用查詢的方式不斷查詢TF0著實沒有必要,在中斷服務函數里想寫什么就寫什么了。你整個程序沒有while(1),走一遍main就停了
回復

使用道具 舉報

5#
ID:695565 發表于 2020-3-1 10:47 | 只看該作者
wulin 發表于 2020-3-1 07:06
樓主的核心錯誤在這一條 led=led|0xfe; 如果改成 led=led|0x80; 右移后最高位補1就可以正常顯示。但總體來 ...

非常感謝,我明白了
回復

使用道具 舉報

6#
ID:695565 發表于 2020-3-1 10:49 | 只看該作者
之一知足 發表于 2020-3-1 09:50
為啥你不直接用定時器中斷服務函數么?你這種用查詢的方式不斷查詢TF0著實沒有必要,在中斷服務函數里想寫 ...

我想先用定時器寫一遍,再加中斷,這兩我剛學,都不太熟練,非常感謝你的回答
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

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