51单片机总线时序
- 格式:docx
- 大小:17.14 KB
- 文档页数:6
51单片机软件模拟I2C时序,进行掉电保护数据在数码管上按顺序显示数据0—f(十六进制)模拟断电-切断单片机电源复位后接着断电前数据显示#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit sda=P2^0;sbit scl=P2^1;uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39 ,0x5e,0x79,0x71} ;uchar num,sec,panju;//由定时器进行计数,计时,以数组的形式显示于数码管每隔1S读一次AT24C16中的数据//-------------------------------定时器0进行精确的计时,由AT24C16进行掉电保护----------------------------------//void delay(){;;}void init_timer0()//定时器初始化{TMOD=0X01;//工作方式1,GATE=0,C/~T=0,M0=0,M1=1;TH0=15536/256;//求模TL0=15536%256;//求余装入初值EA=1;ET0=1;//中断允许寄存器TR0=1;//TCON寄存器}//------------------------------------------------------------------------------------------------------------//void init_AT()//EEPROM器件初始化释放总线{scl=0;delay();//微秒延时sda=1;delay();scl=1;delay();}//----------------------------------------------------------------------------------------------------------//void start() //起始信号{scl=0;delay();sda=1;delay();scl=1;delay();sda=0;delay();sda=1;//释放数据总线//--------------------------------------------------------------------------------------------------------//void write_byte(uchar date)//字节写{uchar s,temp;//局部变量temp=date;//由高位一位一位的写入for(s=0;s<8;s++){temp=temp<<1;//左移溢出到PSW寄存器CY位scl=0;//允许sda进行的变化delay();sda=CY;//进行一位一位的送入数据总线delay();scl=1;//符合读走数据总线上数据的要求delay();//稳定一段时间}scl=0;//允许sda变化,以便于接受应答信号delay();sda=1;//释放数据总线,准备接收应答信号delay();}//--------------------------------------------------------------------------------------------------------//void response()//应答,可以看书page181,由接收设备发出的第九位数据,要经由sda传输给发送设备{uchar t;//局部变量scl=1;delay();while((sda==1)&&(t<250)){t++;//等待应答有一定的时间限制,sda被拉低表示有应答,由硬件控制}scl=0;delay();}//------------------------------------------------------------------------------------------------------//void stop()//停止信号,scl=1,sda形成一个正跳变{scl=0;//允许sda变化delay();sda=0;//准备形成正跳变delay();scl=1;//信号有效前提1delay();sda=1;//形成正跳变delay();//信号有效前提1}//-----------------------------------------------------------------------------------------------------//void delay1(uint z)//毫秒级延时{for(x=z;x>0;x--)for(y=10;y>0;y--);}//---------------------------------------------------------------------------------------------------------------//uchar read_byte()//带有返回值,将所读到的数据作为返回值{uchar i,d;//局部变量d=0x00;//清空存储变量的空间for(i=0;i<8;i++){scl=0;//允许变化,即允许传送数据,sda是serial dual date busdelay();scl=1;//允许读走数据delay();d=(d<<1)|sda;//将sda上数据放入存储变量d,也是8位ucharscl=0;delay();}return d;}//----------------------------------------------------------------------------------------------------------//void write_add(uchar address,uchar date) //任意位置,写任意内容{start();//起始信号write_byte(0xa0);//写入EEPROM器件地址,写入分为数据,地址数据,地址又分为器件地址和内部存储地址,例如某班级某学生座位response();//等待应答write_byte(address);//内部存储地址实际参数addressresponse();write_byte(date);//写入真正意义上的数据,由引入的实际参数dateresponse();//等待应答stop();//停止读取数据信号delay1(1);}//-------------------------------------------------------------------------------------------------------//uchar read_add(uchar address){uchar shu;start();write_byte(0xa0);//申明所读器件地址response();write_byte(address);//申明该器件中所要求读数据的位置response();start();write_byte(0xa1);response();shu=read_byte();//进行读数据操作后,非应答,budaixingcan,而是将返回值直接赋予变量stop();}//------------------------------------------------------------------------------------------------------------// void main(){P0=0X00;init_AT();sec=read_add(0X03);//将芯片中数据读出;作为基数init_timer0();//定时器初始化设置if(sec==16)sec=0;while(1){P0=table[sec];if(panju==1){panju=0;write_add(0x03,sec);}}}//---------------------------------------------------------------------------------------------------------// void timer0_break() interrupt 1{TH0=15536/256;//求模TL0=15536%256;//求余装入初值num++;if(num==20){num=0;sec++;panju=1;if(sec==16) sec=0;}}。
51单⽚机晶振频率、时钟周期、状态周期、机器周期、指令周期和总线周期的关系⼀、晶振频率1、英⽂全称:frequency oscillate2、定义:晶体振荡器的固有频率, 不能改变。
⼆、时钟周期1、英⽂全称:Clock Cycle。
2、时钟周期是计算机中最基本的、最⼩的时间单位。
在⼀个时钟周期内,CPU仅完成⼀个最基本的动作。
3、时钟周期 = 晶振周期 = 振荡周期Tosc = 晶振频率(振荡频率fosc)的倒数。
4、若晶振周期为12MHz,则时钟周期 = 1/12us。
每秒发出12000000个脉冲信号,那么发出⼀个脉冲的时间就是时钟周期,即1/12微妙。
三、状态周期振荡器脉冲信号经过时钟电路⼆分频之后产⽣的单⽚机时钟信号的周期(⽤S表⽰)称为状态周期。
故⼀个状态周期S包含2个节拍,前⼀时钟周期称为P1节拍,后⼀时钟周期称为P2节拍。
四、机器周期1、定义:CPU完成⼀项基本操作(取指令、存储器读写等)所消耗的最短时间。
2、⼀般由12个时钟周期或者6个状态周期组成。
3、计算:机器⼈周期 = 12 / 晶振频率。
4、存在的原因:1个时钟周期⽆法⼲完⼀件事,⽽12个时钟周期能够完成基本的操作。
五、指令周期取出并执⾏⼀条指令的时间。
指令周期是不确定的,因为她和该条指令所包含的机器周期有关。
⼀个指令周期=1个(或2个或3个或4个)机器周期,像乘法或除法就含有4个机器周期,单指令就只含有1个机器周期。
六、总线周期访问1次存储器和I/O端⼝操作所需要的时间。
七、⼩结所需时间:时钟周期 < 状态周期 < 机器周期 < 指令周期 < 总线周期————————————————————————————————————————————————————————————。
单片机时序图MCS51单片机的指令时序接下来我们分别对几个典型的指令时序加以说明。
·单字节单周期指令:单字节单周期指令只进行一次读指令操作,当第二个ALE信号有效时,PC并不加1,那么读出的还是原指令,属于一次无效的读操作。
·双字节单周期指令:这类指令两次的ALE信号都是有效的,只是第一个ALE信号有效时读的是操作码,第二个ALE信号有效时读的是操作数。
·单字节双周期指令:两个机器周期需进行四读指令操作,但只有一次读操作是有效的,后三次的读操作均为无效操作。
单字节双周期指令有一种特殊的情况,象MOVX这类指令,执行这类指令时,先在ROM 中读取指令,然后对外部数据存储器进行读或写操作,头一个机器周期的第一次读指令的操作码为有效,而第二次读指令操作则为无效的。
在第二个指令周期时,则访问外部数据存储器,这时,ALE信号对其操作无影响,即不会再有读指令操作动作。
上页的时序图中,我们只描述了指令的读取状态,而没有画出指令执行时序,因为每条指令都包含了具体的操作数,而操作数类型种类繁多,这里不便列出,有兴趣的读者可参阅有关书籍时序是用定时单位来描述的,MCS-51的时序单位有四个,它们分别是节拍、状态、机器周期和指令周期,接下来我们分别加以说明。
·节拍与状态:我们把振荡脉冲的周期定义为节拍(为方便描述,用P表示),振荡脉冲经过二分频后即得到整个单片机工作系统的时钟信号,把时钟信号的周期定义为状态(用S表示),这样一个状态就有两个节拍,前半周期相应的节拍我们定义为1(P1),后半周期对应的节拍定义为2(P2)。
·机器周期:MCS-51有固定的机器周期,规定一个机器周期有6个状态,分别表示为S1-S6,而一个状态包含两个节拍,那么一个机器周期就有12个节拍,我们可以记着S1P1、S1P2……S6P1、S6P2,一个机器周期共包含12个振荡脉冲,即机器周期就是振荡脉冲的12分频,显然,如果使用6MHz的时钟频率,一个机器周期就是2us,而如使用12MHz的时钟频率,一个机器周期就是1us。
51单片机控制N a n d F l a s h读写的两种方法本文叙述了51单片机控制N a n d F l a s h读写的两种方法:总线方式和I/O模拟方式,并通过逻辑分析仪验证这两种方法均是符合N a n d F l a s h的读写时序的,最后通过逻辑分析仪观察和汇编分析给出了这两种方法读效率的对比。
第一章 单片机与N a n d F l a s h总线连接 1N a n d F l a s h的总线时序分析图1-1N a n d F l a s h总线操作要求将N a n d F l a s h总线操作分为三类:写命令、写地址和数据操作(读数据与写数据仅仅差别在n R和n W引脚,而且这两个引脚无法进行编址,故归为一类)。
根据这三类的时序要求,选出引脚在这三类中变化的进行编址,n E引脚总是要求低电平,不符合要求;A L和C L在这三类操作中有时是低电平有时是高电平,符合要求。
2单片机读写外部数据存储器的时序分析由图2和图3可以知道,51单片机在进行外部数据读写操作时要求A L E信号为低电平,这与N a n d F l a s h总线操作片选信号n E要求相同,因此可以将A L E与n E相连。
为了能够利用N a n d F l a s h的保护功能,将n W P引脚与单片机的一个I/O 口相连。
3N a n d F l a s h与单片机的连接及编址因为对于单片机仅仅M O V X 指令才能访问外部数据存储器,又因为单片机P 0口已经作为数据口与单片机相连,因此只能使用拥有高8位地址的P 2口。
P 2口仅仅在16位地址操作中才有用,因此编址采用16位形式,用不到的补零。
如表2所示,可知N a n d 的命令端口地址为:0×6000h ,地址端口地址为:o x A o o o h ,数据端口地址为:0×2000h 。
在C 程序中声明如下:第二章 单片机与N a n d F l a s h I /O 直接相连1.N a n d 与单片机的连接图1-1描述了N a n d F l a s h 操作的时序要求,根据该要求可以采用单片机的I /O 口与N a n d F l a s h 直接相连,通过I /O 口模拟的方式来控制N a n d F l a s h 的操作。
在学习单片机的过程中,我常有这样的烦恼:随随便便一个芯片,少则占用三五个IO口,一般的就占用8个,稍微想用多一点芯片吧,老觉得IO口不够用。
学串口的时候觉得串口是个好东西,连两条线就够了,现在学到I2C,觉得这也是一个非常好的东西,也是两条线,还能给每个总线上的设备设立地址,简直就是一个小网络了。
I2C总线使用两条线,一条是时钟线,称为SCL,一条是数据线,称为SDA,各个设备就并在总线上,每一个总线上的设备都有一个自己的地址,主机在操作设备的时候,都会先发送一个地址码,告诉被操作机,接下来的命令由它接收。
接下来说一下I2C总线的数据有效性。
I2C总线进行数据传送时,要求SCL为高电平时,SDA上的数据必需保持稳定,换言之,当SCL为高电平时,SDA的电平不能变换,只有当SCL为低电平时,SDA的电平才能变。
I2C总线通信时,需要遵照一定的协议,以下为一次通信过程:1.由主机发送起始信号,启动I2C总线。
时序为,在SCL为高电平期间,SDA出现一个下降沿。
2.主机发送寻址信号,即告诉特定的设备,接下来的命令是发给它的。
地址分为7位和10位,以7位为例,高7位为设备地址,最低位表示读或写,1表示读,0表示写。
3.应答信号,I2C协议规定,每传送一个字节数据(包括地址及命令)后,都要有一个接收设备返回的应答信号,以确定信号是否被接收设备正确接收到了。
其时序为,在SCL信号为高电平期间,接收设备把SDA电平拉低。
4.数据传输,当主机发送发址并收到应答后,就可以发送数据了,但是发送数据只能每次发送一位,并且每发送一位后都需要收到接收机的应答。
或主机为接收设备时,主机对最后一个字节不应答,表示向发送设备说,数据传送结束。
5.发送停止信号,在全部数据传送完毕后,主机发送停止信号,时序为,在SCL为高电平期间,SDA上产生一个上升沿。
前面讲到,I2C协议要求数据的发送,要求SCL为低电平时,SDA才能变换,看一下上面的时序,可以看到,命令都是SCL为高电平时对SDA的操作,而发送数据则是SCL为低电平时对SDA操作。
MCS-51 单片机的指令时序
时序是用定时单位来描述的,MCS-51 的时序单位有四个,它们分别是
节拍、状态、机器周期和指令周期,接下来我们分别加以说明。
-节拍与状态:
我们把振荡脉冲的周期定义为节拍(为方便描述,用P 表示),振荡脉冲经
过二分频后即得到整个单片机工作系统的时钟信号,把时钟信号的周期定义
为状态(用S 表示),这样一个状态就有两个节拍,前半周期相应的节拍我们
定义为1(P1),后半周期对应的节拍定义为2(P2)。
-机器周期:
MCS-51 有固定的机器周期,规定一个机器周期有6 个状态,分别表示为
S1-S6,而一个状态包含两个节拍,那幺一个机器周期就有12 个节拍,我们
可以记着S1P1、S1P2S6P1、S6P2,一个机器周期共包含12 个振荡脉冲,即机器周期就是振荡脉冲的12 分频,显然,如果使用6MHz 的时钟频率,一个机器周期就是2us,而如使用12MHz 的时钟频率,一个机器周期就是1us。
-指令周期:
执行一条指令所需要的时间称为指令周期,MCS-51 的指令有单字节、双
字节和三字节的,所以它们的指令周期不尽相同,也就是说它们所需的机器。
参考自
51单片机工程应用实例/唐继贤编著.—北京:北京航空航天大学出版社,2009.1
单片机初级教程:单片机基础/张迎新等编著.—2版.—北京:北京航空航天大学出版社,
2006.8
AT89S52数据手册/Atmel Corporation
1.并行
2.串行
2.1 UART异步串行【Intel】
2.2 IIC(I2C)【Philips】
2.3 SPI 【Motorola】
2.4 单总线【Dallas Semiconductor】
2.5 USB
并行总线
并行通行——所传数据的各位同时发送或接收
并行扩展——利用单片机的三总线(地址、数据和控制)进行系统扩展一般的计算机外部总线是相互独立的,但是51系列单片机由于受引脚的限制,地址总线与数据总线是引脚复用。
并行总线的扩展有几种
1.专用的可编程并行口扩展芯片如8255
2.不可编程的并行口扩展
1).三态门如74LS244 [扩展输入]
2).锁存器如74LS273 [扩展输出]
3).带三态功能的锁存器如74LS373
3.利用串行口扩展并行口
(图1)向片外写数据时的时序图
(图2)从片外读数据时的时序图
74244扩展输入例子
(图3)74244扩展输入例子注:图中用的是或门
74273扩展输出例子
(图4)74273扩展输出例子注:图中用或或非都可以
另附上74273的逻辑
74373的扩展例子(略)
串口扩展并口(串口设为移位寄存器模式,加上74164即可)
【END】。
51 单片机总线时序
一、总线概述
计算机系统是以微处理器为核心的,各器件要与微处理器相连,且必须协调工作,所以在微处理机中引入了总线的概念,各器件共同享用总线,任何时候只能有一个器件发送数据(可以有多个器件同时接收数据) 。
计算机的总线分为控制总线、地址总线和数据总线等三种。
而数据总线用于传送数据,控制总线用于传送控制信号,地址总线则用于选择存储单元或外设。
二、单片机的三总线结构
51 系列单片机具有完善的总线接口时序,可以扩展控制对象,其直接寻址能力达到64k( 2 的16 次方) 。
在总线模式下,不同的对象共享总线,独立编址、分时复用总线,CPU 通过地址选择访问的对象,完成与各对象之间的信息传递。
单片机三总线扩展示意如图1 所示。
1、数据总线。