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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 6752|回復(fù): 1
收起左側(cè)

PIC16F877A單片機(jī)PPM調(diào)制的激光通信Proteus仿真及源程序

[復(fù)制鏈接]
ID:18297 發(fā)表于 2018-6-14 15:56 | 顯示全部樓層 |閱讀模式
幫一個(gè)畢業(yè)生做的《PIC16F877A基于PPM的激光通信》仿真。
軟件:
MPLAB X IDE v4.15編譯    proteus 8.6仿真.
1、仿真電路圖;
2、發(fā)送和接收源程序加注釋。
請(qǐng)看注釋。
原理:
1)ADC讀取并用led顯示ADC讀數(shù),并通過(guò)usart進(jìn)行輸出。
2)通過(guò)PPM原理進(jìn)行通訊傳輸?shù)搅硗庖粋(gè)單片機(jī),LED顯示接收的值。
具體請(qǐng)看附件
希望大家頂一下。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)

原理和仿真

原理和仿真

1、發(fā)送模塊:讀取ADC數(shù)值,LED顯示10位ADC值。并通過(guò)PPM發(fā)送。
2、接收模塊:PPM接收到的數(shù)據(jù)。LED顯示接收的ADC值(10bits)

基于PIC單片機(jī)的PPM調(diào)制激光通信收發(fā)器
PPM (pulse position modulation) 脈沖位置調(diào)制。
  • 通過(guò)改變脈沖的位置來(lái)傳輸不同的數(shù)據(jù)。
如圖1、
  • PPM的編碼:
如圖、利用單片機(jī)的PWM功能產(chǎn)生PWM1和PWM2連個(gè)脈沖。
利用數(shù)字電路合成PPM脈沖。
可以看出當(dāng)PWM1的占空比是0時(shí),PPM如下圖的A,
PWM1的占空比是1時(shí),PPM如下圖的B,


  • PPM的合成:
如第一個(gè)圖可知,PPM可以將PPM1求反后和PWM2相與得到。
故設(shè)計(jì)如上發(fā)送模塊。接收模塊結(jié)果波形整形送到單片機(jī)處理。
  • PPM發(fā)送的數(shù)據(jù)(16位的雙字節(jié)數(shù))。
定義占空比一定的脈沖為發(fā)送的數(shù)據(jù)。
發(fā)送0,   0,   0,   0-3, 4-7,   8-11, 12-15
前面是頭,可以提供接收PPM的單個(gè)周期。
  • PPM接收。
PPM接收到的數(shù)據(jù)是:
由圖中知道
  • 不用,作為啟動(dòng)接收。
  • 就是波形的周期
    (3-2)即3測(cè)量的寬度減去波形的周期的等于0-3對(duì)應(yīng)的PWM脈寬1
(4+脈寬1-2)即4測(cè)量的寬度加上脈寬1減去波形的周期的等于4-7對(duì)應(yīng)的PWM脈寬2
(5+脈寬2-2)即5測(cè)量的寬度加上脈寬2減去波形的周期的等于8-11對(duì)應(yīng)的PWM脈寬3
(6+脈寬3-2)即6測(cè)量的寬度加上脈寬3減去波形的周期的等于12-15對(duì)應(yīng)的PWM脈寬4
在將四個(gè)半字節(jié)數(shù)合成2個(gè)字節(jié)16位的值。

單片機(jī)源程序如下:
  1. #include "sys.h"
  2. #include <stdint.h>        /* For uint8_t definition */
  3. #include <stdbool.h>       /* For true/false definition */
  4. #include <stdio.h>
  5. #define AKING PORTCbits.RC0
  6. const uint8_t uart_disp1[]={"ADC result(DEC) is:"};      //uart DISP
  7. void usart_send_8bits(uint8_t send_data);
  8. void ppm_send_unit(uint8_t send_data);
  9. void time1_init();

  10. uint16_t adc_read()                        
  11. {
  12.     ADCON1=0x80;                //fosc/2,A口都是AD口,Vref=VDD
  13.            ADCON0=0x01;                //AN0進(jìn)行轉(zhuǎn)換,允許轉(zhuǎn)換
  14.                                 //ADFM  ADCS2 --  --  PCFG3   PCFG2   PCFG1  PCFG0
  15.                                 //        1      0             0      0      0      0
  16.                                 //ADCS1 ADCS0  CHS2 CHS1 CHS0  GO/DONE  --  ADON
  17.                                 //  0     0     0    0     0     0            1
  18.     __delay_ms(2);              //delay
  19.         GO=0x01;                                                          //開(kāi)始AD轉(zhuǎn)換
  20.     while(GO);                                                        //是否轉(zhuǎn)換完畢,GO=0轉(zhuǎn)換完畢  
  21.         uint16_t adc_result=(uint16_t)ADRESH<<8 |ADRESL;    //轉(zhuǎn)換結(jié)果,10bits
  22.     return adc_result;                  //return ADC results
  23. }
  24. void sys_init()                        //SYS INIT
  25. {   
  26.     TRISC=0;                            //PORTC is output
  27.     PORTC=0;                            //Clear PORTC
  28.     TRISD=0;                            //PORTD is output
  29.     PORTD=0;                            //Clear PORTD
  30. }
  31. void uart_init()                        //UART INIT
  32. {
  33.     TXSTA =0x24;                            //TXEN=1,TX enable
  34.                                             //BRGH=1,high speed baud
  35.     RCSTA =0b10010000;                      //SPEN=1,receive enable
  36.                                             //CREN=1
  37.     TRISB=0x00;                             //PORTB is output
  38.     SPBRG=103;                              //SPBRG=FOSC/(16*baud)-1;      (high speed baud)
  39.                                             //     =16000000/(16*9600)-1
  40.                                             //     =104-1=103
  41.     INTCON=0;                               //no interrupt
  42.     PIE1=0;                                 //PIE1 disable
  43.     PIE2=0;                                 //PIE2 disable
  44.     PIR1=0;                                 //Clear PIR1(flag of interrupt)
  45.     PIR2=0;                                 //Clear PIR2(flag of interrupt)
  46. }
  47. void usart_send_16bits(uint16_t send_data)            //send 2 bytes
  48. {
  49.      uint16_t send_buffer;                     
  50.       send_buffer=send_data;                           
  51.       usart_send_8bits((uint8_t)(send_buffer>>8));      //send high byte
  52.       usart_send_8bits((uint8_t)(send_data));           //send low  byte
  53. }
  54. void usart_send_8bits(uint8_t send_data)            //send one bytes
  55. {
  56.       TXREG=(uint8_t)(send_data);                       
  57.       while(TRMT==0);                                 //send is over
  58. }
  59. void TMR1_init()                                    //TMR1 INIT
  60. {
  61.     T1CON=0;                                         //TMR1 is TIMR
  62.     TMR1=(uint16_t)(65535-985);                      //delay is 1000*FOSC=1000*0.25=250us
  63.     TMR1IF=0;                                        //Clear TMR1IF
  64. }
  65. void PWM_init()                                     //PWM INIT
  66. {
  67.     PR2=0xff;                                        //寫(xiě)入PR2寄存器設(shè)置PWM周期,PWM周期=[(PR2)+1]*4*TOSC*(TMR2預(yù)分頻比)
  68.                                                      //                               =[255+1]*4*4/16=256us

  69.     CCPR1L=0;                                       //Clear CCPR1L
  70.     T2CON=0x01;                                     //TMR2預(yù)分頻比=1:4
  71.     CCP1CON=0;                                      //Clear CCP1CON
  72.     CCP2CON=0;                                      //Clear CCP2CON
  73.     TMR2ON=1;                                       //TMR2 enable
  74. }
  75. void PPM_unit(uint8_t send_data)                   //PPM send half byte
  76. {
  77.     TMR1_init();                                    //TMR1 delay 250us
  78.     TMR1ON=1;                                       //TMR1 enable
  79.     TMR2=0xF0;                                      //to start PWM
  80.     CCPR1L=(uint8_t)(send_data<<3);                 //CCPR1L
  81.     CCPR2L=(uint8_t)(CCPR1L+8);                     //CCPR2L=CCPR1L+8
  82.     CCP1CON=0x0c;                                   //CCP1 PWM enable
  83.     CCP2CON=0x0c;                                   //CCP2 PWM enable
  84.     while(TMR1IF==0);                               //250us delay is over
  85.     TMR1IF=0;                                       //clear TMR1IF
  86.     CCP1CON=0x0;                                    //CCP1 PWM disable
  87.     CCP2CON=0x0;                                    //CCP2 PWM disable
  88.    
  89. }
  90. void PPM_send(uint16_t send_data)                 //PPM send 2 byte
  91. {
  92.     uint8_t send_buffer[7];
  93.     send_buffer[3]=(uint8_t)send_data;              //half byte
  94.     send_buffer[4]=(uint8_t)send_data;              //half byte
  95.     send_buffer[5]=(uint8_t)(send_data>>8);         //half byte
  96.     send_buffer[6]=(uint8_t)(send_data>>8);         //half byte
  97.     send_buffer[0]=0;                               //head
  98.     send_buffer[1]=0;                               //head                             
  99.     send_buffer[2]=0;                               //head   
  100.     send_buffer[3]=(uint8_t)(send_buffer[3] & 0x0f);    //half byte
  101.     send_buffer[4]=(uint8_t)(send_buffer[4]>>4);        //half byte
  102.     send_buffer[5]=(uint8_t)(send_buffer[5] & 0x0f);    //half byte
  103.     send_buffer[6]=(uint8_t)(send_buffer[6]>>4);        //half byte
  104.     for(uint8_t i=0;i<7;i++)
  105.     {
  106.         PPM_unit(send_buffer[i]);                       //PPM send head(0,0,0) & half byte,half byte,half byte,half byte      7 bytes
  107.     }      
  108. }
  109. void UART_disp(uint16_t uart_data)                     //UART DISP
  110. {
  111.     for(uint8_t i=0;i<19;i++)
  112.     {
  113.         usart_send_8bits(uart_disp1[i]);                //PRINT"ADC result(DEC) is:"
  114.     }
  115.     uint8_t buff[4];
  116.     sprintf(buff,"%d",uart_data);                       //ADC result Dec
  117.     for(uint8_t i=0;i<4;i++)
  118.     {
  119.         usart_send_8bits(buff[i]);                      //
  120.     }
  121.     usart_send_8bits(0x0d);                             //send "enter"
  122. }
  123. void main(void)
  124. ……………………

  125. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
0.png

所有資料51hei提供下載:
sendrece2.rar (499.06 KB, 下載次數(shù): 90)




評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:109235 發(fā)表于 2019-11-13 12:58 | 顯示全部樓層
好樣的,學(xué)習(xí)一下1
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 一区二区在线免费观看视频 | 一级黄在线观看 | 一级片网站视频 | 欧美日韩精品一区二区天天拍 | 成人久久久久 | 国际精品鲁一鲁一区二区小说 | 一区二区日韩精品 | 99久久精品国产一区二区三区 | 欧美成人二区 | 免费观看av网站 | 一区二区三区国产视频 | 国产日韩一区二区三免费 | 亚av在线 | 青青草精品视频 | 免费一二区 | 热re99久久精品国99热观看 | 天天操天天插 | 欧美日本一区 | 日本三级电影在线观看视频 | 欧美精品久久久久 | a级性视频| 欧美精品福利 | 香蕉久久网 | 亚洲综合色网站 | 美女在线一区二区 | 韩国av一区二区 | av影音在线 | 日韩天堂av | 久热精品在线观看视频 | 91精品国产91久久综合桃花 | 三级成人在线 | 久久国产精品视频 | 国产精品美女久久久久久久网站 | 91在线第一页 | 午夜在线小视频 | 国产精品免费视频一区 | 中文字幕在线视频免费视频 | 一区二区三区中文字幕 | 国产精品视频入口 | 一区二区三区在线免费看 | 欧美二区乱c黑人 |