博客
关于我
蓝桥杯单片机第四届国赛:超声波测距报警
阅读量:485 次
发布时间:2019-03-07

本文共 10024 字,大约阅读时间需要 33 分钟。

本次使用的模块与第三届国赛门禁系统类似,但功能更复杂,具体包括超声波测距、EEPROM读写、时钟DS1302、矩阵键盘以及数码管显示等模块。

注意事项:

  • 超声波模块:当超声波接收到信号时,RX端会从高拉低,因此在判断信号时需谨慎处理。
  • 定时器2中断:需设置IE2 |= 0x04以启用定时器2的中断。
  • 第三届使用的模块操作方法可以参考以下代码:

    #include 
    #include
    #include "iic.h"#include "ds1302.h"#define u8 unsigned char#define u16 unsigned intsbit TX = P1^0;sbit RX = P1^1;u8 code LED[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0xbf, 0xff};u8 Digcom = 0, yi = 1, er = 2, san = 3, si = 4, wu = 5, liu = 6, qi = 7, ba = 8;u8 Digbuf[] = {8, 8, 8, 8, 8, 8, 8, 8};u8 KEY, KEY_TEMP;u8 Tsonic = 0;bit sonic_flag = 0, alarm_flag = 0, LED_flag1 = 0, LED_flag2 = 0;u16 distance, alarm_distance = 30, T_led = 0;u16 T_start = 0;bit Start_flag = 1, s7_flag = 1, s6_flag = 1, s5_flag = 1, s4_flag = 1;bit flicker_flag = 1, time_flag = 1;u8 button = 1;u8 hour = 11, min = 50, sec = 59;u16 T_flicker = 999;extern u8 Time[];void Delay13us() { _nop_(); _nop_(); i = 33; while (--i) {}}void delay_ms(u16 ms) { u16 i, j; for (i = ms; i > 0; i--) { for (j = 845; j > 0; j--) {} }}void INIT(void) { P2 |= 0x80; P2 &= 0x9F; P0 = 0xFF; P2 |= 0xA0; P2 &= 0xBF; P0 = 0x00; P2 |= 0xC0; P2 &= 0xDF; P0 = 0xFF; P2 |= 0xE0; P2 &= 0xFF; P0 = 0xFF;}void Start(void) { P2 |= 0xC0; P2 &= 0xDF; P0 = 0x01; P2 |= 0xE0; P2 &= 0xFF; P0 = 0x00; delay_ms(1); P2 |= 0xC0; P2 &= 0xDF; P0 = 0x02; P2 |= 0xE0; P2 &= 0xFF; P0 = 0x00; delay_ms(1); P2 |= 0xC0; P2 &= 0xDF; P0 = 0x04; P2 |= 0xE0; P2 &= 0xFF; P0 = 0x00; delay_ms(1); P2 |= 0xC0; P2 &= 0xDF; P0 = 0x08; P2 |= 0xE0; P2 &= 0xFF; P0 = 0x00; delay_ms(1); P2 |= 0xC0; P2 &= 0xDF; P0 = 0x10; P2 |= 0xE0; P2 &= 0xFF; P0 = 0x00; delay_ms(1); P2 |= 0xC0; P2 &= 0xDF; P0 = 0x20; P2 |= 0xE0; P2 &= 0xFF; P0 = 0x00; delay_ms(1); P2 |= 0xC0; P2 &= 0xDF; P0 = 0x40; P2 |= 0xE0; P2 &= 0xFF; P0 = 0x00; delay_ms(1); P2 |= 0xC0; P2 &= 0xDF; P0 = 0x80; P2 |= 0xE0; P2 &= 0xFF; P0 = 0x00; delay_ms(1); P2 |= 0xC0; P2 &= 0xDF; P0 = 0xFF; P2 |= 0xE0; P2 &= 0xFF; P0 = 0xFF;}void KEY_BTN(void) { KEY_TEMP = P3 & 0x0F; if (KEY_TEMP != 0x0F && KEY == 0xFF) { delay_ms(5); KEY_TEMP = P3 & 0x0F; if (KEY_TEMP != 0x0F) { KEY = KEY_TEMP; switch (KEY_TEMP) { case 0x0E: if (!s6_flag) { s7_flag = !s7_flag; } break; case 0x0D: s6_flag = 1; if (s7_flag) { flicker_flag = 1; T_flicker = 999; if (++button == 3) { s6_flag = 0; flicker_flag = 0; button = 0; Time[0] = ((sec / 10) << 4) | (sec % 10); Time[1] = ((min / 10) << 4) | (min % 10); Time[2] = ((hour / 10) << 4) | (hour % 10); Time[3] = 0x00; Time[4] = 0x00; Time[5] = 0x00; Time[6] = 0x00; DS1302_INIT(); } } else { if (alarm_flag) { s6_flag = 0; alarm_flag = 0; Write_AT24C02(0xA0, alarm_distance); } else { alarm_distance = Read_AT24C02(0xA0); alarm_flag = 1; } } break; case 0x0B: if (s7_flag && flicker_flag) { if (button == 1) { if (++hour == 24) hour = 0; } else if (button == 2) { if (++min == 60) min = 0; } } else if (!s7_flag && alarm_flag) { if (alarm_distance != 99) { alarm_distance++; } } break; case 0x07: if (s7_flag && flicker_flag) { if (button == 1) { if (hour == 0) { hour = 23; } else { hour--; } } else if (button == 2) { if (min == 0) { min = 59; } else { min--; } } } else if (!s7_flag && alarm_flag) { if (alarm_distance != 0) { alarm_distance--; } } break; } } } else if (KEY_TEMP == 0x0F && KEY != 0x0F) { delay_ms(5); KEY_TEMP = P3 & 0x0F; if (KEY_TEMP == 0x0F) { KEY = 0xFF; } }}void Timer2Init(void) { AUXR |= 0x04; T2L = 0xCD; T2H = 0xD4; AUXR |= 0x10; IE2 |= 0x04; EA = 1;}void Timer0Init(void) { AUXR |= 0x80; TMOD &= 0xF0; TL0 = 0x00; TH0 = 0x00; TF0 = 0; TR0 = 0;}void timer2() interrupt 12 { if (!Start_flag) { P2 |= 0xC0; P2 &= 0xDF; P0 = 0x01; P2 |= 0xE0; P2 &= 0xFF; P0 = 0x00; delay_ms(1); P2 |= 0xC0; P2 &= 0xDF; P0 = 0x02; P2 |= 0xE0; P2 &= 0xFF; P0 = 0x00; delay_ms(1); P2 |= 0xC0; P2 &= 0xDF; P0 = 0x04; P2 |= 0xE0; P2 &= 0xFF; P0 = 0x00; delay_ms(1); P2 |= 0xC0; P2 &= 0xDF; P0 = 0x08; P2 |= 0xE0; P2 &= 0xFF; P0 = 0x00; delay_ms(1); P2 |= 0xC0; P2 &= 0xDF; P0 = 0x10; P2 |= 0xE0; P2 &= 0xFF; P0 = 0x00; delay_ms(1); P2 |= 0xC0; P2 &= 0xDF; P0 = 0x20; P2 |= 0xE0; P2 &= 0xFF; P0 = 0x00; delay_ms(1); P2 |= 0xC0; P2 &= 0xDF; P0 = 0x40; P2 |= 0xE0; P2 &= 0xFF; P0 = 0x00; delay_ms(1); P2 |= 0xC0; P2 &= 0xDF; P0 = 0x80; P2 |= 0xE0; P2 &= 0xFF; P0 = 0x00; delay_ms(1); P2 |= 0xC0; P2 &= 0xDF; P0 = 0xFF; P2 |= 0xE0; P2 &= 0xFF; P0 = 0xFF; } if (t_start == 1000 && Start_flag) { t_start = 0; Start_flag = 0; INIT(); Timer0Init(); DS1302_INIT(); if (++tsonic == 200) { tsonic = 0; sonic_flag = 0; } if (++t_flicker == 999) { t_flicker = 0; flicker_flag = 0; } Digbuf[0] = hour / 10; Digbuf[1] = 11; Digbuf[2] = 10; Digbuf[3] = min / 10; Digbuf[4] = 11; Digbuf[5] = 10; Digbuf[6] = sec / 10; Digbuf[7] = 11; if (button == 1) { Digbuf[0] = 11; } else if (button == 2) { Digbuf[3] = 11; } else if (button == 3) { Digbuf[6] = 11; } time_flag = !time_flag; if (++t_led == 500) { t_led = 0; if (LED_flag1) { LED_flag2 = 0; } if (LED_flag2) { LED_flag1 = 0; P2 |= 0x80; P2 &= 0x9F; P0 = 0xFF; P2 |= 0xA0; P2 &= 0xBF; P0 = 0x00; } } }}void sonic_send(void) { u8 i; while (i--) { TX = 0; Delay13us(); }}int main(void) { u16 temp; ultrasonic sensor initialization; Timer2Init(); Write_AT24C02(0xA0, 30); delay_ms(5); alarm_distance = Read_AT24C02(0xA0); while (1) { if (sonic_flag && !Start_flag) { TR0 = 0; sonic_send(); } while (RX == TF0 == 0) { if (TF0) { distance = (unsigned int)(distance * 0.00153718); if (distance <= alarm_distance) { LED_flag1 = 1; } else { LED_flag1 = 0; P2 |= 0x80; P2 &= 0x9F; P0 = 0xFF; P2 |= 0xA0; P2 &= 0xBF; P0 = 0x00; } P2 |= 0xE0; P2 &= 0xFF; P0 = 0x00; } } if (Start_flag) { Start(); } else if (s7_flag && !s6_flag) { DS1302_Getime(); Digbuf[0] = Time[2] / 16; Digbuf[1] = Time[2] % 16; Digbuf[2] = 10; Digbuf[3] = Time[1] / 16; Digbuf[4] = Time[1] % 16; Digbuf[5] = 10; Digbuf[6] = Time[0] / 16; Digbuf[7] = Time[0] % 16; } else if (!s7_flag && !s6_flag) { Digbuf[0] = 11; Digbuf[1] = 11; Digbuf[2] = 11; Digbuf[3] = 11; if (distance == 999) { Digbuf[4] = 11; Digbuf[5] = 11; Digbuf[6] = 11; Digbuf[7] = 11; } else { Digbuf[4] = 11; Digbuf[5] = distance / 100; Digbuf[6] = (distance / 10) % 10; Digbuf[7] = distance % 10; } } else if (!s7_flag && alarm_flag) { Digbuf[0] = 11; Digbuf[1] = 11; Digbuf[2] = 11; Digbuf[3] = 10; Digbuf[4] = 10; Digbuf[5] = alarm_distance / 100; Digbuf[6] = (alarm_distance / 10) % 10; Digbuf[7] = alarm_distance % 10; } KEY_BTN(); }}

    转载地址:http://uwccz.baihongyu.com/

    你可能感兴趣的文章
    Objective-C实现Tribonacci Number特里波纳契数算法(附完整源码)
    查看>>
    Objective-C实现Trie字典树算法(附完整源码)
    查看>>
    Objective-C实现Trie段树算法(附完整源码)
    查看>>
    Objective-C实现Trim函数功能(附完整源码)
    查看>>
    Objective-C实现triplet sum三元组和算法(附完整源码)
    查看>>
    Objective-C实现UDP传输系统源码(附完整源码)
    查看>>
    Objective-C实现UDP内网穿透(附完整源码)
    查看>>
    Objective-C实现ugly numbers丑数算法(附完整源码)
    查看>>
    Objective-C实现unescape函数功能(附完整源码)
    查看>>
    Objective-C实现unet模型(附完整源码)
    查看>>
    Objective-C实现volume conversions体积转换算法(附完整源码)
    查看>>
    Objective-C实现wc函数功能(附完整源码)
    查看>>
    Objective-C实现weight conversion权重转换算法(附完整源码)
    查看>>
    Objective-C实现wiggle sort摆动排序算法(附完整源码)
    查看>>
    Objective-C实现word frequency functions词频函数算法(附完整源码)
    查看>>
    Objective-C实现XOR Cipher异或密码算法(附完整源码)
    查看>>
    Objective-C实现XZordering算法(附完整源码)
    查看>>
    Objective-C实现y = sinx函数的积分运算(附完整源码)
    查看>>
    Objective-C实现y = x的平方函数的积分运算(附完整源码)
    查看>>
    Objective-C实现z-algorithm算法(附完整源码)
    查看>>