制作出来的实物图如下:
所用的语音模块为WT588D
此模块不建议使用,因为烧录繁杂(需要烧录器)。我已改成JQ8900语音模块。需要的见我另外的帖子。(等这个月下旬再发)
电路原理图如下:
单片机代码如下:
#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, 下载次数: 27)
|