51单片机与6264通信探讨

程序描述:利用6264,扩展STC89C52的存储空间,使接在P1口的数码管从0到F循环显示。

部分接线图:

额外说明:

1、   由上图的接法可知6264存储空间为0x2000-0x3FFF。

2、   由于P0与P2口已被用作第二功能,所以切记不可以再当普通的I/O使用。

3、   程序中用到了关于‘AUXR’特殊功能寄存器的使用,不熟悉它的读者请自行参考STC89C52单片机手册。简言之,当AUXR=0x02时,可禁止物理上位于内部、逻辑上位于外部的EXTRAM的使用。当AUXR=0x00时,允许使用且上电时为允许。

4、   当然,高三位地址P2^7、P2^6、P2^5也可以不接138,直接悬空,此时直接把’CE1非’接地。由于6264总共有8KB的空间,所以地址可以从0x0000到0x1fff,只不过选取的各个地址间可能有重叠,这没多大关系。不过,建议最好把最低起始地址设为0x0100,这样可避免与EXTRAM地址00H-FFH重叠。

5、   下图是可以修改存储模式和片外RAM地址的对话框:

程序代码:

 

主程序

#include <reg52.h>          

#include <intrins.h>

#include "delay.h"

#define uchar unsigned char

#define uint unsigned int

uchar codedpy_duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x98,

0x88,0x83,0xc6,0xa1,0x86,0x8e};

sfr AUXR=0x8e;    //定义特殊功能寄存器AUXR

uchar xdata i;         //之后读者会发现变量 i 的存储类型是什么会影响最后结果

void main()

{

       AUXR=0x02;                //之后读者会发现,是否注释掉此句,对最后结果很有影响

       while(1)

       {

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

              {

                     P1=dpy_duan[i];    

                     delay(65535);

              }

       }

}

经验总结:

   下表格是我调试时得出的一些结论,请读者仔细看,最好自己亲自验证一下

1、‘Y’表示有数码管反应正常或6264起了作用;‘N’表示数码管没反应或6264未起作用。如YY表示数码管反应正常且6264起了作用。注意:这里的6264未起作用是指在此程序中相当于没用到,但一旦把程序写复杂了,内部RAM不能满足数据处理要求,则6264还是会起作用的。

2、这个表格结论是基于上面原理图及6264地址的规定如上面的图片option框中所示。

3、还有一种存储模式pdata我没调试,读者有兴趣可一试。

4、可以发现‘是否注释掉AUXR’只影响i 为pdata时的情况。那是因为,pdata是指外部数据存储器的前256字节,请注意,这个外部不是片外,而是在逻辑上是外部但物理上是内部的空间,即EXTRAM。当AUXR=0x02时,EXTRAM已被禁止,i 为pdata本身就不合理,所以数码管没反应;但未注释掉AUXR时,i 就有了可以存储的空间,故数码管有反应。同时,不管存储模式是data还是xdata,此空间不属于片外空间,故6264未起作用,即接了相当于没接。

5、在编译时可知道所写程序需要多少data空间,利用这一点可验证之。比如我这程序需要约9个data空间,所以当我在‘option for target ‘target 1’’框中的‘off-chip Xdata memory ’第一行的两个框中分别输入0x1FF7和9时,最后发现数码管显示的出错率很大;但稍微把这size扩大点的话,就好多了。

时间: 2024-10-24 04:51:48

51单片机与6264通信探讨的相关文章

51单片机串口通信-51单片机编程串口通信问题

问题描述 51单片机编程串口通信问题 #include unsigned char a[]="i love"; unsigned int b=0; void love()interrupt 4 {if(TI==1) TI=0; } void delay(unsigned int a) {a--; } void main() {EA=1; ES=1; TMOD=0X20; TH1=0XFD; TL1=0; TR1=1; SM1=0; SM1=1; while(1) {for(b=0;b&

51单片机之间的串口通信问题

问题描述 51单片机之间的串口通信问题 请问各位大虾,我要让两块51之间用串口进行通信,请问要怎么弄呢? 比如说我一块采集温度,将采集到的温度发送到另一块并在另一块显示出来,要怎么弄呢? 希望能详细点...谢谢... 解决方案 arm与51单片机之间串口通信实验arm与51单片机之间串口通信实验51单片机串口通信 解决方案二: 代码难得写,你找一下单片机多机通讯的书看看,硬件电路上两根串口线是交叉连接的.就是一个单片机tx连接另一个的rx 解决方案三: 网上也有详细的代码,方向给你说了,加油哦.

51单片机串口通信时,接收到数据后为什么在while语句中将EA置1

问题描述 51单片机串口通信时,接收到数据后为什么在while语句中将EA置1 刚进入while语句时为什么要将EA置1??程序如下: #include #define uchar unsigned char uchar numaflagbenum; sbit beep=P2^3; void init(); void main() { init(); while(1) { if(flag==1) { EA=0; flag=0; TR0=1; if(a==1) { benum=4; } if(a=

51单片机串口通信-51单片机中的串口通信发送10(16进制)以上显示不正确

问题描述 51单片机中的串口通信发送10(16进制)以上显示不正确 串口通信中,向单片机发送数据控制LED灯亮实验中 发01,02.04.08 依次是 第1 2 3 4 个灯亮 而发送 10 就成第5 6 个一起亮了,然后发20 .40 是第7 和 第 8 个: 发 80 就全灭了 , 这是啥情况啊. #include unsigned char a,flag; void init(); void main() { init(); while(1) { if(flag == 1) { ES =

求解答-C语言51单片机串口通信程序求教

问题描述 C语言51单片机串口通信程序求教 #include #include #include #define INBUF_LEN 4 //数据长度 unsigned char inbuf1[INBUF_LEN]; unsigned char checksum,count3; bit read_flag=0; void init_serialcomm(void) { SCON = 0x50; //SCON: serail mode 1, 8-bit UART, enable ucvr TMOD

串口通信-菜鸟求助·51单片机串口响应小程序

问题描述 菜鸟求助·51单片机串口响应小程序 程序1.在液晶上显示从PC机串口上下发的数据,屏满后自动清屏.实现如下的功能:1.用下串口0模式,实现数据的移位输出2.用定时器实现波特率的计算,单片机与PC通信.3.实现多机通信.4.高级串口功能的应用,请参看Keil的print等串口输出函数.这时候可实现串口向上位机输出字符串等功能,上位机向下位机发送命令等功能.如用PC机发送一个字符串"Hello,world"单片机用puts函数回送一个"Hello,my friend&q

51单片机串口通信-手机如何通过蓝牙透传模块HC-05控制51单片机STC89C52上一个led灯的亮灭?

问题描述 手机如何通过蓝牙透传模块HC-05控制51单片机STC89C52上一个led灯的亮灭? 需要先往单片机里下载什么源程序(串口程序)吗?...如果有知道的,请不吝赐教,万分感谢 解决方案 波特率调好,在设置单片机的串口通信读取就好.需要代码我可以发给你

串口通信-51单片机串口发送字符串给电脑 自己写了程序但出不了结果

问题描述 51单片机串口发送字符串给电脑 自己写了程序但出不了结果 #include unsigned char code L1[] = "123456789"; unsigned char code L2[] = "12345678"; void delay(void) { unsigned char n,m; for(m=0;m<200;m++) for(n=0;n<250;n++); } void send_str() { unsigned i =

串口通信-求51单片机用uart发送接收到的字符串

问题描述 求51单片机用uart发送接收到的字符串 51单片机用uart 把接收到的字符串 自动显示在串口调试助手上的代码. 解决方案 如果你的单片机代码支持收发,你可以直接在硬件上 将 RX 和 TX 端口短接,这样你在PC 上面发什么下来,同时PC 就会接收到什么.