51单片机超声波测距和报警+Proteus仿真
生活随笔
收集整理的這篇文章主要介紹了
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仿真的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 将GDB中的输出定向到文件
- 下一篇: boost库中mutex、conditi