📄 基于51单片机的公交车报站系统程序.c
字号:
系统源程序(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<reg51.h>
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;
unsigned char *q2;
unsigned int secret=0; //录音密码
unsigned int ymcode = 255; //红外线编码
bit flag0=1; //译码标志位
bit s;
bit hw=0; //解码成功失败标志位
bit mode=0; //模式选择,0:报站模式,1录音模式(录音需要输入密码)。
bit xs=0; //显示输入密码标志位
bit ly=0; //录音允许位
sbit P1_0 = P3^7; //红外线信号输入断口
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<t;i++)
{;;;;;;;;;;}
}
/***************************************
* 名称: Write_com(unsigned char d)
* 说明:
* 功能: 写命令字
* 参数: d:命令代码
* 返回值: 无
****************************************/
void Write_com(unsigned char d)
{
LCD_RS = 0;
LCD_E = 0;
LCD_WR = 0;
P1 = d;
LCD_E = 1;
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;i<n;i++)
{
pos=posx;
if((pos<8)||((pos>15)&&(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<p_last)
{
for(addr=0;addr<p_last-i;addr++)
Disp_char(addr+pos+i,0x20);
for(addr=0;addr<i;addr++)
Disp_char(addr+pos,tab[i-addr-1]+48);
}
else
{
for(addr=0;addr<i;addr++)
{
Disp_char(addr+pos,tab[i-addr-1]+48);
}
}
if(0==i)Disp_char(pos,48);
p_last=i;
}
/**********************
*
* 名称: delay0()
* 说明: 晶振采用24.0MHz
* 功能: 延时
* 延时(t*0.1)ms
* 输入: t(时间参数)
* 返回值: 无
***********************/
void delay0(unsigned int t)
{
tm=t;
do
{
TH0 = 0xFF;
TL0 = 0x38;
TR0 = 1;
while ( !TF0 );
TF0 = 0;
TR0 = 0;
} while (--tm);
}
/**********************
*
* 名称: time1()
* 说明: 晶振采用24.0MHz
* 功能: 监视红外线信号是否结束
* 如果2ms内输入信号没有沿跳变,就结束译码
* 输入: 无
* 返回值: flag0
***********************/
void time1()interrupt 3 using 2
{
flag0 = 0;
}
/**********************
*
* 名称: bit hw_yima()
* 说明:
* 功能: 红外线译码
* 输入: 无
* 返回值: ym:解码成功(1),失败(0)。
***********************/
bit hw_yima()
{
unsigned int ymdata = 0;
unsigned char n = 0;
bit ym=0;
ymcode=0xffff;
s = P1_0;
if(0==P1_0)
{
while(flag0)
{
while(P1_0==s);
if(1==flag0)
{
TR1 = 0;
TH1 = 0xF0;
TL1 = 0x60;
TR1 = 1;
delay0(12);
ymdata = ymdata<<1;
if(0==P1_0)
{
ymdata |= 0x01;
}
n++;
s = P1_0;
}
}
if(n>9) //此参数直接影响接受的灵敏度
{
ymcode = ymdata>>1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -