找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2317|回复: 0
打印 上一主题 下一主题
收起左侧

51单片机红外反射传感器实验代码

[复制链接]
跳转到指定楼层
楼主
ID:448967 发表于 2018-12-18 15:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. /**********************************************************/
  2. //晶振频率:11.0592MHz
  3. //文件名  :Main.c
  4. //功能说明:红外反射传感器实验
  5. /**********************************************************/

  6. #include <STC12C5A60S2.h>


  7. #define                BUF_LENTH        128                //定义串口接收缓冲长度
  8. unsigned char         uart1_wr;                //写指针
  9. unsigned char         uart1_rd;                //读指针
  10. unsigned char         xdata RX0_Buffer[BUF_LENTH];        //接收缓冲
  11. unsigned char flag;
  12. unsigned char i;
  13. unsigned char   xdata mbus_buffer[255];
  14. unsigned char   xdata mbus_Sendbuf[255];
  15. unsigned char   xdata Crc_buf[2];  //声明存储CRC校验值的高8位及低8位的缓存
  16. unsigned int  Crc_return_data;  //声明CRC校验值
  17. bit                B_TI; //发送完成标志
  18. sbit  P1_0 = P1^0;//定义P1.0端口

  19. void        uart1_init(void);
  20. void Uart1_TxByte(unsigned char dat);
  21. void Uart1_String(unsigned char code *puts);
  22. void delay_ms(unsigned char ms);
  23. unsigned int cal_crc(unsigned char *snd, unsigned char num);

  24. /*************** 用户定义参数 *****************************/

  25. #define MAIN_Fosc                11059200UL       
  26. #define Baudrate0                9600UL               
  27.                                                                        
  28. /**********************************************************/


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

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


  31. /**********************************************************/

  32. //**********************************************************************
  33. //函数名:main(void)
  34. //输入  :无
  35. //输出  :无
  36. //功能描述:当串口有读取红外反射的指令过来,单片机把有无物体挡在红外反射
  37. //传感器上面的状态指令返回到串口
  38. //**********************************************************************
  39. void        main(void)
  40. {
  41.         uart1_init();//初始化串口
  42.         while(1)
  43.         {
  44.              if(flag==1)
  45.                         {                delay_ms(5);
  46.                                                                                                                                                 
  47.                                         if(RX0_Buffer[0x03] == 0x36)
  48.                                         {
  49.                                                    
  50.                                                            mbus_Sendbuf[3] = 0x00;
  51.                                                            mbus_Sendbuf[4] = 0x00;
  52.                                                            if(P1_0==0)
  53.                                                            {
  54.                                                            mbus_Sendbuf[4] = 0x01;
  55.                                                            }
  56.                                                            mbus_Sendbuf[2] = (((RX0_Buffer[0x04] * 16) + RX0_Buffer[0x05]) * 2);                                                          
  57.                                                            mbus_Sendbuf[0] = RX0_Buffer[0];  
  58.                                                            mbus_Sendbuf[1] = 0x03;
  59.                                                              
  60.                                                        
  61.                                                            Crc_return_data=cal_crc(mbus_Sendbuf, 5);  //取得将要发送数据的CRC值
  62.                                                    Crc_buf[0]=((Crc_return_data >> 8)&0xff);  //取得CRC值的高8位
  63.                                                    Crc_buf[1]=(Crc_return_data & 0xff);   //取得CRC值的低8位
  64.                                                            mbus_Sendbuf[5]=Crc_buf[1];  //CRC值低8位赋值给将要发送的数据的倒数第二个字节
  65.                                                            mbus_Sendbuf[6]=Crc_buf[0];  //CRC值高8位赋值给将要发送的数据的最后一个
  66.                                                          for(i = 0; i < 7; i++)
  67.                                                            {            
  68.                                                                         Uart1_TxByte(mbus_Sendbuf[i]);       
  69.                                                            }
  70.                                                                 flag=0;                          
  71.                                                         uart1_wr=0;                  
  72.                                         }       
  73.                           }  
  74.         }
  75. }


  76. //**********************************************************************
  77. //函数名:uart1_init(void)
  78. //输入  :无
  79. //输出  :无
  80. //功能描述:串口初始化函数,通信参数为9600 8 N 1
  81. //**********************************************************************
  82. void        uart1_init(void)
  83. {
  84.         PCON |= 0x80;                //UART0 Double Rate Enable
  85.         SCON = 0x50;                //UART0 set as 10bit , UART0 RX enable
  86.         AUXR |=  0x01;                //UART0 使用BRT
  87.         AUXR |=  0x04;                //BRT set as 1T mode
  88.         BRT = BRT_Reload;
  89.         AUXR |=  0x10;                //start BRT       

  90.         ES  = 1;
  91.         EA = 1;
  92. }
  93. /*****************************CRC校验计算函数********************************/
  94. unsigned int cal_crc(unsigned char *snd, unsigned char num)

  95. {

  96.    unsigned char i, j;

  97.    unsigned int c,crc=0xFFFF;

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

  99.    {

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

  101.        crc ^= c;

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

  103.        {

  104.            if (crc & 0x0001)

  105.            {

  106.                crc>>=1;

  107.                crc^=0xA001;

  108.            }

  109.            else crc>>=1;

  110.        }

  111.    }   

  112.    return(crc);
  113. }
  114. //**********************************************************************
  115. //函数名:Uart1_TxByte(unsigned char dat)
  116. //输入  :需要发送的字节数据
  117. //输出  :无
  118. //功能描述:从串口发送单字节数据
  119. //**********************************************************************
  120. void Uart1_TxByte(unsigned char dat)
  121. {
  122.     B_TI = 0;
  123.         SBUF = dat;
  124.         while(!B_TI);
  125.         B_TI = 0;
  126. }
  127. //**********************************************************************
  128. //函数名:Uart1_String(unsigned char code *puts)
  129. //输入  :字符串首地址
  130. //输出  :无
  131. //功能描述:从串口发送字符串
  132. //**********************************************************************
  133. void Uart1_String(unsigned char code *puts)
  134. {
  135.     for(; *puts != 0; puts++)
  136.         {
  137.         Uart1_TxByte(*puts);

  138.         }
  139. }

  140. //**********************************************************************
  141. //函数名:UART1_RCV (void)
  142. //输入  :无
  143. //输出  :无
  144. //功能描述:串口中断接收函数
  145. //**********************************************************************
  146. void UART1_RCV (void) interrupt 4
  147. {
  148.         if(RI)
  149.         {
  150.                 RI = 0;
  151.                 RX0_Buffer[uart1_wr++] = SBUF;
  152.                 //if(++uart0_wr >= BUF_LENTH)        uart0_wr = 0;
  153.                 flag = 1;
  154.         }

  155.         if(TI)
  156.         {
  157.                 TI = 0;
  158.                 B_TI = 1;
  159.         }
  160. }

  161. void delay_ms(unsigned char ms)
  162. {
  163.     unsigned int i;
  164.         do{
  165.             i = MAIN_Fosc /1400;
  166.                 while(--i);
  167.         }while(--ms);
  168. }
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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