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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2362|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 超碰在线久 | 日韩av免费在线观看 | 亚洲欧洲色视频 | 国产69精品久久99不卡免费版 | 欧美一级小视频 | 免费小视频在线观看 | 精品在线看 | 一区二区三区四区视频 | 亚洲手机视频在线 | 日韩色图在线观看 | 欧美日韩在线观看一区二区三区 | 亚洲欧洲日本国产 | 亚洲成人av一区二区 | 亚洲一区成人 | 国产精品久久久久国产a级 欧美日韩国产免费 | 国产精品1区 | 亚洲激精日韩激精欧美精品 | 欧美黄视频 | av片免费| 99av成人精品国语自产拍 | 欧美激情一区二区三区 | 少妇一级淫片免费放播放 | 成人无遮挡毛片免费看 | 天天射影院 | 在线免费观看视频你懂的 | 久久精品国产一区二区三区 | 中文字幕乱码一区二区三区 | 四虎影院一区二区 | 国产日韩欧美精品一区二区三区 | 影音先锋成人资源 | 亚洲在线一区 | 国产高清在线精品 | av黄色在线观看 | 黄色一级片aaa| 中文字幕av亚洲精品一部二部 | 欧美日韩国产一区二区 | 四虎影院在线免费观看 | 蜜桃在线播放 | 久久免费香蕉视频 | 91精品国产91久久久久游泳池 | 久久乐国产精品 |