|
转载自互联网!!!
原理图
PCB
- #include <AT89X52.h> //预处理命令
- #include <stdio.h>
- #include <intrins.h>
- typedef unsigned char uchar ;
- typedef unsigned int uint ;
- uint Dat; // 全局变量Timer0计数寄存器
- uchar Flag; // 全局变量中断标志Flag
- /* 数码管显示译码*/
- static uchar ledcode[12] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff,0x7f };
- /*****************对应的数字 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, , .************/
- /****************************************************************************
- * 名 称: int0()
- * 功 能: 低电平接收超声波信号
- * 入口参数: 无
- * 出口参数: 无
- ****************************************************************************/
- void int0() interrupt 0
- {
- uchar templ_1,templ_2,temph;
- TR1 = 0; // 关闭定时器0
-
- EA = 0; // 关闭总中断
- EX0 =0; // 关外部中断
- templ_1 = TL1;
- temph = TH1;
- templ_2 = TL1;
- if(templ_1 == templ_2) // 判断读数是否正确
- {
- Dat = (temph<<8)|templ_2; // 计算定时器寄存器值
- Flag = 1;
- }
-
- Flag = 1;
- }
- /****************************************************************************
- * 名 称:timer0()
- * 功 能:中断函数 .用于记录超声波的个数
- * 入口参数: 无
- * 出口参数: 无
- ****************************************************************************/
- void timer0() interrupt 1 using 0
- {
- TR2 = 0; // 记录到10个超声波信号了,关闭超声波源
- }
- void main(void) //主函数名
- {
- uchar i;
- uint k;
- uint a;
- uint j;
- uint S;
- float S_buf;
- uchar dispcode[5];
-
- /**************************************************************************************************
- * 设置Timer2为时钟发生器
- **************************************************************************************************/
- T2CON = 0x00;
- C_T2 = 0;
- T2MOD = T2OE_;
- RCAP2H = 0xff; // 时钟输出频率 晶振为8MHZ 输出频率为40KHZ
- RCAP2L = 0xce;
- //TR2 = 1; // 启动定时器2 发送超声波
- /**************************************************************************************************
- * 设置Timer0为计数器 记录超声波发出到接收的时间
- **************************************************************************************************/
- TMOD = 0x15; // Timer0工作在16位计数器中断模式 ,Timer1工作在16位定时器方式
- TH0 = 0xff; // 给Timer0 初始值 ,检测到10个脉冲就中断
- TL0 = 0xf6;
- ET0=1; // 启动Timer0 中断
- TR0 = 1; // 启动Timer0计数
- /**************************************************************************************************
- * 设置外部中断 .低电平中断..用于中断接收超声波信号
- ***************************************************************************************************/
- // EX0 = 1; // 开外部中断0
- IT0 = 0; // 低电平触发
- // PX0 = 1; //
- // PT0 = 0; // T0 中断优先级低 可不用设置优先级
- while(1)
-
- {
- TL0 = 0xf6; // 给定时器0 装初值.计数超声波发送个数
- TH0 = 0xff;
-
- TL1 = 0x00; // 给定时器1装初值.记录发送到接收的时间
- TH1 = 0x00;
-
- EA =1; // 启动总中断
- TR2 = 1; // 发送超声波 start
- TR1 = 1; // 启动定时器计时
- /** 测试大概延时2ms *******************************
- while(1)
- {
- P1_0 = 0;
- for(k=0;k<150;k++) _nop_(); // 发送一定数量的超声波信号
- P1_0 = 1;
- for(k=0;k<150;k++) _nop_();
- }
- ***************************************************/
-
- for(k=0;k<120;k++) _nop_(); // 延时2ms,去除没有经过物体反射的回波
- EX0 = 1; // 开外部中断0
- if(Flag == 1)
- {
- Flag = 0; // 清零中断标志
-
- S_buf = Dat * 0.0255; // 距离S = V* 1/2t S = 1/2 *Dat *1.5us *340m/s
- S = (uint)S_buf;
-
- for(i=0;i<4;i++) // 显示译码
- {
- dispcode[3-i] = S%10;
- S /= 10;
- if(dispcode[0] == 0)
- dispcode[0] = 10; // 不显示最高零位
- }
- }
-
- for(j=0;j<400;j++)
- {
- for(i=0;i<4;i++) // 四路扫描
- {
-
- P0 = ledcode[dispcode[3-i]]; // 发送显示数据
- P2 = ~(1<<i); // 确实显示位
- for (a=0; a<40; a++); // 延时一段时间
- P2 |= (1<<i); // 关闭显示
- }
- P0 = ledcode[11]; // 显示小数点
- P2_2 = 0;
- for (a=0; a<40; a++);
- P2_2 = 1;
- }
- }
-
- }
复制代码
syyyd.com-超声波测距原理图、PCB.zip
(25.89 KB, 下载次数: 83)
程序.zip
(19.5 KB, 下载次数: 74)
|
|