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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 18266|回復(fù): 5
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)紅外對(duì)射傳感器實(shí)驗(yàn)詳解 附程序源碼

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:418816 發(fā)表于 2018-10-31 22:26 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
實(shí)驗(yàn)2 紅外對(duì)射傳感器實(shí)驗(yàn)-V20160908
1.實(shí)驗(yàn)?zāi)康?/strong>
學(xué)習(xí)紅外對(duì)射傳感器工作原理;
2.實(shí)驗(yàn)設(shè)備
硬件:紅外對(duì)射傳感器節(jié)點(diǎn),串口線;
軟件:Keil u Vision4編譯軟件,STC下載軟件STC_ISP;
芯片手冊(cè):配套光盤(pán)\附件\芯片手冊(cè)\紅外對(duì)射傳感器
電路原理圖路徑:配套光盤(pán)\附件\電路原理圖;
源碼路徑:配套光盤(pán)\源代碼\傳感器原理與應(yīng)用\實(shí)驗(yàn)2 紅外對(duì)射傳感器實(shí)驗(yàn)-V20161122
hex文件路徑:配套光盤(pán)\源代碼\傳感器原理與應(yīng)用\實(shí)驗(yàn)2 紅外對(duì)射傳感器實(shí)驗(yàn)-V20161122\out
3.實(shí)驗(yàn)原理
3.1 紅外對(duì)射傳感器介紹
紅外對(duì)射傳感器使用的是槽型紅外光電開(kāi)關(guān)。紅外光電傳感器是捕捉紅外線這種不可見(jiàn)光,采用專用的紅外發(fā)射管和接收管,轉(zhuǎn)換為可以觀測(cè)的電信號(hào)。紅外光電傳感器有效地防止周?chē)梢?jiàn)光的干擾,進(jìn)行無(wú)接觸探測(cè),不損傷被測(cè)物體。紅外光電傳感器在一般情況下,有三部分構(gòu)成,它們分為:發(fā)送器、接收器和檢測(cè)電路。
紅外對(duì)射傳感器的外型如圖3.1所示。槽型紅外光電開(kāi)關(guān)把一個(gè)紅外光發(fā)射器和一個(gè)紅外光接收器面對(duì)面地裝在一個(gè)槽的兩側(cè)。發(fā)光器能發(fā)出紅外光,在無(wú)阻情況下光接收器能收到光。但當(dāng)被檢測(cè)物體從槽中通過(guò)時(shí),光被遮擋,光電開(kāi)關(guān)便動(dòng)作,輸出一個(gè)開(kāi)關(guān)控制信號(hào),切斷或接通負(fù)載電流,從而完成一次控制動(dòng)作。槽形開(kāi)關(guān)的檢測(cè)距離因?yàn)槭苷w結(jié)構(gòu)的限制一般只有幾厘米。
圖3.1  紅外對(duì)射傳感器

3.2 光敏傳感器的電路圖
紅外對(duì)射傳感器電路如圖3.2,U1的1,2腳為紅外發(fā)射端,3,4腳為接收端,當(dāng)凹槽中有物體擋住紅外線時(shí),3,4腳之間截止,1IN+為高電平,D4輸出高電平;當(dāng)凹槽中沒(méi)有物體擋住紅外線時(shí),3,4腳之間導(dǎo)通,1IN+為低電平,D4輸出低電平。
圖3.2  紅外對(duì)射傳感器電路
4.實(shí)驗(yàn)步驟
4.1 編寫(xiě)實(shí)驗(yàn)源代碼文件
4.1.1 取紅外對(duì)射傳感器節(jié)點(diǎn),打開(kāi)Keil集成開(kāi)發(fā)環(huán)境,打開(kāi)配套光盤(pán)\源代碼\傳感器原理與應(yīng)用\實(shí)驗(yàn)2 紅外對(duì)射傳感器實(shí)驗(yàn)-V20161122的工程文件。
4.1.2點(diǎn)擊左上角的Rebuild按鍵,編譯整個(gè)工程,將生成hongwaiduishe.hex可執(zhí)行文件,該可執(zhí)行文件自動(dòng)保存在配套光盤(pán)\源代碼\傳感器原理與應(yīng)用\實(shí)驗(yàn)2 紅外對(duì)射傳感器實(shí)驗(yàn)-V20161122\out目錄下。(注意:請(qǐng)根據(jù)該目錄下 hongwaiduishe.hex 文件的生成時(shí)間,判斷該文件是否是自己剛剛編譯完成的。)
4.1.3 使用串口線將電腦與紅外對(duì)射傳感器節(jié)點(diǎn)的串口相連,將紅外對(duì)射傳感器節(jié)點(diǎn)上的S1開(kāi)關(guān)撥打到左邊,讓STC單片機(jī)和DB9相連。
4.1.4 根據(jù) 配套光盤(pán)\第三方應(yīng)用軟件\STC_ISP的STC-ISP軟件使用說(shuō)明書(shū)-甄鵬-V20160423,使用STC-ISP軟件將4.1.2步中生成的可執(zhí)行hongwaiduishe.hex文件通過(guò)STC_ISP串口下載軟件下載進(jìn)STC單片機(jī)中。
4.2  實(shí)驗(yàn)源代碼解析

  1. #include <STC12C5A60S2.h>

  2. #define                            BUF_LENTH              128                            //定義串口接收緩沖長(zhǎng)度
  3. #define     uint unsigned int
  4. #define     uchar unsigned char
  5. unsigned char               uart1_wr;                            //寫(xiě)指針
  6. unsigned char               uart1_rd;                            //讀指針
  7. unsigned char               xdata RX0_Buffer[BUF_LENTH];              //接收緩沖
  8. unsigned char flag;
  9. unsigned char i;
  10. unsigned char   xdata mbus_buffer[255];
  11. unsigned char   xdata mbus_Sendbuf[255];
  12. unsigned char   xdata Crc_buf[2];  //聲明存儲(chǔ)CRC校驗(yàn)值的高8位及低8位的緩存
  13. unsigned int  Crc_return_data;  //聲明CRC校驗(yàn)值
  14. bit                            B_TI; //發(fā)送完成標(biāo)志
  15. sbit  P1_0 = P1^0;//定義P1.0端口
  16. //                                                                                                                7       6      5       4         3      2    1    0   Reset Value
  17. //sfr ADC_CONTR = 0xBC;                            ADC_POWER SPEED1 SPEED0 ADC_FLAG ADC_START CHS2 CHS1 CHS0 0000,0000              //AD 轉(zhuǎn)換控制寄存器
  18. #define ADC_OFF()              ADC_CONTR = 0
  19. #define ADC_ON                            (1 << 7)
  20. #define ADC_90T                            (3 << 5)
  21. #define ADC_180T              (2 << 5)
  22. #define ADC_360T              (1 << 5)
  23. #define ADC_540T              0
  24. #define ADC_FLAG              (1 << 4)              //軟件清0
  25. #define ADC_START              (1 << 3)              //自動(dòng)清0
  26. #define ADC_CH0                            0
  27. #define ADC_CH1                            1
  28. #define ADC_CH2                            2
  29. #define ADC_CH3                            3
  30. #define ADC_CH4                            4
  31. #define ADC_CH5                            5
  32. #define ADC_CH6                            6
  33. #define ADC_CH7                            7

  34. uint adc10_start(uchar channel);
  35. void              uart1_init(void);
  36. void Uart1_TxByte(unsigned char dat);
  37. void Uart1_String(unsigned char code *puts);
  38. void delay_ms(unsigned char ms);
  39. unsigned int cal_crc(unsigned char *snd, unsigned char num);
  40. /*************** 用戶定義參數(shù) *****************************/

  41. #define MAIN_Fosc                            11059200UL            
  42. #define Baudrate0                            9600UL                           
  43.                                                                                                                              
  44. /**********************************************************/


  45. /************** 編譯器自動(dòng)生成,用戶請(qǐng)勿修改 *****************************/

  46. #define BRT_Reload                                          (256 - MAIN_Fosc / 16 / Baudrate0)                            //Calculate the timer1 reload value ar 1T mode


  47. /**********************************************************/

  48. //**********************************************************************
  49. //函數(shù)名:main(void)
  50. //輸入  :無(wú)
  51. //輸出  :無(wú)
  52. //功能描述:檢測(cè)紅外對(duì)射傳感器中間有無(wú)物體,用AD量表示,當(dāng)返回值大于
  53. //500判定有物體        
  54. //**********************************************************************
  55. void              main(void)
  56. {
  57.               uint              j;
  58.               uart1_init();//初始化串口
  59.               P1ASF = (1 << ADC_CH0);              //STC12C5A16S2系列模擬輸入(AD)選擇ADC1(P1.0)
  60.               ADC_CONTR = ADC_360T | ADC_ON;
  61.               while(1)
  62.               {
  63.                                              j = adc10_start(0);              //(P1.0)ADC1轉(zhuǎn)換
  64.                                           delay_ms(5);
  65.               if(flag==1)
  66.                                           {                            delay_ms(5);
  67.                                                                                                                                                                                                                                                      
  68.                                                                       if(RX0_Buffer[0x03] == 0x2C)
  69.                                                                       {
  70.                                                                                  
  71.                                                                                                      mbus_Sendbuf[3] = 0x00;
  72.                                                                                                      mbus_Sendbuf[4] = 0x00;
  73.                                                                                                      if(j>500)
  74.                                                                                                      mbus_Sendbuf[4] = 0x01;
  75.                                                                                                      mbus_Sendbuf[2] = (((RX0_Buffer[0x04] * 16) + RX0_Buffer[0x05]) * 2);                                                                                                   
  76.                                                                                                      mbus_Sendbuf[0] = RX0_Buffer[0];
  77.                                                                                                      mbus_Sendbuf[1] = 0x03;
  78.                                                                                                       
  79.                                                                                                 
  80.                                                                                                      Crc_return_data=cal_crc(mbus_Sendbuf, 5);  //取得將要發(fā)送數(shù)據(jù)的CRC值
  81.                                                                                  Crc_buf[0]=((Crc_return_data >> 8)&0xff);  //取得CRC值的高8位
  82.                                                                                  Crc_buf[1]=(Crc_return_data & 0xff);   //取得CRC值的低8位
  83.                                                                                                      mbus_Sendbuf[5]=Crc_buf[1];  //CRC值低8位賦值給將要發(fā)送的數(shù)據(jù)的倒數(shù)第二個(gè)字節(jié)
  84.                                                                                                      mbus_Sendbuf[6]=Crc_buf[0];  //CRC值高8位賦值給將要發(fā)送的數(shù)據(jù)的最后一個(gè)
  85.                                                                                              for(i = 0; i < 7; i++)
  86.                                                                                                {            
  87.                                                                                                                         Uart1_TxByte(mbus_Sendbuf[i]);            
  88.                                                                                                }
  89.                                                                                                                 flag=0;                                            
  90.                                                                                                   uart1_wr=0;                             
  91.                                                                       }            
  92.                                             }
  93.               }
  94. }
  95. //**********************************************************************
  96. //函數(shù)名:adc10_start(uchar channel)
  97. //輸入  :ADC轉(zhuǎn)換的通道
  98. //輸出  :ADC值
  99. //功能描述:ADC轉(zhuǎn)換
  100. //**********************************************************************
  101. uint              adc10_start(uchar channel)              //channel = 0~7
  102. {
  103.               uint              adc;
  104.               uchar              i;

  105.               ADC_RES = 0;
  106.               ADC_RESL = 0;

  107.               ADC_CONTR = (ADC_CONTR & 0xe0) | ADC_START | channel;
  108.               i = 250;
  109.               do{
  110.                             if(ADC_CONTR & ADC_FLAG)
  111.                             {
  112.                                           ADC_CONTR &= ~ADC_FLAG;
  113.                                           adc = (uint)ADC_RES;
  114.                                           adc = (adc << 2) | (ADC_RESL & 3);
  115.                                           return              adc;
  116.                             }
  117.               }while(--i);
  118.               return              1024;
  119. }
  120. /*****************************CRC校驗(yàn)計(jì)算函數(shù)********************************/
  121. unsigned int cal_crc(unsigned char *snd, unsigned char num)

  122. {

  123.    unsigned char i, j;

  124.    unsigned int c,crc=0xFFFF;

  125.    for(i = 0; i < num; i ++)

  126.    {

  127.        c = snd[i] & 0x00FF;

  128.        crc ^= c;

  129.        for(j = 0;j < 8; j ++)

  130.        {

  131.            if (crc & 0x0001)

  132.            {

  133.                crc>>=1;

  134.                crc^=0xA001;

  135.            }

  136.            else crc>>=1;

  137.        }

  138.    }  

  139.    return(crc);
  140. }
  141. //**********************************************************************
  142. //函數(shù)名:uart1_init(void)
  143. //輸入  :無(wú)
  144. //輸出  :無(wú)
  145. //功能描述:串口初始化函數(shù),通信參數(shù)為9600 8 N 1
  146. //**********************************************************************
  147. void              uart1_init(void)
  148. {
  149.               PCON |= 0x80;                            //UART0 Double Rate Enable
  150.               SCON = 0x50;                            //UART0 set as 10bit , UART0 RX enable
  151.               AUXR |=  0x01;                            //UART0 使用BRT
  152.               AUXR |=  0x04;                            //BRT set as 1T mode
  153.               BRT = BRT_Reload;
  154.               AUXR |=  0x10;                            //start BRT            

  155.               ES  = 1;
  156.               EA = 1;
  157. }
  158. //**********************************************************************
  159. //函數(shù)名:Uart1_TxByte(unsigned char dat)
  160. //輸入  :需要發(fā)送的字節(jié)數(shù)據(jù)
  161. //輸出  :無(wú)
  162. //功能描述:從串口發(fā)送單字節(jié)數(shù)據(jù)
  163. //**********************************************************************
  164. void Uart1_TxByte(unsigned char dat)
  165. {
  166.     B_TI = 0;
  167.               SBUF = dat;
  168.               while(!B_TI);
  169.               B_TI = 0;
  170. }
  171. //**********************************************************************
  172. //函數(shù)名:Uart1_String(unsigned char code *puts)
  173. //輸入  :字符串首地址
  174. //輸出  :無(wú)
  175. //功能描述:從串口發(fā)送字符串
  176. //**********************************************************************
  177. void Uart1_String(unsigned char code *puts)
  178. {
  179.     for(; *puts != 0; puts++)
  180.               {
  181.         Uart1_TxByte(*puts);

  182.               }
  183. }

  184. //**********************************************************************
  185. //函數(shù)名:UART1_RCV (void)
  186. //輸入  :無(wú)
  187. //輸出  :無(wú)
  188. //功能描述:串口中斷接收函數(shù)
  189. //**********************************************************************
  190. void UART1_RCV (void) interrupt 4
  191. {
  192.               if(RI)
  193.               {
  194.                             RI = 0;
  195.                             RX0_Buffer[uart1_wr++] = SBUF;
  196.                             //if(++uart0_wr >= BUF_LENTH)              uart0_wr = 0;
  197.                             flag = 1;
  198.               }

  199.               if(TI)
  200.               {
  201.                             TI = 0;
  202.                             B_TI = 1;
  203.               }
  204. }

  205. void delay_ms(unsigned char ms)
  206. {
  207.     unsigned int i;
  208.               do{
  209.                   i = MAIN_Fosc /1400;
  210.                             while(--i);
  211.               }while(--ms);
  212. }
復(fù)制代碼


4.3  實(shí)驗(yàn)運(yùn)行效果
節(jié)點(diǎn)S1開(kāi)關(guān)撥打到左邊讓STC單片機(jī)和DB9連接,打開(kāi)串口調(diào)試助手,進(jìn)入如圖4.1所示界面,在串口參數(shù)設(shè)置選擇正確的端口號(hào)以及9600-8-N-1串口配置,選擇16進(jìn)制發(fā)送,16進(jìn)制接收,把紅外對(duì)射傳感器狀態(tài)讀取指令02 03 00 2C 00 01 45 f0復(fù)制到發(fā)送區(qū),打開(kāi)串口,點(diǎn)擊發(fā)送: 02 03 00 2C 00 01 45 f0
凹槽沒(méi)有物體時(shí)返回:02 03 02 00 00 FC 44
凹槽有物體時(shí)返回:02 03 02 00 01 3D 84
圖4.1 紅外對(duì)射傳感器的返回值

完整的Word格式文檔51黑下載地址:
實(shí)驗(yàn)2 紅外對(duì)射傳感器實(shí)驗(yàn)-V20161122.doc (285.5 KB, 下載次數(shù): 80)

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

使用道具 舉報(bào)

沙發(fā)
ID:287320 發(fā)表于 2018-11-25 23:12 | 只看該作者
配套光盤(pán)那里有啊
回復(fù)

使用道具 舉報(bào)

板凳
ID:481329 發(fā)表于 2019-2-27 08:59 | 只看該作者
非常感謝
回復(fù)

使用道具 舉報(bào)

地板
ID:679425 發(fā)表于 2020-3-7 10:02 | 只看該作者
表格中的數(shù)據(jù)看得一頭霧水。
回復(fù)

使用道具 舉報(bào)

5#
ID:603068 發(fā)表于 2020-3-28 16:20 | 只看該作者

非常感謝
回復(fù)

使用道具 舉報(bào)

6#
ID:841294 發(fā)表于 2020-11-10 21:19 | 只看該作者
有沒(méi)有STM32的?
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 欧产日产国产精品视频 | 国产美女精品视频 | 日本精品一区二区 | 亚洲精品视频在线看 | 中日字幕大片在线播放 | 欧美综合国产精品久久丁香 | 亚洲精品一二三 | 黄色毛片免费看 | 狠狠婷婷综合久久久久久妖精 | 日韩最新网站 | 中文字幕一区二区三区乱码在线 | 久久日韩精品一区二区三区 | 欧美一区免费 | 亚洲精品国产电影 | 久久国产精品色av免费观看 | 国产羞羞视频在线观看 | 久久精品16 | 国产精品久久久久免费 | 在线免费观看a级片 | 国产精品自拍视频 | 成人婷婷| 国产综合在线视频 | 欧美色性 | av黄色在线观看 | 538在线精品 | 91在线视频一区 | 麻豆久久久久久久 | 国产精品高清在线 | 成人在线观看免费视频 | 日韩欧美中文 | 久久亚洲欧美日韩精品专区 | 精品一区av| 在线观看亚洲专区 | 免费簧片视频 | 欧美久久久久久久久中文字幕 | 性高朝久久久久久久3小时 av一区二区三区四区 | 日本久久久一区二区三区 | 国产精品99久久免费观看 | 亚洲国产一区二区三区, | 亚洲国产成人精品久久 | 啪视频在线 |