|
- /**************************************************************
- 功能:超聲波模塊HY-SRF05,數(shù)碼管顯示
- 說明:
- 硬件:stc12c5a32s2,晶振12MHz
- 4組共陽數(shù)碼管
- HY-SRF05超聲波模塊
- **************************************************************/
- #include<stc12c5a60s2.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define Num P2 //P2口接數(shù)碼管其余腳
- #define Seg_Place P3 //P3口高位來控制哪個(gè)管顯示數(shù)字
- sbit Trig = P0^0; //超聲波模塊觸發(fā)
- sbit Echo = P0^1; //超聲波模塊回響
- //點(diǎn)亮第幾位數(shù)碼管
- uint code Seg[]={0x10,0x20,0x40,0x80};
- //數(shù)碼管0~9數(shù)字
- uint code Table[]={
- 0x03,0x9f,0x25,0x0d,0x99,
- 0x49,0x41,0x1f,0x01,0x09};
- void Timer0Init(void)
- {
- TMOD = 0x01; //設(shè)置定時(shí)器模式
- TH0 = 0;
- TL0 = 0;
- }
- /***********************************************
- 函數(shù)作用: 延時(shí)
- 說明: 時(shí)間不精確,i=1為1毫秒
- *************************************************/
- void Delay_Ms(uint i)
- {
- uint j;
- for(i;i>0;i--)
- {
- for(j=0;j<1002;j++);
- }
- }
- /***********************************************
- 函數(shù)作用: 數(shù)碼管顯示的數(shù)字
- 說明:
- *************************************************/
- void Display_Seg_Num(uchar i)
- {
- Num = Table[i];
- }
- /***********************************************
- 函數(shù)作用: 顯示第幾位數(shù)碼管
- 說明:
- *************************************************/
- void Display_Seg(uchar i)
- {
- Seg_Place = Seg[i];
- }
- /***********************************************
- 函數(shù)作用: 超聲波觸發(fā)
- 說明: 拉高電平至少10us
- *************************************************/
- void Trig_Init()
- {
- Trig = 0;
- Trig = 1;
- Delay_Ms(1);
- Trig = 0;
- }
- /***********************************************
- 函數(shù)作用: 接收超聲波并計(jì)算距離
- 說明: 一個(gè)機(jī)器周期為1us,12個(gè)時(shí)鐘周期為1個(gè)機(jī)器周期
- 注意: 如果這樣寫:time = time * 12 /12 ; time * 12可能會溢出,導(dǎo)致結(jié)果出錯(cuò)
- *************************************************/
- uint Distance()
- {
- uint time,distance;
- Trig_Init(); //初始化超聲波觸發(fā)
-
- while(Echo == 0); //當(dāng)回響為高電平,打開定時(shí)器0
- TR0 = 1;
- while(Echo == 1); //當(dāng)回響為低電平,計(jì)算時(shí)間
- TR0 = 0;
- time = TH0*256 + TL0;
- time = time /12 * 12; //time是us級別(實(shí)際時(shí)間 = 時(shí)間 / 晶振頻率 ×12個(gè)時(shí)鐘周期)
- TH0 = 0;
- TL0 = 0;
- distance = 0.017 * time; //距離=速度×?xí)r間;(厘米 = 0.017厘米/微秒 × 微秒)
- return distance; //返回值 距離
- }
- /***********************************************
- 函數(shù)作用: 數(shù)碼管顯示的數(shù)字
- 說明:
- *************************************************/
- void main()
- {
- uint distance;
- uchar i;
- P3M0 = 0Xf0;
- P3M1 = 0X00; //P3口推挽輸出,增加電流大小
- Timer0Init(); //初始化定時(shí)器0
- while(1)
- {
- distance = Distance(); //將讀出的距離賦值給distance
- for(i=0;i<50;i++) //顯示距離一段時(shí)間
- {
- Display_Seg(0); //點(diǎn)亮第一個(gè)數(shù)碼管
- Display_Seg_Num(distance/100); //顯示厘米的百位
- Delay_Ms(5); //短延時(shí)
- Display_Seg(1); //點(diǎn)亮第二個(gè)數(shù)碼管
- Display_Seg_Num(distance/10%10); //顯示厘米的十位
- Delay_Ms(3); //短延時(shí)
- Display_Seg(2); //點(diǎn)亮第三個(gè)數(shù)碼管
- Display_Seg_Num(distance%10); //顯示厘米的個(gè)位
- Delay_Ms(3); //短延時(shí)
- }
- }
- }
復(fù)制代碼 |
|