6264RAM 读写程序(紧急)

6264RAM 读写程序(紧急),第1张

RAM(6264)的片选线(/cs)应该连上,假设连p2.4或其他未使用p2端口

实现将数据13h写入RAM的0001h地址

MOV A,#13h

MOV DPTR,#0001h

MOVX @DPTR,A

6264不能当做程序存储器,只能用来扩展数据存储器。

用线选法是利用“高位地址线”直接连接到RAM芯片的片选端。

6264芯片本身要用13条地址线,MCS-51单片机还剩3条高位地址线,所以最多可扩展3片6264。

3块芯片的地址范围分别是:

6000-7FFF

A000-BFFF

C000-DFFF

-----------

楼上说是8片,那是采用了译码法,而不是线选法。

汇编编写的模拟串口通信程序

T2作为波特率控制

UART_RXD 是硬中断0或1口,如果能进入中断,说明该线有一个起始位产生,进入中断后调

用下面的接收程序。退出硬中断之前还需要将硬中断标志重新复位。

UART_TXD 是任何其它IO即可。

UART_SEND:

PUSH IE

PUSH DPH

PUSH DPL

PUSH PSW

PUSH 00H

PUSH ACC

CLR EA

SETB UART_TXDSTART BIT

MOV R0,A

CLR TR2TR2置1,计数器2启动,时间计数启动。

MOV A,RCAP2L计数器2重新装载值

MOV TL2,A置计数器2初值 T2需要重新装载

MOV A,DPH

MOV A,RCAP2H

MOV TH2,A

MOV A,R0

SETB TR2TR2置1,计数器

JNB TF2,$

CLR TF2

JNB TF2,$

CLR TF2

CLR UART_TXDSTART BIT

JNB TF2,$

CLR TF2

JNB TF2,$

CLR TF2

MOV R0,#08H

UART_SEND_LOOP:

RRC A

MOV UART_TXD,C8 BIT

JNB TF2,$

CLR TF2

JNB TF2,$

CLR TF2

DJNZ R0,UART_SEND_LOOP

SETB UART_TXDEND BIT

JNB TF2,$

CLR TF2

JNB TF2,$

CLR TF2

POP ACC

POP 00H

POP PSW

POP DPL

POP DPH

POP IE

RET

UART_REC:

PUSH IE

PUSH DPH

PUSH DPL

CLR EA

CLR TR2TR2置1,计数器2启动,时间计数启动。

MOV A,RCAP2L计数器2重新装载值

MOV TL2,A置计数器2初值 T2需要重新装载

MOV A,DPH

MOV A,RCAP2H

MOV TH2,A

JB UART_RXD,$REC

SETB TR2TR2置1,计数器2启动,时间计数启动。

JNB TF2,$

CLR TF20.5 BIT

JNB TF2,$

CLR TF21 BIT

JNB TF2,$

CLR TF21.5 BIT

MOV C,UART_RXD

MOV ACC.0,C

JNB TF2,$

CLR TF2

JNB TF2,$

CLR TF22.5

MOV C,UART_RXD

MOV ACC.1,C

JNB TF2,$

CLR TF2

JNB TF2,$

CLR TF23.5

MOV C,UART_RXD

MOV ACC.2,C

JNB TF2,$

CLR TF2

JNB TF2,$

CLR TF24.5

MOV C,UART_RXD

MOV ACC.3,C

JNB TF2,$

CLR TF2

JNB TF2,$

CLR TF25.5

MOV C,UART_RXD

MOV ACC.4,C

JNB TF2,$

CLR TF2

JNB TF2,$

CLR TF26.5

MOV C,UART_RXD

MOV ACC.5,C

JNB TF2,$

CLR TF2

JNB TF2,$

CLR TF27.5

MOV C,UART_RXD

MOV ACC.6,C

JNB TF2,$

CLR TF2

JNB TF2,$

CLR TF28.5

MOV C,UART_RXD

MOV ACC.7,C

JNB TF2,$

CLR TF29.5

JNB UART_RXD,$等待停止位,并重新复位计数器

SETB UART_RXD

POP DPL

POP DPH

POP IE

RET

补充回答:

串口调试

1. 发送:向总线上发命令

2. 接收:从总线接收命令,并分析是地址还是数据。

3. 定时发送:从内存中取数并向主机发送.

经过调试,以上功能基本实现,可以通过上位机对单片机进行实时控制。

程序如下:

//这是一个单片机C51串口接收(中断)和发送例程,可以用来测试51单片机的中断接收

//和查询发送,发送没有必要用中断,因为程序的开销是一样的

#include <reg51.h>

#include<stdio.h>

#include <string.h>

#define INBUF_LEN 4 //数据长度

unsigned char inbuf1[INBUF_LEN]

unsigned char checksum,count3 , flag,temp,ch

bit read_flag=0

sbit cp=P1^1

sbit DIR=P1^2

int i

unsigned int xdata *RAMDATA/*定义RAM地址指针*/

unsigned char a[6] ={0x11,0x22,0x33,0x44,0x55,0x66}

void init_serialcomm(void)

{

SCON=0x50 //在11.0592MHz下,设置串行口波特率为9600,方式1,并允许接收

PCON=0x00

ES=1

TMOD=0x21 //定时器工作于方式2,自动装载方式

TH0=(65536-1000)%256

TL0=(65536-1000)/256

TL1=0xfd

TH1=0xfd

ET0=1

TR0=1

TR1=1

// TI=0

EA=1

// TI=1

RAMDATA=0x1F45

}

void serial () interrupt 4 using 3

{

if(RI)

{ RI=0

ch=SBUF

TI=1 //置SBUF空

switch(ch)

{

case 0x01 :printf("A") TI=0break

case 0x02 :printf("B") TI=0break

case 0x03 :printf("C") TI=0break

case 0x04 :printf("D") TI=0break

default :printf("fg") TI=0break

}

}

}

//向串口发送一个字符

void timer0() interrupt 1 using 3{

// char i

flag++

TH0=0x00

TL0=0x00

if(flag==10)

{// cp=!cp

// for(i=0i<6i++)

P2=0x25

TI=1

temp=*RAMDATA

printf("%c",temp)

TI=0

// RAMDATA--

flag=0

}

}

//主程序

main()

{

init_serialcomm() //初始化串口

//向6264中送数据

{

*RAMDATA=0x33

}

while(1)

{

*RAMDATA=0x33

}

}

调试需要注意的问题:

1. 发送过程:在发送时必须保证TI=1:即发送缓冲器为空,否则将导致数据发不出去,如果想强制发送可以用:TI=1.具体发送数据:利用printf(“abcd”)函数直接发送即可。

2. 接收过程:在接收时多选用中断方式,这样可以节约CPU的时间,提高效率,


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11082879.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-13
下一篇 2023-05-13

发表评论

登录后才能评论

评论列表(0条)

保存