制作一個基于單片機的公交車自動報站系統,制作元器件+程序+原理圖資料
部分圖如下,附件資料下載
元件清單
元件標號 元件名稱 數量
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)
2020-7-6 14:25 上傳
點擊文件名下載附件
|