找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3770|回復(fù): 11
打印 上一主題 下一主題
收起左側(cè)

這個(gè)程序?yàn)楹文茉趩纹瑱C(jī)開發(fā)板運(yùn)行,卻不能在最小系統(tǒng)上運(yùn)行?

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
要是將switch里面的語(yǔ)句改成注釋后的那種形式,就可以在最小系統(tǒng)上運(yùn)行。
但是在單片機(jī)開發(fā)板上是根本不需要改動(dòng)的,不知道為什么了。我的猜想是不是最小系統(tǒng)的定時(shí)器沒(méi)有工作,所以flag始終為0?

單片機(jī)程序如下:
  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; //紅外接收器數(shù)據(jù)線

  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; //觸發(fā)方式為脈沖負(fù)邊沿觸發(fā)
  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. //確認(rèn)IR信號(hào)出現(xiàn)
  58.         while (!IRIN) //等IR變?yōu)楦唠娖,跳過(guò)9ms的前導(dǎo)低電平信號(hào)。
  59.                 delay(1);


  60.         for (j=0;j<4;j++) //收集四組數(shù)據(jù)
  61.         {
  62.                 for (k=0;k<8;k++) //每組數(shù)據(jù)有8位
  63.                 {
  64.                         while (IRIN)
  65.                         {delay(1);} //等 IR 變?yōu)榈碗娖剑^(guò)4.5ms的前導(dǎo)高電平信號(hào)。 {delay(1);}
  66.                         while (!IRIN) //等 IR 變?yōu)楦唠娖?br />
  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計(jì)數(shù)過(guò)長(zhǎng)自動(dòng)離開。
  77.                         } //高電平計(jì)數(shù)完畢
  78.                         IRCOM[j]=IRCOM[j] >> 1; //數(shù)據(jù)最高位補(bǔ)“0”
  79.                         if(N>=8)
  80.                         {
  81.                                 IRCOM[j] = IRCOM[j] | 0x80; //數(shù)據(jù)最高位補(bǔ)“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次,高四位變?yōu)榈退奈?br />
  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; //串口發(fā)送01
  115.                 case 0x18:n=2;break; //串口發(fā)送02          M1=0;M2=1;M3=1;M4=0;break;
  116.                 case 0x55:t--;if(t<=0)t=0;break; //串口發(fā)送03
  117.                 case 0x08:n=4;break; //串口發(fā)送04          M1=0;M2=0;M3=1;M4=0;break;
  118.                 case 0x13:n=5;break; //串口發(fā)送05          M1=0;M2=1;M3=0;M4=0;break;
  119.                 case 0x51:n=6;break; //串口發(fā)送06
  120.                 case 0x52:n=8;break; //串口發(fā)送08          M1=0;M2=0;M3=0;M4=0;break;
  121.         }        
  122.         EX0 = 1;

  123. }

  124. /***************延時(shí)函數(shù)*****************************/
  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: //前進(jìn)
  140.                 M1=1;
  141.                 M2=0;
  142.                 M3=1;
  143.                 M4=0;
  144.                 break;

  145.         case 4: //左轉(zhuǎn)
  146.                 M1=0;
  147.                 M2=0;
  148.                 M3=1;
  149.                 M4=0;
  150.                 break;
  151.         
  152.         case 6: //右轉(zhuǎn)
  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. 函數(shù)功能:定時(shí)器T0的中斷服務(wù)函數(shù)

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

  178. void Time0(void ) interrupt 1 using 1 //定時(shí)器T0的中斷編號(hào)為1,使用第1組工作寄存器 {
  179. {
  180.         count++; //T0每中斷1次,count加1
  181.         if(count==20)        //若累計(jì)滿20次,即計(jì)滿1秒鐘
  182.         {
  183.                 flag=1; //計(jì)滿1秒鐘標(biāo)志位置1
  184.                 count=0; //清0,重新統(tǒng)計(jì)中斷次數(shù)
  185.         }
  186.         TH0=(65536-46083)/256; //定時(shí)器T0高8位重新賦初值
  187.         TL0=(65536-46083)%256; //定時(shí)器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--); //延時(shí)124*8+10=1002us
  210. }
復(fù)制代碼



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

使用道具 舉報(bào)

沙發(fā)
ID:96682 發(fā)表于 2019-1-27 02:12 | 只看該作者
主要還是開發(fā)板上那電路與程序是配套的,與最小系統(tǒng)電路肯定不同
回復(fù)

使用道具 舉報(bào)

板凳
ID:155507 發(fā)表于 2019-1-27 08:05 | 只看該作者
單片機(jī)程序是要針對(duì)相應(yīng)的硬件環(huán)境的,原理圖也不發(fā),讓大家猜捫嘛,
你是怎么接的?別人都一無(wú)所知,怎么幫你?
回復(fù)

使用道具 舉報(bào)

地板
ID:123289 發(fā)表于 2019-1-27 09:07 | 只看該作者
因?yàn)殚_發(fā)板做對(duì)了,最小系統(tǒng)有做錯(cuò)的地方。
回復(fù)

使用道具 舉報(bào)

5#
ID:368203 發(fā)表于 2019-1-27 20:14 | 只看該作者
這是最小系統(tǒng)的原理圖:


這是實(shí)物的接線圖:


最小系統(tǒng)的P1^0~P1^5,分別接的是L298N的IN1、IN2、IN3、IN4、ENA、ENB。
然后P3^2接的是紅外線。
接法與我在開發(fā)板操作的適合基本相吻合(除了紅外線,因?yàn)榧t外線在開發(fā)板是自帶的)。
但是只要我直接在switch里面case中修改成M1=0,M2=1……小車是可以跑動(dòng)的。

HC6800-ES V2.0 新版.pdf

759.71 KB, 下載次數(shù): 4

開發(fā)板原理圖

回復(fù)

使用道具 舉報(bào)

6#
ID:368203 發(fā)表于 2019-1-27 20:15 | 只看該作者
wc86110 發(fā)表于 2019-1-27 02:12
主要還是開發(fā)板上那電路與程序是配套的,與最小系統(tǒng)電路肯定不同

我懷疑可能是最小系統(tǒng)的定時(shí)器壞了,所以那個(gè)flag一直為0,就卡死在while循環(huán)里面,不知道有沒(méi)有這個(gè)可能呢?
回復(fù)

使用道具 舉報(bào)

7#
ID:368203 發(fā)表于 2019-1-27 20:16 | 只看該作者
angmall 發(fā)表于 2019-1-27 08:05
單片機(jī)程序是要針對(duì)相應(yīng)的硬件環(huán)境的,原理圖也不發(fā),讓大家猜捫嘛,
你是怎么接的?別人都一無(wú)所知,怎么 ...

不好意思,昨天太晚上傳了,沒(méi)有弄完整,F(xiàn)在已經(jīng)上傳好了,請(qǐng)大神幫忙看看,謝謝!
回復(fù)

使用道具 舉報(bào)

8#
ID:368203 發(fā)表于 2019-1-27 20:17 | 只看該作者
yzwzfyz 發(fā)表于 2019-1-27 09:07
因?yàn)殚_發(fā)板做對(duì)了,最小系統(tǒng)有做錯(cuò)的地方。

可是我的接線引腳什么的,都是按著開發(fā)板那里照搬過(guò)去的,而且我看了下原理圖,我也沒(méi)發(fā)現(xiàn)最小系統(tǒng)的原理圖跟開發(fā)板有差別,就讓我很費(fèi)解
回復(fù)

使用道具 舉報(bào)

9#
ID:368203 發(fā)表于 2019-1-28 18:33 | 只看該作者
有大神幫忙看看嗎
回復(fù)

使用道具 舉報(bào)

10#
ID:504978 發(fā)表于 2019-12-19 15:03 | 只看該作者
你好,你的問(wèn)題解決了嗎?我也遇到了這種情況。
開發(fā)板上運(yùn)行正常,能正常出方波,網(wǎng)上買的小系統(tǒng)板不行,就好像晶振沒(méi)工作一樣。
想著是不是電阻電容或者有哪地方不一樣,或者哪個(gè)元件壞了。
又按照開發(fā)板的原理圖,元件規(guī)格,組了一個(gè)小系統(tǒng),結(jié)果還不行。
你最后發(fā)現(xiàn)什么問(wèn)題了嗎?
回復(fù)

使用道具 舉報(bào)

11#
ID:662518 發(fā)表于 2019-12-19 15:47 | 只看該作者
就一個(gè)程序,沒(méi)法解決!
回復(fù)

使用道具 舉報(bào)

12#
ID:215444 發(fā)表于 2019-12-19 16:34 | 只看該作者
仔細(xì)看下 最下系統(tǒng)和開發(fā)板的晶振差別,看看晶振起振沒(méi)
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表