久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3721|回復: 11
打印 上一主題 下一主題
收起左側

這個程序為何能在單片機開發板運行,卻不能在最小系統上運行?

[復制鏈接]
跳轉到指定樓層
樓主
要是將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. }
復制代碼



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

使用道具 舉報

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

使用道具 舉報

板凳
ID:155507 發表于 2019-1-27 08:05 | 只看該作者
單片機程序是要針對相應的硬件環境的,原理圖也不發,讓大家猜捫嘛,
你是怎么接的?別人都一無所知,怎么幫你?
回復

使用道具 舉報

地板
ID:123289 發表于 2019-1-27 09:07 | 只看該作者
因為開發板做對了,最小系統有做錯的地方。
回復

使用道具 舉報

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


這是實物的接線圖:


最小系統的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

開發板原理圖

回復

使用道具 舉報

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

我懷疑可能是最小系統的定時器壞了,所以那個flag一直為0,就卡死在while循環里面,不知道有沒有這個可能呢?
回復

使用道具 舉報

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

不好意思,昨天太晚上傳了,沒有弄完整。現在已經上傳好了,請大神幫忙看看,謝謝!
回復

使用道具 舉報

8#
ID:368203 發表于 2019-1-27 20:17 | 只看該作者
yzwzfyz 發表于 2019-1-27 09:07
因為開發板做對了,最小系統有做錯的地方。

可是我的接線引腳什么的,都是按著開發板那里照搬過去的,而且我看了下原理圖,我也沒發現最小系統的原理圖跟開發板有差別,就讓我很費解
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

11#
ID:662518 發表于 2019-12-19 15:47 | 只看該作者
就一個程序,沒法解決!
回復

使用道具 舉報

12#
ID:215444 發表于 2019-12-19 16:34 | 只看該作者
仔細看下 最下系統和開發板的晶振差別,看看晶振起振沒
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久精品福利视频 | 黄色毛片免费视频 | 欧美精品一区二区三区一线天视频 | 久久久久久中文字幕 | 国产精品视频一区二区三区 | 国产精品久久久久久久久久久久午夜片 | 老牛影视av一区二区在线观看 | 国产精品日韩欧美一区二区 | 丝袜 亚洲 另类 欧美 综合 | 一区二区三区在线免费观看 | 国内精品视频在线观看 | 三级成人在线观看 | 91伊人| 一区二区在线不卡 | 国产在线精品一区二区三区 | av永久免费 | 午夜天堂精品久久久久 | 中文字幕一区二区三区在线观看 | av喷水 | www.久久.com| 国产亚洲二区 | 网络毛片| 久久亚洲国产 | 日本人爽p大片免费看 | 亚洲狠狠| 国产成人免费视频 | 国产精品精品视频一区二区三区 | 欧美老少妇一级特黄一片 | 欧美日在线 | 国产免费国产 | 人人爽人人爽人人片av | 中文字幕精品一区二区三区精品 | 亚洲精品久久国产高清情趣图文 | 日韩欧美在线视频 | 日本在线观看网址 | 久久最新| 中文字幕视频在线 | 精区3d动漫一品二品精区 | 国产精品久久久久久久久久久久 | 免费精品国产 | 激情欧美一区二区三区中文字幕 |