圣源电子制作

标题: 超声波测距-CX20106-CD4069-原理图-PCB-C语言程序-C51 [打印本页]

作者: sydz    时间: 2011-10-13 16:53
标题: 超声波测距-CX20106-CD4069-原理图-PCB-C语言程序-C51
转载自互联网!!!
原理图
(, 下载次数: 86)
PCB
(, 下载次数: 65)
  1. #include <AT89X52.h> //预处理命令
  2. #include <stdio.h>
  3. #include <intrins.h>

  4. typedef   unsigned char uchar ;
  5. typedef   unsigned int uint  ;



  6. uint Dat;           // 全局变量Timer0计数寄存器
  7. uchar Flag;         // 全局变量中断标志Flag

  8.                                                     /* 数码管显示译码*/
  9. static uchar ledcode[12] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff,0x7f };
  10. /*****************对应的数字   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,    ,   .************/

  11. /****************************************************************************
  12. * 名    称:         int0()
  13. * 功    能:     低电平接收超声波信号
  14. * 入口参数:        无
  15. * 出口参数:        无
  16. ****************************************************************************/
  17. void int0() interrupt 0
  18. {
  19.     uchar templ_1,templ_2,temph;
  20.     TR1 = 0;                // 关闭定时器0
  21.        
  22.         EA = 0;                 // 关闭总中断
  23.         EX0 =0;                        // 关外部中断

  24.     templ_1 = TL1;
  25.         temph = TH1;
  26.         templ_2 = TL1;
  27.         if(templ_1 == templ_2)  // 判断读数是否正确
  28.         {

  29.                 Dat = (temph<<8)|templ_2;  // 计算定时器寄存器值
  30.                 Flag = 1;
  31.         }
  32.        
  33.         Flag = 1;

  34. }         
  35. /****************************************************************************
  36. * 名    称:timer0()
  37. * 功    能:中断函数        .用于记录超声波的个数
  38. * 入口参数:         无
  39. * 出口参数:         无
  40. ****************************************************************************/
  41. void timer0() interrupt 1 using 0
  42. {   
  43.         TR2 = 0;        // 记录到10个超声波信号了,关闭超声波源
  44. }

  45. void main(void)      //主函数名
  46. {
  47.     uchar i;
  48.         uint k;
  49.         uint a;
  50.         uint j;
  51.         uint S;
  52.         float S_buf;
  53.     uchar dispcode[5];
  54.        

  55. /**************************************************************************************************
  56. *                          设置Timer2为时钟发生器
  57. **************************************************************************************************/
  58.     T2CON = 0x00;
  59.         C_T2 = 0;
  60.         T2MOD = T2OE_;
  61.         RCAP2H = 0xff;                   // 时钟输出频率 晶振为8MHZ 输出频率为40KHZ
  62.         RCAP2L = 0xce;
  63.         //TR2 = 1;             // 启动定时器2        发送超声波
  64. /**************************************************************************************************
  65. *                                                设置Timer0为计数器 记录超声波发出到接收的时间
  66. **************************************************************************************************/
  67.     TMOD = 0x15;                   // Timer0工作在16位计数器中断模式         ,Timer1工作在16位定时器方式
  68.         TH0 = 0xff;                       // 给Timer0 初始值        ,检测到10个脉冲就中断
  69.         TL0 = 0xf6;
  70.         ET0=1;               // 启动Timer0 中断
  71.         TR0 = 1;             // 启动Timer0计数
  72. /**************************************************************************************************
  73. *   设置外部中断 .低电平中断..用于中断接收超声波信号
  74. ***************************************************************************************************/
  75. //    EX0 = 1;               // 开外部中断0
  76.         IT0 = 0;               // 低电平触发  

  77. //        PX0 = 1;               //
  78. //        PT0 = 0;               // T0 中断优先级低 可不用设置优先级

  79.     while(1)
  80.        
  81.         {          
  82.             TL0 = 0xf6;                 // 给定时器0 装初值.计数超声波发送个数
  83.             TH0 = 0xff;
  84.                
  85.                 TL1 = 0x00;                     // 给定时器1装初值.记录发送到接收的时间
  86.                 TH1 = 0x00;
  87.             
  88.                 EA =1;                // 启动总中断       
  89.             TR2 = 1;              // 发送超声波         start
  90.                 TR1 = 1;              // 启动定时器计时

  91.                 /**  测试大概延时2ms  *******************************
  92.                 while(1)
  93.                 {
  94.                  P1_0 = 0;
  95.                 for(k=0;k<150;k++) _nop_();                    // 发送一定数量的超声波信号
  96.                  P1_0 = 1;
  97.                  for(k=0;k<150;k++) _nop_();
  98.                  }
  99.                  ***************************************************/
  100.                                
  101.                 for(k=0;k<120;k++) _nop_();         // 延时2ms,去除没有经过物体反射的回波
  102.                 EX0 = 1;                            // 开外部中断0

  103.                 if(Flag == 1)
  104.                 {       
  105.                     Flag = 0;                 // 清零中断标志
  106.                
  107.                         S_buf = Dat * 0.0255;     // 距离S = V* 1/2t  S = 1/2 *Dat *1.5us *340m/s
  108.                         S = (uint)S_buf;
  109.                        
  110.                         for(i=0;i<4;i++)                  // 显示译码
  111.                         {
  112.                              dispcode[3-i] = S%10;
  113.                                  S /= 10;
  114.                                  if(dispcode[0] == 0)
  115.                                      dispcode[0] = 10; // 不显示最高零位
  116.                         }
  117.                 }
  118.                        
  119.                 for(j=0;j<400;j++)
  120.                 {
  121.                     for(i=0;i<4;i++)                       // 四路扫描
  122.                     {
  123.                           
  124.                           P0 = ledcode[dispcode[3-i]];                // 发送显示数据
  125.                           P2 = ~(1<<i);                                                // 确实显示位
  126.                           for (a=0; a<40; a++);                            // 延时一段时间
  127.                           P2 |= (1<<i);                                            // 关闭显示
  128.                     }
  129.                         P0 = ledcode[11];                            // 显示小数点
  130.                         P2_2 = 0;
  131.                     for (a=0; a<40; a++);
  132.                     P2_2 = 1;
  133.                 }
  134.         }
  135.                
  136. }
复制代码


(, 下载次数: 83)
(, 下载次数: 74)






欢迎光临 圣源电子制作 (https://sydz.syyyd.com/) Powered by Discuz! X3.4