*****************************/ 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