找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 16955|回复: 5
收起左侧

单片机红外对射传感器实验详解 附程序源码

[复制链接]
ID:418816 发表于 2018-10-31 22:26 | 显示全部楼层 |阅读模式
实验2 红外对射传感器实验-V20160908
1.实验目的
学习红外对射传感器工作原理;
2.实验设备
硬件:红外对射传感器节点,串口线;
软件:Keil u Vision4编译软件,STC下载软件STC_ISP;
芯片手册:配套光盘\附件\芯片手册\红外对射传感器
电路原理图路径:配套光盘\附件\电路原理图;
源码路径:配套光盘\源代码\传感器原理与应用\实验2 红外对射传感器实验-V20161122
hex文件路径:配套光盘\源代码\传感器原理与应用\实验2 红外对射传感器实验-V20161122\out
3.实验原理
3.1 红外对射传感器介绍
红外对射传感器使用的是槽型红外光电开关。红外光电传感器是捕捉红外线这种不可见光,采用专用的红外发射管和接收管,转换为可以观测的电信号。红外光电传感器有效地防止周围可见光的干扰,进行无接触探测,不损伤被测物体。红外光电传感器在一般情况下,有三部分构成,它们分为:发送器、接收器和检测电路。
红外对射传感器的外型如图3.1所示。槽型红外光电开关把一个红外光发射器和一个红外光接收器面对面地装在一个槽的两侧。发光器能发出红外光,在无阻情况下光接收器能收到光。但当被检测物体从槽中通过时,光被遮挡,光电开关便动作,输出一个开关控制信号,切断或接通负载电流,从而完成一次控制动作。槽形开关的检测距离因为受整体结构的限制一般只有几厘米。
图3.1  红外对射传感器

3.2 光敏传感器的电路图
红外对射传感器电路如图3.2,U1的1,2脚为红外发射端,3,4脚为接收端,当凹槽中有物体挡住红外线时,3,4脚之间截止,1IN+为高电平,D4输出高电平;当凹槽中没有物体挡住红外线时,3,4脚之间导通,1IN+为低电平,D4输出低电平。
图3.2  红外对射传感器电路
4.实验步骤
4.1 编写实验源代码文件
4.1.1 取红外对射传感器节点,打开Keil集成开发环境,打开配套光盘\源代码\传感器原理与应用\实验2 红外对射传感器实验-V20161122的工程文件。
4.1.2点击左上角的Rebuild按键,编译整个工程,将生成hongwaiduishe.hex可执行文件,该可执行文件自动保存在配套光盘\源代码\传感器原理与应用\实验2 红外对射传感器实验-V20161122\out目录下。(注意:请根据该目录下 hongwaiduishe.hex 文件的生成时间,判断该文件是否是自己刚刚编译完成的。)
4.1.3 使用串口线将电脑与红外对射传感器节点的串口相连,将红外对射传感器节点上的S1开关拨打到左边,让STC单片机和DB9相连。
4.1.4 根据 配套光盘\第三方应用软件\STC_ISP的STC-ISP软件使用说明书-甄鹏-V20160423,使用STC-ISP软件将4.1.2步中生成的可执行hongwaiduishe.hex文件通过STC_ISP串口下载软件下载进STC单片机中。
4.2  实验源代码解析

  1. #include <STC12C5A60S2.h>

  2. #define                            BUF_LENTH              128                            //定义串口接收缓冲长度
  3. #define     uint unsigned int
  4. #define     uchar unsigned char
  5. unsigned char               uart1_wr;                            //写指针
  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];  //声明存储CRC校验值的高8位及低8位的缓存
  13. unsigned int  Crc_return_data;  //声明CRC校验值
  14. bit                            B_TI; //发送完成标志
  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 转换控制寄存器
  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)              //自动清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. /*************** 用户定义参数 *****************************/

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


  45. /************** 编译器自动生成,用户请勿修改 *****************************/

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


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

  48. //**********************************************************************
  49. //函数名:main(void)
  50. //输入  :无
  51. //输出  :无
  52. //功能描述:检测红外对射传感器中间有无物体,用AD量表示,当返回值大于
  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转换
  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);  //取得将要发送数据的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位赋值给将要发送的数据的倒数第二个字节
  84.                                                                                                      mbus_Sendbuf[6]=Crc_buf[0];  //CRC值高8位赋值给将要发送的数据的最后一个
  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. //函数名:adc10_start(uchar channel)
  97. //输入  :ADC转换的通道
  98. //输出  :ADC值
  99. //功能描述:ADC转换
  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校验计算函数********************************/
  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. //函数名:uart1_init(void)
  143. //输入  :无
  144. //输出  :无
  145. //功能描述:串口初始化函数,通信参数为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. //函数名:Uart1_TxByte(unsigned char dat)
  160. //输入  :需要发送的字节数据
  161. //输出  :无
  162. //功能描述:从串口发送单字节数据
  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. //函数名:Uart1_String(unsigned char code *puts)
  173. //输入  :字符串首地址
  174. //输出  :无
  175. //功能描述:从串口发送字符串
  176. //**********************************************************************
  177. void Uart1_String(unsigned char code *puts)
  178. {
  179.     for(; *puts != 0; puts++)
  180.               {
  181.         Uart1_TxByte(*puts);

  182.               }
  183. }

  184. //**********************************************************************
  185. //函数名:UART1_RCV (void)
  186. //输入  :无
  187. //输出  :无
  188. //功能描述:串口中断接收函数
  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. }
复制代码


4.3  实验运行效果
节点S1开关拨打到左边让STC单片机和DB9连接,打开串口调试助手,进入如图4.1所示界面,在串口参数设置选择正确的端口号以及9600-8-N-1串口配置,选择16进制发送,16进制接收,把红外对射传感器状态读取指令02 03 00 2C 00 01 45 f0复制到发送区,打开串口,点击发送: 02 03 00 2C 00 01 45 f0
凹槽没有物体时返回:02 03 02 00 00 FC 44
凹槽有物体时返回:02 03 02 00 01 3D 84
图4.1 红外对射传感器的返回值

完整的Word格式文档51黑下载地址:
实验2 红外对射传感器实验-V20161122.doc (285.5 KB, 下载次数: 80)
回复

使用道具 举报

ID:287320 发表于 2018-11-25 23:12 | 显示全部楼层
配套光盘那里有啊
回复

使用道具 举报

ID:481329 发表于 2019-2-27 08:59 | 显示全部楼层
非常感谢
回复

使用道具 举报

ID:679425 发表于 2020-3-7 10:02 | 显示全部楼层
表格中的数据看得一头雾水。
回复

使用道具 举报

ID:603068 发表于 2020-3-28 16:20 | 显示全部楼层

非常感谢
回复

使用道具 举报

ID:841294 发表于 2020-11-10 21:19 | 显示全部楼层
有没有STM32的?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表