欢迎来到天天文库
浏览记录
ID:18745583
大小:311.50 KB
页数:14页
时间:2018-09-22
《基于51单片机的spi总线》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、基于51单片机的SPI总线基于51单片机的SPI总线单片机与其它芯片或设备之间的数据传输在单片机的应用中具有重要的地位,单片机本身的数据传输接口过去主要为8位并行数据接口或异步串行通信接口,但电子技术的迅速发展使得许多新的数据传输接口标准不断涌现,大多数的51单片机并没有在硬件中集成这些新的数据传输接口。SPI(SerialPeripheralInterface)总线是由Motorola公司提出的一种同步串行外围接口,采用三或四根信号线。51单片机一般并没有在硬件中集成这种新的接口,所以要用软件来进行模
2、拟。1硬件设计DS1302是涓流充电时钟芯片,内含有一个实时时钟/日历和31字节静态RAM,实时时钟/日历电路提供秒、分、时、日、星期、月、年的信息,每月的天数和闰年的天数可自动调整,时钟操作可通过AM/PM指示决定采用24或12小时格式。DS1302与单片机之间能简单地采用SPI同步串行的方式进行通信,仅需用到三根信号线:RES(复位),I/O(数据线),SCLK(同步串行时钟)。通过1602LCD显示日期和时间,其电路如下所示。在桌面上双击图标,打开ISIS7Professional窗口(本人使用的
3、是v7.4SP3中文版)。单击菜单命令“文件”→“新建设计”,选择DEFAULT模板,保存文件名为“SPI.DSN”。在器件选择按钮中单击“P”按钮,或执行菜单命令“库”→“拾取元件/符号”,添加如下表所示的元件。51单片机AT89C51一片晶体CRYSTAL12MHz一只瓷片电容CAP22pF二只电解电容CAP-ELEC10uF一只电阻RES10K一只排阻RESPAC-810K一只1602液晶显示器LM016L一只晶体CRYSTAL32.768KHz一只时钟芯片DS1302一片电池BATTERY3V一
4、只若用Proteus软件进行仿真,则上图中的两只晶体、U1的复位电路和U1的31脚以及电池都可以不画,它们大都是默认的。在ISIS原理图编辑窗口中放置元件,再单击工具箱中元件终端图标,在对象选择器中单击POWER或GROUND放置电源或地。放置好元件后,布好线。左键双击各元件,设置相应元件参数,完成电路图的设计。2软件设计采用AT89C51以及日历芯片DS1302和1602LCD组成时钟的流程图如下所示。本例主要目的是如何用软件模拟SPI总线对DS1302进行读、写,其详细详细C51程序如下。//实例:
5、基于DS1302的日历时钟#include//包含单片机寄存器的头文件#include//包含_nop_()函数定义的头文件/*********************************以下是DS1302芯片的操作程序**********************************/unsignedcharcodedigit[10]={"0123456789"};//定义字符数组显示数字sbitDATA="P1"^1;//位定义1302的数据输出端定义在
6、P1.1引脚sbitRST="P1"^2;//位定义1302的复位端口定义在P1.2引脚sbitSCLK="P1"^0;//位定义1302的时钟输出端口定义在P1.0引脚/*****************************函数功能:延时若干微秒入口参数:n******************************/voiddelaynus(unsignedcharn){unsignedchari;for(i=0;i7、****函数功能:向1302写一个字节数据入口参数:dat***********************************/voidWrite1302(unsignedchardat){unsignedchari;SCLK=0;//拉低SCLK,为脉冲上升沿写入数据做好准备delaynus(2);//稍微等待,使硬件做好准备for(i=0;i<8;i++)//连续写8个二进制位数据{DATA=dat&0x01;//取出dat的第0位数据写入1302delaynus(2);//稍微等待,使硬件做好准8、备SCLK=1;//上升沿写入数据delaynus(2);//稍微等待,使硬件做好准备SCLK=0;//重新拉低SCLK,形成脉冲dat>>=1;//将dat的各数据位右移1位,准备写入下一个数据位}}/***********************************************函数功能:根据命令字,向1302写一个字节数据入口参数:Cmd,储存命令字;dat,储存待写的数据************************
7、****函数功能:向1302写一个字节数据入口参数:dat***********************************/voidWrite1302(unsignedchardat){unsignedchari;SCLK=0;//拉低SCLK,为脉冲上升沿写入数据做好准备delaynus(2);//稍微等待,使硬件做好准备for(i=0;i<8;i++)//连续写8个二进制位数据{DATA=dat&0x01;//取出dat的第0位数据写入1302delaynus(2);//稍微等待,使硬件做好准
8、备SCLK=1;//上升沿写入数据delaynus(2);//稍微等待,使硬件做好准备SCLK=0;//重新拉低SCLK,形成脉冲dat>>=1;//将dat的各数据位右移1位,准备写入下一个数据位}}/***********************************************函数功能:根据命令字,向1302写一个字节数据入口参数:Cmd,储存命令字;dat,储存待写的数据************************
此文档下载收益归作者所有