新聞中心

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

        單片機用Mssp_spi模塊三點通信

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

        /**guest.c*/

        本文引用地址:http://www.104case.com/article/201612/325226.htm

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

        channel&=0x07;
        ADCON0&=0x85;/*清當前通道*/
        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ù)據(jù)移位*/
        SSPCON=0b00110100;/* SSPEN=1;CKP=1 , FOSC/64,從方式*/
        }

        unsigned char
        RX_DATA()
        {
        unsigned char BUFF;
        do
        {
        ;
        }while(SSPIF==0);/*等待發(fā)送完畢*/
        SSPIF=0;/*清除SSPIF標志*/
        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);
        }

        }



        評論


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

        關(guān)閉
        主站蜘蛛池模板: 衡水市| 三门峡市| 巴楚县| 五峰| 兴和县| 沙坪坝区| 逊克县| 璧山县| 和林格尔县| 绥中县| 南澳县| 阆中市| 汾阳市| 庐江县| 宜昌市| 莱阳市| 抚州市| 安溪县| 宣城市| 永清县| 迭部县| 肇庆市| 奉化市| 浮山县| 高雄县| 扶绥县| 南靖县| 施甸县| 景德镇市| 平顺县| 宽城| 西峡县| 应用必备| 岳阳市| 玉屏| 镇赉县| 木兰县| 广昌县| 天峨县| 巫溪县| 南川市|