标题:
STC12C5a32s2单片机超声波模块HY-SRF05程序,数码管 注释详细显示
[打印本页]
作者:
mhzqmhz
时间:
2020-3-11 13:56
标题:
STC12C5a32s2单片机超声波模块HY-SRF05程序,数码管 注释详细显示
/**************************************************************
功能:超声波模块HY-SRF05,数码管显示
说明:
硬件:stc12c5a32s2,晶振12MHz
4组共阳数码管
HY-SRF05超声波模块
**************************************************************/
#include<stc12c5a60s2.h>
#define uchar unsigned char
#define uint unsigned int
#define Num P2 //P2口接数码管其余脚
#define Seg_Place P3 //P3口高位来控制哪个管显示数字
sbit Trig = P0^0; //超声波模块触发
sbit Echo = P0^1; //超声波模块回响
//点亮第几位数码管
uint code Seg[]={0x10,0x20,0x40,0x80};
//数码管0~9数字
uint code Table[]={
0x03,0x9f,0x25,0x0d,0x99,
0x49,0x41,0x1f,0x01,0x09};
void Timer0Init(void)
{
TMOD = 0x01; //设置定时器模式
TH0 = 0;
TL0 = 0;
}
/***********************************************
函数作用: 延时
说明: 时间不精确,i=1为1毫秒
*************************************************/
void Delay_Ms(uint i)
{
uint j;
for(i;i>0;i--)
{
for(j=0;j<1002;j++);
}
}
/***********************************************
函数作用: 数码管显示的数字
说明:
*************************************************/
void Display_Seg_Num(uchar i)
{
Num = Table[i];
}
/***********************************************
函数作用: 显示第几位数码管
说明:
*************************************************/
void Display_Seg(uchar i)
{
Seg_Place = Seg[i];
}
/***********************************************
函数作用: 超声波触发
说明: 拉高电平至少10us
*************************************************/
void Trig_Init()
{
Trig = 0;
Trig = 1;
Delay_Ms(1);
Trig = 0;
}
/***********************************************
函数作用: 接收超声波并计算距离
说明: 一个机器周期为1us,12个时钟周期为1个机器周期
注意: 如果这样写:time = time * 12 /12 ; time * 12可能会溢出,导致结果出错
*************************************************/
uint Distance()
{
uint time,distance;
Trig_Init(); //初始化超声波触发
while(Echo == 0); //当回响为高电平,打开定时器0
TR0 = 1;
while(Echo == 1); //当回响为低电平,计算时间
TR0 = 0;
time = TH0*256 + TL0;
time = time /12 * 12; //time是us级别(实际时间 = 时间 / 晶振频率 ×12个时钟周期)
TH0 = 0;
TL0 = 0;
distance = 0.017 * time; //距离=速度×时间;(厘米 = 0.017厘米/微秒 × 微秒)
return distance; //返回值 距离
}
/***********************************************
函数作用: 数码管显示的数字
说明:
*************************************************/
void main()
{
uint distance;
uchar i;
P3M0 = 0Xf0;
P3M1 = 0X00; //P3口推挽输出,增加电流大小
Timer0Init(); //初始化定时器0
while(1)
{
distance = Distance(); //将读出的距离赋值给distance
for(i=0;i<50;i++) //显示距离一段时间
{
Display_Seg(0); //点亮第一个数码管
Display_Seg_Num(distance/100); //显示厘米的百位
Delay_Ms(5); //短延时
Display_Seg(1); //点亮第二个数码管
Display_Seg_Num(distance/10%10); //显示厘米的十位
Delay_Ms(3); //短延时
Display_Seg(2); //点亮第三个数码管
Display_Seg_Num(distance%10); //显示厘米的个位
Delay_Ms(3); //短延时
}
}
}
复制代码
作者:
QEQWE123
时间:
2020-10-27 15:42
没评论吗
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1