|
在某一個(gè)寶上買的公交車自動(dòng)報(bào)站項(xiàng)目學(xué)習(xí)資料,問了店家?guī)状我仓v不明白。
這個(gè)紅外線發(fā)射電路是單片機(jī)編碼?
接收電路我知道是用VS1838紅外接收頭接收的紅外信號(hào),然后解碼傳送給單片機(jī),但紅外發(fā)射電路(從機(jī))就一個(gè)單片機(jī)連接一個(gè)二極管就完成紅外信號(hào)的編碼和發(fā)送。不明白這個(gè)紅外發(fā)射電路的原理
主機(jī)原理圖
從機(jī)原理圖
主機(jī)程序:
- #include <reg52.h> //調(diào)用單片機(jī)頭文件
- #define uchar unsigned char //無符號(hào)字符型 宏定義 變量范圍0~255
- #define uint unsigned int //無符號(hào)整型 宏定義 變量范圍0~65535
- sbit rs=P2^5; //寄存器選擇信號(hào) H:數(shù)據(jù)寄存器 L:指令寄存器
- sbit rw=P2^6; //寄存器選擇信號(hào) H:數(shù)據(jù)寄存器 L:指令寄存器
- sbit e =P2^7; //片選信號(hào) 下降沿觸發(fā)
- sbit hw_P32=P3^2; //紅外遙控接的IO口
- uchar hw_table[4]; //紅外解碼的緩沖區(qū)
- bit flag_jiema_en = 1; //紅外解碼成功標(biāo)志
- uchar geshu=2;
- uchar code gj_ming[]="直達(dá)車 ";
- uchar code table1[]="1號(hào)站 ";
- uchar code table2[]=" 2號(hào)站 ";
- /***********************語音模塊控制IO口的定義************************/
- sbit VRST = P3^7;
- sbit VBUSY= P3^6;
- sbit VSDA = P3^5;
- sbit VCS = P3^4;
- sbit VSCL = P3^3;
- /********************************************************************
- * 名稱 : delay_1ms()
- * 功能 : 延時(shí)1ms函數(shù)
- * 輸入 : q
- * 輸出 : 無
- ***********************************************************************/
- void delay_1ms(uint q)
- {
- uint i,j;
- for(i=0;i<q;i++)
- for(j=0;j<120;j++);
- }
-
-
- /************ 延時(shí)函數(shù) *****************/
- void delay_uint(uint z)
- {
- while(z--);
- }
- /***************交換函數(shù) 高位變低位 低位變高位*****************/
- uchar change_dat(uchar dat)
- {
- uchar i,value;
- for(i=0;i<8;i++)
- {
- value <<= 1;
- if((dat & 0x01) == 0x01)
- value |= 0x01;
- dat >>= 1;
- }
- return value;
- }
- /************ 寫命令函數(shù) *****************/
- void write_com(uchar com)
- {
- P0=change_dat(com);
- rw=0;
- rs=0;
- delay_uint(25);
- e=1;
- delay_uint(50);
- e=0;
- }
- /************ 寫數(shù)據(jù)函數(shù) *****************/
- void write_dat(uchar dat)
- {
- P0=change_dat(dat);
- rw=0;
- rs=1;
- delay_uint(25);
- e=1;
- delay_uint(50);
- e=0;
- }
- /**********************************************************
- *函數(shù)名: addr_12864
- *功能:寫地址
- *說明:寫漢字時(shí)要寫個(gè)地址
- *輸入:無
- *返回:無
- **********************************************************/
- void addr_12864(uchar hang,uchar lie) //地址轉(zhuǎn)換
- {
- uchar address;
- switch(hang)
- {
- case 1: address=0x80 + lie ;
- break;
- case 2: address=0x90 + lie ;
- break;
- case 3: address=0x88 + lie ;
- break;
- case 4: address=0x98 + lie ;
- break;
- default :
- break;
- }
- write_com(address);
- }
- /**********************************************************
- *函數(shù)名: write_string
- *功能:在12864上顯示字符數(shù)據(jù)
- *說明:
- *輸入:無
- *返回:無
- **********************************************************/
- void write_string(uchar hang,uchar lie,uchar *p)
- {
- addr_12864(hang,lie); //地址轉(zhuǎn)換
- while(*p != '\0')
- {
- write_dat(*p);
- p++;
- delay_uint(50);
- }
- }
- /************12864液晶初始化函數(shù)*****************/
- void init_12864()
- {
- write_com(0x30);
- write_com(0x0c);
- write_com(0x01);
- delay_1ms(100);
- }
- /************初始化顯示*****************/
- void init_12864_dis()
- {
- write_string(1,0," 歡迎乘坐 ");
- write_string(2,0,gj_ming);
- write_string(3,0," ");
- write_string(4,0," ");
- }
- /***********************語音子程序************************/
- void Send_threelines(unsigned char addr,uchar dat)
- {
- unsigned char i;
- VRST=0;
- VRST=1;
- VCS=0;
- for(i=0;i<8;i++)
- {
- VSCL=0;
- if(addr&0x01)
- {
- VSDA=1;
- }
- else
- VSDA=0;
- addr>>=1;
- VSCL=1;
- }
- VCS=1;
- if(dat == 1)
- while(VBUSY == 0); //忙等待
- }
- /***************100us的延時(shí)函數(shù)***12M晶振*****************/
- void delay_100us(uchar z)
- { //12M
- uchar x,y;
- for(x=0;x<z;x++)
- for(y=0;y<20;y++);
- }
- /********************獨(dú)立按鍵程序*****************/
- uchar key_can; //按鍵值
- void key() //獨(dú)立按鍵程序
- {
- if((P1 & 0x0f) != 0x0f) //按鍵按下
- {
- delay_1ms(1); //按鍵消抖動(dòng)
- if((P1 & 0x0f) != 0x0f)
- { //確認(rèn)是按鍵按下
- switch(P1 & 0x0f)
- {
- case 0x0e: key_can = 2; break; //得到按鍵值
- case 0x0d: key_can = 1; break; //得到按鍵值
- }
- }
- }
- }
- /***********外部中斷0初始化程序****************/
- void init_int0()
- {
- EX0=1; //允許外部中斷0中斷
- EA=1; //開總中斷
- IT0 = 1; //外部中斷0負(fù)跳變中斷
- }
- /***************主函數(shù)*****************/
- void main()
- {
- uchar num;
- P0 = P1 = P2 = P3 = 0XFF;
- init_12864();
- init_12864_dis();
- Send_threelines(0,0); //語音播報(bào)
- init_int0(); //外部中斷初始化
- while(1)
- {
- if(flag_jiema_en == 1)
- {
- flag_jiema_en = 0;
- if(hw_table[2] == 0x45)
- {
- write_string(1,0,gj_ming);
- write_string(2,0,table1);
- write_string(3,0," ");
- write_string(4,0," ");
- Send_threelines(1,1); //語音播報(bào)
- }
- if(hw_table[2] == 0x47)
- {
- write_string(1,0,gj_ming);
- write_string(2,0,table2);
- write_string(3,0," ");
- write_string(4,0," ");
- Send_threelines(2,1); //語音播報(bào)
- }
- hw_table[2] = 0;
- }
- key(); //獨(dú)立按鍵程序
- if(key_can == 1)
- {
- if(num < 2)
- {
- num ++;
- if(num == 1) //報(bào)第1個(gè)站
- {
- write_string(1,0,gj_ming);
- write_string(2,0,table1);
- write_string(3,0," ");
- write_string(4,0," ");
- Send_threelines(1,0); //語音播報(bào)
- }
- if(num == 2) //報(bào)第2個(gè)站
- {
- write_string(1,0,gj_ming);
- write_string(2,0,table2);
- write_string(3,0," ");
- write_string(4,0," ");
- Send_threelines(2,0); //語音播報(bào)
- }
- }
- }
- if(key_can == 2)
- {
- if(num != 0)
- num--;
- if(num == 1) //報(bào)第1個(gè)站
- {
- write_string(1,0,gj_ming);
- write_string(2,0,table1);
- write_string(3,0," ");
- write_string(4,0," ");
- Send_threelines(1,0); //語音播報(bào)
- }
- if(num == 2) //報(bào)第2個(gè)站
- {
- write_string(1,0,gj_ming);
- write_string(2,0,table2);
- write_string(3,0," ");
- write_string(4,0," ");
- Send_threelines(2,0); //語音播報(bào)
- }
- }
- }
- }
- /*****************紅外解碼程序********************/
- void int0() interrupt 0
- {
- unsigned char i,j;
- delay_100us(20); //防止干擾
- if(hw_P32 == 0)
- { //引導(dǎo)碼
- while(hw_P32 == 0); //等待低電平過完
- delay_100us(20);
- if(hw_P32 == 1) //引碼結(jié)束
- {
- delay_100us(20); // 說明高電平已經(jīng)過完 引導(dǎo)碼已經(jīng)結(jié)束
- for(i=0;i<4;i++)
- for(j=0;j<8;j++)
- {
- while(hw_P32 == 0); //等待過完
- delay_100us(5);
- if(hw_P32 == 0) //數(shù)據(jù)0的時(shí)間
- { //數(shù)據(jù)1的時(shí)間
- hw_table[i] >>= 1; //低位在前
- }
- else
- {
- delay_100us(5); // 高電平的時(shí)間過完
- hw_table[i] >>= 1; //低位在前
- hw_table[i] |= 0x80; //數(shù)據(jù)值1
- }
- }
- flag_jiema_en = 1; //紅外解碼成功
- }
- }
- }
- 從機(jī)程序:
- #include"reg52.h"
- #define uint unsigned int
- #define uchar unsigned char
- sbit P35=P2^7; // 定義控制紅外發(fā)射管的控制引腳
- uchar fa_value;
- /*********** 延時(shí)函數(shù) ***********/
- void delay_1ms(uint z) // 延時(shí) z 毫秒
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--) ;
- }
- /***************100us的延時(shí)函數(shù)***12M晶振*****************/
- void delay_100us(uchar z)
- { //12M
- uchar x,y;
- for(x=0;x<z;x++)
- for(y=0;y<20;y++);
- }
- /*********** 紅外發(fā)射子程序 ***********/
- void hongwaifase(uchar dat) // 發(fā)射dat
- {
- uchar i,j,str[4]; // str[4]存放等待發(fā)射的四個(gè)數(shù)據(jù)
- str[0]=0xff;str[1]=0x00;
- str[2]=dat;str[3]=~dat;
- TR1=1;
- delay_100us(90); //起始信號(hào) 9毫秒
- TR1=0;
- delay_100us(45);
- for(j=0;j<4;j++) //發(fā)射四個(gè)數(shù)據(jù)
- {
- for(i=0;i<8;i++) // 發(fā)射八個(gè)位
- {
- TR1=1;
- delay_100us(5); // 0.56毫秒
- TR1=0;
- if(str[j]&0x01==0x01)
- delay_100us(11); //11.2毫秒 代表發(fā)送1
- else
- delay_100us(5); //0.56毫秒 代表發(fā)送0
- str[j]>>=1;
- }
- }
- }
- void init()
- {
- EA=1;
- ET1=1;
- TR1 = 1;
- TMOD=0X20;
- TH1=0XF0;
- TL1=0XF0; // 用定時(shí)器中斷產(chǎn)生38khz的方波
- }
- void main()
- {
- init();
- while(1)
- {
- hongwaifase(0x45);
- delay_1ms(1000);
- }
- }
- void time1() interrupt 3 using 1
- {
- P35=~P35; //取反產(chǎn)生方波
- }
復(fù)制代碼
|
|