任务
本文给出的是基于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();
}