标题:
51单片机公交车自动报站系统制作元件清单 程序+原理图资料
[打印本页]
作者:
renanwei
时间:
2020-7-6 12:34
标题:
51单片机公交车自动报站系统制作元件清单 程序+原理图资料
制作一个基于单片机的公交车自动报站系统,制作元器件+程序+原理图资料
部分图如下,附件资料下载
b.png
(283.1 KB, 下载次数: 33)
下载附件
2020-7-6 12:23 上传
元件清单
元件标号 元件名称 数量
C1 10uf电解电容 1
C2, C3 30pf瓷片电容 2
D1, D2 IN4007二极管 2
J1 5V电源接口 1
K1, K2, K3 轻触按键 3
LCD1 12864液晶显示屏+20P插座 1
P1 103排阻 1
P2 4针排针 1
R2 10K电阻 1
SP1 喇叭 1
SW1 自锁开关 1
U1 STC89C52单片机+DIP40插座 1
U2 WT588D -16模块+ 2个8P圆排座 1
VR1 103滑动变阻器 1
Y1 12M晶振 1
51hei.png
(57.56 KB, 下载次数: 19)
下载附件
2020-7-6 14:22 上传
单片机源程序如下:
#include <reg52.h> //调用单片机头文件
#include <intrins.h>
#include"12864.h"
#define uchar unsigned char //无符路字符型 宏定义 变量范围0~255
#define uint unsigned int //无符路整型 宏定义 变量范围0~65535
uchar irtime;
uchar startflag;
uchar irdata[33];
uchar bitnum;
uchar irreceok;
uchar ircode[4];
uchar irprosok;
uchar disp[8];
uchar ir_num=0;
uchar ir_flag=0;
uchar k;
sbit rs=P0^0; //寄存器选择信号 H:数据寄存器 L:指令寄存器
sbit rw=P0^1; //寄存器选择信号 H:数据寄存器 L:指令寄存器
sbit e =P0^2; //片选信号 下降沿触发
/***********************语音模块控制IO口的定义************************/
sbit VRST = P3^7;
sbit VBUSY= P3^6;
sbit VSDA = P3^5;
sbit VCS = P3^4;
sbit VSCL = P3^3;
uchar geshu=6;
uchar code gj_ming[]= " 101路公交车 ";
uchar code gj_ming1[]=" ";
uchar code table1[]= " 1 号站 ";
uchar code table2[]= " 2 号站 ";
uchar code table3[]= " 3 号站 ";
uchar code table4[]= " 4 号站 ";
uchar code table5[]= " 5 号站 ";
uchar code table6[]= " 6 号站 ";
uchar code table7[]= " ";
uchar code table8[]= " ";
uchar code table9[]= " ";
void timer0init(void)
{
TMOD=0x02;
TH0=0x00;
TL0=0x00;
ET0=1;
EA=1;
TR0=1;
}
void int0init(void)
{
IT0=1;
EX0=1;
EA=1;
}
void irpros(void) //0x1c
{
uchar k,i,j;
uchar value;
k=1;
for(j=0;j<4;j++)
{
for(i=0;i<8;i++)
{
value=value>>1; //7
if(irdata[k]>6) //8
{
value=value | 0x80;
}
k++;
}
ircode[j]=value;
}
irprosok=1;
}
void irwork(void)
{
disp[0]=ircode[0]/16;
disp[1]=ircode[0]%16;
disp[2]=ircode[1]/16;
disp[3]=ircode[1]%16;
disp[4]=ircode[2]/16;
disp[5]=ircode[2]%16;
disp[6]=ircode[3]/16;
disp[7]=ircode[3]%16;
WriteCommand(0X98);
WriteData(ircode[2]/100+0x30);
WriteData(ircode[2]%100/10+0x30);
WriteData(ircode[2]%10+0x30);
switch(ircode[2])
{
case (0x0c): k=1;ir_flag=1;break;
case (0x18): k=2;ir_flag=1;break;
case (0x5E): k=3;ir_flag=1;break;
case (0x08): k=4;ir_flag=1;break;
case (0x1c): k=5;ir_flag=1;break;
case (0x5A): k=6;ir_flag=1;break;
case (0x42): k=7;ir_flag=1;break;
case (0x55): k=8;ir_flag=1;break;
case (0x4a): k=9;ir_flag=1;break;
// case (0x84): k='C';break; //
case (0x43): k='*';break; //撤销
case (0x15): k='#';break; //确认键
case (0x0d): k='D';break; //重设密码
case (0x45): k='B';break; //
case (0x41): k='C';break; //
case (0x44): k='A';break; //
case (0x40): k='A';break; //
case (0x07): k='A';break; //
case (0x09): k='A';break; //
case (0x19): k='A';break; //
// default:;
}
}
/********************************************************************
* 名称 : delay_1ms()
* 功能 : 延时1ms函数
* 输入 : q
* 输出 : 无
***********************************************************************/
void delay_1ms(uint q)
{
uint i,j;
for(i=0;i<q;i++)
for(j=0;j<115;j++);
}
/************初始化显示*****************/
void init_12864_dis()
{ PutStr(0,0," 欢迎乘坐 ");
PutStr(1,0,gj_ming);
PutStr(2,0,gj_ming1);
PutStr(3,0," ");
}
/***********************小延时函数**************************/
void delay_us (unsigned int us)
{
while(us--)
{
_nop_();
}
}
/***********************三线发码子程序************************/
void Send_threelines(unsigned char addr,uchar dat)
{
unsigned char i;
VCS=0;
delay_1ms(5); /* 片选拉低5ms */
for(i=0;i<8;i++)
{
VSCL=0;
if(addr&0x01)
{
VSDA=1;
}
else
VSDA=0;
addr>>=1;
delay_us(150); /* 150us */
VSCL=1;
delay_us(150); /* 150us */
}
VCS=1;
delay_1ms(30);
if(dat == 1)
while(VBUSY == 0); //忙等待
}
/********************独立按键程序*****************/
uchar key_can; //按键值
void key() //独立按键程序
{
static uchar key_new;
key_can = 20; //按键值还原
P1 |= 0x0f;
if((P1 & 0x0f) != 0x0f) //按键按下
{
delay_1ms(1); //按键消抖动
if(((P1 & 0x0f) != 0x0f) && (key_new == 1))
{ //确认是按键按下
key_new = 0;
switch(P1 & 0x0f)
{
case 0x0e: key_can = 2; break; //得到按键值
case 0x0d: key_can = 1; break; //得到按键值
}
}
}
else //按键松开
key_new = 1;
}
uchar flag_s = 0;
uchar flag_z= 0;
/***************主函数*****************/
void main()
{
uchar num=0; //定时器1,工作在定时方式2
timer0init();
int0init();
P0 = P1 = P2 = P3 = 0XFF;
LcmInit();//初始化12864
init_12864_dis();
Send_threelines(0,0); //语音播报
while(1)
{ if(irreceok)
{
irpros();
irreceok=0;
}
if(irprosok)
{
irwork();
irprosok=0;
}
key(); //独立按键程序
if((key_can < 20)||((ir_flag==1)&&(k<=geshu)))
{
if(key_can == 1)
{
if(num < geshu)
{
num++;
}
flag_s = 1;
}
if(key_can == 2)
{
if(num != 0)
num--;
}
if((ir_flag==1)&&(k<=geshu))
{
ir_flag=0;
num=k;
}
if(num == 1) //报第1个站
{
PutStr(1,0,gj_ming);
PutStr(2,0,table1);
PutStr(3,0,gj_ming1);
PutStr(3,0," ");
Send_threelines(1,0); //语音播报
}
if(num == 2) //报第2个站
{
PutStr(1,0,gj_ming);
PutStr(2,0,table2);
PutStr(3,0,gj_ming1);
PutStr(3,0," ");
flag_z=1;
Send_threelines(2,0); //语音播报
}
if(num == 3) //报第3个站
{
PutStr(1,0,gj_ming);
PutStr(2,0,table3);
PutStr(3,0,gj_ming1);
PutStr(3,0," ");
Send_threelines(3,0); //语音播报
}
if(num == 4) //报第4个站
{
PutStr(1,0,gj_ming);
PutStr(2,0,table4);
PutStr(3,0,gj_ming1);
PutStr(3,0," ");
Send_threelines(4,0); //语音播报
}
if(num == 5) //报第5个站
{
PutStr(1,0,gj_ming);
PutStr(2,0,table5);
PutStr(3,0,gj_ming1);
PutStr(3,0," ");
Send_threelines(5,0); //语音播报
}
if(num == 6) //报第5个站
{
PutStr(1,0,gj_ming);
PutStr(2,0,table6);
PutStr(3,0,gj_ming1);
PutStr(3,0," ");
Send_threelines(6,0); //语音播报
}
if(num == 7) //报第5个站
{
PutStr(1,0,gj_ming);
PutStr(2,0,table7);
PutStr(3,0,gj_ming1);
PutStr(3,0," ");
Send_threelines(7,0); //语音播报
}
if(num == 8) //报第5个站
{
PutStr(1,0,gj_ming);
PutStr(2,0,table8);
PutStr(3,0,gj_ming1);
PutStr(3,0," ");
Send_threelines(8,0); //语音播报
}
if(num == 9) //报第9个站
{
PutStr(1,0,gj_ming);
PutStr(2,0,table9);
PutStr(3,0,gj_ming1);
PutStr(3,0," ");
if(flag_s == 1)
{
Send_threelines(10,0); //语音播报
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
公交报站资料-b.7z
(1.2 MB, 下载次数: 97)
2020-7-6 14:25 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1