1. 首页 > 科技

89c52,单片机实验,需要读取存储器内的值并赋给另一个储存空间,编译没问题,但没实现功能?

89c52,单片机实验,需要读取存储器内的值并赋给另一个储存空间,编译没问题,但没实现功能?

89S51单片机的片内程序储存和数据存储器分别来存放什么内容,存储器容量分别为?

片内程序储存器存放程序和表格等常数,数据存储器用来存放运算的中间结果。

其大小分别为4KB和128字节

STC89C52单片机如何在运行时向EEPROM内写入数据,使数据断电后不消失,下次运行继续用.

STC89C52RC,有4K的eepROM。

以下是个实例:

/***************************************************************

作品:EEPROM实验,开机还原关电前LED的亮灭状况

单片机:STC89C52RC

晶振:12M

编译环境:Keil uVision4 V9.00

***************************************************************/

#include <STC89C52RC.H>

#include <intrins.h>

#define uchar unsigned char

#define uint unsigned int

sbit LED1 = P1^1;

sbit LED2 = P1^2;

sbit K1 = P3^2; //按钮1

sbit K2 = P3^3; //按钮2

void cc(uint addr);

void xcx(uint addr,uchar dat);

uchar dcx(uint addr);

void Q0();

/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈

函数:主程序

┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/

void main(void)

{

uchar V;

V = dcx(0x2002); // 开机读取EEPROM区2002h数据,还原关电前LED的亮灭状况

if(V == 2) {LED1=0;LED2=1;}

else if(V == 6){LED1=0;LED2=0;}

while(1)

{

if(!K1)

{

while(!K1);

LED1=0;LED2=1;

cc(0x2000); // 擦除第1个扇区(2000h~21FFh)

xcx(0x2002,2); // 对EEPROM区2002h写入2

}

if(!K2)

{

while(!K2);

LED1=0;LED2=0;

cc(0x2000); // 擦除第1个扇区(2000h~21FFh)

xcx(0x2002,6); // 对EEPROM区2002h写入6

}

}

}

/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈

函数:擦除某一扇区(每个扇区512字节)

入口:addr = 某一扇区首地址

┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/

void cc(uint addr)

{

// 0x83(晶振<5M) 0x82(晶振<10M) 0x81(晶振<20M) 0x80(晶振<40M)

ISP_CONTR = 0x81; // 打开 IAP 功能(ISPEN(ISP_CONTR.7)=1:允许编程改变Flash, 设置 Flash 操作等待时间。

ISP_CMD = 0x03; // 用户可以对"Data Flash/EEPROM区"进行扇区擦除

ISP_ADDRL = addr; // ISP/IAP操作时的地址寄存器低八位,

ISP_ADDRH = addr>>8; // ISP/IAP操作时的地址寄存器高八位。

EA =0;

ISP_TRIG = 0x46; // 在ISPEN(ISP_CONTR.7)=1时,对ISP_TRIG先写入46h,

ISP_TRIG = 0xB9; // 再写入B9h,ISP/IAP命令才会生效。

_nop_();

Q0(); // 关闭ISP/IAP

}

/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈

函数:写一字节

入口:addr = 扇区单元地址 , dat = 待写入数据

┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/

void xcx(uint addr,uchar dat)

{

ISP_CONTR = 0x81;

ISP_CMD = 0x02; // 用户可以对"Data Flash/EEPROM区"进行字节编程

ISP_ADDRL = addr;

ISP_ADDRH = addr>>8;

ISP_DATA = dat; // 数据进ISP_DATA

EA = 0;

ISP_TRIG = 0x46;

ISP_TRIG = 0xB9;

_nop_();

Q0(); // 关闭ISP/IAP

}

/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈

函数:读一字节

入口:addr = 扇区单元地址

出口:dat = 读出的数据

┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/

uchar dcx(uint addr)

{

uchar dat;

ISP_CONTR = 0x81;

ISP_CMD = 0x01; // 用户可以对"Data Flash/EEPROM区"进行字节读

ISP_ADDRL = addr;

ISP_ADDRH = addr>>8;

EA = 0;

ISP_TRIG = 0x46;

ISP_TRIG = 0xB9;

_nop_();

dat = ISP_DATA; // 取出数据

Q0(); // 关闭ISP/IAP

return dat;

}

/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈

函数:关闭ISP/IAP操作

┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/

void Q0()

{

ISP_CONTR = 0; // 关闭IAP功能

ISP_CMD = 0; // 待机模式,无ISP操作

ISP_TRIG = 0; // 关闭IAP功能, 清与ISP有关的特殊功能寄存器

}

STC89C52RC内部EEPROM详细地址表:

第一扇区 第二扇区 第三扇区 第四扇区

起始地址 结束地址 起始地址 结束地址 起始地址 结束地址 起始地址 结束地址

2000h 21FFh 2200h 23FFh 2400h 25FFh 2600h 27FFH

第五扇区 第六扇区 第七扇区 第八扇区

起始地址 结束地址 起始地址 结束地址 起始地址 结束地址 起始地址 结束地址

2800h 29FFh 2A00h 2BFFh 2C00h 2DFFh 2E00h 2FFFh

89c52单片机如何保存一个数字让他在数码管上显示出来

将这个数存在暂存单元里,按下按键时,取出这个数并处理 。

89c52单片机位寻址

对位地址中的内容进行微操作的寻址方式成为位寻址。

由于单片机中只有内部RAM和特殊功能寄存器的部分单元有位地址,因此位寻址只能对有位地址的这两个空间进行寻址操作。位寻址是一种直接寻址方式,由指令给出直接为的地址。与直接寻址不同的是,位寻址只给出位地址,而不是字节地址。

例如:(这是汇编的)

SETB 20H //即给20H位地址置1

MOV 32H,C //把进位位C的值放入32H位地址。C的值只能为1或者是0。.

**************************************************************************

MOV 30H,20H //直接寻址:指令中直接给出操作数的地址(只能在内部数据存储器和特殊功 能寄存器中使用。)

单片机里的寻址方式很多的,弄明白是很有必要的,也很重要,你最好是找本书,自己看透了。