B016 - 基于51单片机的公交车语音报站_点阵广告屏

任务

本文给出的是基于STC89C52的一个16×16点阵LED电子显示屏的设计。整机以STC公司生产的40脚单片机STC89C52为核心,使用德飞莱16*16点阵屏模块,采用ISD4004(现升级为JQ8400F,可根据需要定制)语音模块。文中详细介绍了LED点阵显示的硬件设计思路、硬件电路各个部分的功能及原理以及相应的C程序设计等。

设计实物

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

源程序主逻辑

/*******************************************************************************

* 文件名称:基于51单片机的公交车语音报站

* 实验目的:1.

* 2.

* 程序说明:完整程序Q:2772272579;@: [email protected]

* 日期版本:可定制,如GPS报站,地铁LED报站,LED点阵广告牌等。

*******************************************************************************/
#include"include.h"
extern unsigned char code DIS_WELCOM_TAB[DIS_WELCOM+2][32];		 //欢迎语
extern unsigned char code QISHIZHAN_TIANXUANLOU_TAB[QISHIZHAN_TIANXUANLOU+2][32];		   //前方到站:天机楼
extern unsigned char code TIANJILOU_DAOLE_TAB[TIANJILOU_DAOLE+2][32];			  //天机楼到了
extern unsigned char code QIANFANGDAOZHAN_KAIYANGLOU_TAB[QIANFANGDAOZHAN_KAIYANGLOU+2][32];	  //前方到站:开阳楼
extern unsigned char code KAIYANGLOU_DAOLE_TAB[KAIYANGLOU_DAOLE+2][32];	  //开阳楼到了
extern unsigned char code QIANFANGDAOZHAN_YUHENGLOU_TAB[QIANFANGDAOZHAN_YUHENGLOU+2][32];	//前方到站:玉衡楼
extern unsigned char code YUHENGLOU_DAOLE_TAB[YUHENGLOU_DAOLE+2][32];	  // 玉衡楼到了
extern unsigned char code QIANFANGDAOZHAN_ZHONGDIANZHAN_TAB[QIANFANGDAOZHAN_ZHONGDIANZHAN+2][32];	//前方到达终点站: 天枢楼
extern unsigned char code QIANFANGDAOZHAN_TIANXUANLOU_TAB[QIANFANGDAOZHAN_TIANXUANLOU+2][32];	//前方到达终点站: 天璇楼
extern unsigned char code TIANSHULOU_ZHONGDIANZHAN_TAB[TIANSHULOU_ZHONGDIANZHAN+2][32];  //终点站: 天枢楼
extern unsigned char code QISHIZHAN_TIANSHULOU_TAB[QISHIZHAN_TIANSHULOU+2][32];  //起始站:天枢楼
extern unsigned char code TIANXUANLOU_ZHONGDIANZHAN_TAB[TIANXUANLOU_ZHONGDIANZHAN+2][32]; //终点站:天璇楼

extern unsigned char code LUYINZHONG_TAB[LUYINZHONG+2][32];	  //  录音中,请按对应按键进行录音设置

#define	T0_time 1500 

sbit K1=P3^0;//进入修改录音 模式
sbit K2=P3^1;//修改录音 模式放音按键
sbit K3=P3^2;//修改录音 模式录音按键

uchar Flag_ZHAN_START=10;	  //起止站切换标志
uchar zhan=0,duan=0;
void Key_Scan()
{
    
    
	duan=0;
	if(K1==0) //K1键按下。录音
	{
    
    
		delay_ms(5);
		if(K1==0)
		{
    
    
			duan=1;
			Splide_LED(LUYINZHONG_TAB,LUYINZHONG);
			while(K1==0);//等待松手
		}
	}	 
	while(duan>0)
	{
    
    
		EA=0;
		Splide_LED(LUYINZHONG_TAB,LUYINZHONG);
		if(K1==0) //K1键按下。录音
		{
    
    
			delay_ms(5);
			if(K1==0)
			{
    
    
				duan++;

				if(duan>7)
				{
    
    
					duan=0;
					EA=1;
				}
				while(K1==0);//等待松手
			}
		}
		if(K2==0)//播报站名
		{
    
    
			ISD_PowerUp(); //ISD 上电
			delay_ms(100); 
			if(duan==1)ISD_SetPlay(0x0000);//第1站的站名
			if(duan==2)ISD_SetPlay(0x0050);//第2站的站名
			if(duan==3)ISD_SetPlay(0x0100);//第3站的站名
			if(duan==4)ISD_SetPlay(0x0150);//第4站的站名
			if(duan==5)ISD_SetPlay(0x0200);//第5站的站名	  
			if(duan==6)ISD_SetPlay(0x0350);//到了,请携带好随身物品从下车门下车
			if(duan==7)ISD_SetPlay(0x0600);//车起步,请坐稳扶好,前方到站

			ISD_Play(); //发送放音指令 
			while(ISD_INT==1);//放音未结束	   等待放音结束
			ISD_Stop();//发送停止命令     
			ISD_PowerDown();//发送掉电指令
		}
		if(K3==0)//修改站名
		{
    
    
			ISD_PowerUp(); //ISD 上电
			delay_ms(100);
			if(duan==1)ISD_SetRec(0x0000);//第1站的站名	 ,天璇楼
			if(duan==2)ISD_SetRec(0x0050);//第2站的站名	   天机楼
			if(duan==3)ISD_SetRec(0x0100);//第3站的站名	   开阳楼
			if(duan==4)ISD_SetRec(0x0150);//第4站的站名	   玉衡楼
			if(duan==5)ISD_SetRec(0x0200);//第5站的站名    天枢楼
			if(duan==6)ISD_SetRec(0x0350);//到了,请携带好随身物品从后车门下车
			if(duan==7)ISD_SetRec(0x0600);//车起步,请坐稳扶好,前方到站

			ISD_Rec(); //发送 rec 指令  
			while(K3==0);
			delay_ms(500);
			ISD_Stop();//发送停止命令     
			ISD_PowerDown();//发送掉电指令
		}
	} 
	if(K2==0)//播报站名
	{
    
    
		delay_ms(5);//延时消除按键抖动
		if(K2==0)
		{
    
    
			if(Flag_ZHAN_START==0)		   //开往。。。下一站 第2站
			{
    
    
				if(zhan==0)				 
				{
    
    		
					Splide_LED(QISHIZHAN_TIANXUANLOU_TAB,QISHIZHAN_TIANXUANLOU);	 //前方到站:天机楼	
				}
				else if(zhan==1)
				{
    
    
					Splide_LED(TIANJILOU_DAOLE_TAB,TIANJILOU_DAOLE);		  //天机楼到了
				}
				else if(zhan==2)
				{
    
    
					Splide_LED(QIANFANGDAOZHAN_KAIYANGLOU_TAB,QIANFANGDAOZHAN_KAIYANGLOU);	 //前方到站:开阳楼
				}
				else if(zhan==3)
				{
    
    
					Splide_LED(KAIYANGLOU_DAOLE_TAB,KAIYANGLOU_DAOLE);				 //开阳楼到了
				}
				else if(zhan==4)
				{
    
    
					Splide_LED(QIANFANGDAOZHAN_YUHENGLOU_TAB,QIANFANGDAOZHAN_YUHENGLOU);					//前方到站:玉衡楼
				}
				else if(zhan==5)
				{
    
    
					Splide_LED(YUHENGLOU_DAOLE_TAB,YUHENGLOU_DAOLE);			  // 玉衡楼到了
				}
				else if(zhan==6)
				{
    
    
					Splide_LED(QIANFANGDAOZHAN_ZHONGDIANZHAN_TAB,QIANFANGDAOZHAN_ZHONGDIANZHAN);			  // 前方到达终点站:天枢楼
				}
				if(zhan==7)
				{
    
    
					Splide_LED(TIANSHULOU_ZHONGDIANZHAN_TAB,TIANSHULOU_ZHONGDIANZHAN);			 //终点站: 天枢楼
				}
				else{
    
    }
				shang_xing_yu_yin();//上行语音播报
			}			
			if(Flag_ZHAN_START==1)
			{
    
    
				if(zhan==0)
				{
    
    
					Splide_LED(QISHIZHAN_TIANSHULOU_TAB,QISHIZHAN_TIANSHULOU);		   //起始站:天枢楼
				}
				else if(zhan==1)
				{
    
    
					Splide_LED(YUHENGLOU_DAOLE_TAB,YUHENGLOU_DAOLE);		 // 玉衡楼到了
				}
				else if(zhan==2)
				{
    
    
					Splide_LED(QIANFANGDAOZHAN_KAIYANGLOU_TAB,QIANFANGDAOZHAN_KAIYANGLOU);			//前方到站:开阳楼
				}
				else if(zhan==3)
				{
    
    
					Splide_LED(KAIYANGLOU_DAOLE_TAB,KAIYANGLOU_DAOLE);			   //开阳楼到了
				}
				else if(zhan==4)
				{
    
    
					Splide_LED(QISHIZHAN_TIANXUANLOU_TAB,QISHIZHAN_TIANXUANLOU);	    //前方到站:天机楼
				}
				else if(zhan==5)
				{
    
    
					Splide_LED(TIANJILOU_DAOLE_TAB,TIANJILOU_DAOLE);		   //天机楼到了
				}
				else if(zhan==6)
				{
    
    
					Splide_LED(QIANFANGDAOZHAN_TIANXUANLOU_TAB,QIANFANGDAOZHAN_TIANXUANLOU);	  	//前方到达终点站: 天璇楼
				}
				if(zhan==7)
				{
    
    
					Splide_LED(TIANXUANLOU_ZHONGDIANZHAN_TAB,TIANXUANLOU_ZHONGDIANZHAN);   //终点站:天璇楼
				}
				xia_xing_yu_yin();//下行语音播报
			}			
			zhan++;
			if(zhan>7)
			{
    
    
				zhan=0;
				Flag_ZHAN_START++;
				if(Flag_ZHAN_START>1)
					 Flag_ZHAN_START=0;
			}
			while(!K2);
		}
	}
	if(K3==0)//往返程切换
	{
    
    
		delay_ms(5);
		if(K3==0)
		{
    
    
			Flag_ZHAN_START++;
			if(Flag_ZHAN_START>1)
			{
    
    
				 zhan=0;
				 Flag_ZHAN_START=0;
			}
			while(K3==0);
		}
	}
}
/*************定时器0初始化程序***************/
void Time_init()	  
{
    
    
	EA   = 1;	 	  //开总中断
	TMOD = 0X01;	  //定时器0、定时器1工作方式1
	TH0=(65536-T0_time)/256;
	TL0=(65536-T0_time)%256;
	ET0  = 1;		  //开定时器0中断 
	TR0  = 1;		  //允许定时器0定时
}
void main(void)
{
    
    
	Time_init();
	while(1)
	{
    
    	
		Key_Scan();
		if(Flag_ZHAN_START>2)
		{
    
    
			Splide_LED(DIS_WELCOM_TAB,DIS_WELCOM);		//欢迎语						    
		}	
	}
}
/*************定时器0中断服务程序***************/
void time0_int() interrupt 1		 //定时中断函数	 每50ms进一次中断 
{
    
      								
    TH0=(65536-T0_time)/256;
	TL0=(65536-T0_time)%256;
	kw_led();
}

猜你喜欢

转载自blog.csdn.net/qq_20467929/article/details/126107260