赞
踩
#include <ioCC2530.h> #define TRIG P0_0 #define ECHO P0_1 #define buzzer P2_0 #define LED1 P1_4 #define ON 0 #define OFF 1 unsigned char ms_cnt = 0; void rada_init(void); int mark; int getdistance(); void hc_sr04_init(void); void Buzzer_Init(void); void delay_10us(void); void Buzzer_Init(void); void led_init(void); void main(void) { led_init(); rada_init(); hc_sr04_init(); Buzzer_Init(); while(1) { mark = getdistance(); if(mark <= 60){ //buzzer = 1; LED1 = ON; }else{ //buzzer = 0; LED1 = OFF; } } } void rada_init(void) { P0SEL &= ~0x03;//普通IO置0,或者外设置1 P0DIR |= 0x01;//方向:输出置1 P0DIR &= 0x02;//输入置0 P0INP &= 0x02;//置0,上拉/下拉 P2INP |= 0x20;//置1,端口0所有引脚下拉 P2SEL &= ~0x01; P2DIR |= 0x01; T1CTL = 0x04;//分频,2N T1CNTL = 0x00; T1CNTH = 0x00; T1CC0L = 0x00; T1CC0H = 0x07; IEN1 |= 0x02; //端口0中断使能 IRCON = 0x00;//中断标志寄存器 置0,无中断未决 EA = 1;//开中断 } //中断 #pragma vector=T1_VECTOR __interrupt void time_ISR(void) { if(T1STAT&0x20)//定时器1计数器溢出中断标志 { ms_cnt++; } IRCON&=~0x02; } void hc_sr04_init() { TRIG=1; delay_10us();//提供一个10us以上脉冲触发信号 TRIG=0; while(!ECHO); T1CTL |= 0x01; //开始自由运行模式 } int getdistance() { unsigned char i; int distance = 0; unsigned char val; unsigned char reg_val; for(i = 0; i < 5; i++) { TRIG = 1; delay_10us(); TRIG = 0; while(!ECHO); T1CTL &= ~0x03;//先清零 T1CTL |= 0x02;//模模式启动 while(ECHO){ if(ms_cnt > 40) { T1CTL &= ~0x03; T1CNTL = 0x00; T1CNTH |= 0x00; ms_cnt = 0; return 0;//非正常结束 } } //测量正确 T1CTL &= ~0x03; val = T1CNTL; reg_val = T1CNTH; reg_val = ((reg_val<<8) | val)>>1; distance += (ms_cnt*1000 + reg_val)/59; T1CNTL = 0x00; T1CNTH = ms_cnt = 0; } return distance; } void delay_10us(void) { int i; for(i = 0; i < 10; i++); } /******蜂鸣器输出初始化******/ void Buzzer_Init(void) { P2SEL &= ~0x01; P2DIR |= 0x01; //P2_0定义为输出 buzzer = 0; } void led_init(void){ P1SEL &= ~0x10; P1DIR |= 0x10; LED1 = OFF; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。