- /**************************************************************
- 功能:超声波模块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); //短延时
- }
- }
- }
复制代码 |