51和pic单片机都能用的spi bus程序

发布者:美好的人生最新更新时间:2015-07-10 来源: 51hei关键字:单片机  spi  bus程序 手机看文章 扫描二维码
随时随地手机看文章
#define mcu_51 //单片机选择
/*pic18->mcu_pic_18  avr->mcu_avr  
/*******************************/
#define _CPOL     0 //模式配置
#define _CPHA     0 //模式配置
/*******************************/
#ifdef mcu_51
#include "REG51.h"
#define SCK_IO(x)  (0?(P1&=0XFE):(P1|=0X01))//1->输出  0->输入
#define MOSI_IO(x) (0?(P1&=0XFD):(P1|=0X02))
#define MISO_IO(x) (0?(P1&=0XFB):(P1|=0X04))
#define SSEL_IO(x) (0?(P1&=0XF7):(P1|=0X08))
#define SCK_D(x)  (x?(P1|=0X01):(P1&=0XFE))
#define MOSI_D(x) (x?(P1|=0X02):(P1&=0XFD))
#define SSEL_D(X) (X?(P1|=0X08):(P1&=0XF7))
#define MISO_I()  (P1&0X04)  
#endif

#ifdef mcu_pic_18
#include "PIC18.h"
#define SCK_IO(x)  (x?(TRISA&=0XFE):(TRISA|=0X01))//1->输出  0->输入
#define MOSI_IO(x) (x?(TRISA&=0XFD):(TRISA|=0X02))
#define MISO_IO(x) (x?(TRISA&=0XFB):(TRISA|=0X04))
#define SSEL_IO(x) (x?(TRISA&=0XF7):(TRISA|=0X08))
#define SCK_D(x)  (x?(LATA|=0X01):(LATA&=0XFE))
#define MOSI_D(x) (x?(LATA|=0X02):(LATA&=0XFD))
#define SSEL_D(X) (X?(LATA|=0X08):(LATA&=0XF7))
#define MISO_I()  (PORTA&0X04)  
#endif
#ifdef mcu_avr
#include "iom8535v.h"
#define SCK_IO(x)  (x?(DDRA|=0X01):(DDRA&=0XFE))//1->输出  0->输入
#define MOSI_IO(x) (x?(DDRA|=0X02):(DDRA&=0XFD))
#define MISO_IO(x) (x?(DDRA|=0X04):(DDRA&=0XFB))
#define SSEL_IO(x) (x?(DDRA|=0X08):(DDRA&=0XF7))
#define SCK_D(x)  (x?(PORTA|=0X01):(PORTA&=0XFE))
#define MOSI_D(x) (x?(PORTA|=0X02):(PORTA&=0XFD))
#define SSEL_D(X) (X?(PORTA|=0X08):(PORTA&=0XF7))
#define MISO_I()  (PINA&0X04)  
#endif
extern void SPI_Init(void);
extern unsigned char SPI_Send_Dat(unsigned char dat);
extern void delay(unsigned char ms );



void delay(unsigned char ms )
{
 unsigned char m;
    while(ms--)
    for(m=0;m<100;m++);
}
/************************************************
        端口方向配置  与输出初始化
************************************************/
void SPI_Init(void)
{
SCK_IO(1)   ;  
MOSI_IO(1)  ; 
MISO_IO(0)  ;  
SSEL_IO(1)  ;
SSEL_D(1);
MOSI_D(1);
#if _CPOL==0
SCK_D(0);
#else
SCK_D(1);
#endif
}
/**********************************************
模式零           
***********************************************/
#if _CPOL==0&&_CPHA==0          //MODE   0  0    
unsigned char SPI_Send_Dat(unsigned char dat)
{
//第一数据sck上升之前 其他下降沿  数据采样 上升沿 
 unsigned char n,rx_dat;
 for(n=0;n<8;n++)
 {
  SCK_D(0);//下降沿
  if(dat&0x80)MOSI_D(1);
  else MOSI_D(0);
  dat<<=1;
  SCK_D(1); //上升沿 
  rx_dat<<=1;
  if(MISO_I())rx_dat|=0x01;
  else rx_dat&=0xfe;
 }
  SCK_D(0);
return rx_dat;
}
#endif
/**********************************************
模式二          
***********************************************/
#if _CPOL==1&&_CPHA==0           //MODE   1  0
unsigned char SPI_Send_Dat(unsigned char dat)
{
//第一数据sck下降沿之前 其他上升沿  数据采样 下降沿 
 unsigned char n,rx_dat;
 for(n=0;n<8;n++)
 {
  SCK_D(1);
  if(dat&0x80)MOSI_D(1);
  else MOSI_D(0);
  dat<<=1;
  SCK_D(0);
  rx_dat<<=1;
  if(MISO_I())rx_dat|=0x01;
  else rx_dat&=0xfe;
 }
  SCK_D(1);
 return rx_dat;
}
#endif
/*********************************************
模式一       
*********************************************/
#if _CPOL==0&&_CPHA==1           //MODE  0  1
unsigned char SPI_Send_Dat(unsigned char dat)
{
//第一数据sck上升 其他上升沿  数据采样 下降沿 
 unsigned char n,rx_dat;
 SCK_D(0);
 for(n=0;n<8;n++)
 {
  SCK_D(1);
  if(dat&0x80)MOSI_D(1);
  else MOSI_D(0);
  dat<<=1;
  SCK_D(0);
  rx_dat<<=1;
  if(MISO_I())rx_dat|=0x01;
  else rx_dat&=0xfe;
 }
return  rx_dat;
}
#endif 
///////////////////////////////////////////////////////
///////////////////////////////////////////////////////
#if _CPOL==1&&_CPHA==1            //MODE  1  1
unsigned char SPI_Send_Dat(unsigned char dat)
{
//第一数据下降沿  其他下降沿   数据采样 上升沿 
 unsigned char n,rx_dat;
 SCK_D(1);
 for(n=0;n<8;n++)
 {
  SCK_D(0);
  if(dat&0x80)MOSI_D(1);
  else MOSI_D(0);
  dat<<=1;
  SCK_D(1);
  rx_dat<<=1;
  if(MISO_I())rx_dat|=0x01;
  else rx_dat&=0xfe;
 }
 return rx_dat;
}
/*************************************
*************************************/
/*int main(void)
{
//DDRB=0Xff;
SPI_Init();
while(1)
{
SSEL_D(0);
P2=SPI_Send_Dat(0xaa);
SSEL_D(1);
//delay(100);
}
return 0;
} */
关键字:单片机  spi  bus程序 引用地址:51和pic单片机都能用的spi bus程序

上一篇:51单片机电子时钟
下一篇:经典单片机C51多任务代码(改进版)

推荐阅读最新更新时间:2024-03-16 14:24

用PC104控制模块和C51单片机实现AD检测板
  由PC104控制模块和Cgnal C8051F06x单片机组成的控制检测板可用于高端检测设备中,充分利用PC104控制模块和单片机丰富的软硬件资源,可用于各种检测应用中。   在开发检测设备的过程中,可采用核心板加底板的设计方法来降低技术难度,实现可编程、高性能、开发简单、扩展性强的设计方案,并且稍加改动就可以很容易地应用到其他领域。   核心板采用PC104控制模块,利用其强大的处理能力来处理数据,如数据存储、数据分析、数据评估,尤其是友好的GUI简化了用户的使用难度。底板采用Cgnal8051F06x、双口RAM和缓冲寄存器,利用C8051F06X单片机丰富的软硬件资源来实现可编程,可设置的各种复杂功能。核心板与底板之
[测试测量]
芯旺微电子:自主处理器架构实现最大的竞争差异化
如果用简单一句话来介绍芯旺微电子的差异化,那就是:“自主IP KungFu内核处理器架构,打造高端芯片从内核设计、工具开发到开发环境全新生态圈。” 2021年3月,芯旺微宣布完成B轮融资。资金将主要用于车规芯片的研发,包括满足ASIL-D等级应用于汽车发动机和域控制器的多核MCU产品,以及射频、以太网和总线类车规产品,芯旺微电子致力成为汽车领域多方位的数字和模拟芯片供应商,同时布局汽车软件生态的建设。 日前,在慕尼黑上海电子展商,芯旺微FAE经理卢恒洋介绍了芯旺微的车规级MCU发展历程,以及自主KungFu内核处理器的优势,据悉目前芯旺微车规级MCU已覆盖智能座舱、车身控制、汽车电源与电机和汽车照明领域。 芯旺微FA
[单片机]
芯旺微电子:自主处理器架构实现最大的竞争差异化
提高单片机抗干扰的设计
  做过产品的朋友都有体会,一个设计看似简单,硬件设计和代码编写很快就搞定,但在调试过程中却或多或少的意外,这些都是抗干扰能力不够的体现。   下面讨论一下如何让你的设计避免走弯路:   抗干扰体现在2个方面,一是硬件设计上,二是软件编写上。   这里重点提醒:在MCU设计中主要抗干扰设计是在硬件上,软件为辅。因为MCU的计算能力有限,所以要在硬件上花大工夫。   干扰的途径:   1:干扰信号干扰MCU的主要路径是通过I/O口,一是影响了MCU的数据采集,二是影响内部其它寄存器。   解决方法:后面讨论。   2:电源干扰:MCU虽然适应电压较宽(3-5。5V),但对于电源的波动却很敏感,比如说MCU可以在3V电压下稳
[单片机]
51单片机和52单片机区别是什么?51仿真器有必要买吗?
我们在开发单片机程序的时候,经常会碰到编译没有错误,程序代码反复的检查,但就是找不到问题所在,不知道问题到底出现在哪里了? 这个时候的心情就会特别烦躁,单片机程序代码就是字母加数字,有点抽象,所以很多的程序代码我们都在在芯片原厂提供技术资料上开发的, 如果单片机程序一旦出现一些比较抽象的问题,又找不出问题,那是一件非常苦恼的事情。 碰到这些问题,我们该怎么去处理。 ①通过LED的闪烁效果来锁定问题,怀疑那里有问题就在哪里实现LED的效果 ②通过串口打印来查找问题,这个是我在51单片机程序开发过程中使用最多的调试方法 ③通过单片机硬件仿真来处理 虽然找问题有很多种办法,但我们不得不认可,单片机硬件仿真是效率最高的,而且使用起来是非常
[单片机]
MCU发展解读:变与不变的哲学
MCU或许是最让原厂“愁肠百结”而又“欲罢不能”的IC产品了。一方面,MCU市场稳步增长,应用不断拓宽,吸引老将新兵不断征战。就拿中国市场来看,据IHS研究显示,2013年到2017年其年复合增长率将达到7.7%,从31亿美元增长至45亿美元。另一方面,ARM架构成席卷之势,多家大厂已经放弃专有核而投入ARM怀抱,“百家争鸣、一花独放”可描述目前的MCU市场。MCU原厂不仅要着力寻求差异化,着力提供包括开发工具在内的完整解决方案,而且随着MCU价格的“直落式”下行,如何保证合理的利润也是厂商的“心结”。无论如何,既然选择了这条路,就要承受所有的崎岖和变数:不变的是核,变的是如何集成、如何差异化、如何未雨绸缪。 集成考验持续
[单片机]
AVR单片机的RTOS-AVRX应用
引 言   随着技术的发展,嵌入式系统的设计及应用对人们的生活产生了很大的影响,并将逐渐改变人们未来的生活方式。在特定的操作系统上开发应用程序,可以使开发人员忽略掉很多底层硬件细节,使得应用程序调试更方便、易于维护、开发周期缩短并且降低开发成本,因而嵌入式操作系统深得开发人员的青睐。   AVR微处理器是Atmel公司开发的8位嵌入式RISC处理器,它具有高性能、高保密性、低功耗、非易失性等优点,而且程序存储器和数据存储器可独立编址,并具有独立访问的哈佛结构。AVR单片机内核有丰富的指令集,通过32个通用寄存器直接与逻辑运算单元相连接,允许在一个周期内一条单一指令访问两个独立的寄存器,这样的结构使代码的执行效率比传统的复杂指令集
[单片机]
基于51单片机的超声波测距系统设计
功能: 超声波测距仪,测量距离,用LCD12864显示信息。 lcd_writestr(0,0, 超声波测距仪 ); lcd_writestr(1,0, ******** ); lcd_writestr(2,0, 当前被测距离为: ); lcd_writestr(3,0, 厘米 ); 程序运行图: 原理图: 部分程序: /***************************************************** * 功能:超声波测距 ******************************************************/ #include reg52.h #include
[单片机]
80c51单片机的基本配置有哪些 80c51单片机各个引脚及功能
  80c51单片机的基本配置有哪些   80C51单片机的基本配置包括:   CPU:80C51单片机的CPU由一个8位的ALU(算术逻辑单元)、一个8位的累加器、一个8位的B寄存器、一个16位的程序计数器和一个8位的状态寄存器组成。   存储器:80C51单片机的存储器包括程序存储器(ROM)、数据存储器(RAM)和特殊功能寄存器(SFR)。   时钟源:80C51单片机支持多种时钟源,包括外部晶体、外部时钟信号、内部振荡器等。   中断系统:80C51单片机支持多种中断源和中断优先级设置,可以灵活处理各种外部事件。   IO端口:80C51单片机的IO端口由多个可编程的输入输出引脚组成,可以连接各种外部设备。   通信接口:
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved