android spi串口调试,PIC入门3,SPI通信和串口调试实验

原标题:PIC入门3,SPI通信和串口调试实验

MSSP模块工作于SPI主控方式,这个可以直接在实验板上执行。

程序:

//适合3EPIC实验板,配置PIC的MSSP模块工作于SPI主控方式下,

//通过一个并/串行转换(74HC165)将接收的并行数据通过SD0口送出的串行数据,

//PIC将串行数据存入寄存器,送给D口,驱动亮。

#include

#include

volatile unsigned char data;

/*************************************************************************/

/*函数名:SPIINT() */

/*功能:SPI初始化 */

/*************************************************************************/

void SPIINIT()

{

PIR1=0;

SSPCON=0x30; /*SSPEN=1;CKP=1;FOSC/4 */

SSPSTAT=0xC0;

TRISC=0x10; //SDO引脚为输入,SCK引脚为输出

}

/*************************************************************************/

/*函数名:initial() */

/*功能: 系统各输入输出口初始化 */

/*************************************************************************/

void initial()

{

TRISE=0x00; //控制PL口

TRISD=0x00; /*接LED的D口为输出*/

INTCON=0x00; //关闭所有中断

}

/*************************************************************************/

/*函数名:SPIN() */

/*功能: SPI接收子程序 */

/*************************************************************************/

void SPIN()

{

RE1=0; //PL低,并行数据置入

RE1=1; //PL高,并行数据读出

SSPBUF=0; //启动SPI,此操作只用予清楚SSPSTAT的BF位,因此W中的实际数据无关重要

do

{

;

}while(SSPIF==0); //等待发送完毕

SSPIF=0; //清除SSPIF标志

data=SSPBUF;

}

/*************************************************************************/

/*函数名:SPIOUT() */

/*功能: 把SPI接收的数据通过D口显示在8个发光二级管上 */

/*************************************************************************/

void SPIOUT(int data)

{

PORTD=~data;

}

/*************************************************************************/

/*函数名:main() */

/*功能: 主函数 */

/*************************************************************************/

main()

{

initial(); //系统初始化

RE0=1; //LED使能端

SPIINIT(); //SPI初始化

while (1)

{

SPIN(); //SPI接收外部数据

SPIOUT(data); //送出数据显示

}

}

这个要另外接74HC,但是在运行的时候是74HC595的快动作(速射),所以没有从1显示到结尾,直接显示结尾的数字,慢动作一直没有调出来。

程序:

//适合3ePIC开发板,在SPI模式下实现数码管的显示

//下行器件是用74HC595(8位串转并寄存器)实验

#include

#include

static volatile int table[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0X77,0X7C,0X39,0X5E,0X79,0X71};

volatile unsigned char data;

#define PORTAIT(adr,bit) ((unsigned)(&adr)*8+(bit)) //*绝对寻址位操作指令*/

static bit PORTA_5 @ PORTAIT(PORTA,5);

/*************************************************************************/

/*函数名:SPIINT() */

/*功能:SPIi初始化 */

/*************************************************************************/

void SPIINIT()

{

PIR1=0;

SSPCON=0x30; /*允许SPI工作在主控方式下,SSPEN=1;CKP=1 ,*/

/* FOSC/4 */

SSPSTAT=0xC0;

TRISC=0x00; /* SDO引脚为输出,SCK引脚为输出*/

}

/*************************************************************************/

/*函数名:initial() */

/*功能: 系统各输入输出口初始化 */

/*************************************************************************/

void initial()

{

TRISA=0x00; //A口设置为输出

TRISB=0x00;

INTCON=0x00; //关闭所有中断

// LACK送低电平,为锁存做准备

}

/****************************************************************************/

/*函数名:SPILED() */

/*功能:SPI发送数据 */

/****************************************************************************/

void SPILED(int data)

{

SSPBUF=data; //启动发送

do

{

;

}while(SSPIF==0); //等待发送完毕

SSPIF=0; //清除SSPIF标志

}

void DELAY()

{

unsigned int j;

for(j=0;j<50000;j++)

continue;

}

/***************************************************************************/

/*函数名:main() */

/*功能:主程序 */

/***************************************************************************/

main()

{

unsigned int i;

initial(); //系统初始化

RB2=0;

SPIINIT(); //SPI初始化

for(i=0;i<8;i++) //连续发送8个数据

{

data=table[i]; //通过数组的转换获得待显示的段码

SPILED(data); //发送显示段码显示*/

}

PORTA_5=0;

DELAY();

PORTA_5=1; //最后给锁存信号,代表显示任务完成

}

实验:

实验程序:

//实验目的:熟悉USART通信

//通过“串口调试助手”协助工作

//串口调试助手发送数据给877,877收到后再转发回串口助手

//硬件要求:拨码开关S7全置ON,其他拨码开关置OFF

#include //包含单片机内部资源预定义

__CONFIG(0x1832);

//芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡

//---------------------------------------------

//主程序

void main()

{

TRISC=0XFF; //设置C口方向全为输出

SPBRG=0XC; //设置波特率为19200BPS

TXSTA=0X24; //使能串口发送,选择高速波特率

RCSTA=0X90; //使能串口工作,连续接收

RCIE=0X1; //使能接收中断

GIE=0X1; //开放全局中断

PEIE=0X1; //使能外部中断

while(1) //等待中断

{;}

}

//--------------------------------------------

//中断函数

void usart(void)

{

if(RCIE&&RCIF) //判断是否为串口接收中断

{

TXREG=RCREG; //把接收到的数据发送回去

}

}

责任编辑:

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值