找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 936|回复: 4
收起左侧

单片机IAP15F2K61S2型号超声波设计 加一个按键的功能但一直调试不好

[复制链接]
ID:1101599 发表于 2023-11-28 17:15 | 显示全部楼层 |阅读模式
我做了快一个月的超声波设计,想在超声波的基础上再加一个按键的功能但一直调试不好,以下是源代码,请大家帮忙看看是哪里有问题

单片机源程序如下:
  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. }
复制代码

回复

使用道具 举报

ID:235200 发表于 2023-11-28 21:27 | 显示全部楼层
是使用超声波模块吗?如果是,TX只需触发一下,程序中就不应该有TX = ~TX;,如果不是采用模块,发射超声波建议用定时中断产生
回复

使用道具 举报

ID:213173 发表于 2023-11-28 21:34 | 显示全部楼层
超声波应用范围很广,你没说目标功能,也没有电路图。单从你的程序看不出什么所以然。写法怪怪的,又没有任何注释,神仙也帮不了你。
回复

使用道具 举报

ID:161164 发表于 2023-11-29 10:42 | 显示全部楼层
2023-11-29_100104.png
回复

使用道具 举报

ID:1019324 发表于 2023-12-4 14:02 | 显示全部楼层
15单片机可以看看蓝桥杯单片机的源码仿着那个写
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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