新闻中心

EEPW首页>嵌入式系统>设计应用> 单片机用Mssp_spi模块三点通信

单片机用Mssp_spi模块三点通信

作者: 时间:2016-12-03 来源:网络 收藏
效果如下:右边作为从机单片机进行AD采样,然后将数据发送到左主单片机,它将数据送往74LS164,再送到显示终端
程序如下 :
/**host.c/
#include
#include "7seg.h"
#ifndef _XTAL_FREQ
#define _XTAL_FREQ 4000000
#endif
/*
SPI自动按全双工形式运行,
也就发送一个信息时必接收一个信号,
这是否是从机发来的信号不得而知。
因此我定义了一个协议:/主机发送0X00作为控制命令,
以控制从机何时采集信号;
主机接收从机信号时,伴随
发送0X0FF,从机收到不做处理/
这是单一主机、双机的 三点通信,
74LS164吸电流大于拉电流,数码管接成上拉形式
这是主机程序
C0C1为从机和从器件选中控制信号
*/
void
init()
{
PORTC=0B00000011;
TRISC=0B11010000;
/*
RC4/SDI引脚为输入,
RC5/SDO引脚为输出,
RC3/SCK引脚为输出,
没有用上引脚设为输入
*/
SSPSTAT=0b00000000;/* 在结束时采样,在上升沿数据移位*/
SSPCON=0b00110010;/* SSPEN=1;CKP=1 , FOSC/64,主控方式*/
}
void
TX_74LS164(unsigned char datas)
{
RC1=0;/*选中74LS164*/
SSPBUF=datas;
do
{
;
}while(SSPIF==0);/*等待发送完毕*/
SSPIF=0;/*清除SSPIF标志*/
RC1=1;/*不选中*/
}
unsigned char
In_OUT(unsigned char datas)
/*
同时发送和接收信息(全双工)
*/
{
unsigned char BUFF;
SSPBUF=datas;
do
{
;
}while(SSPIF==0);/*等待发送完毕*/
SSPIF=0;/*清除SSPIF标志*/
BUFF=SSPBUF;/*腾空缓冲器*/
return BUFF;
}
unsigned char
protocal(unsigned char data)
/*
发送信息给从机和接收信息自从机
*/
{
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);/*主机发送0X00控制命令*/
__delay_ms(150);
guest_res=protocal(0x0ff);
/*主机接收从机信号时,
伴随发送0X00非控制命令,
从机收到不做处理*/
TX_74LS164(guest_res);
}
}

/**guest.c*/

本文引用地址://m.amcfsurvey.com/article/201612/325226.htm

#include
#ifndef _XTAL_FREQ
#define _XTAL_FREQ 4000000
#endif
/*
SPI自动按全双工形式运行,
也就发送一个信息时必接收一个信号,
这是否是从机发来的信号不得而知。
因此我定义了一个协议:/主机发送0X00作为控制命令,
以控制从机何时采集信号;
主机接收从机信号时,伴随
发送0X0FF,从机收到不做处理/
这是单一主机、双机的三点通信,
74LS164吸电流大于拉电流,数码管接成上拉形式
这是主机程序
C0C1为从机和从器件选中控制信号
*/
unsigned int TEMP=0;/*存放AD初始化值*/
voi d ad_init (void){
INTCON=0X00;
ADIF=0X00;
ADCON1=0B10000100;/*AN0、AN1、AN3*/
ADCON0=0X81; /*十位结果必须高为8位*/
TRISA=0X0FF;/*默认为AD输入*/
PORTA=0X00;
ADON=1;
}
unsigned
int read_ADresult
(unsigned char channel){/*通道转换*/

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引脚为输出,
没有用上引脚设为输入
*/
TRISA5=1;/* SS为输入*/
SSPSTAT=0b00000000;/* 在结束时采样,在上升沿数据移位*/
SSPCON=0b00110100;/* SSPEN=1;CKP=1 , FOSC/64,从方式*/
}

unsigned char
RX_DATA()
{
unsigned char BUFF;
do
{
;
}while(SSPIF==0);/*等待发送完毕*/
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);
}

}



评论


技术专区

关闭