找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 111|回复: 4
打印 上一主题 下一主题
收起左侧

单片机程序 智能停车位加收费,在前人基础上加收费 希望大佬指点一下为什么报错

[复制链接]
跳转到指定楼层
楼主
ID:1153404 发表于 2025-6-13 00:57 来自触屏版 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
大概代码,但是总报错for等语句,哪里有问题
我想做一个,按下接p1.0的K1开关,模拟车辆进入,步进电机转动模拟抬杆,同时下面由74hc5 95控制的红灯亮起时,lm016l 切换到第二页,同时开始计时收费,每小时3块钱,前面计时,后面收费,两个车位一页,16个车位共八页,第10页记录所有收款金额数。总共10页(包含首页车辆进出情况)。当我按下接p1.1开关K2时,步进电机转动模拟抬杆,同时红灯熄灭,停止计时收费,5秒后自动清零清零,但是所收费用归入第十页的总收入里。接p1.3的K3是人工控制抬杆进,接p1.4d的K4是人工控制抬杠出。接p2.5的开关k5控制翻页。


#include <reg52.h>
#define uchar unsigned char
#define uint  unsigned int
#include <intrins.h>

/************************** 硬件引脚定义 **************************/
// 按键
sbit K1 = P1^0;  // 车辆进入
sbit K2 = P1^1;  // 车辆离开
sbit K3 = P1^2;  // 人工抬杆进
sbit K4 = P1^3;  // 人工抬杆出
sbit K5 = P2^5;  // 翻页控制
sbit beep = P1^7;// 蜂鸣器

// 74HC595控制
sbit SH = P3^5;
sbit ST = P3^6;
sbit DS = P3^7;

// 步进电机控制(ULN2003A)
#define MOTOR_PORT P2
uchar code MOTOR_CW[] = {0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}; // 正转序列
uchar code MOTOR_CCW[] = {0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01}; // 反转序列

/************************** 全局变量定义 **************************/
uchar enter_count = 0;   // 进入车辆数
uchar exit_count = 0;    // 离开车辆数
uchar current_cars = 0;  // 当前车辆数
uint current_page = 1;   // 当前显示页(1-10)
uint total_income = 0;   // 总收入(第10页显示)
uint timer[16] = {0};    // 每个车位计时(秒)
uchar display_cars[2];   // 当前页显示的2个车位状态

/************************** LCD1602驱动 **************************/
#ifndef LCD1602_H
#define LCD1602_H

sbit LCD_RS = P1^4;
sbit LCD_RW = P1^5;
sbit LCD_E  = P1^6;

// 微延时
void lcd_delay(uint ms) {
    uint i, j;
    for(i = 0; i < ms; i++)
        for(j = 0; j < 120; j++);
}

// 写命令
void lcd_write_cmd(uchar cmd) {
    LCD_E = 0;
    LCD_RS = 0;
    LCD_RW = 0;
    P0 = cmd;
    lcd_delay(3);
    LCD_E = 1;
    lcd_delay(25);
    LCD_E = 0;
}

// 写数据
void lcd_write_data(uchar dat) {
    LCD_E = 0;
    LCD_RS = 1;
    LCD_RW = 0;
    P0 = dat;
    lcd_delay(3);
    LCD_E = 1;
    lcd_delay(25);
    LCD_E = 0;
}

// 初始化LCD
void lcd_init() {
    lcd_write_cmd(0x38); // 8位接口,2行显示
    lcd_write_cmd(0x0c); // 显示开,光标关
    lcd_write_cmd(0x06); // 地址自增
    lcd_write_cmd(0x01); // 清屏
}

// 显示字符串(指定位置)
void lcd_show_string(uchar line, uchar col, uchar *str) {
    if(line == 1) lcd_write_cmd(0x80 + col);
    else lcd_write_cmd(0x80 + 0x40 + col);
   
    while(*str != '\0') {
        lcd_write_data(*str);
        str++;
    }
}

// 显示2位数字(自动补位)
void lcd_show_num2(uchar line, uchar col, uint num) {
    if(line == 1) lcd_write_cmd(0x80 + col);
    else lcd_write_cmd(0x80 + 0x40 + col);
   
    if(num >= 100) {
        lcd_write_data(0x30 + num/100%10);
        lcd_write_data(0x30 + num/10%10);
    } else {
        if(num < 10) lcd_write_data(' ');
        lcd_write_data(0x30 + num/10%10);
    }
    lcd_write_data(0x30 + num%10);
}

#endif

/************************** 通用延时函数 **************************/
void delay_ms(uint ms) {
    uint i, j;
    for(i = 0; i < ms; i++)
        for(j = 0; j < 120; j++);
}

/************************** 步进电机控制 **************************/
// 正转抬杆
void motor_raise() {
    uint i, j;
    for(i = 0; i < 5; i++) {       // 转动5圈
        for(j = 0; j < 8; j++) {   // 8拍控制
            MOTOR_PORT = MOTOR_CW[j];
            delay_ms(20);          // 控制速度
        }
    }
    MOTOR_PORT = 0x00;             // 停止
}

// 反转落杆
void motor_lower() {
    uint i, j;
    for(i = 0; i < 5; i++) {       // 转动5圈
        for(j = 0; j < 8; j++) {   // 8拍控制
            MOTOR_PORT = MOTOR_CCW[j];
            delay_ms(20);          // 控制速度
        }
    }
    MOTOR_PORT = 0x00;             // 停止
}

/************************** 74HC595控制 **************************/
void hc595_write(uint data) {
    uchar i;
    ST = 0;
    for(i = 0; i < 16; i++) {
        SH = 0;
        DS = (data & 0x0001) ? 1 : 0;
        SH = 1;
        data >>= 1;
    }
    ST = 1;
}

uint get_led_state(uchar car_count) {
    uchar i;
    uint state = 0;
    for(i = 0; i < car_count; i++) {
        state |= 1 << i;
    }
    return state;
}

/************************** 计时收费逻辑 **************************/
void update_timer() {
    uchar i;
    for(i = 0; i < 16; i++) {
        if( (get_led_state(current_cars) & (1 << i)) ) {
            timer[ i]++; // 仅对占用车位计时
        }
    }
}

uint calculate_fee(uint seconds) {
    return (seconds / 3600 + (seconds % 3600 ? 1 : 0)) * 3;
}

/************************** 页面显示逻辑 **************************/
void show_page1() {
    lcd_init();
    lcd_show_string(1, 0, "Enter:    Exit:");
    lcd_show_string(2, 0, "Cars:      Empty:");
    lcd_show_num2(1, 6, enter_count);
    lcd_show_num2(1, 14, exit_count);
    lcd_show_num2(2, 5, current_cars);
    lcd_show_num2(2, 13, 16 - current_cars);
}

void show_car_page(uchar page_idx) {
    uchar start = (page_idx - 2) * 2; // 计算起始车位
    lcd_init();
   
    lcd_show_string(1, 0, "Car ");
    lcd_show_num2(1, 4, start + 1);
    lcd_show_string(1, 6, "-");
    lcd_show_num2(1, 7, start + 2);
    lcd_show_string(1, 9, "Fee:");
   
    // 获取车位状态
    display_cars[0] = (get_led_state(current_cars) & (1 << start)) ? 1 : 0;
    display_cars[1] = (get_led_state(current_cars) & (1 << (start + 1))) ? 1 : 0;
   
    // 显示车位1状态
    lcd_show_string(2, 0, "State:");
    lcd_show_string(2, 6, display_cars[0] ? "Occupy" : "Empty");
   
    // 显示费用1
    if(display_cars[0]) {
        lcd_show_num2(2, 12, calculate_fee(timer[start]));
    } else {
        lcd_show_string(2, 12, " 0");
    }
   
    delay_ms(50);
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:592807 发表于 2025-6-13 08:07 | 只看该作者
1  你的void delay_ms(uint ms)   void lcd_delay(uint ms)这两个代码有什么区别

2  你是不是在H文件里面写代码了,别人都在C文件写,你你怎么在H文件写,你是不是吧H文件和C文件搞反了
回复

使用道具 举报

板凳
ID:592807 发表于 2025-6-13 08:10 | 只看该作者
我去。程序.c.兄弟你牛。还带中文的文件名。
回复

使用道具 举报

地板
ID:1121801 发表于 2025-6-13 08:42 | 只看该作者
把报错信息也发上来啊
回复

使用道具 举报

5#
ID:108361 发表于 2025-6-13 09:42 | 只看该作者
缺头文件声明
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表