日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

基于51单片机来开发的智能感应开盖垃圾桶

發(fā)布時間:2024/3/12 编程问答 61 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于51单片机来开发的智能感应开盖垃圾桶 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

為什么要引入定時器呢?
因為定時到報表的時候,可以由硬件執(zhí)行那部分程序,軟件部分仍然單獨運行。
一、智能垃圾桶需求分析:
當距離小于等于10時,垃圾桶開蓋持續(xù)兩秒鐘,否則垃圾桶關閉蓋子
當檢測到震動時,垃圾桶開蓋持續(xù)兩秒鐘,否則垃圾桶關閉蓋子
當按下按鍵時,垃圾桶開蓋


二、智能垃圾桶工作原理。

主要是通過超聲波測距與舵機轉動相結合來實現(xiàn)主功能。超聲波采用定時器1進行定時,實現(xiàn)無難度;舵機轉動我們要通過定時器0來實現(xiàn)中斷,從而確定最小定時單位0.5ms,這里我們確定一個標志位,jd,從而來決定是否讓舵機進行轉動,例如,提前聲明jd=3,當定時器開始計數(shù)時,跑到這里jd=3,定時器0不斷進行中斷操作,從而確定是否進行轉動(這里定義PWM波時一定要一個周期循環(huán)定義)。當震動傳感器震動時,cpu先對舵機進行的延時,從而不對震動傳感器的響應進行操作,這里需要我們把這個震動傳感器定義到中端口P3^2,打開外部中斷EX,并且把ET0設置為低電平觸發(fā),當震動傳感器震動時,cpu(即晶振,單片機的心臟)停止對舵機進行計時,優(yōu)先處理震動。

#include "reg52.h"sbit LED1 = P3^7;//根據(jù)原理圖(電路圖),設備變量led1指向P3組IO口的第7口 sbit LED2 = P3^6;//根據(jù)原理圖(電路圖),設備變量led2指向P3組IO口的第6口 sbit Trig = P1^5; sbit Echo = P1^6; sbit SG90 = P1^4; sbit Virbate = P3^2;//3.2口是外部中斷口,當有電壓來臨時,中斷其他服務程序,執(zhí)行此程序。 sfr AUXR=0x8E;int cnt=0; int jd; int mark_vibrate=0; double dis; double time; void Timer0Init(void) //500微秒@11.0592MHz {AUXR &= 0x7F; //定時器時鐘12T模式TMOD &= 0xF0; //設置定時器模式TMOD |= 0x01; //設置定時器模式TL0 = 0x33; //設置定時初值TH0 = 0xFE; //設置定時初值TF0 = 0; //清除TF0標志TR0 = 1; //定時器0開始計時EA = 1;//打開總中斷ET0 = 1;//打開定 時器0的中斷 }//計時器0管舵機,主要記錄0.5ms時間void Timer1Init(void) //71.111毫秒@11.0592MHz {AUXR &= 0xBF; //定時器時鐘12T模式TMOD &= 0x0F; //設置定時器模式TMOD |= 0x10; //設置定時器模式TL1 = 0x00; //設置定時初值TH1 = 0x00; //設置定時初值 }//計時器1管超聲波收發(fā)時間void Delay10us() //@11.0592MHz {unsigned char i;i = 2;while (--i); }void Delay200ms() //@11.0592MHz {unsigned char i, j, k;i = 2;j = 103;k = 147;do{do{while (--k);} while (--j);} while (--i); }void Delay600ms() //@11.0592MHz {unsigned char i, j, k;i = 5;j = 52;k = 195;do{do{while (--k);} while (--j);} while (--i); }void Trigbegin()//超聲波開始發(fā)送波 {Trig = 0;Trig = 1;Delay10us();Trig = 0; } void OpenLight()//開蓋燈 {LED1 = 0;LED2 = 1; } void CloseLight()//關蓋燈 {LED1 = 1;LED2 = 0; } void SG90Init()//舵機初始化 {cnt = 0;//開蓋關蓋從0計時jd = 1;//初始化舵機為關蓋狀態(tài)SG90=1; } void SG90_0()//舵機中斷關蓋 {jd = 1;cnt = 0;Delay200ms(); } void SG90_90()//舵機中斷開蓋 {jd = 3;if(jd_back!=jd)//下次進來如果還和標志位相等,就不用延時,直接90°{cnt = 0;Delay600ms();//在這600ms里PWM波不斷地讓舵機重復90°,所以舵機臂不下降}jd_back=jd;//把標志位賦值給他,下次若手未動,則不延時,舵機直接90°不動。 }double getdis() {Trigbegin();while(Echo == 0);TR1=1;//開始計時while(Echo == 1);TR1=0;//停止計時time=(TH1*256+TL1)*1.085/1000000;//以S為單位計時TH1=0x00;TL1=0x00;Delay200ms();return (time*17000); } void ExInit()外部中斷P3^2初始化 {EX0 = 1;//打開外部中斷IT0 =0;//低電平觸發(fā)中斷 } void main() {Timer0Init();//舵機開始計時,中斷時跳到定時器0中斷函數(shù)處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//定時器0中斷,由硬件調(diào)用,軟件部分繼續(xù)執(zhí)行 {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//外部中斷 { //中斷cpu計數(shù),小技巧mark_vibrate = 1; }

總結

以上是生活随笔為你收集整理的基于51单片机来开发的智能感应开盖垃圾桶的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。