赵瀛馨 2024-06-04 10:46 采纳率: 11.1%
浏览 12

基于c51单片机设计一个震动报警器,使用震动传感器实现震动,采用LM016L显示屏上显示震动,蜂鸣器和led灯来同时进行声音报警、三个按键控制手动报警布防按键和取消报警的程序设计

img

img

img

img


基于c51单片机设计一个震动报警器的程序设计!代码问题需要改正。求更正!

  • 写回答

1条回答 默认 最新

  • 阿里嘎多学长 2024-06-04 11:00
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    基于您提供的代码和需求,我将帮助您更正和完善程序设计。以下是对您提供的代码的更正和建议:

    1. 修正错误和不明确的代码部分

    • sbit LCD_RS = P2^の; 应更正为 sbit LCD_RS = P2^4;(假设4号引脚连接到LCD的RS引脚)
    • uchar alarmFlag = の; 应更正为 uchar alarmFlag = 0;(初始状态为未报警)
    • ICD RS = 0: 应更正为 LCD_RS = 0;
    • LcdwWriteCmd 应更正为 LcdwriteCmd

    2. 添加去抖逻辑

    在按键检测部分,添加去抖逻辑以避免误触发。例如,在检测到按键按下后,延时一段时间再次检测按键状态,如果仍然为按下状态,则执行相应操作。

    3. 完善报警逻辑

    确保震动传感器检测到震动时,能够触发报警,并且报警标志位 alarmFlag 能够正确设置和清除。

    4. 完整的代码示例

    以下是根据您提供的代码片段和需求整理的示例代码:

    #include <reg52.h>
    #include <intrins.h>
    
    #define uint unsigned int
    #define uchar unsigned char
    
    #define LCD_D P0
    sbit LED = P1^6; // LED灯
    sbit BUZZER = P2^3; // 蜂鸣器
    sbit KEY1 = P3^1; // 手动报警布防按键
    sbit KEY2 = P3^2; // 取消报警按键
    sbit KEY3 = P3^3; // 清零按键
    sbit LCD_RS = P2^4; // 显示屏数据/命令选择引脚
    sbit LCD_RW = P2^1; // 显示屏读/写选择引脚
    sbit LCD_E = P2^2; // 显示屏使能引脚
    sbit DOUT = P2^6; // 震动传感器
    
    uchar alarmFlag = 0; // 报警标志位,0为未报警,1为已报警
    
    void Delayms(uint ms) {
        uint i, j;
        for (i = 0; i < ms; i++)
            for (j = 0; j < 120; j++); // 根据实际晶振频率调整延时
    }
    
    void LcdWaitReady() {
        unsigned char sta;
        LCD_D = 0xff;
        LCD_RS = 0;
        LCD_RW = 1;
        LCD_E = 1;
        do {
            LCD_E = 1;
            sta = LCD_D;
            LCD_E = 0;
        } while (sta & 0x80);
    }
    
    void LcdwriteCmd(unsigned char cmd) {
        LcdWaitReady();
        LCD_RS = 0;
        LCD_RW = 0;
        LCD_D = cmd;
        LCD_E = 1;
        LCD_E = 0;
    }
    
    void LcdwriteDat(unsigned char dat) {
        LcdWaitReady();
        LCD_RS = 1;
        LCD_RW = 0;
        LCD_D = dat;
        LCD_E = 1;
        LCD_E = 0;
    }
    
    void LcdSetCursor(unsigned char x, unsigned char y) {
        unsigned char addr;
        if (y == 0)
            addr = 0x00 + x;
        else
            addr = 0x40 + x;
        LcdwriteCmd(addr | 0x80);
    }
    
    void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str) {
        LcdSetCursor(x, y);
        while (*str != '\0') {
            LcdwriteDat(*str++);
        }
    }
    
    void InitLcd1602() {
        LcdwriteCmd(0x38);
        LcdwriteCmd(0x0c);
        LcdwriteCmd(0x06);
        LcdwriteCmd(0x01);
    }
    
    void Alarm() {
        while (alarmFlag) {
            BUZZER = ~BUZZER;
            LED = ~LED;
            Delayms(100);
        }
    }
    
    void main() {
        InitLcd1602();
        while (1) {
            if (DOUT == 0) { // 震动传感器检测到震动
                LED = 0;
                BUZZER = 0;
                alarmFlag = 1;
                Alarm(); // 调用报警函数
                alarmFlag = 0; // 停止报警
            } else {
                LED = 1;
                BUZZER = 1;
            }
    
            if (KEY1 == 0) { // 手动报警布防按键按下
                Delayms(10); // 延时去抖
                if (KEY1 == 0) {
                    alarmFlag = 1;
                    LcdShowStr(0, 1, "S"); // 显示S表示已报警
                    Alarm(); // 报警函数发出声音和闪烁LED灯
                }
            }
    
            if (KEY2 == 0) { // 取消报警按键按下
                alarmFlag = 0;
                LcdShowStr(0, 1, ""); // 清空S表示未报警
                LED = 1;
                BUZZER = 1;
            }
    
            if (KEY3 == 0) { // 清零按键按下
                LcdShowStr(0, 0, ""); // 清空显示区域
                alarmFlag = 0;
                LcdShowStr(0, 1, ""); // 清空A表示未报警
                LED = 1;
                BUZZER = 1;
            }
        }
    }
    

    5. 参考资料

    请注意,以上代码仅为示例,您可能需要根据实际硬件连接和晶振频率进行相应的调整。希望这些信息对您有所帮助!

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 6月4日

悬赏问题

  • ¥15 如何卸载arcgis 10.1 data reviewer for desktop
  • ¥15 共享文件夹会话中为什么会有WORKGROUP
  • ¥15 关于#python#的问题:使用ATL02数据解算光子脚点的坐标(操作系统-windows)
  • ¥115 关于#python#的问题:未加密前两个软件都可以打开,加密后只有A软件可打开,B软件可以打开但读取不了数据
  • ¥15 在matlab中Application Compiler后的软件无法打开
  • ¥15 想问一下STM32创建工程模板时遇到得问题
  • ¥15 Fiddler抓包443
  • ¥20 Qt Quick Android 项目报错及显示问题
  • ¥15 而且都没有 OpenCVConfig.cmake文件我是不是需要安装opencv,如何解决?
  • ¥15 oracleBIEE analytics