標(biāo)題: 為什么不能實(shí)現(xiàn)流水等功能,單片機(jī)代碼編譯沒(méi)有問(wèn)題,可以串口發(fā)送指令,請(qǐng)各位幫忙... [打印本頁(yè)]

作者: qwettyuio    時(shí)間: 2021-5-6 11:53
標(biāo)題: 為什么不能實(shí)現(xiàn)流水等功能,單片機(jī)代碼編譯沒(méi)有問(wèn)題,可以串口發(fā)送指令,請(qǐng)各位幫忙...
#include<reg51.h>    //包含51單片機(jī)寄存器定義的頭文件
unsigned char keyval;  //儲(chǔ)存按鍵值
//unsigned char keyval2;  //儲(chǔ)存按鍵值
#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ù)功能:流水燈延時(shí)
**************************************************/
void led_delay(void)
{
   unsigned char i,j;
        for(i=0;i<250;i++)
          for(j=0;j<250;j++);           
}
/*************************************************
函數(shù)功能:軟件消抖延時(shí)
**************************************************/
void delay20ms(void)
{
   unsigned char i,j;
       for(i=0;i<100;i++)
          for(j=0;j<60;j++);           
}
/*************************************************
函數(shù)功能:正向流水點(diǎn)亮LED
**************************************************/
void forward(void)
{                              //不能加while(1),會(huì)循環(huán)這一函數(shù),其他按鍵控制無(wú)效
        for(x=0;x<8;x++)        
        {
                P1=tabup[x];
                led_delay();
        }               
}
/*************************************************
函數(shù)功能:反向流水點(diǎn)亮LED
**************************************************/
void backward(void)
{                          //不能加while(1),會(huì)循環(huán)這一函數(shù),其他按鍵控制無(wú)效
        for(y=0;y<8;y++)
        {
                P1=tabdown[y];
                led_delay();
        }
}
/*************************************************
函數(shù)功能:關(guān)閉所有LED
**************************************************/
void stop(void)
{
        P1=0xff;    //關(guān)閉8個(gè)LED
}
/*************************************************
函數(shù)功能:閃爍點(diǎn)亮LED
**************************************************/
void flash(void)
{
  P1=0x00;      //點(diǎn)亮8個(gè)LED
  led_delay();
}
/*************************************************
函數(shù)功能:主函數(shù)
**************************************************/
void main(void)           //主函數(shù)
{
        SCON = 0x50;           //設(shè)定串口工作方式
  PCON = 0x00;           //波特率不倍增        
  TMOD = 0x20;           //定時(shí)器1工作于8位自動(dòng)重載模式, 用于產(chǎn)生波特率


  TL1  = 0xfd;
  TH1  = 0xfd;           //波特率9600
  TR1  = 1;
  EA   = 1;
  ES   = 1;              //允許串口中斷
  while(1);        
}
/*************************************************
函數(shù)功能:定時(shí)器T0的中斷服務(wù)子程序
**************************************************/
void  serial() interrupt 4
{
   ES = 0;                //關(guān)閉串行中斷
   RI = 0;                //清除串行接受標(biāo)志位
   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;    //允許串口中斷
}


作者: mornbin    時(shí)間: 2021-5-6 13:03
debug看一下,能走到這幾個(gè)case里嗎?
作者: dhz0105    時(shí)間: 2021-5-6 13:45
本帖最后由 dhz0105 于 2021-5-6 13:52 編輯

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

作者: game灬boy    時(shí)間: 2021-5-6 15:21
你把延時(shí)時(shí)間調(diào)大一點(diǎn)看看20ms可能太短肉眼識(shí)別不出來(lái),看起來(lái)就是直接就亮了最后一個(gè)燈
還有就是把這段放到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;
   }

作者: sync763    時(shí)間: 2021-5-6 16:29
不要在中斷函數(shù)內(nèi)處理太多的東西,把switch判斷的語(yǔ)句都放到主函數(shù)里就可以了。同時(shí)流水燈的延時(shí)時(shí)間要長(zhǎng)一些,太短了看不出來(lái)。
作者: qwettyuio    時(shí)間: 2021-5-6 16:37
sync763 發(fā)表于 2021-5-6 16:29
不要在中斷函數(shù)內(nèi)處理太多的東西,把switch判斷的語(yǔ)句都放到主函數(shù)里就可以了。同時(shí)流水燈的延時(shí)時(shí)間要長(zhǎng)一 ...

原來(lái)代碼發(fā)送對(duì)應(yīng)指令沒(méi)有反應(yīng)
作者: qwettyuio    時(shí)間: 2021-5-6 16:37
game灬boy 發(fā)表于 2021-5-6 15:21
你把延時(shí)時(shí)間調(diào)大一點(diǎn)看看20ms可能太短肉眼識(shí)別不出來(lái),看起來(lái)就是直接就亮了最后一個(gè)燈
還有就是把這段放 ...

是一個(gè)都沒(méi)有亮
作者: qwettyuio    時(shí)間: 2021-5-6 16:38
game灬boy 發(fā)表于 2021-5-6 15:21
你把延時(shí)時(shí)間調(diào)大一點(diǎn)看看20ms可能太短肉眼識(shí)別不出來(lái),看起來(lái)就是直接就亮了最后一個(gè)燈
還有就是把這段放 ...

不是亮一個(gè)
作者: 染沫冉    時(shí)間: 2021-5-6 18:44
可以加一個(gè)循環(huán)試試
作者: birdzhyli    時(shí)間: 2021-5-6 22:01
1、串口處理程序里一般不要放太多東西,中斷處理要盡量快
2、要確認(rèn)你收到的數(shù)據(jù)是你想要的,你這里是要的1,2,3,那么收到的是不是數(shù)字1,2,3,還是字符1,2,3,調(diào)試程序時(shí)要確認(rèn)一下,可以讓串口把收到的再發(fā)回去,在上位機(jī)確認(rèn)一下
3、程序合理的縮進(jìn)結(jié)構(gòu)有助于自己檢查程序,求助別人也能讓人容易看懂,亂了就別人就不想看了,哪有那么多時(shí)間去琢磨別人是怎么想的呀
作者: wulin    時(shí)間: 2021-5-7 06:52
串口中斷里不要放與串口功能無(wú)直接關(guān)系的語(yǔ)句,更不能含有較長(zhǎng)時(shí)間的阻滯型延時(shí),這會(huì)導(dǎo)致通信響應(yīng)緩慢甚至無(wú)效。程序要簡(jiǎn)潔,給你屏蔽了所有不必要的語(yǔ)句,你試試。
  1. #include<reg51.h>    //包含51單片機(jī)寄存器定義的頭文件
  2. unsigned char keyval;  //儲(chǔ)存按鍵值
  3. //unsigned char keyval2;  //儲(chǔ)存按鍵值
  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ù)功能:流水燈延時(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ù)功能:軟件消抖延時(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ù)功能:正向流水點(diǎn)亮LED
  31. **************************************************/
  32. void forward(void)
  33. {                              //不能加while(1),會(huì)循環(huán)這一函數(shù),其他按鍵控制無(wú)效
  34. //        for(x=0;x<8;x++)        
  35. //        {
  36.                 P1=tabup[x];
  37. //                led_delay();
  38. //        }               
  39. }
  40. /*************************************************
  41. 函數(shù)功能:反向流水點(diǎn)亮LED
  42. **************************************************/
  43. void backward(void)
  44. {                          //不能加while(1),會(huì)循環(huán)這一函數(shù),其他按鍵控制無(wú)效
  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個(gè)LED
  58. }
  59. /*************************************************
  60. 函數(shù)功能:閃爍點(diǎn)亮LED
  61. **************************************************/
  62. void flash(void)
  63. {
  64.         P1=0x00;      //點(diǎn)亮8個(gè)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;           //定時(shí)器1工作于8位自動(dòng)重載模式, 用于產(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. //                        這樣寫更簡(jiǎn)潔
  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);//延時(shí)約0.5秒
  95.                 x=++x%8;//循環(huán)計(jì)數(shù)
  96.         }
  97. }

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

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

復(fù)制代碼







歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1