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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

51单片机超声波测距和报警+Proteus仿真

發布時間:2023/12/20 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 51单片机超声波测距和报警+Proteus仿真 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

系統描述

基于51單片機超聲波測距和報警,采用HC-SR04測距,數碼管顯示測量距離。按鍵設置報警上下限,超限報警。

源碼下載地址:51單片機超聲波測距和報警+Proteus仿真

硬件設計

仿真圖1:

仿真圖2:

程序設計

部分程序

#include "task.h"extern unsigned int S; //聲明距離緩存變量,在文件"task.c"中定義 extern unsigned int dis_buf[4]; //聲明顯示緩存數組,在文件"task.c"中定義 extern unsigned int code duan_ma[16]; extern unsigned int S_H, S_L; //S_H:報警上限值,默認400cm,S_L:報警下限值,默認10cm/* 主函數 */ void main(void) {digDuan = 0x40; //顯示"----"digWei1 = 0;digWei2 = 0;digWei3 = 0;digWei4 = 0;delayms(1000); //延時大約1s InitTimer0(); //定時器0初始化while(1){count(); //計算距離if(S>=S_H || S<=S_L) //如果超出設定的范圍,則顯示"---"{dis_buf[3] = 0x00;dis_buf[2] = 0x40; //顯示"---"dis_buf[1] = 0x40;dis_buf[0] = 0x40; BEEP = 0; //蜂鳴器鳴叫delayms(1000);}else{BEEP = 1; //關閉蜂鳴器dis_distance(); //顯示距離}if(key_scan() == 1) //如果按下設置鍵,則進入設置報警功能{BEEP = 0; //按鍵提示音delayms(50);BEEP = 1;delayms(100);key_fuction(); //進入設置報警功能} } }

key.h

#include "key.h"/* 按鍵延時函數,單位:ms */ static void key_delayms(unsigned int ms) {unsigned char a,b,c;while(--ms){for(c=1;c>0;c--)for(b=142;b>0;b--)for(a=2;a>0;a--);} } /* 按鍵掃描 */ unsigned char key_scan(void) {if(KEY1 == 0) //如果按鍵1按下{key_delayms(10); //延時10ms,去除按鍵抖動if(KEY1 == 0) //再判斷一次按鍵按下{return 1; //輸出鍵值1} }if(KEY2 == 0) //如果按鍵2按下{key_delayms(10); //延時10ms,去除按鍵抖動if(KEY2 == 0) //再判斷一次按鍵按下{return 2; //輸出鍵值2}}if(KEY3 == 0) //如果按鍵3按下{key_delayms(10); //延時10ms,去除按鍵抖動if(KEY3 == 0) //再判斷一次按鍵按下{return 3; //輸出鍵值3}}return 0; //如果沒有按鍵按下,則輸出0 }

task.c

#include "task.h"//全局變量定義 //段碼表,適用于共陰數碼管 unsigned int code duan_ma[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, //0~90x77,0x7c,0x39,0x5e,0x79,0x71}; //A~F unsigned int dis_buf[4]; //顯示緩存unsigned int S = 0; //距離緩存變量 unsigned long time = 0; //時間緩存變量 unsigned int S_H = 400, S_L = 10; //S_H:報警上限值,默認400cm,S_L:報警下限值,默認10cm/* 延時,單位:ms */ void delayms(unsigned int ms) {unsigned char a,b,c;while(--ms){for(c=1;c>0;c--)for(b=142;b>0;b--)for(a=2;a>0;a--); } }

timer.c

#include "timer.h"extern unsigned int dis_buf[4];/* 定時器0初始化,定時1ms */ void InitTimer0(void) {TMOD = 0x11; //配置定時器0為工作方式1,定時器1位工作方式1TH0 = 0;TL0 = 0;TH1 = 0x0EC; //定時5msTL1 = 0x78;EA = 1; //打開總中斷ET1 = 1; //打開定時器0中斷TR1 = 1; //打開定時器1TR0 = 0; //打開定時器0 } /* 定時器0中斷服務函數,5ms進一次本中斷,用于數碼管掃描 */ void Timer1Interrupt(void) interrupt 3 {TH1 = 0x0EC; //定時5ms,重新賦值TL1 = 0x78;dig_scan(dis_buf); //數碼管顯示溫度 }

總結

以上是生活随笔為你收集整理的51单片机超声波测距和报警+Proteus仿真的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。