找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

帖子
查看: 4441|回復(fù): 1
收起左側(cè)

有人能幫我解釋下這個(gè)單片機(jī)公交車自動(dòng)報(bào)站紅外模塊的原理嗎?

[復(fù)制鏈接]
ID:914598 發(fā)表于 2021-4-30 20:58 | 顯示全部樓層 |閱讀模式
在某一個(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ī)原理圖

從機(jī)原理圖

主機(jī)程序:
  1. #include <reg52.h>                 //調(diào)用單片機(jī)頭文件
  2. #define uchar unsigned char  //無符號(hào)字符型 宏定義        變量范圍0~255
  3. #define uint  unsigned int         //無符號(hào)整型 宏定義        變量范圍0~65535

  4. sbit rs=P2^5;         //寄存器選擇信號(hào) H:數(shù)據(jù)寄存器          L:指令寄存器
  5. sbit rw=P2^6;         //寄存器選擇信號(hào) H:數(shù)據(jù)寄存器          L:指令寄存器
  6. sbit e =P2^7;         //片選信號(hào)   下降沿觸發(fā)

  7. sbit hw_P32=P3^2;                   //紅外遙控接的IO口
  8. uchar hw_table[4];           //紅外解碼的緩沖區(qū)
  9. bit flag_jiema_en = 1; //紅外解碼成功標(biāo)志

  10. uchar geshu=2;

  11. uchar code gj_ming[]="直達(dá)車  ";

  12. uchar code  table1[]="1號(hào)站  ";
  13. uchar code  table2[]="  2號(hào)站    ";



  14. /***********************語音模塊控制IO口的定義************************/
  15. sbit  VRST = P3^7;
  16. sbit  VBUSY= P3^6;        
  17. sbit  VSDA = P3^5;
  18. sbit  VCS  = P3^4;  
  19. sbit  VSCL = P3^3;


  20. /********************************************************************
  21. * 名稱 : delay_1ms()
  22. * 功能 : 延時(shí)1ms函數(shù)
  23. * 輸入 : q
  24. * 輸出 : 無
  25. ***********************************************************************/
  26. void delay_1ms(uint q)
  27. {
  28.         uint i,j;
  29.         for(i=0;i<q;i++)
  30.                 for(j=0;j<120;j++);
  31. }


  32.                                    
  33.                                           
  34. /************ 延時(shí)函數(shù)  *****************/
  35. void delay_uint(uint z)
  36. {
  37.    while(z--);
  38. }

  39. /***************交換函數(shù) 高位變低位 低位變高位*****************/
  40. uchar change_dat(uchar dat)
  41. {
  42.         uchar i,value;
  43.         for(i=0;i<8;i++)
  44.         {        
  45.                 value <<= 1;
  46.                 if((dat & 0x01) == 0x01)
  47.                         value |= 0x01;
  48.                 dat >>= 1;        
  49.         }
  50.         return value;
  51. }

  52. /************ 寫命令函數(shù)  *****************/
  53. void write_com(uchar com)
  54. {

  55.    P0=change_dat(com);
  56.    rw=0;
  57.    rs=0;
  58.    delay_uint(25);
  59.    e=1;
  60.    delay_uint(50);
  61.    e=0;
  62. }
  63. /************ 寫數(shù)據(jù)函數(shù)  *****************/
  64. void write_dat(uchar dat)
  65. {

  66.    P0=change_dat(dat);
  67.    rw=0;
  68.    rs=1;
  69.    delay_uint(25);
  70.    e=1;
  71.    delay_uint(50);
  72.    e=0;
  73. }

  74. /**********************************************************
  75. *函數(shù)名: addr_12864
  76. *功能:寫地址
  77. *說明:寫漢字時(shí)要寫個(gè)地址
  78. *輸入:無
  79. *返回:無
  80. **********************************************************/
  81. void addr_12864(uchar hang,uchar lie)          //地址轉(zhuǎn)換
  82. {
  83.         uchar address;
  84.         switch(hang)
  85.         {
  86.                 case 1: address=0x80 + lie ;
  87.                                 break;
  88.                 case 2: address=0x90 + lie ;
  89.                                 break;
  90.                 case 3: address=0x88 + lie ;
  91.                                 break;
  92.                 case 4: address=0x98 + lie ;
  93.                                 break;
  94.                 default :
  95.                                 break;
  96.         }        
  97.         write_com(address);
  98. }

  99. /**********************************************************
  100. *函數(shù)名: write_string
  101. *功能:在12864上顯示字符數(shù)據(jù)
  102. *說明:
  103. *輸入:無
  104. *返回:無
  105. **********************************************************/

  106. void write_string(uchar hang,uchar lie,uchar *p)
  107. {
  108.         addr_12864(hang,lie);          //地址轉(zhuǎn)換
  109.         while(*p != '\0')
  110.         {
  111.                 write_dat(*p);
  112.                 p++;
  113.                 delay_uint(50);
  114.         }
  115. }




  116. /************12864液晶初始化函數(shù)*****************/
  117. void init_12864()
  118. {
  119.    write_com(0x30);
  120.    write_com(0x0c);
  121.    write_com(0x01);         
  122.    delay_1ms(100);
  123. }

  124. /************初始化顯示*****************/
  125. void init_12864_dis()
  126. {
  127.         write_string(1,0,"    歡迎乘坐    ");
  128.         write_string(2,0,gj_ming);
  129.         write_string(3,0,"                ");
  130.         write_string(4,0,"                ");
  131. }


  132. /***********************語音子程序************************/
  133. void Send_threelines(unsigned char addr,uchar dat)
  134. {
  135.    unsigned char i;
  136.         VRST=0;
  137.         VRST=1;
  138.         VCS=0;
  139.     for(i=0;i<8;i++)
  140.         {
  141.                 VSCL=0;
  142.                 if(addr&0x01)
  143.                 {
  144.                         VSDA=1;
  145.                 }
  146.                 else
  147.                         VSDA=0;
  148.                 addr>>=1;
  149.                 VSCL=1;
  150.         }
  151.         VCS=1;
  152.         if(dat == 1)
  153.                 while(VBUSY == 0);          //忙等待
  154. }


  155. /***************100us的延時(shí)函數(shù)***12M晶振*****************/
  156. void delay_100us(uchar z)
  157. {                                //12M
  158.    uchar x,y;
  159.    for(x=0;x<z;x++)
  160.      for(y=0;y<20;y++);
  161. }


  162. /********************獨(dú)立按鍵程序*****************/
  163. uchar key_can;         //按鍵值

  164. void key()         //獨(dú)立按鍵程序
  165. {
  166.         if((P1 & 0x0f) != 0x0f)                //按鍵按下
  167.         {
  168.                 delay_1ms(1);                     //按鍵消抖動(dòng)
  169.                 if((P1 & 0x0f) != 0x0f)
  170.                 {                                                //確認(rèn)是按鍵按下
  171.                         switch(P1 & 0x0f)
  172.                         {
  173.                                 case 0x0e: key_can = 2; break;          //得到按鍵值
  174.                                 case 0x0d: key_can = 1; break;          //得到按鍵值
  175.                         }
  176.                 }                        
  177.         }
  178. }


  179. /***********外部中斷0初始化程序****************/
  180. void init_int0()
  181. {
  182.         EX0=1;                          //允許外部中斷0中斷
  183.         EA=1;                           //開總中斷
  184.         IT0 = 1;                   //外部中斷0負(fù)跳變中斷
  185. }

  186. /***************主函數(shù)*****************/
  187. void main()
  188. {         
  189.         uchar num;
  190.         P0 = P1 = P2 = P3 = 0XFF;
  191.         init_12864();                        
  192.         init_12864_dis();
  193.         Send_threelines(0,0);    //語音播報(bào)
  194.         init_int0();                                        //外部中斷初始化
  195.         while(1)
  196.         {
  197.                 if(flag_jiema_en == 1)                        
  198.                 {
  199.                         flag_jiema_en = 0;
  200.                         if(hw_table[2] == 0x45)
  201.                         {
  202.                                 write_string(1,0,gj_ming);
  203.                                 write_string(2,0,table1);
  204.                                 write_string(3,0,"                ");
  205.                                 write_string(4,0,"                ");
  206.                                 Send_threelines(1,1);    //語音播報(bào)        
  207.                         }
  208.                         if(hw_table[2] == 0x47)
  209.                         {
  210.                                 write_string(1,0,gj_ming);
  211.                                 write_string(2,0,table2);
  212.                                 write_string(3,0,"                ");
  213.                                 write_string(4,0,"                ");
  214.                                 Send_threelines(2,1);    //語音播報(bào)                        
  215.                         }
  216.                         hw_table[2] = 0;
  217.                 }
  218.                 key();         //獨(dú)立按鍵程序        
  219.                 if(key_can == 1)
  220.                 {
  221.                         if(num < 2)
  222.                         {         
  223.                                 num ++;        
  224.                                 if(num == 1)       //報(bào)第1個(gè)站
  225.                                 {
  226.                                         write_string(1,0,gj_ming);
  227.                                         write_string(2,0,table1);
  228.                                         write_string(3,0,"                ");
  229.                                         write_string(4,0,"                ");
  230.                                         Send_threelines(1,0);    //語音播報(bào)        
  231.                                 }
  232.                                 if(num == 2)       //報(bào)第2個(gè)站
  233.                                 {
  234.                                         write_string(1,0,gj_ming);
  235.                                         write_string(2,0,table2);
  236.                                         write_string(3,0,"                ");
  237.                                         write_string(4,0,"                ");
  238.                                         Send_threelines(2,0);    //語音播報(bào)                        
  239.                                 }
  240.                         }
  241.                 }
  242.                 if(key_can == 2)
  243.                 {
  244.                         if(num != 0)
  245.                                 num--;        
  246.                         if(num == 1)       //報(bào)第1個(gè)站
  247.                         {
  248.                                         write_string(1,0,gj_ming);
  249.                                         write_string(2,0,table1);
  250.                                         write_string(3,0,"                ");
  251.                                         write_string(4,0,"                ");
  252.                                 Send_threelines(1,0);    //語音播報(bào)        
  253.                         }
  254.                         if(num == 2)       //報(bào)第2個(gè)站
  255.                         {
  256.                                         write_string(1,0,gj_ming);
  257.                                         write_string(2,0,table2);
  258.                                         write_string(3,0,"                ");
  259.                                         write_string(4,0,"                ");
  260.                                 Send_threelines(2,0);    //語音播報(bào)                        
  261.                         }
  262.                 }
  263.         }
  264. }


  265. /*****************紅外解碼程序********************/
  266. void int0() interrupt 0
  267. {
  268.         unsigned char i,j;
  269.         delay_100us(20);     //防止干擾
  270.         if(hw_P32 == 0)
  271.         {                                     //引導(dǎo)碼
  272.                 while(hw_P32 == 0); //等待低電平過完
  273.                 delay_100us(20);         
  274.                 if(hw_P32 == 1)          //引碼結(jié)束
  275.                 {         
  276.                         delay_100us(20);  // 說明高電平已經(jīng)過完 引導(dǎo)碼已經(jīng)結(jié)束
  277.                         for(i=0;i<4;i++)
  278.                                 for(j=0;j<8;j++)
  279.                                 {
  280.                                         while(hw_P32 == 0);   //等待過完
  281.                                         delay_100us(5);
  282.                                         if(hw_P32 == 0)                //數(shù)據(jù)0的時(shí)間
  283.                                         {                                        //數(shù)據(jù)1的時(shí)間
  284.                                                 hw_table[i] >>= 1;    //低位在前
  285.                                         }
  286.                                         else
  287.                                         {        
  288.                                                 delay_100us(5);   //   高電平的時(shí)間過完
  289.                                                 hw_table[i] >>= 1;    //低位在前
  290.                                                 hw_table[i] |= 0x80;  //數(shù)據(jù)值1
  291.                                         }
  292.                                 }
  293.                         flag_jiema_en = 1;          //紅外解碼成功        
  294.                 }
  295.         }
  296. }


  297. 從機(jī)程序:
  298. #include"reg52.h"
  299. #define uint unsigned int
  300. #define uchar unsigned char
  301. sbit  P35=P2^7;                                         //  定義控制紅外發(fā)射管的控制引腳
  302. uchar fa_value;

  303. /***********   延時(shí)函數(shù)  ***********/
  304. void delay_1ms(uint z)           //  延時(shí)  z 毫秒
  305. {
  306.   uint x,y;
  307.   for(x=z;x>0;x--)
  308.     for(y=110;y>0;y--) ;
  309. }
  310. /***************100us的延時(shí)函數(shù)***12M晶振*****************/
  311. void delay_100us(uchar z)
  312. {                                //12M
  313.    uchar x,y;
  314.    for(x=0;x<z;x++)
  315.      for(y=0;y<20;y++);
  316. }

  317. /***********   紅外發(fā)射子程序  ***********/
  318. void hongwaifase(uchar dat)                 //  發(fā)射dat
  319. {
  320.         uchar i,j,str[4];                         //  str[4]存放等待發(fā)射的四個(gè)數(shù)據(jù)
  321.         str[0]=0xff;str[1]=0x00;
  322.         str[2]=dat;str[3]=~dat;
  323.         TR1=1;
  324.         delay_100us(90);                                   //起始信號(hào)    9毫秒
  325.         TR1=0;
  326.         delay_100us(45);                                         
  327.         for(j=0;j<4;j++)                           //發(fā)射四個(gè)數(shù)據(jù)
  328.         {
  329.                 for(i=0;i<8;i++)                   //  發(fā)射八個(gè)位
  330.                 {
  331.                         TR1=1;
  332.                         delay_100us(5);                  //  0.56毫秒                        
  333.                         TR1=0;
  334.                         if(str[j]&0x01==0x01)
  335.                                 delay_100us(11);                        //11.2毫秒  代表發(fā)送1
  336.                         else
  337.                                 delay_100us(5);                                //0.56毫秒  代表發(fā)送0
  338.                         str[j]>>=1;
  339.                 }
  340.         }                 
  341. }
  342. void init()
  343. {
  344.   EA=1;
  345.   ET1=1;
  346.   TR1 = 1;
  347.   TMOD=0X20;
  348.   TH1=0XF0;
  349.   TL1=0XF0;           //  用定時(shí)器中斷產(chǎn)生38khz的方波
  350. }

  351. void main()
  352. {
  353.         init();
  354.     while(1)
  355.         {                  
  356.                 hongwaifase(0x45);
  357.                 delay_1ms(1000);
  358.         }        
  359. }

  360. void time1() interrupt 3 using 1
  361. {
  362.    P35=~P35;                //取反產(chǎn)生方波
  363. }
復(fù)制代碼

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

ID:968316 發(fā)表于 2021-9-26 11:42 來自觸屏版 | 顯示全部樓層
有沒有去問客服呀?
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表