找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1263|回复: 0
打印 上一主题 下一主题
收起左侧

带串口通讯的单片机超声波测距仪程序与原理图 vb6上位机

[复制链接]
跳转到指定楼层
楼主


单片机源程序如下:
  1. #include <AT89X52.H>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. uchar dispbuf[4]={0,0,0,0};
  5. unsigned long L;
  6. uchar code table0[]={0xA0,0xBB,0x62,0x2A,0x39,0x2C,0x24,0xBA,
  7.                           0x20,0x28,0x30,0x25,0xE4,0x23,0x64,0x74};
  8. /*超声波定义*/
  9. sbit FS=P1^0; //发射端口
  10. uchar t,comkou;
  11. uint display;

  12. /**************************************************
  13. //延时子函数
  14. **************************************************/
  15. void delay100us(void)        //延时子函数
  16. {
  17. uchar i,j;
  18. for(i=40;i>0;i--)
  19.    for(j=248;j>0;j--);
  20. }

  21. void csfs(void)    //超声波发送
  22. {
  23.         uchar times=0;
  24.         while(TF0==0) // TF1定时器1 溢出标志位          使用查询法
  25.         {
  26.                 uchar j;
  27.                 for(j=12;j>0;j--);  //延时                                
  28.                 FS=~FS;
  29.                 times++;  //翻转20次,发送10个脉冲信号的超声波
  30.                 TF0=0;
  31.                 if(times==10) break;
  32.         }
  33.         times=0;
  34.         TH0=0x00;
  35.         TL0=0x00;
  36.         EX0=1;    //外部中断0允许中断位
  37.         TR0=1;    //开定时器1
  38.         ET0=1;    //定时器T1中断允许位
  39.         delay100us();
  40. }
  41. /*
  42. 发送的数据以厘米为单位,测量的距离为1000CM所以一个八位的二进制不够的,
  43. 在此使用的是两个16进制的数,但是发送一个数据要有起始位,如果使用BCD码
  44. 则可以把起始位为0xff,之后的数据分别传送个位,十位,百位,这样的话标志
  45. 位一个就可以了。但是由于数据比较少,标志位定义为两个oxff,和0xf0,只要
  46. 上位机检测到起始的两个16进制的数为0xfff0,则后面的两个为则是传送的数据,
  47. 因为传送的值十进制最大为1000  ,则数据为不可能出现0xfff0;所以在发送数据
  48. 之前先发送0xfff0作为起始标志
  49. */
  50. void fasong(uint juli)
  51. {
  52.         SBUF=0xff;                          //标志位
  53.         while(TI==0);
  54.         TI=0;
  55.         SBUF=0xf0;                          //标志位
  56.         while(TI==0);
  57.         TI=0;
  58.         SBUF=juli/255;                   //数据的高八位
  59.         while(TI==0);
  60.         TI=0;
  61.         SBUF=juli%255;                  //数据的低八位
  62.         while(TI==0);
  63.         TI=0;
  64. }
  65. /***********************************************
  66. //初始化程序
  67. ***********************************************/   
  68. void init()
  69. {
  70.         TMOD=0x21; //设置定时器0和1为工作方式1(及16位定时器/计数器)
  71.         T2MOD=0x00; /*定时器2为工作模式 */
  72.         T2CON=0x04; /*定时器2为16位自动重装定时工作模式,  TR2=1 */
  73.         SCON  = 0x50;//
  74.         PCON=0x80;         //波特率加倍
  75.         TH1   = 0xF4;       //波特率:4800  11.0592MHz
  76.     IE   |= 0x90;       //开中断
  77.     TR1   = 1;                         //启动T1


  78.         RCAP2L=(65536-4000)%256;//给定时器T2装初值,计满后把RCAP2L和RCAP2H自动装入TH0,,TL0;;;;
  79.         RCAP2H=(65536-4000)/256;
  80.         TH0=0x00;
  81.         TL0=0x00;

  82.         IT1=1;      //边沿触发方式        
  83.         
  84.         ET0=1;                //开定时器1中断
  85.         ET2=1;                //开定时器2中断
  86.         EX0=1;
  87.         TR0=1;                //启动定时器1
  88.         TR2=1;      //定时器2,启动定时器2,过了
  89.         EA=1;       //开总中断
  90. }


  91. /***************************************************
  92. //主函数
  93. ***************************************************/
  94. void main(void)
  95. {        
  96.         init();                          //初始化
  97.         while(1)                 //程序在这里不停地扫描同时等待中断发生
  98.         {
  99.                 csfs();            //超声波发送
  100.                 dispbuf[0]=display/1000;//更新数码管显示缓冲区           
  101.                 dispbuf[1]=display%1000/100;
  102.                 dispbuf[2]=display%1000%100/10;
  103.                 dispbuf[3]=display%1000%100%10;
  104.         }
  105.         
  106. }


  107. void int0(void) interrupt 0 using 0 //超声波接收中断程序
  108. {
  109. //        float v;
  110.         unsigned long time;
  111.         EX0=0; //关闭超声波接收
  112.         TR0=0;//关定时器T0
  113.         ET0=0;//中断关闭
  114.         time=TH0*256+TL0; //算出t的值,t的单位为us
  115.         time=(int)time*0.9216;
  116.         L=(time+240)*345;                  //计算出距离,240是发射超声波所用的时间
  117.         L=L/10000;                                  //将距离转化为以厘米为单位
  118.         TH0=0x00;                                  //定时器清零
  119.         TL0=0x00;

  120. }

  121. void t0(void) interrupt 1 using 0 //超时中断程序//
  122. {

  123.         EX0=0;
  124.         TR0=0;//关定时器//
  125.         ET0=0;// 中断关闭
  126.         TH0=0x00;
  127.         TL0=0x00;
  128. }

  129. void t2(void) interrupt 5
  130. {
  131.         uchar i;
  132.         uint a[3];

  133.         RCAP2L=(65536-4000)%256; //给定时器T2装初值,计满后把RCAP2L和RCAP2H自动装入TH2,TL2
  134.         RCAP2H=(65536-4000)/256;
  135.           TF2=0;                        //T2定时器必须用软件清0
  136.          t++;
  137.         comkou++;
  138.         if(comkou==20)
  139.         {
  140.                 a[i]=L;        //距离赋a[i]
  141.                 comkou=0;
  142.                 i++;
  143.                 if(i==4)
  144.                 {
  145.                         i=0;
  146.                         display=(a[0]+a[1]+a[2])/3;        //数字平均滤波
  147.                         fasong(display);                        //测量距离发送上位机
  148.                 }               
  149.         }
  150.         if(t==5) t=1;//数码管显示一遍,重新开始
  151.         switch(t) //数码管显示
  152.         {
  153.                 case 1:  P0=table0[dispbuf[0]];  P2=0xfe;  break;        //分离出距离的千位,并在第一位数码管上显示
  154.                 case 2:  P0=table0[dispbuf[1]];  P2=0xfb;  break;   //分离出距离的百位,并在第二位数码管上显示
  155.                 case 3:  P0=table0[dispbuf[2]];  P2=0xf7;  break;        //分离出距离的十位,并在第三位数码管上显示
  156.                 case 4:  P0=table0[dispbuf[3]];  P2=0xfd;  break;        //分离出距离的个位,并在第四位数码管上显示
  157.         }
  158. }         
复制代码

上图PCB还未完成

下面是代码和原理图下载,大家一起完善:
资料.7z (475.17 KB, 下载次数: 25)

评分

参与人数 1黑币 +10 收起 理由
admin + 10 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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