找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2392|回復: 10
打印 上一主題 下一主題
收起左側(cè)

為什么不能實現(xiàn)流水等功能,單片機代碼編譯沒有問題,可以串口發(fā)送指令,請各位幫忙...

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:858009 發(fā)表于 2021-5-6 11:53 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
#include<reg51.h>    //包含51單片機寄存器定義的頭文件
unsigned char keyval;  //儲存按鍵值
//unsigned char keyval2;  //儲存按鍵值
#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;
keyval2=0;
/*************************************************
函數(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)
{                              //不能加while(1),會循環(huán)這一函數(shù),其他按鍵控制無效
        for(x=0;x<8;x++)        
        {
                P1=tabup[x];
                led_delay();
        }               
}
/*************************************************
函數(shù)功能:反向流水點亮LED
**************************************************/
void backward(void)
{                          //不能加while(1),會循環(huán)這一函數(shù),其他按鍵控制無效
        for(y=0;y<8;y++)
        {
                P1=tabdown[y];
                led_delay();
        }
}
/*************************************************
函數(shù)功能:關(guān)閉所有LED
**************************************************/
void stop(void)
{
        P1=0xff;    //關(guān)閉8個LED
}
/*************************************************
函數(shù)功能:閃爍點亮LED
**************************************************/
void flash(void)
{
  P1=0x00;      //點亮8個LED
  led_delay();
}
/*************************************************
函數(shù)功能:主函數(shù)
**************************************************/
void main(void)           //主函數(shù)
{
        SCON = 0x50;           //設(shè)定串口工作方式
  PCON = 0x00;           //波特率不倍增        
  TMOD = 0x20;           //定時器1工作于8位自動重載模式, 用于產(chǎn)生波特率


  TL1  = 0xfd;
  TH1  = 0xfd;           //波特率9600
  TR1  = 1;
  EA   = 1;
  ES   = 1;              //允許串口中斷
  while(1);        
}
/*************************************************
函數(shù)功能:定時器T0的中斷服務子程序
**************************************************/
void  serial() interrupt 4
{
   ES = 0;                //關(guān)閉串行中斷
   RI = 0;                //清除串行接受標志位
   keyval = SBUF;         //從串口緩沖區(qū)取得數(shù)據(jù)
   if(keyval==0);

         {
                 keyval=keyval2;
         }
   keyval2=keyval;         
   switch(keyval)
   {
      case 1:forward();break;
      case 2:backward();break;
      case 3:stop();break;
      case 4:flash();break;
   }

        
  ES = 1;    //允許串口中斷
}

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

使用道具 舉報

沙發(fā)
ID:913577 發(fā)表于 2021-5-6 13:03 | 只看該作者
debug看一下,能走到這幾個case里嗎?
回復

使用道具 舉報

板凳
ID:546568 發(fā)表于 2021-5-6 13:45 | 只看該作者
本帖最后由 dhz0105 于 2021-5-6 13:52 編輯

你的那些函數(shù)有在main里調(diào)用嗎?
回復

使用道具 舉報

地板
ID:367369 發(fā)表于 2021-5-6 15:21 | 只看該作者
你把延時時間調(diào)大一點看看20ms可能太短肉眼識別不出來,看起來就是直接就亮了最后一個燈
還有就是把這段放到main函數(shù)的while(1)里面
if(keyval==0);

         {
                 keyval=keyval2;
         }
   keyval2=keyval;         
   switch(keyval)
   {
      case 1:forward();break;
      case 2:backward();break;
      case 3:stop();break;
      case 4:flash();break;
   }
回復

使用道具 舉報

5#
ID:392485 發(fā)表于 2021-5-6 16:29 | 只看該作者
不要在中斷函數(shù)內(nèi)處理太多的東西,把switch判斷的語句都放到主函數(shù)里就可以了。同時流水燈的延時時間要長一些,太短了看不出來。
回復

使用道具 舉報

6#
ID:858009 發(fā)表于 2021-5-6 16:37 | 只看該作者
sync763 發(fā)表于 2021-5-6 16:29
不要在中斷函數(shù)內(nèi)處理太多的東西,把switch判斷的語句都放到主函數(shù)里就可以了。同時流水燈的延時時間要長一 ...

原來代碼發(fā)送對應指令沒有反應
回復

使用道具 舉報

7#
ID:858009 發(fā)表于 2021-5-6 16:37 | 只看該作者
game灬boy 發(fā)表于 2021-5-6 15:21
你把延時時間調(diào)大一點看看20ms可能太短肉眼識別不出來,看起來就是直接就亮了最后一個燈
還有就是把這段放 ...

是一個都沒有亮
回復

使用道具 舉報

8#
ID:858009 發(fā)表于 2021-5-6 16:38 | 只看該作者
game灬boy 發(fā)表于 2021-5-6 15:21
你把延時時間調(diào)大一點看看20ms可能太短肉眼識別不出來,看起來就是直接就亮了最后一個燈
還有就是把這段放 ...

不是亮一個
回復

使用道具 舉報

9#
ID:867005 發(fā)表于 2021-5-6 18:44 | 只看該作者
可以加一個循環(huán)試試
回復

使用道具 舉報

10#
ID:889094 發(fā)表于 2021-5-6 22:01 | 只看該作者
1、串口處理程序里一般不要放太多東西,中斷處理要盡量快
2、要確認你收到的數(shù)據(jù)是你想要的,你這里是要的1,2,3,那么收到的是不是數(shù)字1,2,3,還是字符1,2,3,調(diào)試程序時要確認一下,可以讓串口把收到的再發(fā)回去,在上位機確認一下
3、程序合理的縮進結(jié)構(gòu)有助于自己檢查程序,求助別人也能讓人容易看懂,亂了就別人就不想看了,哪有那么多時間去琢磨別人是怎么想的呀
回復

使用道具 舉報

11#
ID:213173 發(fā)表于 2021-5-7 06:52 | 只看該作者
串口中斷里不要放與串口功能無直接關(guān)系的語句,更不能含有較長時間的阻滯型延時,這會導致通信響應緩慢甚至無效。程序要簡潔,給你屏蔽了所有不必要的語句,你試試。
  1. #include<reg51.h>    //包含51單片機寄存器定義的頭文件
  2. unsigned char keyval;  //儲存按鍵值
  3. //unsigned char keyval2;  //儲存按鍵值
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. unsigned char code tabup[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
  7. //code tabdown[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
  8. uint x,y;
  9. //keyval2=0;
  10. /*************************************************
  11. 函數(shù)功能:流水燈延時
  12. **************************************************/
  13. void led_delay(unsigned int t)
  14. {
  15.         unsigned int i,j;
  16.         for(i=0;i<t;i++)
  17.                 for(j=0;j<120;j++);
  18. }
  19. /*************************************************
  20. 函數(shù)功能:軟件消抖延時
  21. **************************************************/
  22. /*
  23. void delay20ms(void)
  24. {
  25.         unsigned char i,j;
  26.         for(i=0;i<100;i++)
  27.                 for(j=0;j<60;j++);
  28. }*/
  29. /*************************************************
  30. 函數(shù)功能:正向流水點亮LED
  31. **************************************************/
  32. void forward(void)
  33. {                              //不能加while(1),會循環(huán)這一函數(shù),其他按鍵控制無效
  34. //        for(x=0;x<8;x++)        
  35. //        {
  36.                 P1=tabup[x];
  37. //                led_delay();
  38. //        }               
  39. }
  40. /*************************************************
  41. 函數(shù)功能:反向流水點亮LED
  42. **************************************************/
  43. void backward(void)
  44. {                          //不能加while(1),會循環(huán)這一函數(shù),其他按鍵控制無效
  45. //        for(y=0;y<8;y++)
  46. //        {
  47. //                P1=tabdown[x];
  48.                 P1=tabup[7-(x%8)];
  49. //                led_delay();
  50. //        }
  51. }
  52. /*************************************************
  53. 函數(shù)功能:關(guān)閉所有LED
  54. **************************************************/
  55. void stop(void)
  56. {
  57.         P1=0xff;    //關(guān)閉8個LED
  58. }
  59. /*************************************************
  60. 函數(shù)功能:閃爍點亮LED
  61. **************************************************/
  62. void flash(void)
  63. {
  64.         P1=0x00;      //點亮8個LED
  65. //        led_delay();
  66. }
  67. /*************************************************
  68. 函數(shù)功能:主函數(shù)
  69. **************************************************/
  70. void main(void)           //主函數(shù)
  71. {
  72.         SCON = 0x50;           //設(shè)定串口工作方式
  73.         PCON = 0x00;           //波特率不倍增        
  74.         TMOD = 0x20;           //定時器1工作于8位自動重載模式, 用于產(chǎn)生波特率
  75.         TL1  = 0xfd;
  76.         TH1  = 0xfd;           //波特率9600
  77.         TR1  = 1;
  78.         EA   = 1;
  79.         ES   = 1;              //允許串口中斷
  80.         while(1)   
  81.         {
  82.                 switch(keyval)
  83.                 {
  84.                         case 1:forward();break;
  85.                         case 2:backward();break;
  86.                         case 3:stop();break;
  87.                         case 4:flash();break;
  88. //                        這樣寫更簡潔
  89. //                        case 1:P1=tabup[x];break;//正向流水燈
  90. //                        case 2:P1=tabup[7-(x%8)];break;//反向流水燈
  91. //                        case 3:P1=0xff;break;//全熄
  92. //                        case 4:P1=0x00;break;//全亮
  93.                 }
  94.                 led_delay(500);//延時約0.5秒
  95.                 x=++x%8;//循環(huán)計數(shù)
  96.         }
  97. }

  98. /*************************************************
  99. 函數(shù)功能:定時器T0的中斷服務子程序
  100. **************************************************/
  101. void  serial() interrupt 4
  102. {
  103. //        ES = 0;                //關(guān)閉串行中斷
  104.         RI = 0;                //清除串行接受標志位
  105.         keyval = SBUF;         //從串口緩沖區(qū)取得數(shù)據(jù)
  106. /*        if(keyval==0);
  107.         {
  108.                 keyval=keyval2;
  109.         }
  110.         keyval2=keyval;         

  111.         ES = 1;*/    //允許串口中斷
  112. }

復制代碼


回復

使用道具 舉報

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

本版積分規(guī)則

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

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

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