找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1799|回复: 8
收起左侧

单片机程序只执行到一半,往下就不运行了是什么回事?

[复制链接]
ID:198189 发表于 2022-10-20 00:03 | 显示全部楼层 |阅读模式
我程序只运行到了这里, if(k3==1)                                  {
                                         
                   LED[0]=a%10;  //显示计数
                                                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单字节串行移位函数
  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;                                //串行数据输入
  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. 使用数组对数码管预先定义
  32. /*****************************************************************************************/
  33. unsigned int motor1=0;         //计左电机码盘脉冲值
  34. unsigned int speed1=0;         //计左电机码盘脉冲值
  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;                        //中断总开关  
  94. }

  95. /********************************************************************************************
  96. 定时器0初始化
  97. /********************************************************************************************/
  98. void T0_init (void)
  99. {
  100.                 AUXR |= 0x80;                //定时器时钟1T模式
  101.         TMOD &= 0xF0;                //设置定时器模式
  102.         TL0 = 0;                //设置定时初始值
  103.         TH0 = 0;                //设置定时初始值计数初值
  104.         TR0 = 1;      //启动定时器
  105.    ET0 = 1;    //使能定时器中断

  106. }

  107. /********************************************************************************************
  108. //延迟函数
  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;  //按键默认显示速度
  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;//显示计数
  149.                                         }
  150.                                 }
  151.                  if(a>9999)
  152.                  {a=0;}
  153.          LED4_Display ();  
  154.         }
  155. }


  156. /*********************************************************************************************
  157. 外部中断INT3计算电机1的脉冲
  158. /********************************************************************************************/
  159. void INT3_Isr() interrupt 11
  160. {
  161.         motor1++;        
  162.         a++;
  163. }
  164. /*********************************************************************************************
  165. 外部中断INT1计算电机2的脉冲
  166. /********************************************************************************************/

  167. void TM0_Isr() interrupt 1
  168. {
  169.         TH0=(65536-1000)/256;        //16位计数寄存器T0高8位, 12MHZ时1000微秒
  170.         TL0=(65536-1000)%256;        //16位计数寄存器T0低8位,
  171.         k++;                        //k自加1
  172.         if(k==1000)               
  173.         {
  174.                 k=k2;
  175.                 k=0;                        //重新定义k的值
  176.                 speed1=motor1*60; // 转/min
  177.                 motor1=0;                 //重新定义motor1的值
  178.         }               
  179.          if(k3==1)
  180.                                  {
  181.                                          
  182.                    LED[0]=a%10;  //显示计数
  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. }
复制代码


回复

使用道具 举报

ID:523803 发表于 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;//显示计数
                                        }
                                }
这里k31按下条件成立K3=2,这个时候下面的判断也成立了,就会反复执行
回复

使用道具 举报

ID:198189 发表于 2022-10-20 10:02 | 显示全部楼层
18520649817 发表于 2022-10-20 00:41
你的K31是按钮吧,如果是按钮的话,你有没有按呢,如果按了的话可能是切换的太快了
if(k31==0&&k3==1)
  ...

k31我还没启用,我直接让k3=2来调试,发现if(k3=2)这语句执行不起来。
回复

使用道具 举报

ID:8222 发表于 2022-10-20 11:05 | 显示全部楼层
你语言描述都不清楚,你还是说明程序运行到到第几行停止吧。
回复

使用道具 举报

ID:198189 发表于 2022-10-20 12:12 | 显示全部楼层
温xyz 发表于 2022-10-20 11:05
你语言描述都不清楚,你还是说明程序运行到到第几行停止吧。

程序运行后只显示计数,不显示速度。就算我在程序开关规定让它不经检测直接默认显示速度也无法显示出来。
回复

使用道具 举报

ID:198189 发表于 2022-10-20 12:19 | 显示全部楼层
另说明,程序是可以运行起来的,计数也是正确的。我调试时是把计数显示直接去掉的,不是让它们两个同时运行,然后发现它不运行速度显示的语句。我纠结了半天没发现我的问题出现在哪里?
回复

使用道具 举报

ID:161164 发表于 2022-10-20 16:41 | 显示全部楼层
xia20 发表于 2022-10-20 10:02
k31我还没启用,我直接让k3=2来调试,发现if(k3=2)这语句执行不起来。

2022-10-20_164015.png
回复

使用道具 举报

ID:198189 发表于 2022-10-20 21:24 | 显示全部楼层

大佬请收下我的膝盖,我这是写晕了头忘了改了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表