久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4375|回復: 1
打印 上一主題 下一主題
收起左側

有人能幫我解釋下這個單片機公交車自動報站紅外模塊的原理嗎?

[復制鏈接]
跳轉到指定樓層
樓主
在某一個寶上買的公交車自動報站項目學習資料,問了店家幾次也講不明白。
這個紅外線發射電路是單片機編碼?
接收電路我知道是用VS1838紅外接收頭接收的紅外信號,然后解碼傳送給單片機,但紅外發射電路(從機)就一個單片機連接一個二極管就完成紅外信號的編碼和發送。不明白這個紅外發射電路的原理

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

  4. sbit rs=P2^5;         //寄存器選擇信號 H:數據寄存器          L:指令寄存器
  5. sbit rw=P2^6;         //寄存器選擇信號 H:數據寄存器          L:指令寄存器
  6. sbit e =P2^7;         //片選信號   下降沿觸發

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

  10. uchar geshu=2;

  11. uchar code gj_ming[]="直達車  ";

  12. uchar code  table1[]="1號站  ";
  13. uchar code  table2[]="  2號站    ";



  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. * 功能 : 延時1ms函數
  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. /************ 延時函數  *****************/
  35. void delay_uint(uint z)
  36. {
  37.    while(z--);
  38. }

  39. /***************交換函數 高位變低位 低位變高位*****************/
  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. /************ 寫命令函數  *****************/
  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. /************ 寫數據函數  *****************/
  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. *函數名: addr_12864
  76. *功能:寫地址
  77. *說明:寫漢字時要寫個地址
  78. *輸入:無
  79. *返回:無
  80. **********************************************************/
  81. void addr_12864(uchar hang,uchar lie)          //地址轉換
  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. *函數名: write_string
  101. *功能:在12864上顯示字符數據
  102. *說明:
  103. *輸入:無
  104. *返回:無
  105. **********************************************************/

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




  116. /************12864液晶初始化函數*****************/
  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的延時函數***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. /********************獨立按鍵程序*****************/
  163. uchar key_can;         //按鍵值

  164. void key()         //獨立按鍵程序
  165. {
  166.         if((P1 & 0x0f) != 0x0f)                //按鍵按下
  167.         {
  168.                 delay_1ms(1);                     //按鍵消抖動
  169.                 if((P1 & 0x0f) != 0x0f)
  170.                 {                                                //確認是按鍵按下
  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負跳變中斷
  185. }

  186. /***************主函數*****************/
  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);    //語音播報
  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);    //語音播報        
  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);    //語音播報                        
  215.                         }
  216.                         hw_table[2] = 0;
  217.                 }
  218.                 key();         //獨立按鍵程序        
  219.                 if(key_can == 1)
  220.                 {
  221.                         if(num < 2)
  222.                         {         
  223.                                 num ++;        
  224.                                 if(num == 1)       //報第1個站
  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);    //語音播報        
  231.                                 }
  232.                                 if(num == 2)       //報第2個站
  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);    //語音播報                        
  239.                                 }
  240.                         }
  241.                 }
  242.                 if(key_can == 2)
  243.                 {
  244.                         if(num != 0)
  245.                                 num--;        
  246.                         if(num == 1)       //報第1個站
  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);    //語音播報        
  253.                         }
  254.                         if(num == 2)       //報第2個站
  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);    //語音播報                        
  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.         {                                     //引導碼
  272.                 while(hw_P32 == 0); //等待低電平過完
  273.                 delay_100us(20);         
  274.                 if(hw_P32 == 1)          //引碼結束
  275.                 {         
  276.                         delay_100us(20);  // 說明高電平已經過完 引導碼已經結束
  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)                //數據0的時間
  283.                                         {                                        //數據1的時間
  284.                                                 hw_table[i] >>= 1;    //低位在前
  285.                                         }
  286.                                         else
  287.                                         {        
  288.                                                 delay_100us(5);   //   高電平的時間過完
  289.                                                 hw_table[i] >>= 1;    //低位在前
  290.                                                 hw_table[i] |= 0x80;  //數據值1
  291.                                         }
  292.                                 }
  293.                         flag_jiema_en = 1;          //紅外解碼成功        
  294.                 }
  295.         }
  296. }


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

  303. /***********   延時函數  ***********/
  304. void delay_1ms(uint z)           //  延時  z 毫秒
  305. {
  306.   uint x,y;
  307.   for(x=z;x>0;x--)
  308.     for(y=110;y>0;y--) ;
  309. }
  310. /***************100us的延時函數***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. /***********   紅外發射子程序  ***********/
  318. void hongwaifase(uchar dat)                 //  發射dat
  319. {
  320.         uchar i,j,str[4];                         //  str[4]存放等待發射的四個數據
  321.         str[0]=0xff;str[1]=0x00;
  322.         str[2]=dat;str[3]=~dat;
  323.         TR1=1;
  324.         delay_100us(90);                                   //起始信號    9毫秒
  325.         TR1=0;
  326.         delay_100us(45);                                         
  327.         for(j=0;j<4;j++)                           //發射四個數據
  328.         {
  329.                 for(i=0;i<8;i++)                   //  發射八個位
  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毫秒  代表發送1
  336.                         else
  337.                                 delay_100us(5);                                //0.56毫秒  代表發送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;           //  用定時器中斷產生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;                //取反產生方波
  363. }
復制代碼

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:968316 發表于 2021-9-26 11:42 來自手機 | 只看該作者
有沒有去問客服呀?
回復

使用道具 舉報

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

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 麻豆久久精品 | 精品一区二区在线观看 | 国产精品成人一区二区三区夜夜夜 | 国产精品日本一区二区不卡视频 | 黄色综合 | 久久久久久高潮国产精品视 | 日韩av在线一区二区三区 | 懂色av蜜桃av | 久久久久亚洲 | 国产一区影院 | 无码日韩精品一区二区免费 | 精品一二区 | 狠狠干狠狠操 | 亚洲欧美中文日韩在线v日本 | 91精品国产综合久久香蕉麻豆 | 玩丰满女领导对白露脸hd | 日韩av黄色 | 成人欧美一区二区三区黑人孕妇 | 在线观看日本高清二区 | 国产在线播 | 欧美中文字幕一区二区三区亚洲 | 日本在线视频一区二区 | 亚洲精品国产电影 | www.久久99 | 亚洲免费人成在线视频观看 | 男人天堂手机在线视频 | 中文字幕一区二区三区乱码图片 | 蜜桃视频成人 | 粉色午夜视频 | 中文字幕在线观看成人 | 久久久久久一区 | 欧美色综合一区二区三区 | 精品久久久久久久久久久久久久久久久 | 97成人在线 | 大香在线伊779 | 久久爱黑人激情av摘花 | 五月香婷婷 | 精精精精xxxx免费视频 | 日本在线视| 欧洲高清转码区一二区 | 中文字幕视频在线看 |