基于 51 单片机的公交车报站系统程序
2007-11-24 14:42
系统源程序(C 语言版)
/*+++++++++++++++++++++++++++++++++++++
LCD 显示,采用 FM12864FLCD 显示模块(带中文字库)
功能说明:键盘显示,键盘采用普通彩电遥控器(SAA3010A),
语音芯片采用 ISD1420P,能够录放 20 秒,
单片机采用 AT89C51,
通过键盘控制实现,语音报站同时 LCD 显示站名,
晶振 24MHz。
接线说明:P1 口接 LCD 的数据口,
P0 口接 ISD1420P 的地址口,
P3.2----PLAY
P3.3----REC
P3.4----RS
P3.5----WR
P3.6----E
P3.7 接 SM0038 信号输出脚
版本时间:2007-05-27 23:12
+++++++++++++++++++++++++++++++++++++++*/
#include
void Clear();
void Delay(unsigned int t);
void Write_com(unsigned char d);
void Write_data(unsigned char d);
unsigned char Read_data();
void Disp_char(unsigned char pos,unsigned char dat);
void Disp_word0(unsigned char posx,unsigned char *p,unsigned char n);
void Lcd_system(void);
bit hw_yima();
void delay0(unsigned int t);
void Disp_control(unsigned char zm);
void Disp_number(unsigned char pos,unsigned int dat);
void Report(unsigned char sl);
void Rec_bus(unsigned char rec);
void Disp_pucture(unsigned char *p);
void bus_contorl();
unsigned char n=0;
unsigned char p_last=0;
unsigned char zm_last=0;
unsigned char k=0;
//红外码位数
//上一次显示指针偏移量
//录音密码
ymcode = 255; //红外线编码
//译码标志位
//放音
//录音
//解码成功失败标志位
P1_0 = P3^7;
//红外线信号输入断口
//显示输入密码标志位
//录音允许位
//模式选择,0:报站模式,1 录音模式(录音需要输入密码)。
unsigned char *q2;
unsigned int secret=0;
unsigned int
bit flag0=1;
bit s;
bit hw=0;
bit mode=0;
bit xs=0;
bit ly=0;
sbit
sbit PLAY=P3^3;
sbit REC =P3^2;
sbit LCD_RS=P3^4;
sbit LCD_WR=P3^5;
sbit LCD_E =P3^6;
unsigned int tm=0;
unsigned char code gImage_word0[1024];
unsigned char code gImage_word2[1024];
unsigned char code table0[]={"虎泉 桌刀泉广阜屯街道口洪山 丁字桥傅家坡大东门阅马场下
一站:"};
unsigned char code table1[]={"深圳市勤正达电子有限公司成立于 2002 年,是专业研发及生产
液晶显示器"
//数据、命令选择信号
//读写信号
//使能信号
"和液晶模块的高新技术企业。LCD 显示器覆盖了多种系列多年来公司秉承"
"全力面向客户,技术专攻的经营理念,一直致力于为广大电子成品制造商"
"提供质量精良,性能稳定,品种齐全的 LCD 显示屏及 LCM 显示模块系列产"
"品。望成为您的首选合作伙伴。
"};
unsigned char code table2[]={"请输入密码:""录音模式""密码错误!"};
void main()
{
unsigned char num=0;
unsigned int i=0;
unsigned char *q;
TMOD=0x11;
TH1 = 0xF0;
TL1 = 0x60;
EA = 1;
ET1 = 1;
REC = 1;
PLAY= 1;
Delay(100);
Lcd_system();
q=gImage_word2;
Disp_pucture(q);
//系统初始化
delay0(30000);
q=gImage_word0;
Disp_pucture(q);
delay0(40000);
Clear();
while(1)
q=table1;
for(num=0;num<5;num++)
{
if(0==mode)
{
Disp_word0(0,q,32);
q=q+64;
}
for(i=0;i<60000;i++)
{
bus_contorl();
}
}
{
}
}
/***************************************
* 名称: Clear()
* 说明:
* 功能: 清除全屏显示
* 参数: 无
* 返回值: 无
****************************************/
void Clear()
{
Write_com(0x01);
Write_com(0x34);
Write_com(0x30);
}
/***************************************
* 名称: Lcd_system()
* 说明:
* 功能: 系统初始化
* 参数: 无
* 返回值: 无
****************************************/
void Lcd_system(void)
{
Delay(600);
LCD_E = 0;
Write_com(0x34);
Delay(10000);
Write_com(0x30);
Delay(10000);
Write_com(0x01);
Delay(10000);
Write_com(0x06);
Delay(10000);
Write_com(0x0c);
Delay(10000);
}
/***************************************
* 名称: Delay(unsigned int t)
* 说明:
* 功能: 延时
* 参数: t:延时长度
* 返回值: 无
****************************************/
void Delay(unsigned int t)
{
unsigned int i;
for(i=0;i
Delay(40);
LCD_E = 0;
LCD_WR = 1;
Delay(100);
}
/***************************************
* 名称: Write_data(unsigned char d)
* 说明:
* 功能: 写数据
* 参数: d:需要写入的数据
* 返回值: 无
****************************************/
void Write_data(unsigned char d)
{
LCD_E = 0;
LCD_RS = 1;
LCD_WR = 0;
P1 = d;
LCD_E = 1;
Delay(40);
LCD_E = 0;
LCD_WR = 1;
Delay(100);
}
/***************************************
* 名称: unsigned char Read_data(void)
* 说明:
* 功能: 读数据
* 参数: 无
* 返回值: d:读出数据
****************************************/
unsigned char Read_data(void)
{
unsigned char d = 0;
LCD_E = 0;
LCD_RS = 1;
LCD_WR = 1;
LCD_E = 1;
Delay(50);
d = P1;
LCD_E = 0;
LCD_WR = 0;
Delay(100);
return(d);
}
/***************************************
* 名称: Disp_word0(unsigned char posx,unsigned char *p,unsigned char n)
* 说明:
* 功能: 显示一串汉字
* 参数: pos:显示位置(第一行:0-6,第二行:7-13),
p:汉字码的地址指针,
n:显示字的个数,
* 返回值: 无
****************************************/
void Disp_word0(unsigned char posx,unsigned char *p,unsigned char n)
{
unsigned char i=0;
unsigned char pos;
for(i=0;i15)&&(pos<24)))
{
if(pos>15)pos=pos-8;
Write_com(0x80|pos);
Write_data(p[0]);
Write_data(p[1]);
}
else
{
if(pos<16)
{
pos =pos-8;
}
else
{
pos =pos-16;
}
Write_com(0x90|pos);
Write_data(p[0]);
Write_data(p[1]);
}
posx++;
p=p+2;
}
}
/***************************************
* 名称: Disp_row(unsigned char row,unsigned char pos,unsigned char dat)
* 说明:
* 功能: 显示一个字母或数字
* 参数: row:行选择,pos:显示位置(0-15),dat:数字码
* 返回值: 无
****************************************/
void Disp_row(unsigned char row,unsigned char pos,unsigned char dat)
{
unsigned char dat0;
unsigned char pos0;
row = row%2;
row = row<<4;
pos0 = pos/2;
if((pos+1)/2==pos0)
{
Write_com((0x80+row)|pos0);
Write_data(dat);
}
else
{
Write_com((0x80+row)|pos0);
dat0 = Read_data();
Write_data(dat);
}
}
/***************************************
* 名称: Disp_char(unsigned char pos,unsigned char dat)
* 说明:
* 功能: 显示一个字母或数字
* 参数: pos:显示位置(第一行:0-15,第二行:16-31,第一行:32-47,第二行:48-63),dat:数
字码
* 返回值: 无
****************************************/
void Disp_char(unsigned char pos,unsigned char dat)
{
if(pos<16)
{
Disp_row(0,pos,dat);
}
if((pos<32)&&(pos>15))
{
Disp_row(1,pos-16,dat);
}
if((pos<48)&&(pos>31))
{
Disp_row(2,pos-16,dat);
}
if((pos<64)&&(pos>47))
{
Disp_row(3,pos-32,dat);
}
}
/***************************************
* 名称: void Disp_number(unsigned char pos,unsigned long dat)
* 说明:
* 功能: 显示一个数(0-65536)
* 参数: pos:显示位置,dat:显示数据
* 返回值: 无
****************************************/
void Disp_number(unsigned char pos,unsigned int dat)
{
unsigned int d;
unsigned char i=0;
unsigned char addr;
unsigned char tab[5]={0};
d =dat;
//
while(d)
{
tab[i] = d%10;
d=d/10;
i++;
}
if(i