標(biāo)題: 單片機(jī)程序只執(zhí)行到一半,往下就不運(yùn)行了是什么回事? [打印本頁]

作者: xia20    時間: 2022-10-20 00:03
標(biāo)題: 單片機(jī)程序只執(zhí)行到一半,往下就不運(yùn)行了是什么回事?
我程序只運(yùn)行到了這里, if(k3==1)                                  {
                                         
                   LED[0]=a%10;  //顯示計(jì)數(shù)
                                                LED[1]=a/10%10;                        
                                                LED[2]=a/100%10;
                                                LED[3]=a/1000;
                                 }
后面的就不顯示了,啥回事?

全程序如下:
  1. /*
  2. MCLKO/NRST/SCL_2/MOSI/RxD_3/T1CLKO/T0/INT2/P5.4
  3. Vcc
  4. SDA_2/SS/TxD_3/T0CLKO/T1/INT3/P5.5
  5. Gnd

  6. P3.3/TxD_2/INT1/MISO/SDA
  7. P3.2/RxD_2/INT0/SCLK/SCL
  8. P3.1/TxD
  9. P3.0/RxD/INT4
  10. */
  11. #include "8g.h"
  12. #include "intrins.h"
  13. #define uchar unsigned char
  14. #define uint  unsigned int
  15. #define EX3             0x20
  16. void LED4_Display (void);                        // LED顯示
  17. void LED_OUT(uchar X);                                // LED單字節(jié)串行移位函數(shù)
  18. unsigned char code LED_0F[];                // LED字模表
  19. unsigned char code fseg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  20. unsigned char code segbit[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
  21. unsigned char  disbuf[4]={0,0,0,0};
  22. sbit DIO = P3^2;                                //串行數(shù)據(jù)輸入
  23. sbit RCLK  = P3^3;                                //時鐘脈沖信號——上升沿有效
  24. sbit SCLK = P5^4;                                //打入信號————上升沿有效
  25. sbit IN3=P5^5;  //對射光藕

  26. sbit k31=P3^1;
  27. //sbit IN3=P1^2;
  28. //sbit IN4=P1^3;
  29. //sbit LED=P2^0;
  30. /******************************************************************************************
  31. 使用數(shù)組對數(shù)碼管預(yù)先定義
  32. /*****************************************************************************************/
  33. unsigned int motor1=0;         //計(jì)左電機(jī)碼盤脈沖值
  34. unsigned int speed1=0;         //計(jì)左電機(jī)碼盤脈沖值
  35. unsigned int k=0,a=0,k2;
  36. unsigned char k3=2;

  37. uchar LED[8];        //用于LED的8位顯示緩存
  38. void LED4_Display (void)
  39. {
  40.         unsigned char code *led_table;          // 查表指針
  41.         uchar i;
  42.         //顯示第1位
  43.         led_table = LED_0F + LED[0];
  44.         i = *led_table;

  45.         LED_OUT(i);                        
  46.         LED_OUT(0x01);               

  47.         RCLK = 0;
  48.         RCLK = 1;
  49.         //顯示第2位
  50.         led_table = LED_0F + LED[1];
  51.         i = *led_table;

  52.         LED_OUT(i);               
  53.         LED_OUT(0x02);               

  54.         RCLK = 0;
  55.         RCLK = 1;
  56.         //顯示第3位
  57.         led_table = LED_0F + LED[2];
  58.         i = *led_table;

  59.         LED_OUT(i);                        
  60.         LED_OUT(0x04);        

  61.         RCLK = 0;
  62.         RCLK = 1;
  63.         //顯示第4位
  64.         led_table = LED_0F + LED[3];
  65.         i = *led_table;

  66.         LED_OUT(i);                        
  67.         LED_OUT(0x08);               

  68.         RCLK = 0;
  69.         RCLK = 1;
  70. }

  71. void LED_OUT(uchar X)
  72. {
  73.         uchar i;
  74.         for(i=8;i>=1;i--)
  75.         {
  76.                 if (X&0x80) DIO=1; else DIO=0;
  77.                 X<<=1;
  78.                 SCLK = 0;
  79.                 SCLK = 1;
  80.         }
  81. }

  82. unsigned char code LED_0F[] =
  83. {// 0         1          2           3        4         5          6           7        8         9          A           b        C    d          E    F    -
  84.         0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x8C,0xBF,0xC6,0xA1,0x86,0xFF,0xbf
  85. };
  86. //

  87. /*********************************************************************************************
  88. 外部中斷
  89. /********************************************************************************************/
  90. void INT_init (void)
  91. {
  92.                 INTCLKO |= EX3;                             //使能INT3下降沿中斷
  93.   EA = 1;                        //中斷總開關(guān)  
  94. }

  95. /********************************************************************************************
  96. 定時器0初始化
  97. /********************************************************************************************/
  98. void T0_init (void)
  99. {
  100.                 AUXR |= 0x80;                //定時器時鐘1T模式
  101.         TMOD &= 0xF0;                //設(shè)置定時器模式
  102.         TL0 = 0;                //設(shè)置定時初始值
  103.         TH0 = 0;                //設(shè)置定時初始值計(jì)數(shù)初值
  104.         TR0 = 1;      //啟動定時器
  105.    ET0 = 1;    //使能定時器中斷

  106. }

  107. /********************************************************************************************
  108. //延遲函數(shù)
  109. /********************************************************************************************/
  110. void DELAY_MS (unsigned int a)
  111. {
  112.         unsigned int i;
  113.         while( a-- != 0)
  114.         {
  115.                 for(i = 0; i < 600; i++);
  116.         }
  117. }

  118. /*********************************************************************************************
  119. 主程序
  120. /********************************************************************************************/
  121. void main(void)
  122. {               
  123.           P1M0 = 0x00;
  124.     P1M1 = 0x00;
  125.     P3M0 = 0x00;
  126.     P3M1 = 0x00;
  127.     P5M0 = 0x00;
  128.     P5M1 = 0x00;               
  129.                 INT_init();
  130.                 T0_init();
  131.           IN3=1;//光藕初始化
  132.           k3=1;  //按鍵默認(rèn)顯示速度
  133.         while (1)
  134.         {
  135.                 if(k31==0&&k3==1)
  136.                         {
  137.                                 DELAY_MS (10);
  138.                                         if(k31==0&&k3==1)
  139.                                         {
  140.                                                 k3=2;//顯示速度
  141.                                         }
  142.                         }
  143.                 if(k31==0&&k3==2)
  144.                         {
  145.                                 DELAY_MS (10);
  146.                                         if(k31==0&&k3==2)
  147.                                         {
  148.                                                 k3=1;//顯示計(jì)數(shù)
  149.                                         }
  150.                                 }
  151.                  if(a>9999)
  152.                  {a=0;}
  153.          LED4_Display ();  
  154.         }
  155. }


  156. /*********************************************************************************************
  157. 外部中斷INT3計(jì)算電機(jī)1的脈沖
  158. /********************************************************************************************/
  159. void INT3_Isr() interrupt 11
  160. {
  161.         motor1++;        
  162.         a++;
  163. }
  164. /*********************************************************************************************
  165. 外部中斷INT1計(jì)算電機(jī)2的脈沖
  166. /********************************************************************************************/

  167. void TM0_Isr() interrupt 1
  168. {
  169.         TH0=(65536-1000)/256;        //16位計(jì)數(shù)寄存器T0高8位, 12MHZ時1000微秒
  170.         TL0=(65536-1000)%256;        //16位計(jì)數(shù)寄存器T0低8位,
  171.         k++;                        //k自加1
  172.         if(k==1000)               
  173.         {
  174.                 k=k2;
  175.                 k=0;                        //重新定義k的值
  176.                 speed1=motor1*60; // 轉(zhuǎn)/min
  177.                 motor1=0;                 //重新定義motor1的值
  178.         }               
  179.          if(k3==1)
  180.                                  {
  181.                                          
  182.                    LED[0]=a%10;  //顯示計(jì)數(shù)
  183.                                                 LED[1]=a/10%10;                        
  184.                                                 LED[2]=a/100%10;
  185.                                                 LED[3]=a/1000;
  186.                                  }
  187.                                  if(k3==2)
  188.                                  {
  189.                   LED[3]=speed1/10;//顯示速度
  190.                                                 LED[2]=speed1%10;
  191.                                                 LED[1]=5;
  192.                                                 LED[0]=8;
  193.                                  }
  194.         
  195.         
  196. }
復(fù)制代碼



作者: 18520649817    時間: 2022-10-20 00:41
你的K31是按鈕吧,如果是按鈕的話,你有沒有按呢,如果按了的話可能是切換的太快了
if(k31==0&&k3==1)
                        {
                                DELAY_MS (10);
                                        if(k31==0&&k3==1)
                                        {
                                                k3=2;//顯示速度
                                        }
                        }
                if(k31==0&&k3==2)
                        {
                                DELAY_MS (10);
                                        if(k31==0&&k3==2)
                                        {
                                                k3=1;//顯示計(jì)數(shù)
                                        }
                                }
這里k31按下條件成立K3=2,這個時候下面的判斷也成立了,就會反復(fù)執(zhí)行
作者: xia20    時間: 2022-10-20 10:02
18520649817 發(fā)表于 2022-10-20 00:41
你的K31是按鈕吧,如果是按鈕的話,你有沒有按呢,如果按了的話可能是切換的太快了
if(k31==0&&k3==1)
  ...

k31我還沒啟用,我直接讓k3=2來調(diào)試,發(fā)現(xiàn)if(k3=2)這語句執(zhí)行不起來。
作者: 溫xyz    時間: 2022-10-20 11:05
你語言描述都不清楚,你還是說明程序運(yùn)行到到第幾行停止吧。
作者: xia20    時間: 2022-10-20 12:12
溫xyz 發(fā)表于 2022-10-20 11:05
你語言描述都不清楚,你還是說明程序運(yùn)行到到第幾行停止吧。

程序運(yùn)行后只顯示計(jì)數(shù),不顯示速度。就算我在程序開關(guān)規(guī)定讓它不經(jīng)檢測直接默認(rèn)顯示速度也無法顯示出來。
作者: xia20    時間: 2022-10-20 12:19
另說明,程序是可以運(yùn)行起來的,計(jì)數(shù)也是正確的。我調(diào)試時是把計(jì)數(shù)顯示直接去掉的,不是讓它們兩個同時運(yùn)行,然后發(fā)現(xiàn)它不運(yùn)行速度顯示的語句。我糾結(jié)了半天沒發(fā)現(xiàn)我的問題出現(xiàn)在哪里?
作者: lkc8210    時間: 2022-10-20 16:41
xia20 發(fā)表于 2022-10-20 10:02
k31我還沒啟用,我直接讓k3=2來調(diào)試,發(fā)現(xiàn)if(k3=2)這語句執(zhí)行不起來。


作者: xia20    時間: 2022-10-20 21:24
lkc8210 發(fā)表于 2022-10-20 16:41

大佬請收下我的膝蓋,我這是寫暈了頭忘了改了。




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