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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 9320|回復: 7
打印 上一主題 下一主題
收起左側

很久以前編的PIC16f1936的超聲波測距的程序+Proteus仿真共享

[復制鏈接]
跳轉到指定樓層
樓主
一個很久以前編的PIC16f1936的超聲波測距的程序。共大家參考:
1、開發環境:mplab X,proteus 8.6仿真。
2、部分程序注釋,在實物板子上有效。
3、只有測量距離,LED顯示距離,(單位是0.1mm),距離中有被屏蔽部分距離。可供參考。
4、這個網上的便宜的模塊,一個很大的短板:測距需要平整的面。對于人臉等,衣服等較差。

制作出來的實物圖如下:


仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機源程序如下:
  1. #include <xc.h>
  2. #include"system.h"
  3. #include <stdint.h>        /* For uint8_t definition */
  4. #include <stdbool.h>       /* For true/false definition */
  5. #include <stdio.h>
  6. #include <string.h>
  7. #include <stdlib.h>
  8. #define TRIG PORTCbits.RC1          //TRIG  input
  9. #define ECHO PORTCbits.RC2          //ECHO  input
  10. //                    0,  1,   2     3   4    5    6    7    8    9   
  11. uint8_t seg_data[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0b10111111,0b11100011,0b10000110,0b10000100};
  12. uint8_t seg_rom[4]={0x01,0x02,0x04,0x08};
  13. uint16_t disp_data=0;                              
  14. uint8_t disp_rom=0;
  15. uint8_t disp_num=0;
  16. uint8_t buffer[10];
  17. uint8_t time_ccpr1l;
  18. uint8_t time_ccpr1h;
  19. uint8_t eccp_up_down_flag=0;                        //up=0;down=1;
  20. uint16_t disp_number;
  21. uint8_t distance_ok_flag=0;
  22. uint8_t distance_over=0;
  23. void serial_send(uint8_t send_data );
  24. void eccp1_disable();
  25. void sys_init();
  26. void distance_test();
  27. void eccp1_enable();
  28. void eccp1_up();
  29. void eccp1_down();
  30. void data_do();
  31. void disp_do();
  32. void clear_pin()
  33. {
  34.     PORTB=0xff;
  35.     PORTA=(uint8_t)((PORTA ) & (uint8_t)(0b11110000));
  36. }
  37. /***************************************************************************
  38. 程序為上升沿檢測
  39. 上升沿檢測初始化并啟動上升沿檢測(中斷)
  40. **************************************************************************/
  41. void eccp1_up()
  42. {
  43.     CCP1CON=0x00;
  44.     CCP1CON=0x05;      //04:下降沿,05:上升沿。
  45.     CCPR1L=0;
  46.     CCPR1H=0;
  47.     TMR1H=0;
  48.     TMR1L=0;
  49.     T1CON=0x24;
  50.     PIR1bits.CCP1IF=0;
  51.     eccp_up_down_flag=0;   //up =0 down=1;   
  52.     eccp1_enable();        //開啟上升沿檢測
  53. }
  54. /***************************************************************************
  55. 程序為下降沿檢測
  56. 下降沿檢測初始化并啟動下降沿檢測(中斷)
  57. **************************************************************************/
  58. void eccp1_down()
  59. {
  60.     CCP1CON=0x00;
  61.     CCP1CON=0x04;      //04:下降沿,05:上升沿。
  62.     CCPR1L=0;
  63.     CCPR1H=0;
  64.     TMR1H=0;
  65.     TMR1L=0x09;
  66.     T1CON=0x25;
  67.     PIR1bits.CCP1IF=0;
  68.     eccp_up_down_flag=1;   //up =0 down=1;   
  69.     PIR1bits.CCP1IF=0;
  70.     PIE1bits.CCP1IE=1;
  71.     INTCONbits.GIE=1;
  72. }
  73. void eccp1_enable()
  74. {
  75.     PIR1bits.CCP1IF=0;
  76.     PIE1bits.CCP1IE=1;
  77.     INTCONbits.GIE=1;
  78. }
  79. void eccp1_disable()
  80. {
  81.      PIR1bits.CCP1IF=0;
  82.      PIE1bits.CCP1IE=0;
  83.      INTCONbits.GIE=0;
  84.      
  85. }
  86. void pin_init()
  87. {
  88.     TRISA=0;                //RA LED輸出
  89.     PORTA=0b11100000;
  90.     TRISB=0x00;             //RB LED輸出
  91.     PORTB=0Xff;            
  92.     ANSELA=0;               //關閉A口的ADC
  93.     TRISC=0b00000100;       //RC2=ECHO input;RC1=Trip output
  94.     PORTC=0;
  95.     IOCBF=0X00;
  96.     IOCBN=0X80;            //
  97.     IOCBP=0X00;   
  98.     SRLEN=0;
  99.     LCDEN=0;
  100. }
  101. void disp()
  102. {
  103.     uint8_t PA_buffer,PB_buffer;
  104.     if(disp_rom==disp_num)                    //4位顯示完畢
  105.     {
  106.         disp_rom=0;        
  107.         sprintf(buffer,"%05u",disp_number*17);//disp_buffer);
  108.         disp_num=4;                           //顯示4位
  109.         if(distance_over==1)                  //超出距離顯示“----”
  110.         {
  111.             disp_num=4;
  112.             buffer[0]=0x3a;
  113.             buffer[1]=0x3a;
  114.             buffer[2]=0x3a;;
  115.             buffer[3]=0x3a;;
  116.         }        
  117.         PA_buffer=seg_rom[disp_rom];
  118.         PB_buffer=seg_data[((unsigned)(buffer[(unsigned)disp_num-1])-0x30)];
  119.         clear_pin();
  120.         PORTA=(uint8_t)((PA_buffer  & 0b00001111) ^ (PORTA & 0b11110000));   
  121.         PORTB=PB_buffer;  
  122.         disp_rom++;
  123.     }
  124.     else                                      //4位沒有顯示完畢
  125.     {
  126.         PA_buffer=seg_rom[disp_rom];
  127.         PB_buffer=seg_data[((unsigned)buffer[(unsigned)disp_num-1-disp_rom])-0x30];         
  128.         clear_pin();
  129.         PORTA=(uint8_t)((PA_buffer  & 0b00001111) ^ (PORTA & 0b11110000));
  130.         if(disp_rom==2 && distance_over==0)
  131.         PORTB=(uint8_t)(PB_buffer & 0b01111111);
  132.         else
  133.         PORTB=PB_buffer;
  134.         disp_rom++;
  135.     }         
  136. }
  137. void Serial_init(void)     
  138. {
  139.     OSCCON = 0x7F;            //64/16MHZ
  140.     SYNC=0;BRGH=0; BRG16=0;   //9600band
  141.     SPBRG=25;                //
  142.     TXEN=1;                      //
  143.     SPEN=1;                      //
  144.     TX9=0;                       //
  145.     RX9=0;                             //
  146.     CREN=1;                             //
  147.     INTCON=0;
  148.     PIE1=0;
  149.     INTCONbits.INTE=0;
  150.     INTCONbits.IOCIE=0;
  151.     PIE1bits.ADIE=0;
  152.     PIE1bits.CCP1IE=0;
  153.     PIE1bits.SSPIE=0;
  154.     PIE1bits.TMR1GIE=0;
  155.     PIE1bits.TMR1IE=0;
  156.     PIE1bits.TMR2IE=0;
  157.     PIE1bits.RCIE=0;        //關閉接收中斷
  158.     INTCONbits.PEIE=1;            //
  159.     INTCONbits.GIE=1;
  160.    
  161. }
  162. /***************************************************************************
  163. 中斷子程序
  164. **************************************************************************/
  165. void interrupt isr (void)
  166. {
  167.     if( CCP1IE && CCP1IF )
  168.     {
  169.         if(eccp_up_down_flag==0)    //上升沿檢測
  170.         {
  171.             eccp1_down();          //進行下降沿檢測        
  172.         }
  173.         else
  174.         {            
  175.             eccp1_disable();       //     
  176.             time_ccpr1l = CCPR1L;  //
  177.             time_ccpr1h = CCPR1H;  //
  178.             CCPR1L=0;              //
  179.             CCPR1H=0;              //
  180.             TMR1H=0;
  181.             TMR1L=0;
  182.             T1CON=0x20;            
  183.             distance_ok_flag=1;    //檢測完畢
  184.             disp_number=(uint16_t)time_ccpr1h<<8 | time_ccpr1l;   //distance save         
  185.             PIR1bits.CCP1IF = 0;   
  186.         }      
  187.     }
  188.    
  189. }
  190. void serial_send(uint8_t send_data )
  191. {
  192.     TXREG = send_data;
  193.     while(TRMT==0);
  194. }
  195. void main()
  196. {   
  197.     uint8_t i;
  198.     sys_init();                     //system initialize   
  199.     disp_data=1234;                 
  200.     sprintf(buffer,"%d",disp_data);
  201.     disp_num=strlen(buffer);        //display"1234"
  202.      __delay_ms(100);   
  203.      while(1)
  204.     {
  205.         distance_test();            //test distance
  206.         for(i=0;i<120;i++)
  207.         {
  208.             disp();                 //display distance
  209.             __delay_ms(1);
  210.         }      
  211.     }   
  212. }
  213. void sys_init()
  214. ……………………

  215. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼


所有資料51hei提供下載:
超聲波測距.rar (115.19 KB, 下載次數: 70)
超聲波測距.pdf (38.51 KB, 下載次數: 43)

評分

參與人數 1黑幣 +80 收起 理由
admin + 80 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:102963 發表于 2018-12-8 09:20 | 只看該作者
沒法編譯,缺少頭文件xc.h
回復

使用道具 舉報

板凳
ID:18297 發表于 2018-12-8 11:49 | 只看該作者
songxia8013 發表于 2018-12-8 09:20
沒法編譯,缺少頭文件xc.h

使用mplab x的環境XC8的編譯器編譯,不要用以前的mplab ide8.70
回復

使用道具 舉報

地板
ID:506519 發表于 2019-4-12 21:20 | 只看該作者
zjjhtony 發表于 2018-12-8 11:49
使用mplab x的環境XC8的編譯器編譯,不要用以前的mplab ide8.70

能不能用CCS編譯器啊?
回復

使用道具 舉報

5#
ID:18297 發表于 2019-4-13 20:24 | 只看該作者
可能需要修改庫函數。為什么不用免費的mplab X呢?
回復

使用道具 舉報

6#
ID:506519 發表于 2019-4-14 15:18 來自手機 | 只看該作者
zjjhtony 發表于 2019-4-13 20:24
可能需要修改庫函數。為什么不用免費的mplab X呢?

這個老師要求用CCS來
回復

使用道具 舉報

7#
ID:48413 發表于 2019-8-29 20:34 | 只看該作者
學習一下
回復

使用道具 舉報

8#
ID:592524 發表于 2019-9-27 14:54 | 只看該作者
謝謝分享。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美大片一区 | 欧美一级视频在线观看 | 亚洲一区二区三区免费在线观看 | 国产精品精品视频一区二区三区 | 久久久精品视频一区二区三区 | 一区二区三区四区国产精品 | 色狠狠桃花综合 | 国产精品久久久久久久久久久久午夜片 | 视频一区二区中文字幕 | 精品国产乱码久久久久久牛牛 | 欧美性另类 | 精精国产xxxx视频在线播放 | 亚洲黄色av| 精品久久久久一区二区国产 | 日日综合| 一级全黄少妇性色生活免费看 | 日韩免费看片 | 亚洲v日韩v综合v精品v | 中文字幕1区2区3区 日韩在线视频免费观看 | 91视频观看 | 精品欧美 | 免费黄色大片 | 日韩成人 | 美女拍拍拍网站 | 人妖videosex高潮另类 | 欧美三级在线 | 在线播放中文字幕 | 久久精品一级 | 精品无码三级在线观看视频 | 精品国产久 | 精品麻豆剧传媒av国产九九九 | 欧美性a视频 | 欧美一级做a爰片免费视频 国产美女特级嫩嫩嫩bbb片 | 在线观看日本高清二区 | 久久久国产网站 | 久久精品视频播放 | 国产日韩欧美在线观看 | 久久国产精品一区二区三区 | 欧美成人精品一区二区男人看 | 天天草草草 | 亚洲国产欧美一区二区三区久久 |