精华内容
下载资源
问答
  • STM32停车车位引导显示系统论文
  • 停车车位控制系统

    2012-09-28 16:48:43
    本文阐述了停车车位控制系统的PLC控制、自动计数、数码显示的一些基本思路和方法,介绍了关于PLC工作特点及运行原理,S7-200不仅编程简单,通用性强,抗干扰能力强,可靠性高,而且具有易于操作及维护,设计、施工...
  • 系统的主要目的是确定免费停车位的可用性并将此数据显示给用户。 该系统将允许用户(驾驶员)实时接收有关停车位状态的最新信息。 抽象的 文凭项目致力于开发停车位监控系统。 在执行文凭项目时,对交通基础设施...
  • 简单的停车位管理系统,通过链表实现

    简单功能介绍

    1. 录入车辆信息
    2. 查找车辆信息
    3. 删除车辆信息
    4. 修改车辆信息
    5. 查找区域车辆信息
    6. 排序(按照车主姓名排序)
    7. 展示所有车辆信息
    8. 将录入的数据保存在文件中
    9. 将文件中的数据读出

    算法构造

    链表的增删改查

    • 结构体的定义
    typedef struct Parking
    {
        char name[20];        //车主姓名
        char carname[10];     //车牌号
        long information;     //车主联系方式
        char region;          //车位区域编号
        int num;              //车位编号
        struct Parking *next; //指针
    }Parking;
    
    
    • 录入车辆信息
      利用尾插法插入新添加的数据
    Parking *Addcar(Parking *head)      //录入车辆信息
    {
        int x;
        system("cls");  //清屏操作
        system("color B");   //改变字体颜色
        Parking *p = head;
        while(p->next!=NULL)   //利用尾插法插入新用户信息
        {
            p = p->next;
        }
        printf("输入需要添加的车辆个数:");
        scanf("%d", &x);
        while(x--)   //输入用户信息
        {
            system("cls");
            Parking *Node = (Parking *)malloc(sizeof(Parking));
            printf("\n输入用户姓名:");
            scanf("%s",Node->name);
            printf("\n输入车牌号:");
            scanf("%s",Node->carname);
            printf("\n输入车主联系方式:");
            scanf("%ld",&Node->information);
            printf("\n输入车位区域编号:");
            getchar();
            scanf("%c",&Node->region);
            printf("\n输入车位编号:");
            scanf("%d",&Node->num);
            Node->next=NULL;
            p->next = Node;
            p = p->next;
        }
        printf("\n输入完成!");
        F(head);   //打印添加后的用户信息
        printf("\n按任意键返回主页\n");
        getch();    //用来显示结果
        return head;
    }
    
    • 删除用户信息
      根据用户名匹配查找用户信息进行删除
    Parking *Delete(Parking *head)      //删除用户信息
    {
        char name[20];
        system("cls");
        system("color B");
        printf("\n\t\t输入你要删除的用户姓名:");
        scanf("%s", name);
        Parking *p = head;
        Parking *q = p->next;
        while(q)   //找到需要删除数据的前结点
        {
            if(strcmp(q->name,name)==0)  //判断字符串是否相等函数
            {
                p->next = q->next;
                free(q);  //释放内存空间
                break;
            }
            p = q;
            q = p->next;
        }
        if(p->next==NULL)
        {
            printf("\n\t\t未找到该用户信息!");
        }
        else
        {
            printf("\n\t\t删除成功!!");
            F(head);
        }
        printf("\n\t\t按任意键返回主菜单");
        getch();
        return head;
    }
    
    • 查找用户信息
      根据字符串匹配查找用户信息
    
    void  Find(Parking *head)      //查找用户信息
    {
        system("cls");
        system("color B");
        char name[20];
        printf("\n\t\t输入你要查找的用户姓名:");
        scanf("%s", name);
        Parking *p = head;
        while(p->next)
        {
            if(strcmp(p->next->name,name)==0)
            {
                printf("找到了!\n");
                printf("该用户的信息如下:");
                printf("\n\t\t---用户姓名            %s",p->next->name);
                printf("\n\t\t---车牌号              %s",p->next->carname);
                printf("\n\t\t---车主联系方式        %ld",p->next->information);
                printf("\n\t\t---车位区域编号        %c",p->next->region);
                printf("\n\t\t---车位编号            %d",p->next->num);
                break;
            }
            p = p->next;
        }
        if(p->next==NULL)
            printf("\n\t\t没有找到该用户信息");
        printf("\n\t\t按任意键返回主菜单");
        getch();
    }
    
    • 修改用户信息
      查找用户找到后显示该用户的信息,根据用户选择修改信息
    Parking *Change(Parking *head)      //修改用户信息
    {
        char name[20];
        system("cls");
        system("color B");
        printf("输入需要修改的用户姓名:");
        scanf("%s", name);
        Parking *p = head->next;
        while(p)
        {
            if(strcmp(p->name,name)==0)
            {
                system("cls");
                system("color B");
                int x;
                printf("\n\t\t                           --该用户信息--                                            \n\n");
                printf("\t---------------------------------------------------------------------\n");
                printf("\t车主姓名--------车牌号-------车主联系方式---车位区域编号-----车位编号----\n");
                printf("\t%-17s%-16s%-15ld%-16c%-17d\n", p->name, p->carname, p->information, p->region, p->num);
                printf("\n输入你要修改的信息编号:\n");
                printf("     1-车主姓名    \n");
                printf("     2-车牌号      \n");
                printf("     3-车主联系方式 \n");
                printf("     4-车位区域编号 \n");
                printf("     5-车位编号     \n");
                scanf("%d", &x);
                switch(x)
                {
                    case 1:
                        printf("\n\t输入修改后的信息");
                        scanf("%s", p->name);
                        break;
                    case 2:
                        printf("\n\t输入修改后的信息");
                        scanf("%s", p->carname);
                        break;
                    case 3:
                        printf("\n\t输入修改后的信息");
                        scanf("%ld", &p->information);
                        break;
                    case 4:
                        printf("\n\t输入修改后的信息");
                        scanf("%c", &p->region);
                        break;
                    case 5:
                        printf("\n\t输入修改后的信息");
                        scanf("%d", &p->num);
                        break;  
                }
                printf("\n\t\t修改后的用户信息为");
                printf("\t车主姓名--------车牌号-------车主联系方式---车位区域编号-----车位编号----\n");
                printf("\t%-17s%-16s%-15ld%-16c%-17d\n", p->name, p->carname, p->information, p->region, p->num);
                break;
            }
            p = p->next;
        }
        if(p==NULL)
        {
            printf("\n未找到相应用户");
            printf("\n按任意键返回主页\n");
            getch();
            return head;
        }
        printf("\n修改完成!");
        F(head);  //显示修改后的全部信息
        printf("\n按任意键返回主页\n");
        getch();
        return head;
    }
    

    其他链表操作

    • 排序(根据用户姓名排序)
    void *Sort(Parking *head)   //排序
    {
        Parking *p=head;
        Parking *q,*p1=NULL,*p2=NULL;
        while(p->next != NULL)
        {
            q = p->next;
            while(q->next != NULL)
            {
                if(strcmp(p->next->name,q->next->name)>0)  //字符串比较
                {
                    p1 = p->next;  //记录p与q的下一结点
                    p2 = q->next;
                    q->next = q->next->next;
                    p->next = p2;
                    p2->next = p1;
                }
                else
                q = q->next;
            }
            p = p->next;
        }
        F(head);
        printf("\n\t\t按任意键返回主菜单");
        getch();
    }
    
    • 查找区域车辆信息
    void RegionalVehicles(Parking *head)   //寻找指定区域内车辆信息
    {
        system("cls");
        system("color B");
        char c;
        printf("\n\t\t输入你想要查看的区域");
        getchar();
        scanf("%c", &c);
        Parking *p = head->next;
        printf("\n\t\t                              --%c区域内车辆用户信息--                                            \n\n",c);
        printf("\t---------------------------------------------------------------------\n");
        printf("\t车主姓名--------车牌号-------车主联系方式---车位区域编号-----车位编号----\n");
        while(p)
            {
                if(p->region==c)  //判断区域字符与输入字符是否相等,相等则输出
                {
                    printf("\t%-17s%-16s%-15ld%-16c%-17d\n", p->name, p->carname, p->information, p->region, p->num);
                }
                p = p->next;
            }
        printf("\n\t\t按任意键返回主菜单");
        getch();
    }
    
    

    文件的读取与输入

    • 将数据保存在文件中
      之所以用w形式打开文件是因为我在程序运行前已将文件内数据读出,最后进行保存数据时覆盖原数据不会导致原数据丢失
    void  Preservation(Parking *head)   //保存数据在文件中
    {
        const char* filename1 = "C:/Users/judicious/Desktop/car.text";  //文件路径
        FILE *fp = fopen(filename1, "w");  //以写的方式打开文件,若文件不存在,则建立新的文件。若文件内有内容则会覆盖原有内容
        if (fp == NULL)   //判断是否成功打开
    	{
    	    puts("Fail to open file!");
    	    exit(1);
    	}
        Parking * p = head->next;
        while(p)
        {
            fprintf(fp,"%s %s %ld %c %d\n", p->name, p->carname, p->information, p->region, p->num);  //向文件内输入数据
            p = p->next;
        }
        fclose(fp);  //关闭文件
        return;
    }
    
    • 将文件中数据读出
      将文件内数据读出并保存在链表当中,方便对数据进行修改
    Parking *Read()   //读取文件内数据
    {
        const char* filename1 = "C:/Users/judicious/Desktop/car.text";
        FILE *fp = fopen(filename1, "rt");  //以读的方式打开文件
        if (fp == NULL)
    	{
    	    puts("Fail to open file!");
    	    exit(1);   
    	}
        Parking *head = (Parking *)malloc(sizeof(Parking));  //为头指针申请内存空间
        head->next = NULL;  
        Parking *p1 = (Parking *)malloc(sizeof(Parking));  //申请存放数据的结点
        p1->next = NULL;
        if(fscanf(fp, "%s %s %ld %c %d", p1->name, p1->carname, &p1->information, &p1->region, &p1->num)!=EOF)  //判断所读文件内容是否为空
        {
            head->next=p1;
            Parking *tmp=head;
            while (tmp->next)   //利用尾插法插入结点,确保读出的数据安正序输出
            {
                tmp=tmp->next;
            }
            while(fgetc(fp)!=EOF)  //判断文件是否为空
            {
                
                Parking *p = (Parking *)malloc(sizeof(Parking));
                fscanf(fp, "%s %s %ld %c %d", p->name, p->carname, &p->information, &p->region, &p->num);
                tmp->next=p;
                p->next=NULL;
                tmp = tmp->next;
            }
            Parking *p2 = head;  //删除最后一个结点
            while(p2->next->next)
            {
                p2 = p2->next;
            }
            p2->next = NULL;
        }
        else
            return NULL;
        fclose(fp);
        return head->next;
    }
    

    删除最后一个结点的原因是我存入数据时每行数据后有一个换行符,fgetc()将换行符读走,最后一行时也将换行符读走。此时判断文件不为空,继续读取内容,所以最后一个结点内的内容为随机值,因此删除该结点。

    主菜单

    void menu()   //主菜单
    {
        Parking *head = (Parking *)malloc(sizeof(Parking));
        head->next = Read();  //读取文件信息
        system("cls");
        HideCursor();   //隐藏光标
        int choice;
        do
        {
            system("cls");  //主页面
            printf("--------------------------------------------------------------");
            printf("\n\n");
            printf("********************欢迎来到停车位管理系统********************\n");
            printf("\n\n");
            printf("---------------------------------------------------------\n");
            printf("\n                 1- 录入车辆信息                        ");
            printf("\n                 2- 查找车辆信息                        ");
            printf("\n                 3- 移除车辆信息                        ");
            printf("\n                 4- 修改车辆信息                        ");
            printf("\n                 5- 查找区域车辆信息                     ");
            printf("\n                 6- 展示所有车辆信息                     ");
            printf("\n                 7- 按车主姓名排序                       ");
            printf("\n                 0- 退出管理系统并保存数据              \n");
            printf("\n-------------------------------------------------------\n");
            scanf("%d", &choice);
            switch(choice)
            {
                case 1:
                    head = Addcar(head);
                    break;
                case 2:
                    Find(head);
                    break;
                case 3:
                    head = Delete(head);
                    break;
                case 4:
                    head = Change(head);
                    break;
                case 5:
                    RegionalVehicles(head);
                    break;
                case 6:
                    F(head);
                    break;
                case 7:
                    Sort(head);
                    break;
            }
        } while (choice!=0);
        Preservation(head);   //保存数据
    }
    
    

    主菜单界面

    主函数

    int main()
    {
        menu();
        return 0;
    }
    

    完整代码

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <windows.h> //system("cls"):清屏  
    #include <conio.h>  //getch()
    
    typedef struct Parking
    {
        char name[20];        //车主姓名
        char carname[10];     //车牌号
        long information;     //车主联系方式
        char region;          //车位区域编号
        int num;              //车位编号
        struct Parking *next; //指针
    }Parking;
    
    
    
    void HideCursor()     //隐藏光标
    {
     CONSOLE_CURSOR_INFO cursor_info = {1, 0}; 
     SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
    }
    
    
    
    Parking *Addcar(Parking *head)      //录入车辆信息
    {
        int x;
        system("cls");
        system("color B");
        Parking *p = head;
        while(p->next!=NULL)
        {
            p = p->next;
        }
        printf("输入需要添加的车辆个数:");
        scanf("%d", &x);
        while(x--)
        {
            system("cls");
            Parking *Node = (Parking *)malloc(sizeof(Parking));
            printf("\n输入用户姓名:");
            scanf("%s",Node->name);
            printf("\n输入车牌号:");
            scanf("%s",Node->carname);
            printf("\n输入车主联系方式:");
            scanf("%ld",&Node->information);
            printf("\n输入车位区域编号:");
            getchar();
            scanf("%c",&Node->region);
            printf("\n输入车位编号:");
            scanf("%d",&Node->num);
            Node->next=NULL;
            p->next = Node;
            p = p->next;
        }
        printf("\n输入完成!");
        F(head);
        printf("\n按任意键返回主页\n");
        getch();
        return head;
    }
    
    
    
    Parking *Change(Parking *head)      //修改用户信息
    {
        char name[20];
        system("cls");
        system("color B");
        printf("输入需要修改的用户姓名:");
        scanf("%s", name);
        Parking *p = head->next;
        while(p)
        {
            if(strcmp(p->name,name)==0)
            {
                system("cls");
                system("color B");
                int x;
                printf("\n\t\t                           --该用户信息--                                            \n\n");
                printf("\t---------------------------------------------------------------------\n");
                printf("\t车主姓名--------车牌号-------车主联系方式---车位区域编号-----车位编号----\n");
                printf("\t%-17s%-16s%-15ld%-16c%-17d\n", p->name, p->carname, p->information, p->region, p->num);
                printf("\n输入你要修改的信息编号:\n");
                printf("     1-车主姓名    \n");
                printf("     2-车牌号      \n");
                printf("     3-车主联系方式 \n");
                printf("     4-车位区域编号 \n");
                printf("     5-车位编号     \n");
                scanf("%d", &x);
                switch(x)
                {
                    case 1:
                        printf("\n\t输入修改后的信息");
                        scanf("%s", p->name);
                        break;
                    case 2:
                        printf("\n\t输入修改后的信息");
                        scanf("%s", p->carname);
                        break;
                    case 3:
                        printf("\n\t输入修改后的信息");
                        scanf("%ld", &p->information);
                        break;
                    case 4:
                        printf("\n\t输入修改后的信息");
                        scanf("%c", &p->region);
                        break;
                    case 5:
                        printf("\n\t输入修改后的信息");
                        scanf("%d", &p->num);
                        break;  
                }
                printf("\n\t\t修改后的用户信息为");
                printf("\t车主姓名--------车牌号-------车主联系方式---车位区域编号-----车位编号----\n");
                printf("\t%-17s%-16s%-15ld%-16c%-17d\n", p->name, p->carname, p->information, p->region, p->num);
                break;
            }
            p = p->next;
        }
        if(p==NULL)
        {
            printf("\n未找到相应用户");
            printf("\n按任意键返回主页\n");
            getch();
            return head;
        }
        printf("\n修改完成!");
        F(head);
        printf("\n按任意键返回主页\n");
        getch();
        return head;
    }
    
    
    
    Parking *Delete(Parking *head)      //删除用户信息
    {
        char name[20];
        system("cls");
        system("color B");
        printf("\n\t\t输入你要删除的用户姓名:");
        scanf("%s", name);
        Parking *p = head;
        Parking *q = p->next;
        while(q)
        {
            if(strcmp(q->name,name)==0)
            {
                p->next = q->next;
                free(q);
                break;
            }
            p = q;
            q = p->next;
        }
        if(p->next==NULL)
        {
            printf("\n\t\t未找到该用户信息!");
        }
        else
        {
            printf("\n\t\t删除成功!!");
            F(head);
        }
        printf("\n\t\t按任意键返回主菜单");
        getch();
        return head;
    }
    
    
    
    void  Find(Parking *head)      //查找用户信息
    {
        system("cls");
        system("color B");
        char name[20];
        printf("\n\t\t输入你要查找的用户姓名:");
        scanf("%s", name);
        Parking *p = head;
        while(p->next)
        {
            if(strcmp(p->next->name,name)==0)
            {
                printf("找到了!\n");
                printf("该用户的信息如下:");
                printf("\n\t\t---用户姓名            %s",p->next->name);
                printf("\n\t\t---车牌号              %s",p->next->carname);
                printf("\n\t\t---车主联系方式        %ld",p->next->information);
                printf("\n\t\t---车位区域编号        %c",p->next->region);
                printf("\n\t\t---车位编号            %d",p->next->num);
                break;
            }
            p = p->next;
        }
        if(p->next==NULL)
            printf("\n\t\t没有找到该用户信息");
        printf("\n\t\t按任意键返回主菜单");
        getch();
    }
    
    
    
    void  F(Parking *head)   //打印用户信息
    {   
        system("cls");
        system("color B");
        Parking *p = head->next;
        printf("\n\t\t                              --停车场用户信息--                                            \n\n");
        printf("\t---------------------------------------------------------------------\n");
        printf("\t车主姓名--------车牌号-------车主联系方式---车位区域编号-----车位编号----\n");
        while (p)
        {
            printf("\t%-17s%-16s%-15ld%-16c%-17d\n", p->name, p->carname, p->information, p->region, p->num);
            p = p->next;
        }
        getch();
        return;
    }
    
    
    
    void RegionalVehicles(Parking *head)   //寻找指定区域内车辆信息
    {
        system("cls");
        system("color B");
        char c;
        printf("\n\t\t输入你想要查看的区域");
        getchar();
        scanf("%c", &c);
        Parking *p = head->next;
        printf("\n\t\t                              --%c区域内车辆用户信息--                                            \n\n",c);
        printf("\t---------------------------------------------------------------------\n");
        printf("\t车主姓名--------车牌号-------车主联系方式---车位区域编号-----车位编号----\n");
        while(p)
            {
                if(p->region==c)
                {
                    printf("\t%-17s%-16s%-15ld%-16c%-17d\n", p->name, p->carname, p->information, p->region, p->num);
                }
                p = p->next;
            }
        printf("\n\t\t按任意键返回主菜单");
        getch();
    }
    
    
    
    void *Sort(Parking *head)   //排序
    {
        Parking *p=head;
        Parking *q,*p1=NULL,*p2=NULL;
        while(p->next != NULL)
        {
            q = p->next;
            while(q->next != NULL)
            {
                if(strcmp(p->next->name,q->next->name)>0)
                {
                    p1 = p->next;
                    p2 = q->next;
                    q->next = q->next->next;
                    p->next = p2;
                    p2->next = p1;
                }
                else
                q = q->next;
            }
            p = p->next;
        }
        F(head);
        printf("\n\t\t按任意键返回主菜单");
        getch();
    }
    
    
    
    void  Preservation(Parking *head)   //保存数据在文件中
    {
        const char* filename1 = "C:/Users/judicious/Desktop/car.text";
        FILE *fp = fopen(filename1, "w");
        if (fp == NULL)
    	{
    	    puts("Fail to open file!");
    	    exit(1);
    	}
        Parking * p = head->next;
        while(p)
        {
            fprintf(fp,"%s %s %ld %c %d\n", p->name, p->carname, p->information, p->region, p->num);
            p = p->next;
        }
        fclose(fp);
        return;
    }
    
    
    
    Parking *Read()   //读取文件内数据
    {
        const char* filename1 = "C:/Users/judicious/Desktop/car.text";
        FILE *fp = fopen(filename1, "rt");
        if (fp == NULL)
    	{
    	    puts("Fail to open file!");
    	    exit(1);   
    	}
        Parking *head = (Parking *)malloc(sizeof(Parking));
        head->next = NULL;
        Parking *p1 = (Parking *)malloc(sizeof(Parking));
        p1->next = NULL;
        if(fscanf(fp, "%s %s %ld %c %d", p1->name, p1->carname, &p1->information, &p1->region, &p1->num)!=EOF)
        {
            head->next=p1;
            Parking *tmp=head;
            while (tmp->next)
            {
                tmp=tmp->next;
            }
            while(fgetc(fp)!=EOF)
            {
                
                Parking *p = (Parking *)malloc(sizeof(Parking));
                fscanf(fp, "%s %s %ld %c %d", p->name, p->carname, &p->information, &p->region, &p->num);
                tmp->next=p;
                p->next=NULL;
                tmp = tmp->next;
            }
            Parking *p2 = head;
            while(p2->next->next)
            {
                p2 = p2->next;
            }
            p2->next = NULL;
        }
        else
            return NULL;
        fclose(fp);
        return head->next;
    }
    
    
    
    void menu()   //主菜单
    {
        Parking *head = (Parking *)malloc(sizeof(Parking));
        head->next = Read();  //读取文件信息
        system("cls");
        HideCursor();   //隐藏光标
        int choice;
        do
        {
            system("cls");
            printf("--------------------------------------------------------------");
            printf("\n\n");
            printf("********************欢迎来到停车位管理系统********************\n");
            printf("\n\n");
            printf("---------------------------------------------------------\n");
            printf("\n                 1- 录入车辆信息                        ");
            printf("\n                 2- 查找车辆信息                        ");
            printf("\n                 3- 移除车辆信息                        ");
            printf("\n                 4- 修改车辆信息                        ");
            printf("\n                 5- 查找区域车辆信息                     ");
            printf("\n                 6- 展示所有车辆信息                     ");
            printf("\n                 7- 按车主姓名排序                       ");
            printf("\n                 0- 退出管理系统并保存数据              \n");
            printf("\n-------------------------------------------------------\n");
            scanf("%d", &choice);
            switch(choice)
            {
                case 1:
                    head = Addcar(head);
                    break;
                case 2:
                    Find(head);
                    break;
                case 3:
                    head = Delete(head);
                    break;
                case 4:
                    head = Change(head);
                    break;
                case 5:
                    RegionalVehicles(head);
                    break;
                case 6:
                    F(head);
                    break;
                case 7:
                    Sort(head);
                    break;
            }
        } while (choice!=0);
        Preservation(head);   //保存数据
    }
    
    
    
    int main()
    {
        menu();
        return 0;
    }
    

    若有错误,欢迎指正!!!

    展开全文
  • 模拟临大停车场车位管理系统 首页显示: 欢迎来到临沂大学 空闲停车位n个(n个灯亮) “by姓名” 按下K1(停车位数递减),显示“欢迎来到临沂大学,停车位剩余n个”。连续按n次,显示“没有空闲停车位”。 按...
  • 基于CC2530 ZIGBEE的物联网车位管理系统系统由下列部分组成: 车位探测器,采用干电池供电。...车位指示灯, 检测到有车显示红色,没车显示绿色。 后台管理系统,汇集所有车位信息,以微信或APP的方式推给用户。
  • 并且拥有16个模拟的停车位,用来显示车辆停放的具体位置。 系统的特点: 由于本系统采用电子元件无需人工管理。 自动显示停车场的车位状态,进出和停放车辆统计。 统计小区当天已停放车辆总数,并且显示停放位置。 本...
  • 以前落后的人力停车管理即将被高科技化的自动停车管理系统所取代,高度自动化的停车场管理系统节省了大量时间和人力物资消耗,大大提高了效率。 功能描述: 1、采用51单片机作为主控芯片; 2、采用红外避障...

    随着人们生活水平的提高,汽车的数量也与日俱增,于是停车正在成为世界性的问题。以前落后的人力停车管理即将被高科技化的自动停车管理系统所取代,高度自动化的停车场管理系统节省了大量时间和人力物资消耗,大大提高了效率。

     

    功能描述

    1、采用51单片机作为主控芯片;

    2、采用红外避障传感器作为计数电路;

    3、采用LCD1602作为显示模块;

    4、当剩余车位数为0时,蜂鸣器报警、红灯亮(平时绿灯亮);

     

    按键说明

    1、设置键:设置车位总量;

    2、加值键:对设置值+1操作;

    3、减值键:对设置值-1操作;

     

    整体方案

     

    电路设计

    采用Altium Designer作为电路设计工具。Altium Designer通过把原理图设计、PCB绘制编辑、拓扑逻辑自动布线、信号完整性分析和设计输出等技术的完美融合,为设计者提供了全新的设计解决方案,使设计者可以轻松进行设计,熟练使用这一软件必将使电路设计的质量和效率大大提高。

     

    仿真设计

    采用Proteus作为仿真设计工具。Proteus是一款著名的EDA工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。

     

    博主福利:100G电子设计学习资源包!

    http://mp.weixin.qq.com/mp/homepage?__biz=MzU3OTczMzk5Mg==&hid=7&sn=ad5d5d0f15df84f4a92ebf72f88d4ee8&scene=18#wechat_redirect

    --------------------------------------------------------------------------------------------------------------------------

    展开全文
  • 本模拟停车位管理系统的功能是:系统对进入停车位的车辆进行车牌识别,将识别出来的车牌号显示出来;然后对车主进行人脸识别,框出车主照片的人脸部分作为车主信息的标记,记录在系统库中。车辆在库期间,系统使用者...

    一、简介

    本模拟停车位管理系统的功能是:系统对进入停车位的车辆进行车牌识别,将识别出来的车牌号显示出来;然后对车主进行人脸识别,框出车主照片的人脸部分作为车主信息的标记,记录在系统库中。车辆在库期间,系统使用者可以随意查看车辆与车主信息的获取过程及获取结果。而当车辆离开时,系统库将清除该车辆与车主的所有信息。
    在这里插入图片描述

    二、源代码

    function varargout = slyarh_main(varargin)
    gui_Singleton = 1;
    gui_State = struct('gui_Name',       mfilename, ...
                       'gui_Singleton',  gui_Singleton, ...
                       'gui_OpeningFcn', @slyarh_main_OpeningFcn, ...
                       'gui_OutputFcn',  @slyarh_main_OutputFcn, ...
                       'gui_LayoutFcn',  [] , ...
                       'gui_Callback',   []);
    if nargin && ischar(varargin{1})
        gui_State.gui_Callback = str2func(varargin{1});
    end
    if nargout
        [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
    else
        gui_mainfcn(gui_State, varargin{:});
    end
    function slyarh_main_OpeningFcn(hObject, eventdata, handles, varargin)
    handles.output = hObject;
    guidata(hObject, handles);
    function varargout = slyarh_main_OutputFcn(hObject, eventdata, handles) 
    varargout{1} = handles.output;
    
    %“※﹏﹋﹏﹋﹏﹋﹏﹋﹏﹋﹏﹋﹏﹋﹏﹋﹏ 启动画面 ﹏﹋﹏﹋﹏﹋﹏﹋﹏﹋﹏﹋﹏﹋﹏﹋﹏ ※”
    ImageFile  = '.\字符模板\wel.png';
    ScreenSize = get(0,'ScreenSize');
    jImage     = im2java(imread(ImageFile));
    jfBounds   = num2cell([...
        (ScreenSize(3)-jImage.getWidth)/2 ...
        (ScreenSize(4)-jImage.getHeight)/2 ...
        jImage.getWidth ...
        jImage.getHeight]);
    jFrame     = javax.swing.JFrame;
    icon       = javax.swing.ImageIcon(jImage);
    label      = javax.swing.JLabel(icon);
    jFrame.getContentPane.add(label);
    jFrame.setUndecorated(true)
    jFrame.setBounds(jfBounds{:});
    jFrame.pack
    jFrame.show
    pause(3)
    jFrame.dispose
    %“※﹏﹋﹏﹋﹏﹋﹏﹋﹏﹋﹏﹋﹏﹋﹏﹋﹏  ﹏﹋﹏﹋﹏﹋﹏﹋﹏﹋﹏﹋﹏﹋﹏﹋﹏ ※”
    
    %“※﹏﹋﹏﹋﹏﹋﹏﹋﹏﹋﹏﹋﹏﹋﹏﹋﹏ 背景和logo ﹏﹋﹏﹋﹏﹋﹏﹋﹏﹋﹏﹋﹏﹋﹏﹋﹏ ※”
    h = handles.figure1; %创建一个Figure,并返回其句柄
    newIcon = javax.swing.ImageIcon('.\字符模板\logo.png')
    figFrame = get(h,'JavaFrame'); %取得Figure的JavaFrame。
    figFrame.setFigureIcon(newIcon); %修改图标
    ha=axes('units','normalized','pos',[0 0 1 1]);
    uistack(ha,'down');
    ii=imread('.\字符模板\bg1.png');
    %设置程序的背景图为beijing1.jpg
    image(ii);
    colormap gray
    set(ha,'handlevisibility','off','visible','off');
    %“※﹏﹋﹏﹋﹏﹋﹏﹋﹏﹋﹏﹋﹏﹋﹏﹋﹏  ﹏﹋﹏﹋﹏﹋﹏﹋﹏﹋﹏﹋﹏﹋﹏﹋﹏ ※”
    
    %“※﹏﹋﹏﹋﹏﹋﹏﹋﹏﹋﹏﹋﹏﹋﹏﹋﹏ 停车 ﹏﹋﹏﹋﹏﹋﹏﹋﹏﹋﹏﹋﹏﹋﹏﹋﹏ ※”
    function bt_in_Callback(hObject, eventdata, handles)
    [filename pathname]=uigetfile({'*.jpg';'*.png';'*.bmp'}, '正在拍摄入场的车辆~');
    I=imread([pathname '\' filename]);
    handles.I=I;
    guidata(hObject, handles);
    axes(handles.axes1);imshow(I);title('汽车靓照');
    axes(handles.axes11);imshow(I);title('汽车靓照');
    imwrite(I,'.\进车记录\原.jpg');
    set(handles.bt_new,'visible','on');
    set(handles.ui_in,'visible','off');
    set(handles.ui_out,'visible','on');
    %“※﹏﹋﹏﹋﹏﹋﹏﹋﹏﹋﹏﹋﹏﹋﹏﹋﹏ 进车 ﹏﹋﹏﹋﹏﹋﹏﹋﹏﹋﹏﹋﹏﹋﹏﹋﹏ ※”
    I=handles.I;
    I1=rgb2gray(I);
    I2=edge(I1,'roberts',0.18,'both');
    imwrite(I1,'.\进车记录\灰度.jpg');
    imwrite(I2,'.\进车记录\边缘.jpg');
    se=[1;1;1];
    I3=imerode(I2,se);%腐蚀操作
    imwrite(I2,'.\进车记录\腐蚀.jpg');
    se=strel('rectangle',[25,25]);
    I4=imclose(I3,se);%图像聚类,填充图像
    I5=bwareaopen(I4,2000);%去除聚团灰度值小于2000的部分
    [y,x,z]=size(I5);%返回15各维的尺寸,存储在x,y,z中
    myI=double(I5);
    tic      %tic计时开始,toc结束
    Blue_y=zeros(y,1);%产生一个y*1的零针
    for i=1:y
        for j=1:x
            if(myI(i,j,1)==1)%如果myI图像坐标为(i,j)点值为1,即背景颜色为蓝色,blue加一
                Blue_y(i,1)=Blue_y(i,1)+1;%蓝色像素点统计
            end
        end
    end
    [temp MaxY]=max(Blue_y);
    %Y方向车牌区域确定
    %temp为向量yellow_y的元素中的最大值,MaxY为该值得索引
    PY1=MaxY;
    while((Blue_y(PY1,1)>=5)&&(PY1>1))
        PY1=PY1-1;
    end
    PY2=MaxY;
    while((Blue_y(PY2,1)>=5)&&(PY2<y))
        PY2=PY2+1;
    end
    IY=I(PY1:PY2,:,:);
    %X方向车牌区域确定
    Blue_x=zeros(1,x);%进一步确认x方向的车牌区域
    for j=1:x
        for i=PY1:PY2
            if(myI(i,j,1)==1)
                Blue_x(1,j)=Blue_x(1,j)+1;
            end
        end
    end
    PX1=1;
    while((Blue_x(1,PX1)<3)&&(PX1<x))
        PX1=PX1+1;
    end
    PX2=x;
    while((Blue_x(1,PX2)<3)&&(PX2>PX1))
        PX2=PX2-1;
    end
    PX1=PX1-1;%对车牌区域的矫正
    PX2=PX2+1;
    dw=I(PY1:PY2-8,PX1:PX2,:);
    t=toc;
    imwrite(dw,'.\进车记录\定位.jpg');
    b=rgb2gray(dw);%将车牌图像转换为灰度图
    g_max=double(max(max(b)));
    g_min=double(min(min(b)));
    T=round(g_max-(g_max-g_min)/3);%T为二值化的阈值
    [m,n]=size(b);
    d=(double(b)>=T);%d:二值图像
    imwrite(d,'.\进车记录\二值.jpg');
    % imwrite(d,'二值化.jpg');
    %均值滤波前
    %滤波
    h=fspecial('average',3);
    %建立预定义的滤波算子,average为均值滤波,模板尺寸为3*3
    d=im2bw(round(filter2(h,d)));%使用指定的滤波器h对h进行d即均值滤波
    imwrite(d,'.\进车记录\均值.jpg');
    % imwrite(d,'均值滤波.jpg');
    %某些图像进行操作
    %膨胀或腐蚀
    se=eye(2);%单位矩阵
    [m,n]=size(d);%返回信息矩阵
    if bwarea(d)/m/n>=0.365%计算二值图像中对象的总面积与整个面积的比是否大于0.365
        d=imerode(d,se);%如果大于0.365则进行腐蚀
    elseif bwarea(d)/m/n<=0.235%计算二值图像中对象的总面积与整个面积的比值是否小于0.235
        d=imdilate(d,se);%%如果小于则实现膨胀操作
    end
    imwrite(I2,'.\进车记录\膨胀.jpg');
    %寻找连续有文字的块,若长度大于某阈值,则认为该块有两个字符组成,需要分割
    d=qiege(d);
    [m,n]=size(d);
    k1=1;
    k2=1;
    s=sum(d);
    j=1;
    while j~=n
        while s(j)==0
            j=j+1;
        end
        k1=j;
        while s(j)~=0 && j<=n-1
            j=j+1;
        end
        k2=j-1;
        if k2-k1>=round(n/6.5)
            [val,num]=min(sum(d(:,[k1+5:k2-5])));
            d(:,k1+num+5)=0;%分割
        end
    end
    %再切割
    d=qiege(d);
    %切割出7个字符
    y1=10;
    y2=0.25;
    flag=0;
    word1=[];
    while flag==0
        [m,n]=size(d);
        left=1;
        wide=0;
        while sum(d(:,wide+1))~=0
            wide=wide+1;
        end
        if wide<y1 %认为是左干扰 
            d(:,[1:wide])=0;
            d=qiege(d);
        else
            temp=qiege(imcrop(d,[1 1 wide m]));
            [m,n]=size(temp);
            all=sum(sum(temp));
            two_thirds=sum(sum(temp([round(m/3):2*round(m/3)],:)));
            if two_thirds/all>y2
                flag=1;word1=temp;%word1
            end
            d(:,[1:wide])=0;d=qiege(d);
        end
    end
    %分割出第二至七个字符
    [word2,d]=getword(d);
    [word3,d]=getword(d);
    [word4,d]=getword(d);
    [word5,d]=getword(d);
    [word6,d]=getword(d);
    [word7,d]=getword(d);
    [m,n]=size(word1);
    %商用系统程序中归一化大小为40*20
    word1=imresize(word1,[40 20]);
    word2=imresize(word2,[40 20]);
    word3=imresize(word3,[40 20]);
    word4=imresize(word4,[40 20]);
    word5=imresize(word5,[40 20]);
    word6=imresize(word6,[40 20]);
    word7=imresize(word7,[40 20]);
    axes(handles.axes2);imshow(word1);
    axes(handles.axes3);imshow(word2);
    axes(handles.axes4);imshow(word3);
    axes(handles.axes5);imshow(word4);
    axes(handles.axes6);imshow(word5);
    axes(handles.axes7);imshow(word6);
    axes(handles.axes8);imshow(word7);
    

    三、运行结果

    在这里插入图片描述
    在这里插入图片描述

    四、备注

    版本:2014a

    展开全文
  • 介绍一种停车车位自动化管理系统...该系统设计通过超声传感器、单片机控制、嵌入式无线串口通讯模块以及星形通信网络技术的有机结合,可自动完成车位信息采集管理和显示功能,从而优化了停车场管理,方便了用户泊车。
  • 按下K1(停车位数递减),显示“欢迎来到临沂大学,停车位剩余n个”。连续按n次,显示“没有空闲停车位”。 按下K2(停车位数递增),显示“欢迎再来临沂大学,停车位空余n个”。 按下K3,挂起任务1. 灯闪烁。 按下...

    FreeRTOS课程设计之临沂大学停车场车位管理系统(一)

    先看一下效果吧

    1.作品要求

    模拟临大停车场车位管理系统

    首页显示:

    欢迎来到临沂大学

    空闲停车位n个(n个灯亮)

    “by姓名”

    按下K1(停车位数递减),显示“欢迎来到临沂大学,停车位剩余n个”。连续按n次,显示“没有空闲停车位”。

    按下K2(停车位数递增),显示“欢迎再来临沂大学,停车位空余n个”。

    按下K3,挂起任务1. 灯闪烁。

    按下K4,恢复任务1. 灯全亮。

    加分项:
    功能的扩展与创意。

    2.实现思路

    • 需要用到 LED、OLED、按键等外设
    • 使用FreeRTOS实时操作系统
    • 需要创建几个任务、任务之间如何安排、数据如何传递?
    • 想好这些之后,再开始敲代码之前画个图吧!

    image-20201217201146378

    主要创建4个任务,这4个任务如上图所示,如何把这几个任务联系起来?

    当然是通过信号量了

    老师说,信号量可以在任务之间传递,但我没怎么用上,偷了个懒,定义了一个chewei(车位变量),Take与Give这两个任务就是对这个变量进行操作,使其–、++。

    LED_Task则是根据chewei信息及时更新LED与OLED显示。

    KEY_Task则是挂起与恢复 前两个任务。

    这样就是大体的思路了。

    3.主要代码

    3.1 任务句柄的创建
    /**************************** 任务句柄 ********************************/
    /* 
     * 任务句柄是一个指针,用于指向一个任务,当任务创建好之后,它就具有了一个任务句柄
     * 以后我们要想操作这个任务都需要通过这个任务句柄,如果是自身的任务操作自己,那么
     * 这个句柄可以为NULL。
     */
    static TaskHandle_t AppTaskCreate_Handle = NULL;/* 创建任务句柄 */
    static TaskHandle_t Take_Task_Handle = NULL;/* Take_Task任务句柄 */
    static TaskHandle_t Give_Task_Handle = NULL;/* Give_Task任务句柄 */
    static TaskHandle_t KEY_Task_Handle = NULL;/* KEY任务句柄 */
    static TaskHandle_t LED_Task_Handle = NULL;/* LED任务句柄 */
    
    3.2 AppTaskCreate任务
    /***********************************************************************
      * @ 函数名  : AppTaskCreate
      * @ 功能说明: 为了方便管理,所有的任务创建函数都放在这个函数里面
      * @ 参数    : 无  
      * @ 返回值  : 无
      **********************************************************************/
    static void AppTaskCreate(void)
    {
      BaseType_t xReturn = pdPASS;/* 定义一个创建信息返回值,默认为pdPASS */
      
      taskENTER_CRITICAL();           //进入临界区
      
      /* 创建Test_Queue */
      CountSem_Handle = xSemaphoreCreateCounting(4,4);	 
      if(NULL != CountSem_Handle)
        printf("CountSem_Handle计数信号量创建成功!\r\n");
    
      /* 创建Take_Task任务 */
      xReturn = xTaskCreate((TaskFunction_t )Take_Task, /* 任务入口函数 */
                            (const char*    )"Take_Task",/* 任务名字 */
                            (uint16_t       )512,   /* 任务栈大小 */
                            (void*          )NULL,	/* 任务入口函数参数 */
                            (UBaseType_t    )4,	    /* 任务的优先级 */
                            (TaskHandle_t*  )&Take_Task_Handle);/* 任务控制块指针 */
      if(pdPASS == xReturn)
        printf("创建Take_Task任务成功!\r\n");
      
      /* 创建Give_Task任务 */
      xReturn = xTaskCreate((TaskFunction_t )Give_Task,  /* 任务入口函数 */
                            (const char*    )"Give_Task",/* 任务名字 */
                            (uint16_t       )512,  /* 任务栈大小 */
                            (void*          )NULL,/* 任务入口函数参数 */
                            (UBaseType_t    )4, /* 任务的优先级 */
                            (TaskHandle_t*  )&Give_Task_Handle);/* 任务控制块指针 */ 
      if(pdPASS == xReturn)
        printf("创建Give_Task任务成功!\n\n");
    	/* 创建KEY_Task任务 */
      xReturn = xTaskCreate((TaskFunction_t )KEY_Task,  /* 任务入口函数 */
                            (const char*    )"KEY_Task",/* 任务名字 */
                            (uint16_t       )512,  /* 任务栈大小 */
                            (void*          )NULL,/* 任务入口函数参数 */
                            (UBaseType_t    )4, /* 任务的优先级 */
                            (TaskHandle_t*  )&KEY_Task_Handle);/* 任务控制块指针 */ 
      if(pdPASS == xReturn)
        printf("创建KEY_Task任务成功!\n\n");
    	/* 创建LED_Task任务 */
    	 xReturn = xTaskCreate((TaskFunction_t )LED_Task,  /* 任务入口函数 */
                            (const char*    )"LED_Task",/* 任务名字 */
                            (uint16_t       )512,  /* 任务栈大小 */
                            (void*          )NULL,/* 任务入口函数参数 */
                            (UBaseType_t    )4, /* 任务的优先级 */
                            (TaskHandle_t*  )&LED_Task_Handle);/* 任务控制块指针 */ 
      if(pdPASS == xReturn)
        printf("创建LED_Task任务成功!\n\n");
      
      vTaskDelete(AppTaskCreate_Handle); //删除AppTaskCreate任务
      
      taskEXIT_CRITICAL();            //退出临界区
    }
    
    3.3 Take_Task
    /**********************************************************************
      * @ 函数名  : Take_Task
      * @ 功能说明: Take_Task任务主体
      * @ 参数    :   
      * @ 返回值  : 无
      ********************************************************************/
    static void Take_Task(void* parameter)
    {	
      BaseType_t xReturn = pdTRUE;/* 定义一个创建信息返回值,默认为pdPASS */
      /* 任务都是一个无限循环,不能返回 */
      while (1)
      {
        //如果KEY1被单击	
    		if( 0 == HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin)  )       
    		{  
    			delay_ms(80);
    			if( 0 == HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin)  )
    			{
    			/* 获取一个计数信号量 */
    				xReturn = xSemaphoreTake(CountSem_Handle,	/* 计数信号量句柄 */
                                 0); 	/* 等待时间:0 */
    				if(chewei!=0){
    					chewei--;
    				
    				}
    					
    				
    				if ( pdTRUE == xReturn ) 
    					printf( "KEY1被按下,成功申请到停车位。\n" );
    				else
    					printf( "KEY1被按下,不好意思,现在停车场已满!\n" );	
    		  }			
    		}
    		vTaskDelay(20);     //每20ms扫描一次		
      }
    }
    
    3.4 Give_Task
    static void Give_Task(void* parameter)
    {	 
      BaseType_t xReturn = pdTRUE;/* 定义一个创建信息返回值,默认为pdPASS */
      /* 任务都是一个无限循环,不能返回 */
      while (1)
      {
        //如果KEY2被单击
    		if( 0 == HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin) )  			
    		{
    			delay_ms(80);
    			if( 0 == HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin) )
    			{
    			/* 获取一个计数信号量 */
          xReturn = xSemaphoreGive(CountSem_Handle);//给出计数信号量  
          chewei++;
    			
    				if ( pdTRUE == xReturn ) 
    					printf( "KEY2被按下,成功释放车位!\r\n" );
    				else
    					printf( "KEY2被按下,不好意思,无可释放车位!\r\n" );	
    				
    		  }		
    				
    	
    	
    		}
    		vTaskDelay(20);     //每20ms扫描一次	
      }
    }
    
    3.5 Key_Task
    static void KEY_Task(void* parameter)
    {	
      while (1)
      {
        if( 0 == HAL_GPIO_ReadPin(KEY3_GPIO_Port, KEY3_Pin))
    			{
    				delay_ms(80);
    			if( 1 == HAL_GPIO_ReadPin(KEY3_GPIO_Port, KEY3_Pin) )
    			{
    				/* K3 被按下 */
    				printf("挂起任务\n");
    				vTaskSuspend(Take_Task_Handle);/* 挂起Take任务 */
    				vTaskSuspend(Give_Task_Handle);/* 挂起Give任务 */
    				printf("挂起任务成功!\n");
    				shining = 1;
    			}
    		}			
        if( 0 == HAL_GPIO_ReadPin(KEY4_GPIO_Port, KEY4_Pin) )
        {/* K4 被按下 */
    			delay_ms(80);
    			if( 0 == HAL_GPIO_ReadPin(KEY4_GPIO_Port, KEY4_Pin) )
    			{/* K4 被按下 */
    				printf("恢复任务!\n");
    				vTaskResume(Take_Task_Handle);/* 恢复Take任务! */
    				vTaskResume(Give_Task_Handle);/* 恢复Give任务! */
    				printf("恢复任务成功!\n");
    				shining = 0; 
    			}
    		}
    
        vTaskDelay(20);/* 延时20个tick */
      }
    }
    

    3.5LED_Task

    /**********************************************************************
      * @ 函数名  : LED_Task
      * @ 功能说明: LED_Task任务主体
      * @ 参数    :   
      * @ 返回值  : 无
      ********************************************************************/
    static void LED_Task(void* parameter)
    {	 
    	OLED_Clear();
    	OLED_ShowChinese_Row(0,0,*huanying); 
    	OLED_ShowChinese_Row(0,2,*shengyu); 
      while (1)
      {
    		pub++;
    				switch ( chewei ) 
    					{	
    						case 0:
    							LED1_OFF;
    							LED2_OFF;
    							LED3_OFF;
    							LED4_OFF;
    							OLED_ShowChinese_Row(0,0,*wukongxain);
    						  OLED_ShowString(0,2,"no free parking ");
    							OLED_ShowNum(64,4, chewei,1,15);
    							break; 
    						
    					  case 1:
    							LED1_OFF;
    						  LED2_OFF;
    						  LED3_OFF;
    						  LED4_ON;
    							if(shining==1){
    							delay_ms(500);
    							LED4_OFF;
    							delay_ms(500);
    						}
    
                  OLED_ShowNum(64,4, chewei,1,15);
    							break;
    					
    						case 2:
    							LED1_OFF;
    						  LED2_OFF;
    						  LED3_ON;
    						  LED4_ON;
    							if(shining==1){
    							delay_ms(500);
    							LED3_OFF;
    							LED4_OFF;
    							delay_ms(500);
    						}
    
                  OLED_ShowNum(64,4, chewei,1,15);
    
    							break;
    					
    						case 3:
    							LED1_OFF;
    						  LED2_ON;
    						  LED3_ON;
    						  LED4_ON;
    							if(shining==1){
    							delay_ms(500);
    							LED2_OFF;
    							LED3_OFF;
    							LED4_OFF;
    							delay_ms(500);
    						}
    
                  OLED_ShowNum(64,4, chewei,1,15);
    
    							break;
    					
    						case 4:
    							LED1_ON;
    						  LED2_ON;
    						  LED3_ON;
    						  LED4_ON;
    
    							if(shining==1)
    						{
    							delay_ms(500);
    							LED1_OFF;
    							LED2_OFF;
    							LED3_OFF;
    							LED4_OFF;
    							delay_ms(500);
    						}
                  OLED_ShowNum(64,4, chewei,1,15);
    
    							break;
    					
    						default: 
    						break;
    					}
    					//大概有1分钟上传一次数据
    			if(pub%2000==0){
    				pub = 0;
    			STM32DHT11_StatusReport();
    		}
      
    				
    		
    		vTaskDelay(20);     //每20ms扫描一次	
    	}
    }
    

    4.遇到一些问题

    4.1 按键不灵敏

    按键有些不灵敏,所要进行消抖

    我用的是软件延时消抖,效果还不错,延时时间为80ms

     if( 0 == HAL_GPIO_ReadPin(KEY3_GPIO_Port, KEY3_Pin))
    			{
    				delay_ms(80);
    			if( 1 == HAL_GPIO_ReadPin(KEY3_GPIO_Port, KEY3_Pin) )
    			{
    				/* K3 被按下 */
    			}
    		}
    

    HAL_GPIO_ReadPin(KEY3_GPIO_Port, KEY3_Pin)

    至于为什么用这个函数?

    贴一张cubeMX配置图

    image-20201217203620724

    一般来说,需要区分这个GPIO口用于输入还是输出。

    如果是output,那个一般选择no pull,这样,引脚才能根据你的output数据,进行正确输出。

    如果是input,那么需要看具体应用的默认输入值是0还是1. 如果默认是输入0,则最好配置为pull down,反之则配置为pull up.

    一个接有上拉电阻的端口设为输入状态时,他的常态就为高电平,用于检测低电平的输入

    展开全文
  • 使用C51单片机和12864显示屏,总控制器和区域控制器会实时的统计停车场总的停车位和每一个区域的停车位空闲状,然后通过显示显示出来,所以车主在驶入停车场的整个过程中都可以得到指引,顺利的找到一条最方便快接...
  • 本文设计了一种智能停车场的车位信息检测及管理系统系统通过在停车车位上安装地磁感应装置,实时采集车位的状态信息,然后借助GPRS无线网络传输至信息管理平台,信息管理平台进行后续数据的处理及信息显示,最后...
  • (1)显示停车场现有车辆数和已停放过车辆数,总共16个车位,指示灯指示具体的车位占用情况; (2)可以手动设置总车位数以及剩余车位数; (3)车位满后将报警提示。
  • 1、本系统是基于英飞凌无人机套件设计的基于物联网的无人机停车场车位引导系统,通过程序控制装置规划引导停车的路线,实现引导车辆找到停车位的功能。 2、系统由PC上位机(三部分,即车位引导模型部分、无人机坐标...
  • 摘要:随着人们生活水平的提升,私人轿车的数量在不断增加,由于...与以往基于超声波、红外或地感线圈等传感器为主的车位检测技术不同,本系统主要由采集车位视频图像、预处理、车位检测以及界面显示几个部分组成。首...
  • 硬件电路的设计 3.1系统的功能分析及体系结构设计 3.1.1系统功能分析 ...3、车位处是否停车并有状态指示灯指示。 3.1.2系统总体结构 本系统具体框图如下图所示: 原理图: 5V电源电路设计 本系统选择5V直流电源作
  • 车位检测识别系统

    千次阅读 2019-06-19 15:01:30
    视频车位引导系统是一款基于车牌识别的车位引导,采用在每个车位安装车位检测终端来判断当前车位状态,再通过引导屏的显示来引导车主快速停车系统独有的优势即后期可以通过增配设备实现功能升级,升级为具有找车...
  • 1.1 一个简单的.v程序: module nand2_ex16(a,b,f);//定义2输入与非门电路模块nand2_ex1 //模块的外部输入输出端口列表 input a,b; //a,b为输入端口 ...标识符用于表示电路系统中的模块、寄存器、I/O...
  • 51单片机智能停车场管理车位引导系统红外检测 本系统由STC89C52单片机、红外对管传感器、LCD1602液晶显示、 LED指示灯及电源组成。 1、通过红外对管模块实时检测车位是否占用,车位分为1车位,2车位,3车位。 2、...
  • 以前落后的人力停车管理即将被高科技化的自动停车管理系统所取代,高度自动化的停车场管理系统节省了大量时间和人力物资消耗,大大提高了效率。 本论文介绍了利用单片机控制的一种停车场管理系统。它能在任意时间...
  • 以前落后的人力停车管理即将被高科技化的自动停车管理系统所取代,高度自动化的停车场管理系统节省了大量时间和人力物资消耗,大大提高了效率。 本论文介绍了利用单片机控制的一种停车场管理系统。它能在任意时间...
  • 在线体验到室内地图的功能后,手机对室内地图加载一个字,要显示“快”,目前微信和电脑都可以打开室内地图的要求是3秒内打开,能有定位导航...目前就根据商场停车项目需求,先如何找到一个商场停车车位的事情说起...
  • 基于超声波的车位检测系统 三个超声波检测三个车位,LCD显示剩余的车位,具有LED指示;: 仿真图2: 基于红外对管的车位检测系统,两个按键模拟红外对管,LCD显示剩余的车位,具有LED指示,车辆超出后蜂鸣器报警...
  • 城市停车位紧张,停车位...共享车位将不同的停车资源整合到平台,并将不同时段的闲置车位显示在平台上,满足不同停车需求的车主停车,通过共享车位平台实现停车场、物业、个人、企业的多方盈利。 城市的快速发展,带...
  • 系统利用STM32F103C8T6开发板小系统进行开发,采用RPR220光电传感器检测停车位上是否有汽车。系统分为4个停车区A、B、C、D,每个停车区暂设2个停车位。每个停车区某个停车位上有车时[车位状态LED]亮,无车时[车位...
  • ①停车:新来车辆时如果有空位,按顺序为该车分配停车位,并自动记录开始停车的时间(用系统的时间); ②计费:车辆开走时,输入车位编号,自动记录结束停车的时间(用系统的时间);计算出相应停车费; ③显示:...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,694
精华内容 2,277
关键字:

停车位显示系统