⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 基于51单片机的公交车报站系统程序.txt

📁 公交车报站系统
💻 TXT
📖 第 1 页 / 共 2 页
字号:
系统源程序(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 + -