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