找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機編譯流水燈藍牙控制,為什么不可以循環(huán),停在LED8就不動,求解

[復制鏈接]
跳轉到指定樓層
樓主
ID:858009 發(fā)表于 2021-5-7 16:38 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
#include <reg52.h>  //頭文件
#define uint unsigned int   //宏定義
#define uchar unsigned char
code tabup[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
code tabdowm[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
void delay(uint z);
int i;
sbit beep=P2^3;
void blue_Init()   //藍牙串口初始化
{
    TMOD = 0x20;
    TH1  = 0xfd;     //9600
    TL1  = 0xfd;
    SM0  = 0;
    SM1  = 1;               
    REN  = 1;
    TR1  = 1;
}
/**主函數(shù)**/
void main()
{
    int a;
    blue_Init();
    P1=0xff;
    while(1)
    {
        if(RI==1)                 
        {  
            a=SBUF;
            RI=0;
            if(a=='1')         //熄滅LED
            {
                P1=0xff;
                                                          beep=0;
                                  delay(100);
                                  beep=1;
            }   
            else if(a=='2')    //點亮LED
            {
                P1=0x00;
                                                          beep=0;
                                  delay(100);
                                  beep=1;
            }
            else if(a=='3')    //順時針流水燈
            {
                                                        for(i=0;i<8;i++)
                                                        {
                                                                P1=tabup[i];
                                                                delay(2000);
                                                        }
                                                }
                                                else if(a=='4')    //逆時針流水燈
                                                {
                                                        for(i=0;i<8;i++)
                                                        {
                                                                P1=tabdowm[i];
                                                                delay(2000);
                                                        }
                                                }
                       
        }  
    }
}
void delay(uint z)  //延時函數(shù)
{
  uchar x,y;  
  for(x=z;x>0;x--)
  for(y=210;y>0;y--);
}

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

使用道具 舉報

沙發(fā)
ID:275826 發(fā)表于 2021-5-7 20:20 | 只看該作者
你這個程序不循環(huán)就對了;要串口發(fā)一次,循環(huán)一次
回復

使用道具 舉報

板凳
ID:858009 發(fā)表于 2021-5-8 09:00 | 只看該作者
如果要實現(xiàn)循環(huán)怎么修改才可以
回復

使用道具 舉報

地板
ID:858009 發(fā)表于 2021-5-8 09:01 | 只看該作者
tyrl800 發(fā)表于 2021-5-7 20:20
你這個程序不循環(huán)就對了;要串口發(fā)一次,循環(huán)一次

如果要實現(xiàn)循環(huán)該怎么修改?求教學或者寫一個完整的代碼參考一下,十分感謝
回復

使用道具 舉報

5#
ID:824490 發(fā)表于 2021-5-8 09:14 | 只看該作者
代碼結構有問題:不建議你在大循環(huán)中處理串口接收中斷呢,更不要把中斷標志做為運行流水的條件。
回復

使用道具 舉報

6#
ID:858009 發(fā)表于 2021-5-8 09:27 | 只看該作者
名字不是重點 發(fā)表于 2021-5-8 09:14
代碼結構有問題:不建議你在大循環(huán)中處理串口接收中斷呢,更不要把中斷標志做為運行流水的條件。

它可以運行工作,就是不能進行循環(huán),我想問一下,怎么用代碼藍牙控制流水燈循環(huán),求解
回復

使用道具 舉報

7#
ID:213173 發(fā)表于 2021-5-8 09:40 | 只看該作者
持續(xù)流水要放在 if(RI==1) 之外,否則只能流水一次。
  1. #include <reg52.h>  //頭文件
  2. #define uint unsigned int   //宏定義
  3. #define uchar unsigned char
  4. sbit beep=P2^3;
  5. code tabup[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
  6. code tabdowm[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
  7. void delay(uint z);
  8. uchar i;

  9. void blue_Init()   //藍牙串口初始化
  10. {
  11.         TMOD = 0x20;
  12.         TH1  = 0xfd;     //9600
  13.         TL1  = 0xfd;
  14.         SM0  = 0;
  15.         SM1  = 1;               
  16.         REN  = 1;
  17.         TR1  = 1;
  18. }
  19. /**主函數(shù)**/
  20. void main()
  21. {
  22.         uchar a;
  23.         blue_Init();
  24.         P1=0xff;
  25.         while(1)
  26.         {
  27.                 if(RI==1)                 
  28.                 {  
  29.                         a=SBUF;
  30.                         RI=0;
  31.                 }
  32.                 if(a=='1')         //熄滅LED
  33.                 {
  34.                         P1=0xff;
  35.                         beep=0;
  36.                         delay(100);
  37.                         beep=1;
  38.                         a='0';
  39.                 }   
  40.                 else if(a=='2')    //點亮LED
  41.                 {
  42.                         P1=0x00;
  43.                         beep=0;
  44.                         delay(100);
  45.                         beep=1;
  46.                         a='0';
  47.                 }
  48.                 else if(a=='3')    //順時針流水燈
  49.                 {
  50.                         for(i=0;i<8;i++)
  51.                         {
  52.                                 P1=tabup[i];
  53.                                 delay(2000);
  54.                         }
  55.                 }
  56.                 else if(a=='4')    //逆時針流水燈
  57.                 {
  58.                         for(i=0;i<8;i++)
  59.                         {
  60.                                 P1=tabdowm[i];
  61.                                 delay(2000);
  62.                         }
  63.                 }
  64.         }
  65. }
  66. void delay(uint z)  //延時函數(shù)
  67. {
  68.         uint x,y;  
  69.         for(x=z;x>0;x--)
  70.                 for(y=120;y>0;y--);
  71. }
復制代碼
回復

使用道具 舉報

8#
ID:429356 發(fā)表于 2021-5-8 09:47 | 只看該作者
你最后加哥re返回。或者把主函數(shù)放進while里面
回復

使用道具 舉報

9#
ID:858009 發(fā)表于 2021-5-8 11:36 | 只看該作者
wulin 發(fā)表于 2021-5-8 09:40
持續(xù)流水要放在 if(RI==1) 之外,否則只能流水一次。

為什么這個也不可以實現(xiàn)你,同樣的問題
#include<reg51.h>    //包含51單片機寄存器定義的頭文件
unsigned char keyval;  //儲存按鍵值
#define uchar unsigned char
#define uint unsigned int
code tabup[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
code tabdown[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
uint x,y;
/*************************************************
函數(shù)功能:流水燈延時
**************************************************/
void led_delay(void)
{
   unsigned char i,j;
        for(i=0;i<250;i++)
          for(j=0;j<250;j++);           
}
/*************************************************
函數(shù)功能:軟件消抖延時
**************************************************/
void delay20ms(void)
{
   unsigned char i,j;
       for(i=0;i<100;i++)
          for(j=0;j<60;j++);           
}
/*************************************************
函數(shù)功能:正向流水點亮LED
**************************************************/
void forward(void)
{                             
        for(x=0;x<8;x++)       
        {
                P1=tabup[x];
                led_delay();
        }               
}
/*************************************************
函數(shù)功能:反向流水點亮LED
**************************************************/
void backward(void)
{                        
        for(y=0;y<8;y++)
        {
                P1=tabdown[y];
                led_delay();
        }
}
/*************************************************
函數(shù)功能:關閉所有LED
**************************************************/
void stop(void)
{
        P1=0xff;    //關閉8個LED
}
/*************************************************
函數(shù)功能:閃爍點亮LED
**************************************************/
void flash(void)
{
  P1=0x00;      //點亮8個LED
  led_delay();
}
/*************************************************
函數(shù)功能:主函數(shù)
**************************************************/
void main(void)           //主函數(shù)
{
        SCON = 0x50;           //設定串口工作方式
  PCON = 0x00;           //波特率不倍增       
  TMOD = 0x20;           //定時器1工作于8位自動重載模式, 用于產生波特率
  EA   = 1;
  ES   = 1;              //允許串口中斷
  TL1  = 0xfd;
  TH1  = 0xfd;           //波特率9600
  TR1  = 1;
  while(1);
}
/*************************************************
函數(shù)功能:定時器T0的中斷服務子程序
**************************************************/
void  serial() interrupt 4
{
   ES = 0;                //關閉串行中斷
   RI = 0;                //清除串行接受標志位
   keyval = SBUF;            //從串口緩沖區(qū)取得數(shù)據                       
   switch(keyval)
   {
      case 1:forward();break;
      case 2:backward();break;
      case 3:stop();break;
      case 4:flash();break;
   }                  
  ES = 1;    //允許串口中斷
}

回復

使用道具 舉報

10#
ID:824490 發(fā)表于 2021-5-10 11:04 | 只看該作者
你把中斷中的:
switch(keyval)
   {
      case 1:forward();break;
      case 2:backward();break;
      case 3:stop();break;
      case 4:flash();break;
   }                  
這一塊移到MAIN的while之下:
while(1)
{
switch(keyval)
   {
      case 1:forward();break;
      case 2:backward();break;
      case 3:stop();break;
      case 4:flash();break;
   }              

}
回復

使用道具 舉報

11#
ID:883167 發(fā)表于 2021-5-10 11:27 | 只看該作者
名字不是重點 發(fā)表于 2021-5-10 11:04
你把中斷中的:
switch(keyval)
   {

嗯,這個好像可以的!
回復

使用道具 舉報

12#
ID:213173 發(fā)表于 2021-5-10 14:44 | 只看該作者
qwettyuio 發(fā)表于 2021-5-8 11:36
為什么這個也不可以實現(xiàn)你,同樣的問題
#include    //包含51單片機寄存器定義的頭文件
unsigned char  ...

你把執(zhí)行語句放在串口中斷里,只有發(fā)生中斷才能執(zhí)行一次,當然不可重復循環(huán)。除非你在中斷剛剛結束再次人為觸發(fā)串口中斷。
回復

使用道具 舉報

13#
ID:917199 發(fā)表于 2021-5-10 20:46 | 只看該作者
delay(2000);
delay(uint z)
  uchar x
  for(x=z                 char?int?     
回復

使用道具 舉報

14#
ID:139866 發(fā)表于 2021-5-12 09:57 | 只看該作者
最好就是中斷里寫標志位,在main函數(shù)里實現(xiàn)功能
回復

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網

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