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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3008|回復(fù): 9
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)遙控控制流水燈的開和關(guān),程序出現(xiàn)了死循環(huán)沒有跳出

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:237797 發(fā)表于 2019-10-17 16:27 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
自己51單片機(jī)寫的用遙控器來控制流水燈開和關(guān),現(xiàn)在遙控可以打開流水燈工作,不能關(guān)閉。出現(xiàn)問題的原因是在流水燈程序里出現(xiàn)了死循環(huán)沒有跳出來,有啥解決思路?

單片機(jī)源程序如下:
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. sbit ADDR0 = P1^0;
  4. sbit ADDR1 = P1^1;
  5. sbit ADDR2 = P1^2;
  6. sbit ADDR3 = P1^3;
  7. sbit ENLED = P1^4;
  8. sbit LED1 = P0^0;



  9. typedef unsigned char uint8;
  10. typedef unsigned int uint16;

  11. uint8 dir = 0;                //移位方向
  12. uint8 shift = 0x01;                //循環(huán)變量
  13. uint16 i = 0;

  14. extern bit irflag;
  15. extern unsigned char ircode[4];
  16. extern void InitInfrared();
  17. void LshiftRshift();


  18. void main()
  19. {
  20.         EA = 1;
  21.         ADDR0 = 0;
  22.         ADDR1 = 1;
  23.         ADDR2 = 1;
  24.         ADDR3 = 1;
  25.         ENLED = 0;

  26.         InitInfrared();

  27.         while (1)
  28.         {
  29.                 if (irflag)
  30.                 {
  31.                         irflag = 0;
  32.                         if (ircode[2] == 0x45)          //0X45  遙控器鍵值
  33.                         {
  34.                                 LshiftRshift();
  35.                         }
  36.                         else if (ircode[2] == 0x46)          
  37.                         {
  38.                                 ENLED = 1;
  39.                         }
  40.                        
  41.                 }
  42.         }
  43. }


  44. void LshiftRshift()
  45. {       
  46.         ENLED = 0;
  47.         ADDR3 = 1;

  48.         ADDR0 = 0;
  49.         ADDR1 = 1;                    
  50.         ADDR2 = 1;


  51.         while(1)
  52.         {       
  53.                 P0 = ~shift;
  54.                 for (i=0;i<20000;i++);
  55.                 if (!dir)           //!dir和dir==0 邏輯相同   dir和dir==1 邏輯相同
  56.                 {
  57.                         shift = shift<<1;
  58.                         if (shift == 0x80)
  59.                         {
  60.                                 dir = 1;
  61.                         }
  62.                 }
  63.                 else
  64.                 {
  65.                         shift = shift>>1;
  66.                         if (shift == 0x01)
  67.                         {
  68.                                 dir = 0;
  69.                         }
  70.                 }
  71.         }
  72. }
復(fù)制代碼


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

使用道具 舉報(bào)

沙發(fā)
ID:601639 發(fā)表于 2019-10-17 17:21 | 只看該作者
設(shè)個(gè)標(biāo)志位,工作完成后標(biāo)志位置0,需要執(zhí)行時(shí)標(biāo)志位置1
回復(fù)

使用道具 舉報(bào)

板凳
ID:235200 發(fā)表于 2019-10-17 18:30 | 只看該作者
把流水燈LshiftRshift程序中的while(1)改為while(退出條件)就能退出了
回復(fù)

使用道具 舉報(bào)

地板
ID:237797 發(fā)表于 2019-10-18 08:16 | 只看該作者
csmyldl 發(fā)表于 2019-10-17 18:30
把流水燈LshiftRshift程序中的while(1)改為while(退出條件)就能退出了

謝謝你的回答,你的方法有效!
回復(fù)

使用道具 舉報(bào)

5#
ID:237797 發(fā)表于 2019-10-18 08:17 | 只看該作者
那個(gè)誰和誰 發(fā)表于 2019-10-17 17:21
設(shè)個(gè)標(biāo)志位,工作完成后標(biāo)志位置0,需要執(zhí)行時(shí)標(biāo)志位置1

你說的方法,我試過,不知道是加錯(cuò)了,不能實(shí)現(xiàn)想要的功能
回復(fù)

使用道具 舉報(bào)

6#
ID:237797 發(fā)表于 2019-10-18 17:46 | 只看該作者
本帖最后由 lclbf 于 2019-10-19 10:43 編輯

遙控部分程序如下:#include<reg51.h>

sbit IR_INPUT = P3^3;

bit irflag = 0;
unsigned char ircode[4];

void InitInfrared()
{
        IR_INPUT = 1;
        TMOD &= 0X0F;
        TMOD |= 0X10;
        TR1 = 0;
        ET1 = 0;
        IT1 = 1;
        EX1 = 1;
}

unsigned int GetHighTime()
{
        TH1 = 0;
        TL1 = 0;
        TR1 = 1;
        while (IR_INPUT)
        {
                if (TH1 >= 0X40)
                {
                        break;
                }
        }
        TR1 = 0;
        return (TH1*256 + TL1);
}

unsigned int GetLowTime()
{
        TH1 = 0;
        TL1 = 0;
        TR1 = 1;
        while (!IR_INPUT)
        {
                if (TH1 >= 0X40)
                {
                        break;
                }
        }
        TR1 = 0;
        return (TH1*256 + TL1);
}

void EXINT1_ISR() interrupt 2
{
        unsigned char i,j;
        unsigned char byt;
        unsigned int time;

        time = GetLowTime();
        if ((time<7833)||(time>8755))
        {
                IE1 = 0;
                return;
        }
        time = GetHighTime();
        if ((time<3686)||(time>4608))
        {
                IE1 = 0;
                return;
        }
        for (i=0;i<4;i++)
        {
                for (j=0;j<8;j++)
                {
                        time = GetLowTime();
                        if ((time<313)||(time>718))
                        {
                                IE1 = 0;
                                return;
                        }
                        time = GetHighTime();
                        if ((time>313)&&(time<718))
                        {
                                byt >>= 1;
                        }
                        else if ((time>1345)&&(time<1751))
                        {
                                byt >>= 1;
                                byt |= 0x80;
                        }
                        else
                        {
                                IE1 = 0;
                                return;
                        }
                }
                ircode = byt;
        }
        irflag = 1;
        IE1 = 0;
}

回復(fù)

使用道具 舉報(bào)

7#
ID:237797 發(fā)表于 2019-10-18 17:48 | 只看該作者
lclbf 發(fā)表于 2019-10-18 08:16
謝謝你的回答,你的方法有效!

這是按照你說的方法,修改的程序:


#include<reg51.h>

sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;

typedef unsigned char uint8;
typedef unsigned int uint16;


uint16 i = 0;
uint8 dir = 0;                //移位方向
uint8 shift = 0x01;                //循環(huán)變量
uint8 LRshiftflag = 0;

extern bit irflag;
extern unsigned char ircode[4];
extern void InitInfrared();
void LshiftRshift();

void main()
{
        EA = 1;

        InitInfrared();

        while (1)
        {
                if (irflag)
                {
                        irflag = 0;
                        if (ircode[2] == 0x45)          //0X45  遙控器鍵值
                        {       
                                LshiftRshift();
                        }
                        else if (ircode[2] == 0x46)          
                        {       
                                ENLED = 1;
                        }
                       
                }
        }
}


void LshiftRshift()
{       
        ENLED = 0;
        ADDR3 = 1;

        ADDR0 = 0;
        ADDR1 = 1;                    
        ADDR2 = 1;


        while(ircode[2] == 0x45) //while(ircode[2] == 0x45)  while(ircode[2] != 0x46)        不能用while(1),會(huì)死在里面,跳不出來,不能關(guān)
        {       
               
                        P0 = ~shift;
                        for (i=0;i<20000;i++);
                        if (!dir)           //!dir和dir==0 邏輯相同   dir和dir==1 邏輯相同
                        {
                                shift = shift<<1;
                                if (shift == 0x80)
                                {
                                        dir = 1;
                                }
                        }
                        else
                        {
                                shift = shift>>1;
                                if (shift == 0x01)
                                {
                                        dir = 0;
                                }
                        }
        }
}

回復(fù)

使用道具 舉報(bào)

8#
ID:237797 發(fā)表于 2019-10-20 11:14 | 只看該作者
那個(gè)誰和誰 發(fā)表于 2019-10-17 17:21
設(shè)個(gè)標(biāo)志位,工作完成后標(biāo)志位置0,需要執(zhí)行時(shí)標(biāo)志位置1

用你說的標(biāo)志位的方法實(shí)現(xiàn)的控制,程序如下:
#include<reg51.h>

sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;

bit sysOn = 0;


typedef unsigned char uint8;
typedef unsigned int uint16;


uint16 i = 0;
uint8 dir = 0;                //移位方向
uint8 shift = 0x01;                //循環(huán)變量
uint8 LRshiftflag = 0;

extern bit irflag;
extern unsigned char ircode[4];
extern void InitInfrared();
void LshiftRshift();

void main()
{
        EA = 1;

        InitInfrared();

                while (1)
                {
                        if (irflag)
                        {
                                irflag = 0;
                       
                                if (ircode[2] == 0x45)          //0X45  遙控器鍵值
                                {       
                                        sysOn = 1;
                                }
                                else if (ircode[2] == 0x46)          
                                {       
                                        sysOn = 0;
                                }                               
                        }
                        LshiftRshift();
        }

}


void LshiftRshift()
{       
//        ENLED = 0;                  //注消這部分不能放這個(gè)位置,會(huì)出現(xiàn)不能關(guān)燈
//        ADDR3 = 1;
//
//        ADDR0 = 0;
//        ADDR1 = 1;                    
//        ADDR2 = 1;

                if (sysOn)
                {       
                        ENLED = 0;
                        ADDR3 = 1;
               
                        ADDR0 = 0;
                        ADDR1 = 1;                    
                        ADDR2 = 1;

                        P0 = ~shift;
                        for (i=0;i<20000;i++);
                        if (!dir)           //!dir和dir==0 邏輯相同   dir和dir==1 邏輯相同
                        {
                                shift = shift<<1;
                                if (shift == 0x80)
                                {
                                        dir = 1;
                                }
                        }
                        else  
                        {
                                shift = shift>>1;
                                if (shift == 0x01)
                                {
                                        dir = 0;
                                }
                        }
                }
                else
                {
                ENLED = 1;        //關(guān)燈程序
                }

}

回復(fù)

使用道具 舉報(bào)

9#
ID:237797 發(fā)表于 2019-10-20 11:18 | 只看該作者
現(xiàn)在還有個(gè)問題,就是關(guān)的時(shí)候燈在哪里滅,下次開燈接著哪里亮,有沒有辦法每次開燈在同一個(gè)地方亮?想到在關(guān)燈的時(shí)候賦初值,還是不行,會(huì)出現(xiàn)下次開燈就是初值的燈亮,不流動(dòng)了。
回復(fù)

使用道具 舉報(bào)

10#
ID:542032 發(fā)表于 2019-10-20 13:18 | 只看該作者
你這需要把數(shù)據(jù)存到51的eeprom里,用的時(shí)候調(diào)用
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久久久久久久久久久国产 | 成人午夜精品 | 久久亚洲一区二区 | 欧美激情综合五月色丁香小说 | 一区二区三区影院 | 免费观看成人鲁鲁鲁鲁鲁视频 | 国产亚洲精品精品国产亚洲综合 | 精品亚洲一区二区三区四区五区高 | 狠狠操狠狠搞 | 国产不卡一区 | 久久高清免费视频 | 天天操 夜夜操 | 成人深夜小视频 | 91在线播 | 精品一区二区三区中文字幕 | 欧美久久久久久久 | 国产精品1区2区 | 亚洲性网 | 色婷婷综合久久久中字幕精品久久 | 欧美三级成人理伦 | 综合精品在线 | 午夜播放器在线观看 | 毛片一级片 | 中文字幕在线观看av | 国产精品久久久久久福利一牛影视 | 国产一级视频免费播放 | 最新毛片网站 | 日韩在线中文字幕 | 一本色道精品久久一区二区三区 | 一级网站| 日韩亚洲一区二区 | 亚洲va国产日韩欧美精品色婷婷 | 亚洲 欧美 日韩 精品 | 国产成人叼嘿视频在线观看 | 久久久久久久久国产 | 99久久精品国产一区二区三区 | 一级毛片视频在线观看 | 亚洲国产一区二区视频 | 99精品国自产在线观看 | 久久大| 日韩成人一区 |