<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 單片機(jī)用Mssp_spi模塊三點(diǎn)通信

          單片機(jī)用Mssp_spi模塊三點(diǎn)通信

          作者: 時(shí)間:2016-12-03 來源:網(wǎng)絡(luò) 收藏
          效果如下:右邊作為從機(jī)單片機(jī)進(jìn)行AD采樣,然后將數(shù)據(jù)發(fā)送到左主單片機(jī),它將數(shù)據(jù)送往74LS164,再送到顯示終端
          程序如下 :
          /**host.c/
          #include
          #include "7seg.h"
          #ifndef _XTAL_FREQ
          #define _XTAL_FREQ 4000000
          #endif
          /*
          SPI自動(dòng)按全雙工形式運(yùn)行,
          也就發(fā)送一個(gè)信息時(shí)必接收一個(gè)信號(hào),
          這是否是從機(jī)發(fā)來的信號(hào)不得而知。
          因此我定義了一個(gè)協(xié)議:/主機(jī)發(fā)送0X00作為控制命令,
          以控制從機(jī)何時(shí)采集信號(hào);
          主機(jī)接收從機(jī)信號(hào)時(shí),伴隨
          發(fā)送0X0FF,從機(jī)收到不做處理/
          這是單一主機(jī)、雙機(jī)的三點(diǎn)通信,
          74LS164吸電流大于拉電流,數(shù)碼管接成上拉形式
          這是主機(jī)程序
          C0C1為從機(jī)和從器件選中控制信號(hào)
          */
          void
          init()
          {
          PORTC=0B00000011;
          TRISC=0B11010000;
          /*
          RC4/SDI引腳為輸入,
          RC5/SDO引腳為輸出,
          RC3/SCK引腳為輸出,
          沒有用上引腳設(shè)為輸入
          */
          SSPSTAT=0b00000000;/* 在結(jié)束時(shí)采樣,在上升沿?cái)?shù)據(jù)移位*/
          SSPCON=0b00110010;/* SSPEN=1;CKP=1 , FOSC/64,主控方式*/
          }
          void
          TX_74LS164(unsigned char datas)
          {
          RC1=0;/*選中74LS164*/
          SSPBUF=datas;
          do
          {
          ;
          }while(SSPIF==0);/*等待發(fā)送完畢*/
          SSPIF=0;/*清除SSPIF標(biāo)志*/
          RC1=1;/*不選中*/
          }
          unsigned char
          In_OUT(unsigned char datas)
          /*
          同時(shí)發(fā)送和接收信息(全雙工)
          */
          {
          unsigned char BUFF;
          SSPBUF=datas;
          do
          {
          ;
          }while(SSPIF==0);/*等待發(fā)送完畢*/
          SSPIF=0;/*清除SSPIF標(biāo)志*/
          BUFF=SSPBUF;/*騰空緩沖器*/
          return BUFF;
          }
          unsigned char
          protocal(unsigned char data)
          /*
          發(fā)送信息給從機(jī)和接收信息自從機(jī)
          */
          {
          unsigned char RESULT;
          RC0=0;/*選中從機(jī)*/
          RESULT=In_OUT(data);
          RC0=1;/*不選中從機(jī)*/
          return RESULT;
          }
          void main()
          {
          unsigned char guest_res;
          init();
          TX_74LS164(0x0ff);
          __delay_ms(100);
          while(1){
          protocal(0x00);/*主機(jī)發(fā)送0X00控制命令*/
          __delay_ms(150);
          guest_res=protocal(0x0ff);
          /*主機(jī)接收從機(jī)信號(hào)時(shí),
          伴隨發(fā)送0X00非控制命令,
          從機(jī)收到不做處理*/
          TX_74LS164(guest_res);
          }
          }

          /**guest.c*/

          本文引用地址:http://www.ex-cimer.com/article/201612/325226.htm

          #include
          #ifndef _XTAL_FREQ
          #define _XTAL_FREQ 4000000
          #endif
          /*
          SPI自動(dòng)按全雙工形式運(yùn)行,
          也就發(fā)送一個(gè)信息時(shí)必接收一個(gè)信號(hào),
          這是否是從機(jī)發(fā)來的信號(hào)不得而知。
          因此我定義了一個(gè)協(xié)議:/主機(jī)發(fā)送0X00作為控制命令,
          以控制從機(jī)何時(shí)采集信號(hào);
          主機(jī)接收從機(jī)信號(hào)時(shí),伴隨
          發(fā)送0X0FF,從機(jī)收到不做處理/
          這是單一主機(jī)、雙機(jī)的三點(diǎn)通信,
          74LS164吸電流大于拉電流,數(shù)碼管接成上拉形式
          這是主機(jī)程序
          C0C1為從機(jī)和從器件選中控制信號(hào)
          */
          unsigned int TEMP=0;/*存放AD初始化值*/
          void ad_init (void){
          INTCON=0X00;
          ADIF=0X00;
          ADCON1=0B10000100;/*AN0、AN1、AN3*/
          ADCON0=0X81; /*十位結(jié)果必須高為8位*/
          TRISA=0X0FF;/*默認(rèn)為AD輸入*/
          PORTA=0X00;
          ADON=1;
          }
          unsigned
          int read_ADresult
          (unsigned char channel){/*通道轉(zhuǎn)換*/

          channel&=0x07;
          ADCON0&=0x85;/*清當(dāng)前通道*/
          ADCON0|=(channel<<3);/*10 xxx 001*/
          __delay_ms(1);
          ADGO=1;
          while(ADGO)continue;
          return(ADRESH<<8)+(ADRESL);
          }
          void
          init()
          {
          PORTC=0;
          TRISC=0B11011100;
          /*
          RC4/SDI引腳為輸入,
          RC5/SDO引腳為輸出,
          RC3/SCK引腳為輸出,
          沒有用上引腳設(shè)為輸入
          */
          TRISA5=1;/* SS為輸入*/
          SSPSTAT=0b00000000;/* 在結(jié)束時(shí)采樣,在上升沿?cái)?shù)據(jù)移位*/
          SSPCON=0b00110100;/* SSPEN=1;CKP=1 , FOSC/64,從方式*/
          }

          unsigned char
          RX_DATA()
          {
          unsigned char BUFF;
          do
          {
          ;
          }while(SSPIF==0);/*等待發(fā)送完畢*/
          SSPIF=0;/*清除SSPIF標(biāo)志*/
          BUFF=SSPBUF;/*騰空緩沖器*/
          return BUFF;
          }
          void main()
          {
          unsigned char res;
          init();
          ad_init();
          while(1){
          do{
          res=RX_DATA();
          }while(res==0x0ff);/**/
          SSPBUF=read_ADresult(0);
          }

          }



          評(píng)論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();