基于单片机的超声波测距系统论文 - 图文(7)

2019-04-22 16:03

*****************************/ void display() {

static uchar i; i++;

if(i >= smg_i) i = 0;

// P1 = 0xff; //段选 // P3 = 0xf0 | (P3 & 0x0f); //位选

// P3 = smg_we[i] | (P3 & 0x0f); //位选 smg_we_switch(i);

P1 = dis_smg[i]; //段选 }

void delay() {

_nop_(); //执行一条_nop_()指令就是1us _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); }

/*********************超声波测距程序*****************************/ void send_wave() {

c_send = 1; //10us的高电平触发 delay();

c_send = 0;

TH0 = 0; //给定时器0清零 TL0 = 0;

TR0 = 0; //关定时器0定时 flag_hc_value = 0; while(!c_recive); //当c_recive为零时等待 TR0=1;

while(c_recive) //当c_recive为1计数并等待 {

flag_time0 = TH0 * 256 + TL0;

if((flag_hc_value > 1) || (flag_time0 > 65000)) //

29

当超声

波超过测量范围时,显示3个888 {

TR0 = 0;

flag_csb_juli = 2; distance = 888; flag_hc_value = 0; break ; }

else {

flag_csb_juli = 1; } }

if(flag_csb_juli == 1) {

TR0=0; //关定时器0定时

distance = TH0; //读出定时器0的时间 distance = distance * 256 + TL0;

distance +=( flag_hc_value * 65536);//算出超声波测距的时间 得到单位是ms

distance *= 0.017; // 0.017 = 340M / 2 = 170M = 0.017M 算出来是米

if(distance > 350) //距离 = 速度 * 时间 {

distance = 888; //如果大于3.8m就超出超声波的量程 } } }

/*********************定时器0、定时器1初始化******************/ void time_init() {

EA = 1; //开总中断

TMOD = 0X11; //定时器0、定时器1工作方式1 ET0 = 1; //开定时器0中断 TR0 = 1; //允许定时器0定时 ET1 = 1; //开定时器1中断 TR1 = 1; //允许定时器1定时 }

/****************按键处理数码管显示函数***************/ void key_with()

30

{

if(key_can == 1) {

menu_1 ++;

if(menu_1 >= 2) {

menu_1 = 0; }

if(menu_1 == 0) {

menu_shudu = 20;

dis_smg[0] = smg_du[distance % 10]; dis_smg[1] = smg_du[distance / 10 % 10] ;

dis_smg[2] = smg_du[distance / 100 % 10] & 0x7f; smg_i = 3; }

if(menu_1 == 1) {

menu_shudu = 1;

dis_smg[0] = smg_du[set_d % 10]; dis_smg[1] = smg_du[set_d / 10 % 10];

dis_smg[2] = smg_du[set_d / 100 % 10] & 0x7f ; dis_smg[3] = 0x88; smg_i = 4; } }

if(menu_1 == 1) //设置高温报警 {

if(flag_lj_3_en == 0) //三次连加之后速度加快 menu_shudu = 10 ; //500ms 加减一次 else

menu_shudu = 1; //250ms 加减一次 if(key_can == 2) {

set_d ++ ; //按键按下未松开自动加三次 if(set_d > 350) set_d = 350;

dis_smg[0] = smg_du[set_d % 10]; //取小数显示

dis_smg[1] = smg_du[set_d / 10 % 10] ; //取个位显示

dis_smg[2] = smg_du[set_d / 100 % 10] & 0x7f; //取十位显示

dis_smg[3] = 0x88; //a

31

}

if(key_can == 3) {

set_d -- ; //按键按下未松开自动加三次 if(set_d <= 1) set_d = 1;

dis_smg[0] = smg_du[set_d % 10]; //取小数显示

dis_smg[1] = smg_du[set_d / 10 % 10] ; //取个位显示 dis_smg[2] = smg_du[set_d / 100 % 10] & 0x7f ; //取十位显示

dis_smg[3] = 0x88; //a }

// write_eepom(); } }

/****************报警函数***************/ void clock_h_l() {

static uchar value; if(distance <= set_d) {

value ++; //消除实际距离在设定距离左右变化时的干扰 if(value >= 5) {

beep = ~beep; //蜂鸣器报警 } } else {

value = 0;

beep = 1; //取消报警 } }

/****************按键按下蜂鸣器响下**********************/ void key_beep() {

static uint value;

if((flag_key_b_en == 1) && (flag_key_set_en == 1)) {

beep = 0; //打开蜂鸣器 value ++;

32

if(value > 800) {

value = 0;

flag_key_b_en = 0; beep = 1;//关闭蜂鸣器 } } }

void main() {

send_wave(); //测距离函数

smg_display(); //处理距离显示函数 time_init();

init_eepom(); //读eepom数据 while(1) {

if(flag_300ms == 1) {

flag_300ms = 0;

clock_h_l(); //报警函数 send_wave(); //测距离函数 if(menu_1 == 0)

smg_display(); //处理距离显示函数 if(zd_break_en == 1) //自动退出设置界面程序 {

zd_break_value ++; //每300ms加一次

if(zd_break_value > 100) //30秒后自动退出设置界面 {

menu_1 = 0; // smg_i = 3;

zd_break_en = 0; zd_break_value = 0; } } }

key(); //按键函数 if(key_can < 10) {

key_with(); //按键处理函数 } } }

33


基于单片机的超声波测距系统论文 - 图文(7).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:事故检查检讨书

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: