标题: 单片机程序 智能停车位加收费,在前人基础上加收费 希望大佬指点一下为什么报错 [打印本页]

作者: lbjkchli    时间: 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);

作者: 黄youhui    时间: 2025-6-13 08:07
1  你的void delay_ms(uint ms)   void lcd_delay(uint ms)这两个代码有什么区别

2  你是不是在H文件里面写代码了,别人都在C文件写,你你怎么在H文件写,你是不是吧H文件和C文件搞反了
作者: 黄youhui    时间: 2025-6-13 08:10
我去。程序.c.兄弟你牛。还带中文的文件名。
作者: cyi8    时间: 2025-6-13 08:42
把报错信息也发上来啊
作者: powerdruy    时间: 2025-6-13 09:42
缺头文件声明
作者: lbjkchli    时间: 2025-6-13 21:10
黄youhui 发表于 2025-6-13 08:07
1  你的void delay_ms(uint ms)   void lcd_delay(uint ms)这两个代码有什么区别

2  你是不是在H文件里 ...

确实,昨晚上没发现,今早上睡起来发现给写h里面了。大佬谢谢你哦,我再仔细看看
作者: man1234567    时间: 2025-6-16 09:11
问题要说清楚,别搞图片加主程序要上传全部工程文件。
如果需要保密可事先声明并签署保密合同。
毕竟是自由论坛大家互助,如果还半推半就半合半迎地又当又立就没意思了。
作者: 单片机重购    时间: 2025-6-27 15:14
以后记住命名一个.c文件的同时尽量的使用英文名称去命名规则,我们可以使得书写单片机的程序时可以更好的对单片机的程序书写更加的完美以及很舒畅,再就是可以命名两个延时函数但是呢,你需要对应的使用不能说是可以使用呢,然后不能去不定义不去调用也是不行的,就是可以使用但是不能是不定义的哦




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1