單片機(jī)用Mssp_spi模塊三點(diǎn)通信
#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)
*/
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://butianyuan.cn/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)論