制作一个基于单片机的公交车自动报站系统,制作元器件+程序+原理图资料
部分图如下,附件资料下载
元件清单
元件标号 元件名称 数量
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
单片机源程序如下:
- #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)
|