单片机数据存储空间分配_第1页
单片机数据存储空间分配_第2页
单片机数据存储空间分配_第3页
单片机数据存储空间分配_第4页
单片机数据存储空间分配_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、单片机数据存储空间分配    日期: 2007-03-20 10:39 1、  data区空间小,所以只有频繁用到或对运算速度要求很高的变量才放到data区内,比如for循环中的计数值。2、  data区内最好放局部变量。因为局部变量的空间是可以覆盖的(某个函数的局部变量空间在退出该函数是就释放,由别的函数的局部变量覆盖),可以提高内存利用率。当然静态局部变量除外,其内存使用方式与全局变量相同;3、  确保你的程序中没有未调用的函数。在Keil C里遇到未调用函数,编译器就将其认为可能是中断函数。函数里用的局部变量的空间是不释放,也就

2、是同全局变量一样处理。这一点Keil C做得很愚蠢,但也没办法。4、  程序中遇到的逻辑标志变量可以定义到bdata中,可以大大降低内存占用空间。在51系列芯片中有16个字节位寻址区bdata,其中可以定义8*16=128个逻辑变量。定义方法是: bdata bit LedState;但位类型不能用在数组和结构体中。5、  其他不频繁用到和对运算速度要求不高的变量都放到xdata区。6、  如果想节省data空间就必须用large模式,将未定义内存位置的变量全放到xdata区。当然最好对所有变量都要指定内存类型。7、  当使用到指针时,要指定指针指向的内

3、存类型。在C51中未定义指向内存类型的通用指针占用3个字节;而指定指向data区的指针只占1个字节;指定指向xdata区的指针占2个字节。如指针p是指向data区,则应定义为:  char data *p;。还可指定指针本身的存放内存类型,如:char data * xdata p;。其含义是指针p指向data区变量,而其本身存放在xdata区。查看全文 | (已有0条评论) 查看评论  发表评论 正在加载评论列表,请稍候. 鲜花:0朵  送鲜花      便便:0坨 

4、60;扔便便 单片机原理    日期: 2007-03-20 10:37 单片机原理        随着大规模集成电路的出现及其发展,将计算的 CPU 、 RAM 、 ROM 、定时 / 计数器和多种 I/O接口集成在一片芯片上,形成芯片级的计算机,因此单片机早期的含义称为单片微型计算机,直译为 单片机 。         一、 单片机的特点 :       1 、具有优异的性能价格比       2 、集成度高、体积小、可靠

5、性高       3 、控制功能强       4 、低电压、低功耗       二、单片机的应用 :       1 、在智能仪器仪表中的应用:在各类仪器仪表中引入单片机,使仪器仪表智能化,提高测试的自动化程度和精度,简化仪器仪表的硬件结构,提高其性能价格比。       2 、在机电一体化中的应用:机电一体化产品是指集机械、微电子技术、计算机技术于一本,具有智能化特征的电子产品。      3 、在实时过程控制中

6、的应用:用单片机实时进行数据处理和控制,使系统保持最佳工作状态,提高系统的工作效率和产品的质量。       4 、在人类生活中的应用:目前国外各种家用电器已普通采用单片机代替传统的控制电路。       5 、在其它方面的应用:单片机除以上各方面的应用,它还广泛应用于办公自动化领域、商业营销领域、汽车及通信、计算机外部设备、模糊控制等各领域中。       三、单片机的基本组成 :       它由 CPU 、存储器(包括 RAM 和 ROM )、 I/O 接口、定时 /

7、计数器、中断控制功能等均集成在一块芯片上,片内各功能通过内部总线相互连接起来。       1.输入 / 输出引脚 P0 、 P1 、 P2 、 P3 的功能 :       P0.0P0 。 7 : P0 口是一个 8 位漏极开路型双向 I/O 端口。在访问片外存储器时,它分时作低 8 位地址和 8 位双向数据总线用。在 EPROM 编程时,由 P0 输入指令字节,而在验证程序时,则输出指令字节。验证程序时,要求外接上拉电阻。 P0 能以吸收电流的方式驱动 8 个 LSTTL 负载。       P1.

8、 0 P1. 7 ( 18 脚): P1 是一上带内部上拉电阻的 8 位双向 I/O 口。在EPROM 编程和验证程序时,由它输入低 8 位地址。 P1 能驱动 4 个 LSTTL 负载。在 8032/8052 中, P1. 0 还相当于专用功能端 T2 ,即定时器的计数触发输入端; P1. 1 还相当于专用功能端 T2EX ,即定时器 T2 的外部控制端。       P2.0P2.7 ( 2128 脚): P2 也是一上带内部上拉电阻的 8 位双向 I/O 口。在访问外部存储器时,由它输出高 8 位地址。在对 EPROM 编程和程序验证时,由它输入高 8 位地

9、址。 P2 可以驱动 4 个 LSTTL 负载。       P3. 0 P3. 7 ( 1017 脚): P3 也是一上带内部上拉电阻的双向 I/O 口。在MCS-51 中,这 8 个引脚还用于专门的第二功能。 P3 能驱动 4 个 LSTTL 负载。                             P3. 0            RXD (串行口输入)

10、                            P3. 1            TXD (串行口输出)                             P3. 2           

11、;   INT0 (外部中断 0 输入)                             P3. 3              INT1 (外部中断 1 输入)                             P3. 4&#

12、160;           T0 (定时器 0 的外部输入)                             P3. 5            T1 (定时器 1 的外部输入)                       

13、0;     P3. 6              WR (片外数据存储器写选通)                             P3. 7              RD (片外数据存储器读选通)       四.MCS-51 的寻址方式:   &

14、#160;                     1 、立即寻址    如: MOV  A , #40H                         2 、直接寻址    如: MOV A , 3AH                  

15、;       3 、寄存器寻址    如: MOV  A , Rn                         4 、寄存器间接寻址    如: MOV  A , Rn                         5 、基址加变址寻址   

16、 如: MOVC  A , A+DPTR                         6 、相对寻址      如: SJMP  08H                         7 、位寻址    MOV 20H , C       五.指令: &

17、#160;                       MOV :  片内 RAM 传送                         MOVX  :片外 RAM 传送                         MOVC

18、: ROM 传送                         XCH :交换(和 A 交换)                         SWAP : A 内半字节交换                         ADD :不带

19、进位加                         ADDC :带进位加                         SUBB  :带进位减                         INC :加 1  

20、                      DEC :减 1                         MUL :乘法                         DIV :除法         &#

21、160;               DAA :调整         六.计数初值的计算             定时或计数方式下计数初值如何确定,定时器选择不同的工作方式,不同的操作模式其计数值均不相同。若设最大计数值为 M ,各操作模式下的 M 值为:             模式 0 :    M=2 13 =8192   

22、0;         模式 1 :    M=2 16 =65536             模式 2 :    M=2 8 =256             模式 3 :    M=256 ,定时器 T0 分成 2 个独立的 8 位计数器,所以 TH0 、 TL0 的M 均为 256 。             因为

23、 MCS-51 的两个定时器均为加 1 计数器,当初到最大值( 00H 或 0000H )时产生溢出,将 TF 位置 1 ,可发出溢出中断,因此计数器初值 X 的计算式为: X=M- 计数值式中的 M 由操作模式确定,不同的操作模式计数器的长不相同,故 M值也不相同。而式中的计数值与定时器的工作方式有关。             1 、计数工作方式时                   计数工作方式时,计数脉冲由外部引入,是对外部冲进行计数,因此

24、计数值根据要求确定。其计数初值: X=M- 计数值                   例如:某工序要求对外部脉冲信号计 100 次, X=M-100             2 、定时工作方式时                   定时工作方式时,因为计数脉冲由内部供给,是对机器周期进行计数,故计数脉冲频率为 f cont =f osc × &#

25、160;                 1/12 、计数周期 T=1/f cont =12/f osc 定时工作方式的计数初值 X 等于:X=M- 计数值 =M-t/T=M- ( f osc × t ) /12      式中: f osc 为振荡器的振荡频率, t 为要求定时的时间。                   定时器有两种工作方式 :即定时和计数工作方式。由 TMOD 的

26、D6 位和 D2 位选择,其中 D6 位选择                         T1 的工作方式, D2 位选择 T0 的工作方式。 =0 工作在定时方式, =1工作在计数方式。并有四种操作模式:                         1 、模式 0 : 13 位计数器, TLi 只用低 5 位。     

27、0;                   2 、模式 1 : 16 位计数器。                         3 、模式 2 : 8 位自动重装计数器, THi 的值在计数中不变, TLi 溢出时, THi 中的值自动装入                     

28、0;   TLi 中。                         4 、模式 3 : T0 分成 2 个独立的 8 位计数器, T1 停止计数。           七.MCS-51 有 5 个中断源,可分为 2 个中断优先级,即高优先级和低优先级,                       

29、0; 中断自然优先级:                         外部中断 0                         定时器 0 中断                         外部中断 1    

30、                     定时器 1 中断                         串行口中断                         定时器 2 中断           &#

31、160;             ( 1 )同级或高优先级的中断正在进行中;                         ( 2 )现在的机器周期还不是执行指令的最后一上机器周期,即正在执行的指令还没完成前不响应任何中断;                         ( 3 )正在执行的是中

32、断返回指令 RET1 或是访问专用寄存器 IE 或 IP 的指令,换而言之,在 RETI                         或者读写 IE 或 IP 之后,不会马上响应中断请求,至少要在执行其它一要指令之扣才会响应。                         (一)CPU 响应中断的条件有:       &#

33、160;                 ( 1 )有中断源发出中断请求;                         ( 2 )中断总允许位 EA=1 ,即 CPU 开中断;                         ( 3 )申请中断的中断源的中断允许位为 1 ,即

34、没有被屏蔽。                         (二)串行口工作方式及帧格式 :                           MCS-51 单片机串行口可以通过软件设置四种工作方式:                     &#

35、160;     方式 0:这种工作方式比较特殊,与常见的微型计算机的串行口不同,它又叫同步移位寄存器输出方式。在这种方式下,数据从RXD 端串行输出或输入,同步信号从 TXD 端输出,波特率固定不变,为振荡率的 1/12 。该方式是以 8位数据为一帧,没有起始位和停止位,先发送或接收最低位。                           方式 2 :采用这种方式可接收或发送 11 位数据,以 11 位为一帧,比方式 1增加了一个数据位,其

36、余相同。第 9 个数据即 D8 位具有特别的用途,可以通过软件搂控制它,再加特殊功能寄存器SCON 中的 SM2 位的配合,可使 MCS-51 单片机串行口适用于多机通信。方式 2 的波特率固定,只有两种选择,为振荡率的 1/64 或 1/32 ,可由 PCON 的最高位选择。                           方式 3 :方式 3 与方式 2 完全类似,唯一的区别是方式 3 的小组特率是可变的。而帧格式与方式 2- 为 11 位一帧。所以方式 3

37、 也适合于多机通信查看全文 | (已有0条评论) 查看评论  发表评论 正在加载评论列表,请稍候. 鲜花:0朵  送鲜花      便便:0坨  扔便便 串行接口SPI接口应用设计    日期: 2006-09-30 00:00 使用的同步串行三线SPI接口,可以方便的连接采用SPI通信协议的外围或另一片AVR单片机,实现在短距离内的高速同步通信。ATmega128的SPI采用硬件方式实现面向字节的全双工3线同步通信,支持主机、从机和2种不同极性

38、的SPI时序,通信速率有7种选择,主机方式的最高速率为1/2系统时钟,从机方式最高速率为1/4系统时钟。    ATmega128单片机内部的SPI接口也被用于程序存储器和数据E2PROM的编程下载和上传。但特别需要注意的是,此时SPI的MOSI和MISO接口不再对应PB2、PB3引脚,而是转换到PE0、PE1引脚上(PDI、PDO),其详见第二章中关于程序存储器的串行编程和校验部分的内容。    ATmega128的SPI为硬件接口和传输完成中断申请,所以使用SPI传输数据的有效方法是采用中断方式+数据缓存器的设计方法。在对SPI初始化时,应注意以下几

39、点:    .正确选择和设置主机或从机,以及工作模式(极性),数据传输率;    .注意传送字节的顺序,是低位优先(LSB First)还是高位优先(MSB Frist);    .正确设置MOSI和MISO接口的输入输出方向,输入引脚使用上拉电阻,可以节省总线上的吊高电阻。下面一段是SPI主机方式连续发送(接收)字节的例程:#define SIZE 100unsigned char SPI_rx_buffSIZE;unsigned char SPI_tx_buffSIZE;unsigned char rx_wr_index,rx_r

40、d_index,rx_counter,rx_buffer_overflow;unsigned char tx_wr_index,tx_rd_index,tx_counter;#pragma interrupt_handler spi_stc_isr:18void spi_stc_isr(void)  SPI_rx_buffrx_wr_index = SPDR;    /从ISP口读出收到的字节  if (+rx_wr_index = SIZE) rx_wr_index = 0;    /放入接收缓冲区,并调整队列指针  if

41、 (+rx_counter = SIZE)      rx_counter = 0;    rx_buffer_overflow = 1;    if (tx_counter)        /如果发送缓冲区中有待发的数据      -tx_counter;    SPDR = SPI_tx_bufftx_rd_index; /发送一个字节数据,并调整指针    if (+tx_rd_index = SIZE) tx

42、_rd_index = 0;  unsigned char getSPIchar(void)  unsigned char data;  while (rx_counter = 0);    /无接收数据,等待  data = SPI_rx_buffrx_rd_index;    /从接收缓冲区取出一个SPI收到的数据  if (+rx_rd_index = SIZE) rx_rd_index = 0;    /调整指针  CLI();  -rx_counter;&

43、#160; SEI();  return data;void putSPIchar(char c)  while (tx_counter = SIZE);/发送缓冲区满,等待  CLI();  if (tx_counter | (SPSR & 0x80) = 0)/发送缓冲区已中有待发数据                  /或SPI正在发送数据时    SPI_tx_buffertx_wr_index = c;   

44、 /将数据放入发送缓冲区排队    if (+tx_wr_index = SIZE) tx_wr_index = 0;    /调整指针    +tx_counter;    else    SPDR = c;        /发送缓冲区中空且SPI口空闲,直接放入SPDR由SIP口发送  SEI();void spi_init(void)  unsigned chat temp;  DDRB |= 0x080; 

45、  /MISO=input and MOSI,SCK,SS = output  PORTB |= 0x80;    /MISO上拉电阻有效   SPCR = 0xD5;    /SPI允许,主机模式,MSB,允许SPI中断,极性方式01,1/16系统时钟速率  SPSR = 0x00;  temp = SPSR;  temp = SPDR;    /清空SPI,和中断标志,使SPI空闲void main(void)  unsigned char I;  C

46、LI();        /关中断  spi_init();    /初始化SPI接口  SEI();        /开中断  while()      putSPIchat(i);        /发送一个字节    i+;    getSPIchar();        /接收一个字节(第一个字节为空字节)

47、60;         这个典型的SPI例程比较简单,主程序中首先对ATmega128的硬件SPI进行初始化。在初始化过程中,将PORTB的MOSI、SCLK和SS引脚作为输出,同时将MISO作为输入引脚,并打开上拉电阻。接着对SPI的寄存器进行初始化设置,并空读一次SPSR、SPDR寄存器(读SPSR后再对SPDR操作将自动清零SPI中断标志自动清零),使ISP空闲等待发送数据。  AVR的SPI由一个16位的循环移位寄存器构成,当数据从主机方移出时,从机的数据同时也被移入,因此SPI的发送和接收在一个中断服务中完成。在SPI中断服务程序中,

48、先从SPDR中读一个接收的字节存入接收数据缓冲器中,再从发送数据缓冲器取出一个字节写入SPDR中,由ISP发送到从机。数据一旦写入SPDR,ISP硬件开始发送数据。下一次ISP中断时,表示发送完成,并同时收到一个数据。类似本章介绍的USART接口的使用,程序中putSPIchar()和getSPIchar()为应用程序的底层接口函数(SPI驱动程序是SPI中断服务程序),同时也使用了两个数据缓冲器,分别构成循环队列。这种程序设计的思路,不但程序的结构性完整,同时也适当的解决了高速MCU和低速串口之间的矛盾,实现程序中任务的并行运行,提高了MCU的运行效率。    本例程是通

49、过SPI批量输出、输入数据的示例,用户可以使用一片ATmega128,将其MOSI和MISO两个引脚连接起来,构成一个ISP接口自发自收的系统,对程序进行演示验证。需要注意,实际接收到的字节为上一次中断时发出的数据,即第一个收到的字节是空字节。    读懂和了解程序的处理思想,读者可以根据需要对程序进行改动,适合实际系统的使用。如在实际应用中外接的从机是一片SPI接口的温度芯片,协议规程为:主机先要连续发送3个字节的命令,然后从机才返回一个字节的数据。那么用户程序可以先循环调用putSPIchar()函数4次,将3个字节的命令和一个字节的空数据发送到从机,然后等待一段时间,

50、或处理一些其它的操作后,再循环调用getSPIchar()函数4次,从接收数据缓冲器中连续读取4个字节,放弃前3个空字节,第4个字节即为从机的返回数据了。查看全文 | (已有0条评论) 查看评论  发表评论 正在加载评论列表,请稍候. 鲜花:0朵  送鲜花      便便:0坨  扔便便 AT24c256读写    日期: 2006-06-10 00:00 /* 以下为AT24C01AT24C256的读写程序,各人可根据自己的需要应用。在buf1

51、中填入需要写入的内容,buf2的大小可根据需要定义。addr可根据使用的芯片选择,可从任何位置读写,只要在该芯片的范围内。enumer=ATxxx,根据使用的芯片赋值。各函数中的形式参数不需改变。本程序只要在调用的程序中定义实际参数即可,下述各子程序不必改动。*/#include <reg52.h>#include <intrins.h>#include "UART.H"#define  ERROR 10    /允许ERROR的最大次数      sbit    SDA

52、=P20;sbit    SCL=P21;enum  eepromtype AT2401,AT2402,AT2404,AT2408,AT2416,AT2432,AT2464,AT24128,AT24256;/*器件的型号*/enum  eepromtype enumer;  /定义一个枚举变量unsigned char code buf1 ='A','B','C','D','E','F','G','H','I&

53、#39;,'J' /* 发送缓冲区 */unsigned char buf2 10; /* 接收缓冲区 */* 一个通用的24C0124C256共9种EEPROM的字节读写操作程序,此程序有五个入口条件,分别为读写数据缓冲区指针,进行读写的字节数,EEPROM首址,EEPROM控制字节,以及EEPROM类型。此程序结构性良好,具有极好的容错性,程序机器码也不多:DataBuff为读写数据输入输出缓冲区的首址 Length 为要读写数据的字节数量Addr 为EEPROM的片内地址 AT24256为032767Control 为EEPROM的控制字节,具体形式为(1)(0)(1)(

54、0)(A2)(A1)(A0)(R/W),其中R/W=1,表示读操作,R/W=0为写操作,A2,A1,A0为EEPROM的页选或片选地址;enumer为枚举变量,需为AT2401至AT24256中的一种,分别对应AT24C01至AT24C256;函数返回值为一个位变量,若返回1表示此次操作失效,0表示操作成功;ERROR为允许最大次数,若出现ERRORCOUNT次操作失效后,则函数中止操作,并返回1SDA和SCL由用户自定义,这里暂定义为P30和P31; */*对于1K位,2K位,4K位,8K位,16K位芯片采用一个8位长的字节地址码,对于32K位以上的采用2个8位长的字节地址码直接寻址,而4K

55、位,8K位,16K位配合页面地址来寻址*/*   AT24C01AT24C256 的读写程序 */bit  RW24xx(unsigned char *DataBuff,unsigned char Length,unsigned int Addr,                    unsigned char Control,enum eepromtype enumer) void Delay(unsigned char DelayCount);  /*

56、0; 延时  */  void Start(void);  /*  启动总线  */  void Stop(void);  /*  停止IIC总线  */  bit  RecAck(void); /*  检查应答位  */  void NoAck(void);  /*  不对IIC总线产生应答  */  void Ack(void);    /*  对IIC总线产生应答  */

57、  unsigned char Receive(void); /*  从IIC总线上读数据子程序  */  void Send(unsigned char sendbyte); /*  向IIC总线写数据  */  unsigned char data j,i=ERROR;  bit errorflag=1;  /*  出错标志  */  while(i-)  Start();  /*  启动总线  */    Se

58、nd(Control & 0xfe); /*  向IIC总线写数据,器件地址 */    if(RecAck() continue; /*  如写不正确结束本次循环  */    if(enumer > AT2416)    Send(unsigned char)(Addr >> 8);/把整型数据转换为字符型数据:弃高取低,只取低8位.如果容量大于32K位,使用16位地址寻址,写入高八位地址      if(RecAck()  conti

59、nue;        Send(unsigned char)Addr); /*  向IIC总线写数据  */    if(RecAck()  continue; /*  如写正确结束本次循环  */    if(!(Control & 0x01)  /判断是读器件还是写器件    j=Length;      errorflag=0;        /* 清

60、错误特征位 */      while(j-)      Send(*DataBuff+); /*  向IIC总线写数据  */        if(!RecAck() continue; /*  如写正确结束本次循环  */        errorflag=1;        break;            i

61、f(errorflag=1) continue;      break;        else    Start();  /*  启动总线  */      Send(Control); /*  向IIC总线写数据  */      if(RecAck() continue;/器件没应答结束本次本层循环      while(-Length)  /*

62、60; 字节长为0结束  */      *DataBuff += Receive();  send_data(*(DataBuff-1);        Ack();  /*  对IIC总线产生应答  */            *DataBuff=Receive(); /* 读最后一个字节 */      send_data(*DataBuff);    

63、0; NoAck();  /*  不对IIC总线产生应答  */      errorflag=0;      break;        Stop();  /*  停止IIC总线  */  if(!(Control & 0x01)  Delay(255); Delay(255); Delay(255); Delay(255);    return(errorflag);/* * * *

64、* 以下是对IIC总线的操作子程序 * * * * */* * * * * * 启动总线 * * * * */void Start(void) SCL=0; /* SCL处于高电平时,SDA从高电平转向低电平表示 */  SDA=1; /* 一个"开始"状态,该状态必须在其他命令之前执行 */  SCL=1;  _nop_(); _nop_(); _nop_();  SDA=0;  _nop_(); _nop_(); _nop_(); _nop_();  SCL=0;  SDA=1;  

65、0; /* * * * * 停止IIC总线 * * * * */void Stop(void) SCL=0; /*SCL处于高电平时,SDA从低电平转向高电平 */  SDA=0; /*表示一个"停止"状态,该状态终止所有通讯 */  SCL=1;  _nop_(); _nop_(); _nop_(); /* 空操作 */  SDA=1;  _nop_(); _nop_(); _nop_();  SCL=0;/* * * * * 检查应答位 * * * * */bit RecAck(void) SCL=0;

66、0; SDA=1;  SCL=1;  _nop_(); _nop_(); _nop_(); _nop_();  CY=SDA;    /* 因为返回值总是放在CY中的 */  SCL=0;  return(CY);/* * * * *对IIC总线产生应答 * * * * */void Ack(void) SDA=0; /* EEPROM通过在收到每个地址或数据之后, */  SCL=1; /* 置SDA低电平的方式确认表示收到读SDA口状态 */  _nop_(); _nop_(); _nop_(); _

67、nop_();  SCL=0;  _nop_();  SDA=1;/* * * * * * * * * 不对IIC总线产生应答 * * * * */void NoAck(void) SDA=1;  SCL=1;  _nop_(); _nop_(); _nop_(); _nop_();  SCL=0;/* * * * * * * * * 向IIC总线写数据 * * * * */void Send(unsigned char sendbyte) unsigned char data j=8;  for(;j>0;j-)&#

68、160; SCL=0;    sendbyte <<= 1; /* 使CY=sendbyte7; */    SDA=CY; /* CY 进位标志位 */    SCL=1;    SCL=0;/* * * * * * * * * 从IIC总线上读数据子程序 * * * * */unsigned char Receive(void) register receivebyte,i=8;  SCL=0;  while(i-)  SCL=1;    recei

69、vebyte = (receivebyte <<1 ) | SDA;    SCL=0;    return(receivebyte);/* * * * * * * * 一个简单延时程序 * * * * * * * * * * * * */void Delay(unsigned char DelayCount) while(DelayCount-);/*   AT24C01AT24C256 的读写程序 */void main() unsigned char Control,*p1,*p2;  unsigned char L

70、ength;  unsigned int addr ; /* 24Cxx片内地址 */  p1=buf1;p2=buf2;  UART_init();  addr=0; /* 片内地址 AT24C256为032767 */  Length=8; /* 读写长度 */  enumer=AT24256; /* 读写AT24C256 */  Control=0xa0; /* 写操作 */  RW24xx(p1,Length,addr,Control,enumer); /* 写 */  Control=0xa1;

71、 /* 读操作 */  RW24xx(p2,Length-2,addr+2,Control,enumer); /* 读 */查看全文 | (已有0条评论) 查看评论  发表评论 正在加载评论列表,请稍候. 鲜花:0朵  送鲜花      便便:0坨  扔便便 串口通讯    日期: 2006-05-29 00:00 #include"reg52.h"/12m-0xe6 2400  smod=1/11.059

72、2-0xe8  2400  smod=1/12m-4800-0xf3  smod=1/11.0592-4800-0xf4  smod=1void send_data(unsigned char dat);void UART_init()  TMOD=0x20;  /记数方式2  TL1=0xf3;          TH1=0xf3;      /9600波特率  SCON=0x50;    /方式3,TB8为1&#

73、160; PCON=0x80;  TR1=1;            /启动定时器T1  TI=1; void printf(char *p)    while(*p!='n')        send_data(*p+);        send_data(0x0a);    send_data(0x0d);  void send_data(unsigned char

74、dat)  SBUF=dat;  TI=0;  while(TI=0);void main(void)  unsigned  int i;  UART_init();while (1)     P1 = 0x01;        /* Toggle P1.0 each time we print */    for(i=0;i<40000;i+);    printf ("Hello World n");

75、60; /* Print "Hello World" */     printf ("you are my  best friend n");  查看全文 | (已有0条评论) 查看评论  发表评论 正在加载评论列表,请稍候. 鲜花:0朵  送鲜花      便便:0坨  扔便便 华方卓越    日期: 2006-04-01 00:00 http:/218.106.1

76、65.186/Circuit/2080.html查看全文 | (已有0条评论) 查看评论  发表评论 正在加载评论列表,请稍候. 鲜花:0朵  送鲜花      便便:0坨  扔便便 FPGA设计的四种常用思想与技巧    日期: 2006-04-01 00:00 FPGA设计的四种常用思想与技巧日期:2005-11-14 来源:电子工程专辑  作者:王诚 吴蕾 字体:大 中 小      本文讨论的四种常

77、用FPGA/CPLD设计思想与技巧:乒乓操作、串并转换、流水线操作、数据接口同步化,都是FPGA/CPLD逻辑设计的内在规律的体现,合理地采用这些设计思想能在FPGA/CPLD设计工作种取得事半功倍的效果。     FPGA/CPLD的设计思想与技巧是一个非常大的话题,由于篇幅所限,本文仅介绍一些常用的设计思想与技巧,包括乒乓球操作、串并转换、流水线操作和数据接口的同步方法。希望本文能引起工程师们的注意,如果能有意识地利用这些原则指导日后的设计工作,将取得事半功倍的效果! 乒乓操作     “乒乓操作”是一个常常应用于数据流控制的处理技巧,典型的乒乓操作

78、方法如图1所示。     乒乓操作的处理流程为:输入数据流通过“输入数据选择单元”将数据流等时分配到两个数据缓冲区,数据缓冲模块可以为任何存储模块,比较常用的存储单元为双口RAM(DPRAM)、单口RAM(SPRAM)、FIFO等。在第一个缓冲周期,将输入的数据流缓存到“数据缓冲模块1”;在第2个缓冲周期,通过“输入数据选择单元”的切换,将输入的数据流缓存到“数据缓冲模块2”,同时将“数据缓冲模块1”缓存的第1个周期数据通过“输入数据选择单元”的选择,送到“数据流运算处理模块”进行运算处理;在第3个缓冲周期通过“输入数据选择单元”的再次切换,将输入的数据流缓存到“数据缓冲模

79、块1”,同时将“数据缓冲模块2”缓存的第2个周期的数据通过“输入数据选择单元”切换,送到“数据流运算处理模块”进行运算处理。如此循环。     乒乓操作的最大特点是通过“输入数据选择单元”和“输出数据选择单元”按节拍、相互配合的切换,将经过缓冲的数据流没有停顿地送到“数据流运算处理模块”进行运算与处理。把乒乓操作模块当做一个整体,站在这个模块的两端看数据,输入数据流和输出数据流都是连续不断的,没有任何停顿,因此非常适合对数据流进行流水线式处理。所以乒乓操作常常应用于流水线式算法,完成数据的无缝缓冲与处理。     乒乓操作的第二个优点是可以节约缓冲区空间。比如在WCDMA基带应用中,1个帧是由15个时隙组成的,有时需要将1整帧的数据延时一个时隙后处理,比较直接的办法是将这帧数据缓存起来,然后延时1个时隙进行处理。这时缓冲区的长

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论