您的位置 首页 发布

单片机用Mssp_spi模块三点通讯

效果如下:右边作为从机单片机进行AD采样,然后将数据发送到左主单片机,它将数据送往74LS164,再送到显示终端程序如下:/**host.c/#incl…

作用如下:右边作为从机单片机进行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*/

#include
#ifndef _XTAL_FREQ
#define _XTAL_FREQ 4000000
#endif
/*
SPI主动按全双工方法运转,
也就发送一个信息时必接纳一个信号,
这是否是从机发来的信号不得而知。
因而我界说了一个协议:/主机发送0X00作为操控指令,
以操控从机何时收集信号;
主机接纳从机信号时,随同
发送0X0FF,从机收到不做处理/
这是单一主机、双机的三点通讯,
74LS164吸电流大于拉电流,数码管接成上拉方法
这是主机程序
C0C1为从机和从器材选中操控信号
*/
unsigned int TEMP=0;/*寄存AD初始化值*/
void 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);
}

}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/fabu/252396.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部