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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2293|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一级黄色毛片 | 奇米四色影视 | 一区二区三区日韩 | 亚洲av一级毛片 | www日本在线播放 | 日韩成人免费av | av一级在线观看 | japanhdxxxx裸体| 精品永久 | 日韩中文在线观看 | 亚洲国产精品va在线看黑人 | 天天干天天干 | 欧美成人一区二免费视频软件 | 免费av手机在线观看 | 国产一区二区三区免费观看视频 | 999久久久久久久久6666 | 日韩精品一区二区三区在线播放 | 欧美簧片 | xx性欧美肥妇精品久久久久久 | 久久久久久久久久久一区二区 | av在线二区 | 免费欧美视频 | 国产精品高潮呻吟久久 | 精品九九 | 亚洲精品久久久久中文字幕欢迎你 | 四虎首页 | 国产精品久久久久久久久久不蜜臀 | 午夜精品一区二区三区在线观看 | 欧美激情综合色综合啪啪五月 | 久久高清 | 成人国产午夜在线观看 | 激情国产在线 | 91精品在线播放 | 日韩精品视频中文字幕 | 久草在线 | 天堂av在线影院 | 欧美三级成人理伦 | 欧美一级免费 | 一区二区三区亚洲 | 亚洲综合色视频在线观看 | 免费看国产精品视频 |