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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4703|回復: 9
收起左側

我想通過單片機定時器中斷來實現led的流水燈,可是程序出了點問題

[復制鏈接]
ID:474631 發(fā)表于 2019-2-3 23:06 | 顯示全部樓層 |閱讀模式
目的是使led從左到右然后再從右到左 可是我的代碼只能實現一次從左到右然后就沒有l(wèi)ed亮(燈8個)
我的思路是通過余數判斷是否移位到邊界然后轉向 我在草稿紙上也算過了發(fā)現沒什么問題啊 可是就是實現不了 求大神幫忙修改一下

單片機源程序:
#include "reg51.h"
typedef unsigned char u8;
typedef unsigned int u16;
#define led P0
u16 j=0;
void time()
{
        TMOD=0x01;
        TH0=0xfc;TL0=0x12;ET0=1;
        TR0=1;EA=1;
}
void main()
{
        u8 dat=0x01,k=0,i=0;
        time();
        while(1)
        { led=dat;
                if(j==500)
                {
                        j=0;
                        if(i/2==1)
                        {
                                dat=dat>>1;
                        }
                        if(i/2==0)
                        {
                                dat=dat<<1;
                        }
                        k++;
                        if(k%7==0&&k!=0)
                        i++;
          }
        }
}
void time0() interrupt 1
{
        TH0=0xfc;TL0=0x12;
        j++;
}

回復

使用道具 舉報

ID:474631 發(fā)表于 2019-2-3 23:17 | 顯示全部樓層
找到問題根源了。。。我把取余號寫成除號了。。還有應該是k=7的時候才轉向。。。
回復

使用道具 舉報

ID:474631 發(fā)表于 2019-2-3 23:22 | 顯示全部樓層
額 不過我還有一個問題 我這個i和k都是有上限的 如何讓他無限的流水?我這個程序當i k其中一個大于65535的時候應該就gg了
回復

使用道具 舉報

ID:472242 發(fā)表于 2019-2-4 04:37 | 顯示全部樓層
日本人孫笑川 發(fā)表于 2019-2-3 23:22
額 不過我還有一個問題 我這個i和k都是有上限的 如何讓他無限的流水?我這個程序當i k其中一個大于65535的 ...

定時器的值是TH0=0xfc;T L0=0x12;同你i,k沒關系,而卻上限是255(typedef unsigned char u8),就算你最終到255,也會現重新從0開始運行

評分

參與人數 2黑幣 +27 收起 理由
#include51.h + 15
站著說話不腰疼 + 12

查看全部評分

回復

使用道具 舉報

ID:474677 發(fā)表于 2019-2-4 10:04 | 顯示全部樓層
shuisheng60 發(fā)表于 2019-2-4 04:37
定時器的值是TH0=0xfc;T L0=0x12;同你i,k沒關系,而卻上限是255(typedef unsigned char u8),就算你最終到2 ...

樓主的定時中斷是用于控制流水燈的跑動間隔時間,跟循環(huán)次數沒有關系,樓主的意思應該是實現無限循環(huán)
回復

使用道具 舉報

ID:474677 發(fā)表于 2019-2-4 10:08 | 顯示全部樓層
日本人孫笑川 發(fā)表于 2019-2-3 23:22
額 不過我還有一個問題 我這個i和k都是有上限的 如何讓他無限的流水?我這個程序當i k其中一個大于65535的 ...

要實現無限循環(huán)就只不需要編寫這么復雜,while(1)主循環(huán)體就是一個無限循環(huán),你只需要包括一個從左到右再從右到左的單循環(huán)體就能實現了。
回復

使用道具 舉報

ID:474677 發(fā)表于 2019-2-4 10:16 | 顯示全部樓層
本帖最后由 iofree 于 2019-2-4 11:37 編輯

回帖審核時間太長了,主體循環(huán)這樣寫應該就可以了,還要增加一個延時函數:void delay()
這個延時函數不細寫了,自己定制吧
while(1)
{
  for(i=0;i<8;i++){
    led=dat;
    dat<<=1;    delay();
  }
  for(i=0;i<8;i++){
    led=dat;
    dat>>=1;
    delay();
  }
}
希望能實現你的要求,祝你成功

回復

使用道具 舉報

ID:474631 發(fā)表于 2019-2-5 22:58 | 顯示全部樓層
iofree 發(fā)表于 2019-2-4 10:16
回帖審核時間太長了,主體循環(huán)這樣寫應該就可以了,還要增加一個延時函數:void delay()
這個延時函數不細 ...

牛b 謝謝老哥
回復

使用道具 舉報

ID:401113 發(fā)表于 2019-2-9 00:34 | 顯示全部樓層
iofree 發(fā)表于 2019-2-4 10:16
回帖審核時間太長了,主體循環(huán)這樣寫應該就可以了,還要增加一個延時函數:void delay()
這個延時函數不細 ...

我覺得的這樣寫不行,<<會把前面的數據擠掉,后面的補0(>>同理),循環(huán)8次dat的值就成了0x00,這樣燈就不亮了。
回復

使用道具 舉報

ID:401113 發(fā)表于 2019-2-9 00:48 | 顯示全部樓層
iofree 發(fā)表于 2019-2-4 10:16
回帖審核時間太長了,主體循環(huán)這樣寫應該就可以了,還要增加一個延時函數:void delay()
這個延時函數不細 ...

這個可以,我試過很多遍了
        while(1)
        {
                    led=dat;
                  while(j!=500);
                  j=0;       
                  for(i=0;i<7;i++)
                  {
                       
                    dat<<=1;
                    led=dat;
                        while(j!=500);
                        j=0;
                  }
                  for(i=0;i<7;i++)
                  {
                    
                    dat>>=1;
                        led=dat;
                        while(j!=500);
                        j=0;
              }
        }
回復

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網

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