找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2152|回复: 0
收起左侧

基于WT588D+51单片机的公交报站系统程序 原理图

[复制链接]
ID:761319 发表于 2022-4-7 08:31 | 显示全部楼层 |阅读模式
制作出来的实物图如下:

成品图

成品图


所用的语音模块为WT588D
此模块不建议使用,因为烧录繁杂(需要烧录器)。我已改成JQ8900语音模块。需要的见我另外的帖子。(等这个月下旬再发)

电路原理图如下:
51hei.png


单片机代码如下:
#include <reg52.h>                 //调用单片机头文件
#include <intrins.h>
#include "JQ8900.h"

#define uchar unsigned char  //无符路字符型 宏定义        变量范围0~255
#define uint  unsigned int         //无符路整型 宏定义        变量范围0~65535

/*12864液晶模块引脚定义*/
sbit rs=P0^0;         //寄存器选择信号 H:数据寄存器          L:指令寄存器
sbit rw=P0^1;         //寄存器选择信号 H:数据寄存器          L:指令寄存器
sbit e =P0^2;         //片选信号   下降沿触发

#if 0
/*
        语音模块控制IO口的定义:弃用 该位WT588D语音模块 改用JQ9800语音模块
*/
sbit  VRST = P3^7;
sbit  VBUSY= P3^6;        
sbit  VSDA = P3^5;
sbit  VCS  = P3^4;  
sbit  VSCL = P3^3;
#endif

uchar geshu=7; //公交站台的个数
/*12864液晶模块显示信息*/                                       
uchar code gj_ming[]= "   3  路公交车";

uchar code  table1[] = "------茶棚------";
uchar code  table2[] = "------金山村----";  
uchar code  table3[] = "----金山公园----";
uchar code  table4[] = "----滨湖公园----";
uchar code  table5[] = "----中山饭店----";
uchar code  table6[] = "----中央百大----";
uchar code  table7[] = "------钟楼------";
//uchar code  table8[] = "南门 ";
//uchar code  table9[] = "下沙行政中心东  ";
//uchar code  table10[]= "海达南路天成东路";
//uchar code  table11[]= "----中沙村----  ";

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

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

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

   P2=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(5);
        }
}

/************12864液晶初始化函数*****************/
void init_12864()
{
   write_com(0x30);
   write_com(0x30);
   write_com(0x08);
   write_com(0x10);
   write_com(0x0c);
   write_com(0x01);        
   write_com(0x06);        

   delay_1ms(100);
}

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

/***********************小延时函数**************************/
void  delay_us (unsigned int us)
{
        while(us--)
        {
                _nop_();
        }
}

#if 0
/*
**********************三线发码子程序***********************
注意:该函数弃用,因WT558D语音模块需要上位机编程 故此处改用JQ8900语音模块
*/
void Send_threelines(unsigned char addr,uchar dat)
{
   unsigned char i;

        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);          //忙等待
}
#endif

/********************独立按键程序*****************/
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;        
}

uchar flag_s = 1;//锁定从起点到终点 跟你们讲个笑话 公交车只会从起点到终点 好笑不
uchar flag_e = 0;//锁定从终点到起点
/***************主函数*****************/
void main()
{         
        uchar num=0;                                 //定时器1,工作在定时方式2
        P0 = P1 = P2 = P3 = 0XFF;
        init_12864();                        
        init_12864_dis();
        //Send_threelines(0,0);    //语音播报
        while(1)
        {
                key();         //独立按键程序        
                if(key_can < 20)
                {
                        //语音播报
                                IO1 = 0;
                                delay_1ms(20);
                                IO1 = 1;
                        if(key_can == 1)
                        {
                                if(flag_e == 0 && flag_s == 1)
                                {
                                        if(num < geshu)
                                        {         
                                                num++;
                                                //flag_s = 1;        
                                        }
                                }
                        }
                        if(key_can == 2)
                        {
                                //语音播报
                                IO1 = 0;
                                delay_1ms(20);
                                IO1 = 1;
                                if(flag_s == 0 && flag_e == 1)
                                {
                                        if(num != 0)
                                        {
                                                num--;
                                                //flag_e = 1;
                                        }                                                
                                }
                        }
                        if(num == 1)       //报第1个站
                        {
                                write_string(1,0,gj_ming);
                                write_string(3,0,table1);
                                write_string(2,0,"        ");
                                write_string(4,0,"        ");
                                //语音播报
                                IO1 = 0;
                                delay_1ms(20);
                                IO1 = 1;        
                                if(flag_e == 1)//从终点--起点
                                {
                                        flag_e = 0;//到站了
                                        flag_s = 1;//那么再次出发智能从起点-终点
                                }        
                        }
                        if(num == 2)       //报第2个站
                        {
                                write_string(1,0,gj_ming);
                                write_string(2,0,"        ");
                                write_string(3,0,table2);
                                write_string(4,0,"        ");
                                //语音播报
                                IO2 = 0;
                                delay_1ms(20);
                                IO2 = 1;
                                                
                        }
                        if(num == 3)       //报第3个站
                        {                                                                    
                                write_string(1,0,gj_ming);
                                write_string(3,0,table3);
                                write_string(2,0,"        ");
                                write_string(4,0,"        ");
                                //语音播报
                                IO3 = 0;
                                delay_1ms(20);
                                IO3 = 1;               
                        }
                        if(num == 4)       //报第4个站
                        {
                                write_string(1,0,gj_ming);
                                write_string(3,0,table4);
                                write_string(2,0,"        ");
                                write_string(4,0,"        ");
                                //语音播报
                                IO4 = 0;
                                delay_1ms(20);
                                IO4 = 1;               
                        }
                        if(num == 5)       //报第5个站
                        {
                                write_string(1,0,gj_ming);
                                write_string(3,0,table5);
                                write_string(2,0,"        ");
                                write_string(4,0,"        ");
                                //语音播报
                                IO5 = 0;
                                delay_1ms(20);
                                IO5 = 1;               
                        }
                        if(num == 6)       //报第6个站
                        {
                                write_string(1,0,gj_ming);
                                write_string(3,0,table6);
                                write_string(2,0,"        ");
                                write_string(4,0,"        ");
                                //语音播报
                                IO6 = 0;
                                delay_1ms(20);
                                IO6 = 1;               
                        }
                        if(num == 7)       //报第7个站
                        {
                                write_string(1,0,gj_ming);
                                write_string(3,0,table7);
                                write_string(2,0,"        ");
                                write_string(4,0,"        ");
                                IO7 = 0;
                                delay_1ms(20);
                                IO7 = 1;
                                if(flag_s == 1)//从起点--终点 到站了
                                {
                                        flag_s = 0;
                                        flag_e = 1;//只能从终点到起点了
                                }
                        }
                }
        }
}

Keil代码下载: 代码原理图.7z (1004.89 KB, 下载次数: 22)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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