圣源电子制作
标题:
超声波测距-CX20106-CD4069-原理图-PCB-C语言程序-C51
[打印本页]
作者:
sydz
时间:
2011-10-13 16:53
标题:
超声波测距-CX20106-CD4069-原理图-PCB-C语言程序-C51
转载自互联网!!!
原理图
(, 下载次数: 86)
上传
点击文件名下载附件
PCB
(, 下载次数: 65)
上传
点击文件名下载附件
#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;
}
}
}
复制代码
(, 下载次数: 83)
上传
点击文件名下载附件
(, 下载次数: 74)
上传
点击文件名下载附件
欢迎光临 圣源电子制作 (https://sydz.syyyd.com/)
Powered by Discuz! X3.4