找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1691|回復: 4
打印 上一主題 下一主題
收起左側(cè)

單片機IAP15F2K61S2型號超聲波設(shè)計 加一個按鍵的功能但一直調(diào)試不好

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1101599 發(fā)表于 2023-11-28 17:15 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
我做了快一個月的超聲波設(shè)計,想在超聲波的基礎(chǔ)上再加一個按鍵的功能但一直調(diào)試不好,以下是源代碼,請大家?guī)兔纯词悄睦镉袉栴}

單片機源程序如下:
  1. #include <REGX52.H>
  2. #include "intrins.h"
  3. sbit buzz=P0^6;
  4. sbit TX = P1^0;
  5. sbit RX = P1^1;
  6. sbit S7 = P3^0;
  7. sfr P4    = 0xC0;
  8. unsigned char code SMG_duanma[] = {0xc0,0xf9,0xa4,0xb0,
  9.                                    0x99,0x92,0x82,0xf8,
  10.                                    0x80,0x90,0x88,0x83,
  11.                                    0xc6,0xa1,0x86,0x8e,
  12.                                    0xbf};

  13. unsigned char Segbuff[] = {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
  14. unsigned int distance = 0;
  15. bit flag = 0;

  16. void Delay12us(void)        
  17. {
  18.         unsigned char data i;

  19.         _nop_();
  20.         _nop_();
  21.         i = 33;
  22.         while (--i);
  23. }

  24. void DelayK(unsigned char t)
  25. {
  26.         while(t--);
  27. }

  28. void SelectHC573(unsigned char channel)
  29. {
  30.         switch(channel)
  31.         {
  32.                 case 0 : P2 = (P2 & 0X1F) | 0X00;break;
  33.                 case 4 : P2 = (P2 & 0X1F) | 0X80;break;
  34.                 case 5 : P2 = (P2 & 0X1F) | 0Xa0;break;
  35.                 case 6 : P2 = (P2 & 0X1F) | 0Xc0;break;
  36.                 case 7 : P2 = (P2 & 0X1F) | 0Xe0;break;
  37.         }
  38. }

  39. void InitSystem()
  40. {
  41.         SelectHC573(5);
  42.         P0 = 0x00;
  43.         SelectHC573(4);
  44.         P0 = 0xFF;
  45.         SelectHC573(0);
  46. }

  47. void DispalySMG_Bit(unsigned char pos, unsigned char dat)
  48. {
  49.         SelectHC573(7);
  50.         P0 = 0xff;
  51.         SelectHC573(6);
  52.         P0 = 0x01 << pos;        
  53.         SelectHC573(0);
  54.         P0 = 0xff;        
  55.         SelectHC573(7);
  56.         P0 = dat;        
  57. SelectHC573(0);
  58. }

  59. void Timer1_Init()
  60. {
  61.         TMOD = 0X00;
  62.         TH1 = (65536 - 1000) / 256;
  63.         TL1 = (65536 - 1000) % 256;
  64.         EA = 1;
  65.         ET1 = 1;
  66.         TR1 = 1;
  67. }

  68. void Measure_Distance()
  69. {
  70.         unsigned char num = 10;
  71.         unsigned int time = 0;
  72.         
  73.         TMOD &= 0xf0;
  74.   TH0 = (65536 - 13) / 256;
  75.         TL0 = (65536 - 13) % 256;
  76.         TR0 = 1;
  77.         TX = 0;
  78.         while(num--)
  79.         {
  80.                 while(TF0 == 0);
  81.                 TX = ~TX;
  82.                 TF0 = 0;               
  83.         }

  84.         TR0 = 0;
  85.         TL0 = 0;
  86.   TH0 = 0;
  87.   TR0 = 1;
  88.         while((RX == 1) && (TF0 == 0));   
  89.         TR0 = 0;                                
  90.         if(TF0 == 0)                                                                  
  91.         {
  92.                 time = TH0;                                                                        
  93.                 time = (time << 8) | TL0;               
  94.                 distance = time*0.017;
  95.         }
  96.         else                                       
  97.         {
  98.                 TF0 = 0;
  99.                 distance = 999;
  100.         }
  101. }

  102. void Display_Distance()
  103. {
  104.         if(distance == 999)
  105.         {
  106.                 Segbuff[0] = 0xff;                        
  107.                 Segbuff[1] = 0xff;
  108.                 Segbuff[2] = 0xff;
  109.                 Segbuff[3] = 0xff;
  110.                 Segbuff[4] = 0xff;
  111.                 Segbuff[5] = SMG_duanma[9];
  112.                 Segbuff[6] = SMG_duanma[9];
  113.                 Segbuff[7] = SMG_duanma[9];
  114.                 P2=(P2&0x1f)|0xa0;
  115.                 buzz=1;
  116.         }
  117.         else
  118.         {
  119.                 P2=(P2&0x1f)|0xa0;
  120.                 buzz=0;
  121.                 Segbuff[0] = 0xff;               
  122.                 Segbuff[1] = 0xff;
  123.                 Segbuff[2] = 0xff;
  124.                 Segbuff[3] = 0xff;
  125.                 Segbuff[4] = 0xff;
  126.                 Segbuff[5] = SMG_duanma[distance / 100];
  127.                 Segbuff[6] = SMG_duanma[(distance % 100) / 10];
  128.                 Segbuff[7] = SMG_duanma[distance % 10];
  129.                
  130.         }
  131. }

  132. void ScanKeys_Alone()
  133. {         
  134.         if(S7==0)
  135.         {
  136.           DelayK(100);
  137.                 if(S7==0)
  138.                 {
  139.                         InitSystem();
  140.             Timer1_Init();
  141.               if(flag)
  142.               {
  143.                       Measure_Distance();
  144.                       flag = 0;
  145.               }
  146.           Display_Distance();
  147.                   while(S7==0);
  148.                                 TX = 1;
  149.           }
  150.         }
  151. }

  152. void Timer1_Service() interrupt 3
  153. {
  154.         
  155.   static unsigned char pos = 0;
  156.         static unsigned char t_1ms = 0;
  157.         t_1ms++;
  158.   switch(pos)
  159.         {
  160.                 case 0 : DispalySMG_Bit(pos, Segbuff[0]);pos++;P0 = 0XFF;break;
  161.                 case 1 : DispalySMG_Bit(pos, Segbuff[1]);pos++;P0 = 0XFF;break;
  162.                 case 2 : DispalySMG_Bit(pos, Segbuff[2]);pos++;P0 = 0XFF;break;
  163.                 case 3 : DispalySMG_Bit(pos, Segbuff[3]);pos++;P0 = 0XFF;break;
  164.                 case 4 : DispalySMG_Bit(pos, Segbuff[4]);pos++;P0 = 0XFF;break;
  165.                 case 5 : DispalySMG_Bit(pos, Segbuff[5]);pos++;P0 = 0XFF;break;
  166.                 case 6 : DispalySMG_Bit(pos, Segbuff[6]);pos++;P0 = 0XFF;break;
  167.                 case 7 : DispalySMG_Bit(pos, Segbuff[7]);pos = 0;P0 = 0XFF;break;
  168.         }
  169.         if(t_1ms == 200)
  170.         {flag = 1;t_1ms = 0;}
  171. }

  172. void main()
  173. {
  174.   P2=(P2&0x1f)|0xa0;
  175. buzz=0;
  176.         while(1)
  177.         {
  178.                 ScanKeys_Alone();
  179.         }
  180. }
復制代碼

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

使用道具 舉報

沙發(fā)
ID:235200 發(fā)表于 2023-11-28 21:27 | 只看該作者
是使用超聲波模塊嗎?如果是,TX只需觸發(fā)一下,程序中就不應(yīng)該有TX = ~TX;,如果不是采用模塊,發(fā)射超聲波建議用定時中斷產(chǎn)生
回復

使用道具 舉報

板凳
ID:213173 發(fā)表于 2023-11-28 21:34 | 只看該作者
超聲波應(yīng)用范圍很廣,你沒說目標功能,也沒有電路圖。單從你的程序看不出什么所以然。寫法怪怪的,又沒有任何注釋,神仙也幫不了你。
回復

使用道具 舉報

地板
ID:161164 發(fā)表于 2023-11-29 10:42 | 只看該作者

回復

使用道具 舉報

5#
ID:1019324 發(fā)表于 2023-12-4 14:02 | 只看該作者
15單片機可以看看藍橋杯單片機的源碼仿著那個寫
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表