找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机超声波测距传感器读取实验代码

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

  6. #include <STC12C5A60S2.h>
  7. #include <intrins.h>

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

  19. sbit  P1_1 = P1^1;//定义P1.1端口        触发信号端

  20. sbit  P1_4 = P1^4;

  21. void        uart1_init(void);
  22. void Uart1_TxByte(unsigned char dat);
  23. void Uart1_String(unsigned char code *puts);
  24. void delay_ms(unsigned char ms);
  25. void INT0_init(void);
  26. unsigned char outcomeH,outcomeL;
  27. void Onboard_wait( unsigned int timeout );
  28. unsigned int cal_crc(unsigned char *snd, unsigned char num);

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

  30. #define MAIN_Fosc                11059200UL       
  31. #define Baudrate0                9600UL               
  32.                                                                        
  33. /**********************************************************/


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

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

  36. //**********************************************************************
  37. //          P1.0采用准双向口工作模式
  38. //**********************************************************************
  39. void        main(void)
  40. {
  41.         uart1_init();//初始化串口
  42.     TMOD = 0x01;

  43.         //INT0_init();

  44.         EX0 = 0;  //外部中断0不使能
  45.         TR0 = 0;   //不启动T0计数
  46.         //EA = 1;           //开总中断



  47.         while(1)
  48.         {
  49.        P1_1 = 0;
  50.        TL0 = 0;
  51.            TH0 = 0;
  52.            outcomeH =0;    //取出定时器的值
  53.        outcomeL =0;    //取出定时器的值
  54.            temp = 0;

  55.            delay_ms(100);
  56.            P1_1 = 1;
  57.            Onboard_wait(12);
  58.            P1_1 = 0;

  59.           
  60.            while(!P1_4);
  61.          
  62.            TR0 = 1;
  63.        
  64.            while(P1_4);
  65.            TR0 = 0;

  66.            outcomeH =TH0;    //取出定时器的值
  67.        outcomeL =TL0;    //取出定时器的值
  68.            temp =(outcomeH * 256 + outcomeL) *0.0184462 ; // ((12/11059200)*340/2)*100,剩与100表示转化为厘米级
  69.         if(flag==1)
  70.                         {                delay_ms(1);
  71.                                                 flag=0;                          
  72.                                                 uart1_wr=0;
  73.                                                                                                                                                 
  74.                                         if(RX0_Buffer[0x03] == 0x46)
  75.                                         {
  76.                                                    
  77.                                                            mbus_Sendbuf[3] = ((temp>>8)&0xff);
  78.                                                            mbus_Sendbuf[4] = temp&0xff;
  79.                                                            mbus_Sendbuf[2] = (((RX0_Buffer[0x04] * 16) + RX0_Buffer[0x05]) * 2);                                                          
  80.                                                            mbus_Sendbuf[0] = RX0_Buffer[0];  
  81.                                                            mbus_Sendbuf[1] = 0x03;
  82.                                                              
  83.                                                        
  84.                                                            Crc_return_data=cal_crc(mbus_Sendbuf, 5);  //取得将要发送数据的CRC值
  85.                                                    Crc_buf[0]=((Crc_return_data >> 8)&0xff);  //取得CRC值的高8位
  86.                                                    Crc_buf[1]=(Crc_return_data & 0xff);   //取得CRC值的低8位
  87.                                                            mbus_Sendbuf[5]=Crc_buf[1];  //CRC值低8位赋值给将要发送的数据的倒数第二个字节
  88.                                                            mbus_Sendbuf[6]=Crc_buf[0];  //CRC值高8位赋值给将要发送的数据的最后一个
  89.                                                          for(i = 0; i < 7; i++)
  90.                                                            {            
  91.                                                                         Uart1_TxByte(mbus_Sendbuf[i]);       
  92.                                                            }
  93.                   
  94.                                         }       
  95.                           }
  96.         }
  97. }



  98. /*****************************CRC校验计算函数********************************/
  99. unsigned int cal_crc(unsigned char *snd, unsigned char num)
  100. {

  101.    unsigned char i, j;

  102.    unsigned int c,crc=0xFFFF;

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

  104.    {

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

  106.        crc ^= c;

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

  108.        {

  109.            if (crc & 0x0001)

  110.            {

  111.                crc>>=1;

  112.                crc^=0xA001;

  113.            }

  114.            else crc>>=1;

  115.        }

  116.    }   

  117.    return(crc);
  118. }



  119. //**********************************************************************
  120. //函数名:uart1_init(void)
  121. //输入  :无
  122. //输出  :无
  123. //功能描述:串口初始化函数,通信参数为9600 8 N 1
  124. //**********************************************************************
  125. void        uart1_init(void)
  126. {
  127.         PCON |= 0x80;                //UART0 Double Rate Enable
  128.         SCON = 0x50;                //UART0 set as 10bit , UART0 RX enable
  129.         AUXR |=  0x01;                //UART0 使用BRT
  130.         AUXR |=  0x04;                //BRT set as 1T mode
  131.         BRT = BRT_Reload;
  132.         AUXR |=  0x10;                //start BRT       

  133.         ES  = 1;
  134.         EA = 1;
  135. }
  136. //**********************************************************************
  137. //函数名:Uart1_TxByte(unsigned char dat)
  138. //输入  :需要发送的字节数据
  139. //输出  :无
  140. //功能描述:从串口发送单字节数据
  141. //**********************************************************************
  142. void Uart1_TxByte(unsigned char dat)
  143. {
  144.     B_TI = 0;
  145.         SBUF = dat;
  146.         while(!B_TI);
  147.         B_TI = 0;
  148. }
  149. //**********************************************************************
  150. //函数名:Uart1_String(unsigned char code *puts)
  151. //输入  :字符串首地址
  152. //输出  :无
  153. //功能描述:从串口发送字符串
  154. //**********************************************************************
  155. void Uart1_String(unsigned char code *puts)
  156. {
  157.     for(; *puts != 0; puts++)
  158.         {
  159.         Uart1_TxByte(*puts);

  160.         }
  161. }

  162. //**********************************************************************
  163. //函数名:UART1_RCV (void)
  164. //输入  :无
  165. //输出  :无
  166. //功能描述:串口中断接收函数
  167. //**********************************************************************
  168. void UART1_RCV (void) interrupt 4
  169. {
  170.         if(RI)
  171.         {
  172.                 RI = 0;
  173.                 RX0_Buffer[uart1_wr++] = SBUF;
  174.                 //if(++uart0_wr >= BUF_LENTH)        uart0_wr = 0;
  175.                 flag = 1;
  176.         }

  177.         if(TI)
  178.         {
  179.                 TI = 0;
  180.                 B_TI = 1;
  181.         }
  182. }

  183. void delay_ms(unsigned char ms)
  184. {
  185.     unsigned int i;
  186.         do{
  187.             i = MAIN_Fosc /1400;
  188.                 while(--i);
  189.         }while(--ms);
  190. }
  191. void Onboard_wait( unsigned int timeout )
  192. {
  193.   while (timeout--)
  194.   {
  195.     _nop_();
  196.         _nop_();
  197.         _nop_();
  198.         _nop_();

  199.   }
  200. }
复制代码


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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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