生活随笔
收集整理的這篇文章主要介紹了
基于51单片机来开发的智能感应开盖垃圾桶
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
為什么要引入定時器呢?
因為定時到報表的時候,可以由硬件執行那部分程序,軟件部分仍然單獨運行。
一、智能垃圾桶需求分析:
當距離小于等于10時,垃圾桶開蓋持續兩秒鐘,否則垃圾桶關閉蓋子
當檢測到震動時,垃圾桶開蓋持續兩秒鐘,否則垃圾桶關閉蓋子
當按下按鍵時,垃圾桶開蓋
二、智能垃圾桶工作原理。
主要是通過超聲波測距與舵機轉動相結合來實現主功能。超聲波采用定時器1進行定時,實現無難度;舵機轉動我們要通過定時器0來實現中斷,從而確定最小定時單位0.5ms,這里我們確定一個標志位,jd,從而來決定是否讓舵機進行轉動,例如,提前聲明jd=3,當定時器開始計數時,跑到這里jd=3,定時器0不斷進行中斷操作,從而確定是否進行轉動(這里定義PWM波時一定要一個周期循環定義)。當震動傳感器震動時,cpu先對舵機進行的延時,從而不對震動傳感器的響應進行操作,這里需要我們把這個震動傳感器定義到中端口P3^2,打開外部中斷EX,并且把ET0設置為低電平觸發,當震動傳感器震動時,cpu(即晶振,單片機的心臟)停止對舵機進行計時,優先處理震動。
#include "reg52.h"sbit LED1
= P3
^7;
sbit LED2
= P3
^6;
sbit Trig
= P1
^5;
sbit Echo
= P1
^6;
sbit SG90
= P1
^4;
sbit Virbate
= P3
^2;
sfr AUXR
=0x8E;int cnt
=0;
int jd
;
int mark_vibrate
=0;
double dis
;
double time
;
void Timer0Init(void)
{AUXR
&= 0x7F; TMOD
&= 0xF0; TMOD
|= 0x01; TL0
= 0x33; TH0
= 0xFE; TF0
= 0; TR0
= 1; EA
= 1;ET0
= 1;
}void Timer1Init(void)
{AUXR
&= 0xBF; TMOD
&= 0x0F; TMOD
|= 0x10; TL1
= 0x00; TH1
= 0x00;
}void Delay10us()
{unsigned char i
;i
= 2;while (--i
);
}void Delay200ms()
{unsigned char i
, j
, k
;i
= 2;j
= 103;k
= 147;do{do{while (--k
);} while (--j
);} while (--i
);
}void Delay600ms()
{unsigned char i
, j
, k
;i
= 5;j
= 52;k
= 195;do{do{while (--k
);} while (--j
);} while (--i
);
}void Trigbegin()
{Trig
= 0;Trig
= 1;Delay10us();Trig
= 0;
}
void OpenLight()
{LED1
= 0;LED2
= 1;
}
void CloseLight()
{LED1
= 1;LED2
= 0;
}
void SG90Init()
{cnt
= 0;jd
= 1;SG90
=1;
}
void SG90_0()
{jd
= 1;cnt
= 0;Delay200ms();
}
void SG90_90()
{jd
= 3;if(jd_back
!=jd
){cnt
= 0;Delay600ms();}jd_back
=jd
;
}double getdis()
{Trigbegin();while(Echo
== 0);TR1
=1;while(Echo
== 1);TR1
=0;time
=(TH1
*256+TL1
)*1.085/1000000;TH1
=0x00;TL1
=0x00;Delay200ms();return (time
*17000);
}
void ExInit()外部中斷P3
^2初始化
{EX0
= 1;IT0
=0;
}
void main()
{Timer0Init();Timer1Init();ExInit();SG90Init();while(1){dis
=getdis();if(dis
<=10||mark_vibrate
== 1){OpenLight();SG90_90();mark_vibrate
= 0;}else{CloseLight();SG90_0();}}
}
void Timer0() interrupt
1
{cnt
++;TL0
= 0x33; TH0
= 0xFE; if(cnt
< jd
){SG90
= 1;} else{SG90
= 0;}if(cnt
== 40){cnt
= 0;SG90
=1;TL0
= 0x33; TH0
= 0xFE;}
}
void Ex0_Handler() interrupt
0
{ mark_vibrate
= 1;
}
總結
以上是生活随笔為你收集整理的基于51单片机来开发的智能感应开盖垃圾桶的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。