找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2214|回复: 3
收起左侧

关于公交车语音系统车上人数

[复制链接]
ID:323751 发表于 2018-5-7 15:19 | 显示全部楼层 |阅读模式
600黑币
我现在毕业论文导师说要加功能,我完全不懂,求帮忙啊
我现在有一个买来的基础的板子,由TH12864、stc89c52、WT588d、现在能实现的是上下报站、nrf报站。就是这样的,带nrf功能的https://item.taobao.com/item.htm ... amp;_u=72359df3f3db

现在老师要实现一个统计车上人数显示的功能怎么办啊?
我是小白求具体的修改后的代码,谢谢。

下面是程序 我现在手上有一个红外模块就是
https://detail.tmall.com/item.ht ... amp;_u=72359df3b940
不知道可不可以,如果不行 我买一个这样的
https://item.taobao.com/item.htm ... &id=44963867710

谢谢,下面是本来主机的代码

#include <reg52.h>                 //调用单片机头文件
#define uchar unsigned char  //无符路字符型 宏定义        变量范围0~255
#define uint  unsigned int         //无符路整型 宏定义        变量范围0~65535
#include <intrins.h>
#include "nrf24l01.h"

sbit rs=P2^5;         //寄存器选择信号 H:数据寄存器          L:指令寄存器
sbit rw=P2^6;         //寄存器选择信号 H:数据寄存器          L:指令寄存器
sbit e =P2^7;         //片选信号   下降沿触发

/***********************语音模块控制IO口的定义************************/
sbit  VRST = P3^7;
sbit  VBUSY= P3^6;       
sbit  VSDA = P3^5;
sbit  VCS  = P3^4;  
sbit  VSCL = P3^3;
uchar yujing[3];

uchar flag_1,flag_2;

uint flag_300ms;
/********************************************************************
* 名称 : delay_1ms()
* 功能 : 延时1ms函数
* 输入 : q
* 输出 : 无
***********************************************************************/
void delay_1ms(uint q)
{
        uint i,j;
        for(i=0;i<q;i++)
                for(j=0;j<115;j++);
}
                                  
                                          
/************ 延时函数  *****************/
void delay_uint(uint z)
{
   while(z--);
}

/***************交换函数 高位变低位 低位变高位*****************/
uchar change_dat(uchar dat)
{
        uchar i,value;
        for(i=0;i<8;i++)
        {       
                value <<= 1;
                if((dat & 0x01) == 0x01)
                        value |= 0x01;
                dat >>= 1;       
        }
        return value;
}

/************ 写命令函数  *****************/
void write_com(uchar com)
{

   P0=change_dat(com);
   rw=0;
   rs=0;
   delay_uint(25);
   e=1;
   delay_uint(50);
   e=0;
}
/************ 写数据函数  *****************/
void write_dat(uchar dat)
{

   P0=change_dat(dat);
   rw=0;
   rs=1;
   delay_uint(25);
   e=1;
   delay_uint(50);
   e=0;
}

/**********************************************************
*函数名: addr_12864
*功能:写地址
*说明:写汉字时要写个地址
*输入:无
*返回:无
**********************************************************/
void addr_12864(uchar hang,uchar lie)          //地址转换
{
        uchar address;
        switch(hang)
        {
                case 1: address=0x80 + lie ;
                                break;
                case 2: address=0x90 + lie ;
                                break;
                case 3: address=0x88 + lie ;
                                break;
                case 4: address=0x98 + lie ;
                                break;
                default :
                                break;
        }       
        write_com(address);
}

/**********************************************************
*函数名: write_string
*功能:在12864上显示字符数据
*说明:
*输入:无
*返回:无
**********************************************************/

void write_string(uchar hang,uchar lie,uchar *p)
{
        addr_12864(hang,lie);          //地址转换
        while(*p != '\0')
        {
                write_dat(*p);
                p++;
                delay_uint(50);
        }
}




/************12864液晶初始化函数*****************/
void init_12864()
{
   write_com(0x30);
   write_com(0x0c);
   write_com(0x01);         
   delay_1ms(100);
}

/************初始化显示*****************/
void init_12864_dis()
{
        write_string(1,0,"    欢迎乘坐    ");
        write_string(2,0,"   403路公交车  ");
        write_string(3,0,"                ");
        write_string(4,0,"                ");
}


/***********************小延时函数**************************/
void  delay_us (unsigned int us)
{

        while(us--)
        {
                _nop_();
        }
}

/***********************语音子程序************************/
void Send_threelines(unsigned char addr,uchar dat)
{
   unsigned char i;
        VRST=0;
        delay_1ms(5);
        VRST=1;
        delay_1ms(20); /* 复位拉高20ms*/
        VCS=0;
        delay_1ms(5);  /* 片选拉低5ms */
    for(i=0;i<8;i++)
        {
                VSCL=0;
                if(addr&0x01)
                {
                        VSDA=1;
                }
                else
                        VSDA=0;
                addr>>=1;
                delay_us(150); /* 150us */
                VSCL=1;
                delay_us(150); /* 150us */
        }
        VCS=1;
        delay_1ms(30);
        if(dat == 1)
                while(VBUSY == 0);          //忙等待
}


/********************独立按键程序*****************/
uchar key_can;         //按键值

void key()         //独立按键程序
{
        static uchar key_new;
        key_can = 20;                   //按键值还原
        P1 |= 0x0f;
        if((P1 & 0x0f) != 0x0f)                //按键按下
        {
                delay_1ms(1);                     //按键消抖动
                if(((P1 & 0x0f) != 0x0f) && (key_new == 1))
                {                                                //确认是按键按下
                        key_new = 0;
                        switch(P1 & 0x0f)
                        {
                                case 0x0e: key_can = 2; break;          //得到按键值
                                case 0x0d: key_can = 1; break;          //得到按键值
                        }
                }                       
        }
        else   //按键松开
                key_new = 1;       
}


/***************主函数*****************/
void main()
{         
        uchar num;
        P0 = P1 = P2 = P3 = 0XFF;
        CE_24=0;
        SCK_24=0;
        CSN_24=1;
        init_12864();                         
        init_12864_dis();
        Send_threelines(0,0);    //语音播报
        RX_Mode();
        while(1)
        {
                key();         //独立按键程序       
                if(key_can < 20)
                {
                        if(key_can == 1)
                        {
                                if(num < 2)
                                {         
                                        num++;       
                                }
                        }
                        if(key_can == 2)
                        {
                                if(num != 0)
                                        num--;       
                        }
                        if(num == 1)       //报第1个站
                        {
                                write_string(1,0,"   403路公交车  ");
                                write_string(2,0,"    定海新村    ");
                                write_string(3,0,"                ");
                                write_string(4,0,"                ");
                                flag_1 = 0;
                                flag_2 = 0;
                                Send_threelines(1,0);    //语音播报       

                        }
                        if(num == 2)       //报第2个站
                        {
                                write_string(1,0,"   403路公交车  ");
                                write_string(2,0,"    拱宸桥东    ");
                                write_string(3,0,"                ");
                                write_string(4,0,"                ");
                                flag_1 = 0;
                                flag_2 = 0;
                                Send_threelines(2,0);    //语音播报       
               
                        }
                }
                flag_300ms ++;
                if(flag_300ms >= 300)                //300ms 处理程序
                {       
                        flag_300ms = 0;          
//                        led = 1;
                        if(nRF24L01_RxPacket(Rx_Buf))
                        {       
//                                led = 0;
                                if(flag_1 == 0)
                                {               
                                        if(Rx_Buf[1] == 1)           //报第1个站
                                        {
                                                write_string(1,0,"   403路公交车  ");
                                                write_string(2,0,"    定海新村    ");
                                                write_string(3,0,"                ");
                                                write_string(4,0,"                ");
                                                Send_threelines(1,1);    //语音播报       
                                                flag_1 = 1;
                                                flag_2 = 0;
                                                num = 1;
                                        }
                                }
                                if(flag_2 == 0)                  
                                {
                                        if(Rx_Buf[1] == 2)          //报第2个站
                                        {
                                                write_string(1,0,"   403路公交车  ");
                                                write_string(2,0,"    拱宸桥东    ");
                                                write_string(3,0,"                ");
                                                write_string(4,0,"                ");
                                                Send_threelines(2,1);    //语音播报       
                                                flag_1 = 0;
                                                flag_2 = 1;
                                                num = 2;
                                        }
                                }
                                Rx_Buf[0] = Rx_Buf[1] = 0;
                        }  
                }
                delay_1ms(1);
        }
}


回复

使用道具 举报

ID:336165 发表于 2018-5-30 00:11 | 显示全部楼层
你是想怎么数人数??用模拟计数还是红外检测??
回复

使用道具 举报

ID:326783 发表于 2018-5-30 11:22 | 显示全部楼层
每上车一个人,数显加1,每下一个人,数显减1.前后两个门各放一个检测。
回复

使用道具 举报

ID:149389 发表于 2018-5-30 15:15 | 显示全部楼层
首先得解决排队的问题,有序的上车,有序的下车,貌似这个秩序不容易。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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