-
//
晶振
=8M
//MCU=STC10F04XE
//P0.0-P0.6
共阳数码管引脚
//Trig
= P1^0
//Echo
= P3^2
#include
//
包括一个
52
标准内核的头文件
#define uchar unsigned char
//
定义一下方便使用
#define uint
unsignedint
#define ulong
unsigned long
//***********************
************************
sfr
CLK_DIV = 0x97; //
为
STC
单片机定义
,
系统时钟分频
//<
/p>
为
STC
单片机的
IO
口设置地址定义
sfr
P0M1
= 0X93;
sfr
P0M0
= 0X94;
sfr
P1M1
= 0X91;
sfr
P1M0
= 0X92;
sfr
P2M1
= 0X95;
sfr
P2M0
= 0X96;
//******************
*****************************
sbit Trig
= P1^0;
//
产生脉冲引脚
sbit
Echo
= P3^2;
//
回波引脚
sbit test
= P1^1;
//
测试用引脚
uchar code SEG7[10]={0xC0,0xF9,0xA4,0xB
0,0x99,0x92,0x82,0xF8,0x80,0x90};//
数码管<
/p>
0-9
uint distance[4];
//
测距接收缓冲区
ucharge,shi,bai,temp,flag,outcomeH,outcomeL,i;
//
自定义寄存器
bit succeed_flag;
//
测量成功标志
//********
函数声明
void conversion(uinttemp_data);
void delay_20us();
//void
pai_xu();
void main(void)
//
主程序
{
uintdistance_data,a,b;
uchar
CONT_1;
CLK_DIV=0X03; //
系统时钟为
1/8
晶振(
pdf-45
页
)
P0M1 = 0;
//
将<
/p>
io
口设置为推挽输出
P1M1 = 0;
P2M1 = 0;
P0M0 = 0XFF;
P1M0 = 0XFF;
P2M0 = 0XFF;
i=0;
flag=0;
test =0;
Trig=0;
//
首先拉低脉冲输入引脚
TMOD=0x11;
//
定时
器
0
,定时器
1
,
16
位工作方式
TR0=1;
//
启动定时器
0
IT0=0;
//
由高电平变低电平,触发外部中断
ET0=1;
//
打开
定时器
0
中断
//ET1=1;
//
打开
定时器
1
中断
EX0=0;
//
关闭外部中断
EA=1;
//
打开总中断
0
while(1)
//
程序循环
{
EA=0;
Trig=1;
delay_20us();
Trig=0;
//
产生
一个
20us
的脉冲,在
Trig
p>
引脚
while(Echo==0);
//
等待
Echo
回波引脚变高电平<
/p>
succeed_flag=0;
//
清测量成功标志
EX0=1;
//
打开外部中断
TH1=0;
//<
/p>
定时器
1
清零
TL1=0;
//<
/p>
定时器
1
清零
TF1=0;
//
TR1=1;
//
启动定时器
1
EA=1;
while(TH1 < 30);//
等待测量的结果,周期
65.535
毫秒(可用中断实现)
TR1=0;
//
关闭定时器
1
EX0=0;
//
关闭外部中断
if(succeed_flag==1)
{
distance_data=outcomeH;
//
测量
结果的高
8
位
distance_data<<=8;
//
放入
1
6
位的高
8
位
distance_data=d
istance_data|outcomeL;//
与低
8<
/p>
位合并成为
16
位结果数据
distance_data*=12;
p>
//
因为定时器默认为
12
分频
distance_data/=58;
//
微秒
的单位除以
58
等于厘米
}
//<
/p>
为什么除以
58
等于厘米,
Y
米
< br>=
(
X
秒
*344
)
/2
//
X
秒
=
(
2*Y
米)
/344 ==
》
X
秒
=0.0058*
Y
米
==
》
厘米
=
微秒
/58
if(succeed_flag==0)
{
-
-
-
-
-
-
-
-
-
上一篇:RLC电路的稳态特性
下一篇:超声波模块单片机程序