找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3272|回复: 11
收起左侧

这个程序为何能在单片机开发板运行,却不能在最小系统上运行?

[复制链接]
ID:368203 发表于 2019-1-26 23:47 | 显示全部楼层 |阅读模式
要是将switch里面的语句改成注释后的那种形式,就可以在最小系统上运行。
但是在单片机开发板上是根本不需要改动的,不知道为什么了。我的猜想是不是最小系统的定时器没有工作,所以flag始终为0?

单片机程序如下:
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};

  6. sbit IRIN=P3^2; //红外接收器数据线

  7. sbit M1 = P1^0;
  8. sbit M2 = P1^1;                 
  9. sbit M3 = P1^2;
  10. sbit M4 = P1^3;
  11. sbit EN12 = P1^4;
  12. sbit EN34 = P1^5;

  13. uchar IRCOM[7];
  14. uchar m,n;
  15. uchar t=2;
  16. uchar count;
  17. bit flag;

  18. void delayxms(uchar t);
  19. void delay(unsigned char x) ;
  20. void delay1(int ms);
  21. void motor();

  22. void main()
  23. {
  24.         
  25.         uint a;
  26.         IRIN=1; //I/O口初始化
  27.         IE=0x83; //允许总中断中断,使能 INT0 外部中断
  28.         TCON=TCON|0x01; //触发方式为脉冲负边沿触发
  29.         lcd_init();
  30.         TMOD=0x51;
  31.         TH0=(65536-50000)/256;
  32.         TL0=(65536-50000)/256;
  33.         TR0=1;
  34.         count=0;        
  35.         while(1)
  36.         {
  37.                 TR1=1;
  38.                 TH1=0;
  39.                 TL1=0;
  40.                 flag=0;
  41.                 while(flag==0);
  42.                 motor();
  43.         }
  44. }

  45. /**********************************************************/

  46. void IR_IN() interrupt 0 using 0
  47. {
  48.         unsigned char j,k,N=0;
  49.         unsigned char q=0;
  50.         EX0 = 0;
  51.         delay(15);
  52.         if (IRIN==1)
  53.         {
  54.                 EX0 =1;
  55.                 return;
  56.         }

  57. //确认IR信号出现
  58.         while (!IRIN) //等IR变为高电平,跳过9ms的前导低电平信号。
  59.                 delay(1);


  60.         for (j=0;j<4;j++) //收集四组数据
  61.         {
  62.                 for (k=0;k<8;k++) //每组数据有8位
  63.                 {
  64.                         while (IRIN)
  65.                         {delay(1);} //等 IR 变为低电平,跳过4.5ms的前导高电平信号。 {delay(1);}
  66.                         while (!IRIN) //等 IR 变为高电平
  67.                                 delay(1);
  68.                         while(IRIN)
  69.                         {
  70.                                 delay(1);
  71.                                 N++;
  72.                                 if (N>=30)
  73.                                 {
  74.                                         EX0=1;
  75.                                         return;
  76.                                 } //0.14ms计数过长自动离开。
  77.                         } //高电平计数完毕
  78.                         IRCOM[j]=IRCOM[j] >> 1; //数据最高位补“0”
  79.                         if(N>=8)
  80.                         {
  81.                                 IRCOM[j] = IRCOM[j] | 0x80; //数据最高位补“1”
  82.                         }
  83.                         N=0;
  84.                 }
  85.         }
  86.         
  87.         if(IRCOM[2]!=~IRCOM[3])
  88.         {
  89.                 EX0=1;
  90.                 return;
  91.         }
  92.         
  93.         IRCOM[5]=IRCOM[2] & 0x0F; //取键码的低四位
  94.         IRCOM[6]=IRCOM[2] >> 4; //右移4次,高四位变为低四位
  95.         
  96.         if(IRCOM[5]>9)
  97.         {
  98.                 IRCOM[5]=IRCOM[5]+0x37;
  99.         }
  100.         else
  101.                 IRCOM[5]=IRCOM[5]+0x30;
  102.         
  103.         if(IRCOM[6]>9)
  104.         {
  105.                 IRCOM[6]=IRCOM[6]+0x37;
  106.         }
  107.         else
  108.                 IRCOM[6]=IRCOM[6]+0x30;
  109.         
  110.         q= (((IRCOM[6]&0x0f)<<4) + (IRCOM[5]&0x0f));
  111.         
  112.         switch(q) //判断按键键码值
  113.         {
  114.                 case 0x03:t++;if(t>=5)t=4;break; //串口发送01
  115.                 case 0x18:n=2;break; //串口发送02          M1=0;M2=1;M3=1;M4=0;break;
  116.                 case 0x55:t--;if(t<=0)t=0;break; //串口发送03
  117.                 case 0x08:n=4;break; //串口发送04          M1=0;M2=0;M3=1;M4=0;break;
  118.                 case 0x13:n=5;break; //串口发送05          M1=0;M2=1;M3=0;M4=0;break;
  119.                 case 0x51:n=6;break; //串口发送06
  120.                 case 0x52:n=8;break; //串口发送08          M1=0;M2=0;M3=0;M4=0;break;
  121.         }        
  122.         EX0 = 1;

  123. }

  124. /***************延时函数*****************************/
  125. void delay(unsigned char x) //x*0.14MS
  126. {
  127.         unsigned char i;
  128.         while(x--)
  129.         {
  130.                 for (i = 0; i<13; i++) {}
  131.         }
  132. }


  133. void motor()
  134. {
  135.         EN12=1;
  136.         EN34=1;
  137.         switch( n)
  138.         {
  139.          case 2: //前进
  140.                 M1=1;
  141.                 M2=0;
  142.                 M3=1;
  143.                 M4=0;
  144.                 break;

  145.         case 4: //左转
  146.                 M1=0;
  147.                 M2=0;
  148.                 M3=1;
  149.                 M4=0;
  150.                 break;
  151.         
  152.         case 6: //右转
  153.                 M1=1;
  154.                 M2=0;
  155.                 M3=0;
  156.                 M4=0;
  157.                 break;
  158.                
  159.         case 8: //后退
  160.                 M1=0;
  161.                 M2=1;
  162.                 M3=0;
  163.                 M4=1;
  164.                 break;
  165.                
  166.         case 5:
  167.                 EN12=0;
  168.                 EN34=0;
  169.                 break;
  170.         
  171.         default :break;
  172.         
  173.         }

  174. }

  175. /*******************************************************

  176. 函数功能:定时器T0的中断服务函数

  177. ********************************************************/

  178. void Time0(void ) interrupt 1 using 1 //定时器T0的中断编号为1,使用第1组工作寄存器 {
  179. {
  180.         count++; //T0每中断1次,count加1
  181.         if(count==20)        //若累计满20次,即计满1秒钟
  182.         {
  183.                 flag=1; //计满1秒钟标志位置1
  184.                 count=0; //清0,重新统计中断次数
  185.         }
  186.         TH0=(65536-46083)/256; //定时器T0高8位重新赋初值
  187.         TL0=(65536-46083)%256; //定时器T0低8位重新赋初值
  188. }

  189. void delay1(int ms)
  190. {
  191.         unsigned char y;
  192.         while(ms--)
  193.         {
  194.                 for(y = 0; y<250; y++)
  195.                 {
  196.                         _nop_();
  197.                         _nop_();
  198.                         _nop_();
  199.                         _nop_();
  200.                 }
  201.         }

  202. }

  203. //************************************************************
  204. void delayxms(uchar t)
  205. {
  206.         uint i;
  207.         uchar j;
  208.         for(j=t;j>0;j--)
  209.                 for(i=80;i>0;i--); //延时124*8+10=1002us
  210. }
复制代码



回复

使用道具 举报

ID:96682 发表于 2019-1-27 02:12 | 显示全部楼层
主要还是开发板上那电路与程序是配套的,与最小系统电路肯定不同
回复

使用道具 举报

ID:155507 发表于 2019-1-27 08:05 | 显示全部楼层
单片机程序是要针对相应的硬件环境的,原理图也不发,让大家猜扪嘛,
你是怎么接的?别人都一无所知,怎么帮你?
回复

使用道具 举报

ID:123289 发表于 2019-1-27 09:07 | 显示全部楼层
因为开发板做对了,最小系统有做错的地方。
回复

使用道具 举报

ID:368203 发表于 2019-1-27 20:14 | 显示全部楼层
这是最小系统的原理图:
最消.png

这是实物的接线图:
微信截图_20190127200807.png

最小系统的P1^0~P1^5,分别接的是L298N的IN1、IN2、IN3、IN4、ENA、ENB。
然后P3^2接的是红外线。
接法与我在开发板操作的适合基本相吻合(除了红外线,因为红外线在开发板是自带的)。
但是只要我直接在switch里面case中修改成M1=0,M2=1……小车是可以跑动的。

HC6800-ES V2.0 新版.pdf

759.71 KB, 下载次数: 4

开发板原理图

回复

使用道具 举报

ID:368203 发表于 2019-1-27 20:15 | 显示全部楼层
wc86110 发表于 2019-1-27 02:12
主要还是开发板上那电路与程序是配套的,与最小系统电路肯定不同

我怀疑可能是最小系统的定时器坏了,所以那个flag一直为0,就卡死在while循环里面,不知道有没有这个可能呢?
回复

使用道具 举报

ID:368203 发表于 2019-1-27 20:16 | 显示全部楼层
angmall 发表于 2019-1-27 08:05
单片机程序是要针对相应的硬件环境的,原理图也不发,让大家猜扪嘛,
你是怎么接的?别人都一无所知,怎么 ...

不好意思,昨天太晚上传了,没有弄完整。现在已经上传好了,请大神帮忙看看,谢谢!
回复

使用道具 举报

ID:368203 发表于 2019-1-27 20:17 | 显示全部楼层
yzwzfyz 发表于 2019-1-27 09:07
因为开发板做对了,最小系统有做错的地方。

可是我的接线引脚什么的,都是按着开发板那里照搬过去的,而且我看了下原理图,我也没发现最小系统的原理图跟开发板有差别,就让我很费解
回复

使用道具 举报

ID:368203 发表于 2019-1-28 18:33 | 显示全部楼层
有大神帮忙看看吗
回复

使用道具 举报

ID:504978 发表于 2019-12-19 15:03 | 显示全部楼层
你好,你的问题解决了吗?我也遇到了这种情况。
开发板上运行正常,能正常出方波,网上买的小系统板不行,就好像晶振没工作一样。
想着是不是电阻电容或者有哪地方不一样,或者哪个元件坏了。
又按照开发板的原理图,元件规格,组了一个小系统,结果还不行。
你最后发现什么问题了吗?
回复

使用道具 举报

ID:662518 发表于 2019-12-19 15:47 | 显示全部楼层
就一个程序,没法解决!
回复

使用道具 举报

ID:215444 发表于 2019-12-19 16:34 | 显示全部楼层
仔细看下 最下系统和开发板的晶振差别,看看晶振起振没
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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