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

QQ登錄

只需一步,快速開始

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

51單片機(jī)使用外部中斷0切換使用模式但是不成功,求大佬幫忙看一下

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:349989 發(fā)表于 2020-3-21 17:52 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
5黑幣
RT最近在做一個(gè)小制作,用單片機(jī)設(shè)計(jì)一個(gè)時(shí)鐘,我用外部中斷0做了一個(gè)模式切換的功能,每按一下中斷觸發(fā)鍵就可以使變量mod加一。其他兩個(gè)模式(時(shí)鐘調(diào)整,鬧鐘調(diào)整)都能正常的切換,但是最后一個(gè)利用串口連接手機(jī)校準(zhǔn)時(shí)間的模式無法正常切換,進(jìn)去就卡在那里切不出去,實(shí)在是不知道為什么了,麻煩大佬幫我看一眼,多謝!代碼寫的少,可能寫的很不好,如果有建議希望大佬多指教!
為了閱讀方便我刪去了前兩個(gè)模式的代碼,用定時(shí)器0來生成秒,send函數(shù)和receive函數(shù)利用了定時(shí)器1來生成波特率,串口校準(zhǔn)模式的設(shè)計(jì)思路是先發(fā)送一個(gè)“1”給手機(jī),再接收手機(jī)發(fā)送的“1”,確定連接建立后再接收手機(jī)發(fā)送的數(shù)據(jù)。因?yàn)槭謾C(jī)端的開發(fā)還沒做完,所以暫時(shí)測試只用來校準(zhǔn)hour

單片機(jī)源程序如下:
  1. #include<reg52.h>

  2. typedef unsigned int u16;      //對(duì)數(shù)據(jù)類型進(jìn)行聲明定義
  3. typedef unsigned char u8;

  4. #define data8b P0

  5. sbit K1=P3^2;               //外部中斷0
  6. sbit K2=P3^3;               //外部中斷1
  7. sbit K3=P3^4;
  8. sbit K4=P3^5;
  9. sbit p=PSW^0;
  10. sbit RW=P2^1;        //4腳,數(shù)據(jù)(1)or命令(0)
  11. sbit RS=P2^0;        //5腳,讀(1)寫(0)
  12. sbit E=P2^2;         //6腳,使能信號(hào)

  13. u8 code dat1[]={0X30,0X31,0X32,0X33,
  14.                                    0X34,0X35,0X36,0X37,
  15.                                    0X38,0X39};
  16.                                             //LCD1602字符

  17.                                                                  
  18. u8 min=0,hour=0;              //時(shí)間初始化
  19. u16 i=0;
  20. u8 s=0;
  21. u8 mod=0;                         //mod初值
  22. bit signal=0;                       //發(fā)送                                          
  23. u8 temp=0;

  24.                     
  25.                                                                  

  26. void delay(u16 i)      //延時(shí)函數(shù)
  27. {
  28.     while(i--);
  29. }

  30. void open012()   //打開中斷0,1,定時(shí)器中斷0
  31. {
  32.     TMOD|=0X01;   //選擇為定時(shí)器0模式,工作方式1
  33.   
  34.     ET0=1;        //打開定時(shí)器0中斷允許
  35.     EA=1;        //打開總中斷
  36.     TR0=1;       //打開定時(shí)器            
  37.     EX0=1;              //打開外部中斷0
  38.     IT0=1;             //邊沿觸發(fā)方式
  39.     EX1=1;              //打開外部中斷1
  40.     IT1=1;             //邊沿觸發(fā)
  41.   
  42. }


  43. void wrm(u8 dat)              //寫入命令
  44. {
  45.     delay(1000);
  46.     RS=0;
  47.     RW=0;
  48.     E=0;
  49.     data8b=dat;
  50.     E=1;
  51.     delay(1000);
  52.     E=0;
  53. }


  54. void wrd(u8 dat)             //寫入數(shù)據(jù)
  55. {
  56.     delay(1000);
  57.     RS=1;
  58.     RW=0;
  59.     E=0;
  60.     data8b=dat;
  61.     E=1;
  62.     delay(1000);
  63.     E=0;
  64. }

  65. void init()                  //LCD初始化
  66. {
  67.     wrm(0X38);                 //八位數(shù)據(jù),兩行顯示,5*7
  68.     wrm(0X0c);                  //無光標(biāo),打開顯示
  69.     wrm(0X06);                  //光標(biāo)右移,屏幕不移動(dòng)
  70.     wrm(0X01);                  //清屏
  71.     wrm(0X80);                  //設(shè)置數(shù)據(jù)指針起點(diǎn)
  72. }



  73. void display()
  74. {
  75.   wrd(dat1[hour/10]);                 //時(shí)十位
  76.     wrd(dat1[hour%10]);                 //時(shí)個(gè)位
  77.     wrd(0x3A);                     //:
  78.     wrd(dat1[min/10]);                 //分十位
  79.     wrd(dat1[min%10]);                 //分個(gè)位
  80.     wrd(0x3A);                     //:
  81.     wrd(dat1[(s/10)]);                 //秒十
  82.     wrd(dat1[(s%10)]);                 //秒個(gè)
  83. }


  84.      //秒個(gè)

  85. void chuli()                                  //處理進(jìn)位
  86. {
  87.     if(min==60)
  88.     {
  89.         hour++;
  90.         min=0;
  91.     }

  92.     if(hour==24)
  93.     {
  94.    
  95.         hour=0;
  96.     }
  97.    
  98.     if(s==60)
  99.     {
  100.         min++;
  101.         s=0;
  102.     }
  103.    
  104. }

  105. void send()                                    //發(fā)送函數(shù),定時(shí)器T1為方式2,串口為方式3,波特率9600,采用偶校驗(yàn)
  106. {
  107.     TMOD=0x20;
  108.     SCON=0xc0;
  109.     PCON=0x00;
  110.     TH1=0xfd;
  111.     TL1=0xfd;
  112.     TB8=P;
  113.     SBUF=1;
  114.     while(TI==0);
  115.     ;
  116.     TI==0;
  117. }

  118. u8 receive()                             //接收函數(shù)
  119. {
  120.     u8 dat;
  121.     TMOD=0x20;
  122.     SCON=0xd0;
  123.     PCON=0x00;
  124.     TH1=0xfd;
  125.     TL1=0xfd;
  126.     TR1=1;
  127.     REN=1;
  128.    
  129.     while(RI==0);
  130.     ;
  131.     RI==0;
  132.     ACC=SBUF;
  133.     if(RB8==P)
  134.     {
  135.         dat=ACC;
  136.         return dat;
  137.     }
  138. }

  139. void dis_string(u8 *pp, u16 n)                  //顯示字符串的函數(shù)
  140. {
  141.     int i;
  142.     for (i=0;i<n;i++)
  143.     wrd(pp[i]);
  144. }

  145. u8 p1[]="connecting";
  146. u8 p2[]="OK!";
  147. u8 p3[]="over";



  148. void main()
  149. {
  150.     IP=1;
  151.     open012();
  152.     init();
  153.     chuli();
  154.     display();
  155.    
  156.    
  157.    
  158.    
  159.     while(1)
  160.     {
  161.         while(mod==0)
  162.     {
  163.         EX1=1;              //打開外部中斷1
  164.         chuli();
  165.         wrm(0x80);
  166.         display();
  167.     }
  168.    
  169.         
  170.         
  171.         
  172.         while(mod==1)
  173.         {
  174.             init();
  175.             EX1=0;
  176.             TR0=0;
  177.             TR1=1;
  178.             dis_string(p1,10);                            //輸出字符connecting
  179.             wrm(0x80+0x40);                                    //換行   
  180.             send();
  181.             delay(1000);
  182.             signal=receive();
  183.             while(1)
  184.             {
  185.                 if(signal=1)
  186.                 {
  187.                     dis_string(p2,3);                        //如果標(biāo)志位=1,則連接成功,輸出ok;如果標(biāo)志位為0,則繼續(xù)接收
  188.                     break;   
  189.                 }
  190.             
  191.                 else if(signal=0)
  192.                 {
  193.                     signal=receive();
  194.                 }
  195.             }
  196.             send();
  197.             temp=receive();                                 //將接受數(shù)據(jù)裝入temp中并賦給hour;
  198.             hour=temp;
  199.             init();
  200.             if(temp!=0)
  201.             {
  202.                 dis_string(p3,4);                             //輸出over
  203.                 delay(1000);
  204.             }
  205.             
  206.                                              
  207.             TR1=0;
  208.             
  209.             }
  210.             }
  211.     }
  212.    

  213.    
  214.    
  215.             
  216.             

  217. void time0() interrupt 1
  218. {
  219.    TH0=0XFC;         //給定時(shí)器賦初值,定時(shí)1ms
  220.      TL0=0X18;
  221.      i++;
  222.      if(i==1000)     //ms轉(zhuǎn)化為s
  223.      {
  224.         i=0;
  225.          s++;
  226.         
  227.      }   
  228. }

  229. void key1() interrupt 0     //外部中斷0,切換模式
  230. {
  231.     EX0=0;
  232.     delay(1000);
  233.     if(K1==0)
  234.       {
  235.             
  236.           mod++;
  237.             while(!K1);
  238.       }

  239. if(mod>1)
  240. {
  241.     mod=0;
  242. }
  243.     EX0=1;
  244. }
復(fù)制代碼

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

使用道具 舉報(bào)

沙發(fā)
ID:235200 發(fā)表于 2020-3-21 21:15 | 只看該作者
所謂卡在那里是程序沒有應(yīng)答你的輸入還是根本不知道程序運(yùn)行到了哪里?仿真調(diào)試可能是串口被占用,燒錄運(yùn)行肯定是程序有BUG
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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