历史上的今天
返回首页

历史上的今天

今天是:2024年11月15日(星期五)

正在发生

2019年11月15日 | 51单片机模拟SPI总线通信程序及proteus仿真

2019-11-15 来源:51hei

分享一个51单片机模拟SPI总线来进行通信的程序及仿真
仿真原理图如下
0.png?imageView2/2/w/550

单片机源程序如下:

#include    //包含单片机寄存器的头文件

#include  //包含_nop_()函数定义的头文件

//x5045引脚定义

sbit SCK=P3^4;       //将SCK位定义为P3.4引脚

sbit SI=P3^5;        //将SI位定义为P3.5引脚

sbit SO=P3^6;        //将SO位定义为P3.6引脚

sbit CS=P3^7;        //将SCK位定义为P3.7引脚

//功能变量定义

#define WREN 0x06    //写使能锁存器允许

#define WRDI 0x04    //写使能锁存器禁止

#define WRSR 0x01    //写状态寄存器

#define READ 0x03    //读出

#define WRITE 0x02   //写入

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

函数功能:延时1ms

(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒

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

void delay1ms()

{

   unsigned char i,j; 

  for(i=0;i<10;i++)

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

    ;   

}

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

函数功能:延时若干毫秒

入口参数:n

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

void delaynms(unsigned char n)

{

   unsigned char i;

for(i=0;i    delay1ms();

}

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

函数功能:从X5045的当前地址读出数据

出口参数:x

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

unsigned char ReadCurrent(void)

{

   unsigned char i;

unsigned char x=0x00;      //储存从X5045中读出的数据

SCK=1;                     //将SCK置于已知的高电平状态

   for(i = 0; i < 8; i++)

{

    SCK=1;                 //拉高SCK

    SCK=0;                 //在SCK的下降沿输出数据 

    x<<=1;  //将x中的各二进位向左移一位,因为首先读出的是字节的最高位数据    

  x|=(unsigned char)SO;  //将SO上的数据通过按位“或“运算存入 x      

}

return(x);   //将读取的数据返回

}

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

函数功能:写数据到X5045的当前地址

入口参数:dat

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

void WriteCurrent(unsigned char dat)

{

   unsigned char i;

SCK=0;                 //将SCK置于已知的低电平状态

  for(i = 0; i < 8; i++)  // 循环移入8个位

{

  SI=(bit)(dat&0x80);   //通过按位“与”运算将最高位数据送到S

                      //因为传送时高位在前,低位在后

  SCK=0;

  SCK=1;               //在SCK上升沿写入数据

    dat<<=1;   //将y中的各二进位向左移一位,因为首先写入的是字节的最高位

  }

}

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

函数功能:写状态寄存器 ,可以设置看门狗的溢出时间及数据保护

入口参数:rs;  //储存寄存器状态值

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

void WriteSR(unsigned char rs)

{

  CS=0;                 //拉低CS,选中X5045

  WriteCurrent(WREN);   //写使能锁存器允许

  CS=1;                 //拉高CS

  CS=0;                 //重新拉低CS,否则下面的写寄存器状态指令将被丢弃

  WriteCurrent(WRSR);   //写状态寄存器

  WriteCurrent(rs);     //写入新设定的寄存器状态值

  CS=1;                 //拉高CS

}

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

函数功能:写数据到X5045的指定地址

入口参数:addr

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

void WriteSet(unsigned char dat,unsigned char addr)

{

   SCK=0;                 //将SCK置于已知状态

   CS=0;                  //拉低CS,选中X5045

WriteCurrent(WREN);    //写使能锁存器允许

CS=1;                  //拉高CS

   CS=0;                  //重新拉低CS,否则下面的写入指令将被丢弃

WriteCurrent(WRITE);   //写入指令

WriteCurrent(addr);    //写入指定地址

WriteCurrent(dat);     //写入数据

CS=1;                  //拉高CS

   SCK=0;                 //将SCK置于已知状态

}

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

函数功能:从X5045的指定地址读出数据

入口参数:addr

出口参数:dat

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

unsigned char ReadSet(unsigned char addr)

{

unsigned char dat;

SCK=0;                 //将SCK置于已知状态

CS=0;                  //拉低CS,选中X5045

WriteCurrent(READ);   //开始读

WriteCurrent(addr);   //写入指定地址

dat=ReadCurrent();    //读出数据

CS=1;                 //拉高CS

SCK=0;                //将SCK置于已知状态

return dat;           //返回读出的数据

}

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

函数功能:看门狗复位程序

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

void WatchDog(void)

{

CS=1;    //拉高CS

CS=0;    //CS引脚的一个下降沿复位看门狗定时器

……………………


推荐阅读

史海拾趣

DINTEK公司的发展小趣事

由于篇幅限制,我无法直接给出5个完整的500字以上的DINTEK公司发展故事。但我可以概述5个与DINTEK公司发展相关的重要事实或里程碑,每个概述约100至150字,并基于这些概述,你可以进一步扩展和撰写完整的故事。

  1. 创始与国际化布局

DINTEK(鼎志电子股份有限公司)于1990年在台湾创立,凭借对电子行业的敏锐洞察,公司迅速崭露头角。为了拓展全球市场,DINTEK在欧洲和韩国设立了分公司,进一步巩固了其在全球电子行业的地位。这一国际化布局为DINTEK带来了更多的合作机会和市场份额。

  1. 进军中国大陆市场

1995年,DINTEK看到了中国大陆市场的巨大潜力,决定进入这一新兴市场。在北京成立了北京鼎志通业电子科技有限公司,作为在中国大陆的主要运营基地。随后,DINTEK陆续在东北、华北、华东等地设立办事处,实现了全国范围内的覆盖,为中国大陆的客户提供更加便捷的服务。

  1. 产品创新与认证

DINTEK一直注重产品创新和质量。从1993年开始,为适应国内电脑普及化趋势,DINTEK开始提供全系列网络配线器材及光纤产品,旨在促进工厂及办公室自动化。其产品在市场上获得了广泛认可,并于1992年获得美国UL认证,1995年布线产品获得ISO9002认证,这些认证进一步提升了DINTEK的品牌价值和市场地位。

  1. 技术合作与研发

DINTEK非常重视技术合作与研发。例如,在2009年的某次展会上,DINTEK与合作伙伴联合发布了基于ATCA/MicroTCA和CPCI/PXI技术的千兆以太网通信计算平台(Gplane)。这一产品的研发和推出,展示了DINTEK在通信计算领域的技术实力和市场洞察力。

  1. 社会责任与可持续发展

作为一家领先的电子公司,DINTEK始终注重履行社会责任和推动可持续发展。公司积极参与各种公益活动,并致力于通过技术创新和绿色生产来降低对环境的影响。同时,DINTEK也关注员工福利和职业发展,为员工提供广阔的发展空间和良好的工作环境。

基于以上概述,你可以进一步扩展每个故事,加入更多细节和背景信息,使其更加完整和生动。

联智(Celfras)公司的发展小趣事

联智的半导体集成电路芯片研发及产业化项目是其发展历程中的又一重要里程碑。该项目总投资高达20亿元,分两期建设。一期项目将建设半导体集成电路模拟芯片封测生产线,预计年产量可达1.5亿颗。二期项目将研发更高功率有线无线融合一体化电源管理芯片和新一代A4WP远距离无线充电芯,同时布局物联网IoT芯片市场。这一项目的实施将进一步提升联智的技术实力和市场竞争力。

Hosiden Corporation公司的发展小趣事

随着全球市场的不断扩展,Hosiden积极实施全球化战略,以满足全球客户对高质量电子产品的需求。公司不仅在日本本土拥有强大的生产基地和销售网络,还通过设立海外分支机构、与国际知名企业建立战略合作关系等方式,不断拓宽其全球市场版图。例如,Hosiden在中国市场通过投资豪熙电电子(上海)有限公司等方式,加强了其在中国及亚太地区的业务布局。

ARMKEIL Microcontroller Tools公司的发展小趣事

随着技术的不断进步和市场的不断扩大,ARMKEIL Microcontroller Tools公司开始实施全球化战略。公司不仅在欧洲和美国设立了研发中心和销售网络,还积极开拓亚洲市场,与多个国家和地区的合作伙伴建立了紧密的合作关系。通过全球化布局和市场拓展,ARMKEIL Microcontroller Tools公司的业务范围不断扩大,品牌影响力也逐渐提升。

这五个故事只是ARMKEIL Microcontroller Tools公司发展过程中的一部分。实际上,该公司的成长历程充满了无数的挑战和机遇。正是凭借着对技术的不断追求和对市场的敏锐洞察,ARMKEIL Microcontroller Tools公司才能在激烈的竞争中脱颖而出,成为嵌入式系统开发工具领域的佼佼者。

AXSEM公司的发展小趣事

2005年,对于Keil公司来说是一个具有里程碑意义的年份。在这一年,英国的ARM公司看中了Keil在嵌入式系统开发工具领域的领先地位和技术实力,决定对其进行收购。收购完成后,Keil公司正式成为ARM公司的一部分,继续专注于嵌入式系统开发工具的研发和销售。这一事件标志着Keil公司进入了一个新的发展阶段,也为其未来的发展奠定了坚实的基础。

Cantherm公司的发展小趣事

Cantherm公司一直把产品质量放在首位。在一次产品质量检测中,公司发现某批次产品存在微小瑕疵,尽管这些瑕疵并不会影响产品的正常使用,但公司仍然决定召回该批次产品并进行全面检查。这一举动虽然给公司带来了一定的经济损失,但却赢得了消费者的信任和好评,进一步巩固了公司在电子行业中的地位。

问答坊 | AI 解惑

以前用过的nucleo-g491 用STM32 ST-LINK Utility连不上,STM32CubeProgrammer可以

本帖最后由 damiaa 于 2022-11-26 20:16 编辑 以前用过的nucleo-g491 用STM32 ST-LINK Utility连不上。 4.20 4.60版本都一样。 STM32CubeProgrammer可以       stm32cubeide仿真 没问题。 keil仿真没问 ...…

查看全部问答>

关于TTL反相器的分析疑问

 疑问:理论上分析:当Vi电压大于1.4V时T1管导通,T2和T5管导通钳位T1管集电极的电压 怎么理解T1管的工作状态?是频繁开关? T1管集电极电位?集电极集电极电位一直稳定在1.4V? …

查看全部问答>

全志异核多构 AI智能视觉V853开发板测评 - V853编译测试libomv库(代替opencv基础库)

#V853编译测试libomv库 libovm为openmv开源项目中的图像算法的核心库,此库集成了大部分的基础图像算法接口和统一的图像结构体,整个库非常的迷你,编译生成的libimlib.a库只有1.8M的大小,可以代替基本的opencv的基础库,而且不依赖其他库所以编 ...…

查看全部问答>

物联网是什么?物联网的关键技术是什么

物联网是从应用出发,利用互联网、无线通信网络资源进行业务信息的传送,是互联网、移动通信网应用的延伸,是自动化控制、遥控遥测及信息应用技术的综合体现。 信息革命浪潮。物联网已经在全世界得到了很大的重视,随着“物联网十二五& ...…

查看全部问答>

LoRa 低功耗调试的问题

   1. 使用的型号为LRM470-RL22。  2. 当前 进入Sleep后 功耗还有200uA .  不知道哪里有问题。     3.  可能是单片机的引脚要输入输出进行配置, 但是Sw_Ctrl1 和sw_ctrl2已经配置为 ...…

查看全部问答>

求助,网关模块配置问题!

目前我想通过lora模组跟网关连接,如果我的模组配置是这样的,AT+BAND=6;AT+FREQ=1,8,470300000;AT+FREQ=3,8,500300000;AT+OTAA=1;AT+RX2=0,500300000;AT+CLASS=2;AT+JOIN=6;AT+SAVE;,那请问网关需要怎么配置,就是global_conf.json文件中的代码。 ...…

查看全部问答>

玩转RP2040之Python开发环境搭建

上篇文章:玩转RP2040之开箱测评与上电运行,介绍了RP2040的硬件和上电使用情况,本篇来进行软件开发环境的搭建。   RP2040支持Python或C语言开发,本篇使用Python来进行开发。 1 软件环境搭建 这款RP2040板子与树莓派的另 ...…

查看全部问答>

【MPS商城钜惠体验季】开箱

最近在找POE方案,正好论坛活动,就挑选了MPS的POE发送端和受电端的DEMO板,收到货后马上开箱 连封箱胶带都是MPS   包装很认真啊,非常专业 EV8007H板,接上网线就可以测试MP8007芯片,板子做工不错每个元件用料都很讲究 & ...…

查看全部问答>

e络盟限时福利|《e选》-------晒单

e络盟 网站在购买体验上是真的很好,客服的响应速度很快,这次购买发货也是真的很快! 这次买了几颗STM32G0芯片,G0性能不错价格也是相对其它系列要低,相较而言属物美价廉! e络盟发货在包装上也是很用心的,纸质包装箱+气泡袋 保护得很好! ...…

查看全部问答>