求助高手:单片机对外部EEPROM进行读写的程序,在仿真时能将结果显示在发光二极管上。

作者&投稿:兴狭 (若有异议请与网页底部的电邮联系)
用51单片机先在EEPROM中写入数据,然后读取数据显示在数码管上~

#include
#include
#define uchar unsigned char
sbit sda=P2^0;
sbit scl=P2^1;
sbit duan=P2^6;
sbit wei=P2^7;

uchar smg_duan[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};

void delay()
{
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
}

void start()
{
sda=1;
delay();
scl=1;
delay();
sda=0;
delay();
}

void stop()
{
sda=0;
delay();
scl=1;
delay();
sda=1;
delay();
}

void ack()
{
uchar i=0;
scl=1;
delay();
while((sda==1)&&(i<200))i++;
scl=0;
delay();
}

void noack()
{
sda=1;
delay();
scl=1;
delay();
scl=0;
delay();
}

void iicwr_byte(uchar dat)
{
uchar i;
scl=0;
for(i=0;i<8;i++)
{
if(dat&0x80)
{
sda=1;
}
else
{
sda=0;
}
dat=dat<<1;
delay();
scl=1;
delay();
scl=0;
delay();
}
sda=1;
delay();
}

uchar iicre_byte()
{
uchar i,dat;
scl=0;
delay();
sda=1;
delay();
for(i=0;i<8;i++)
{
scl=1;
delay();
dat=dat<<1;
if(sda)
{
dat++;
}
scl=0;
delay();
}
return dat;
}

void init()
{
sda=1;
scl=1;
}

void iicwrite_byte(uchar add,uchar dat)
{
init();
start();
iicwr_byte(0xa0);
ack();
iicwr_byte(add);
ack();
iicwr_byte(dat);
ack();
stop();
}

uchar iicread_byte(uchar add)
{
uchar a;
init();
start();
iicwr_byte(0xa0);
ack();
iicwr_byte(add);
ack();
start();
iicwr_byte(0xa1);
ack();
a=iicre_byte();
noack();
stop();
return a;
}

void main()
{
uchar k;
k=iicread_byte(1);
k=k%10;
duan=1;
wei=1;
P0=smg_duan[k];
k++;
iicwrite_byte(1,k);
while(1);
}

用串口输出或者直接在液晶上显示就可以了。

/*-----------------------------------------------
名称:IIC协议 EEPROM24c02
公司:上海浩豚电子科技有限公司
编写:师访
日期:2009.5
修改:无
内容:此程序用于检测EEPROM性能,测试方法如下:写入24c02一些数据,然后在内存中清除这些数据,
掉电后主内存将失去这些信息,然后从24c02中调入这些数据。看是否与写入的相同。
------------------------------------------------*/
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include <intrins.h> //包含NOP空指令函数_nop_(); #define AddWr 0xae //写数据地址,需要参考24c02芯片文档
#define AddRd 0xaf //读数据地址
sbit Sda=P1^2; //定义总线连接端口
sbit Scl=P1^1;
sbit WP=P1^0; //写保护,这里不使用/*------------------------------------------------
延时程序
------------------------------------------------*/
void mDelay(unsigned char j)
{
unsigned int i;
for(;j>0;j--)
{
for(i=0;i<125;i++)
{;}
}
}/*------------------------------------------------
启动IIC总线
------------------------------------------------*/
void Start(void)
{
Sda=1;
_nop_();_nop_();
Scl=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
Sda=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
Scl=0;
}
/*------------------------------------------------
停止IIC总线
------------------------------------------------*/
void Stop(void)
{
Sda=0;
_nop_();
Scl=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
Sda=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
Scl=0;
}
/*------------------------------------------------
应答IIC总线
------------------------------------------------*/
void Ack(void)
{
Sda=0;
_nop_();_nop_();_nop_();
Scl=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
Scl=0;
_nop_();_nop_();
}
/*------------------------------------------------
非应答IIC总线
------------------------------------------------*/
void NoAck(void)
{
Sda=1;
_nop_();_nop_();_nop_();
Scl=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
Scl=0;
_nop_();_nop_();
}
/*------------------------------------------------
发送一个字节
------------------------------------------------*/
void Send(unsigned char Data)
{
unsigned char BitCounter=8;
unsigned char temp; do
{
temp=Data;
Scl=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
if((temp&0x80)==0x80)
Sda=1;
else
Sda=0;
Scl=1;
temp=Data<<1;
Data=temp;
BitCounter--;
}
while(BitCounter);
Scl=0;
}
/*------------------------------------------------
读入一个字节并返回
------------------------------------------------*/
unsigned char Read(void)
{
unsigned char temp=0;
unsigned char temp1=0;
unsigned char BitCounter=8; Sda=1;
do
{
Scl=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
Scl=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
if(Sda)
temp=temp|0x01;
else
temp=temp&0xfe; if(BitCounter-1)
{
temp1=temp<<1;
temp=temp1;
}
BitCounter--;
}
while(BitCounter);
return(temp);
}

/*------------------------------------------------
写入数据
------------------------------------------------*/
void WrToROM(unsigned char Data[],unsigned char Address,unsigned char Num)
{
unsigned char i;
unsigned char *PData;
PData=Data;
for(i=0;i<Num;i++)
{
Start();
Send(AddWr); //写入芯片地址
Ack();
Send(Address+i);//写入存储地址
Ack();
Send(*(PData+i));//写数据
Ack();
Stop();
mDelay(20);
}
}/*------------------------------------------------
读出数据
------------------------------------------------*/
void RdFromROM(unsigned char Data[],unsigned char Address,unsigned char Num)
{
unsigned char i;
unsigned char *PData;
PData=Data;
for(i=0;i<Num;i++)
{
Start(); //写入芯片地址
Send(AddWr);
Ack();
Send(Address+i);//写入存储地址
Ack();
Start();
Send(AddRd); //读入地址
Ack();
*(PData+i)=Read();//读数据
Scl=0;
NoAck();
Stop();
}
}/*------------------------------------------------
主程序
------------------------------------------------*/
void main()
{
unsigned char Number[4]={0x06,0x5b,0x4f,0x66};// 显示码值 1234
unsigned char i;
WP=0; //写保护关掉
P2=0x00;

WrToROM(Number,4,4); //写入24c02
mDelay(200);
Number[0]=0; //清除当前数据
Number[1]=0;
Number[2]=0;
Number[3]=0;
RdFromROM(Number,4,4); //调用存储数据

while(1)
{

P0=Number[i]; //显示存储数据
mDelay(200); //延时用于演示显示数据
mDelay(200);
if(P3==0xfe)i++;
if(i==4)
i=0;
}
} 电路连接好 下载进去就可以了

只要找到外部存储器的起始地址或之后的,然后对应地址写数据就成了噻,然后在再从写数据的起始地址开始读数据!你单片机是几位的,LED有几个啊,如果是8位单片机,需要八个LED灯才能显示完全部数据!


高手帮个忙吧,谁知道单片机中psw=87的具体含义。具体点。谢谢了,坐等...
PSW 是程序状态字,8位,从高位起定义如下:(1)Cy(PSW.7)PSW.7是Cy即进位C,来源于最近一次算术指令或逻辑指令执行时软硬件的改写。(2)Ac(PSW.6) 辅助进位标志位,用于BCD码的十进制调整运算。当低四位向高四位借进位时Ac被置1,否则清0。此位也可和DA指令结合起来用。(3)F0(PSW.5...

电子信息工程专业有必要学习单片机吗?请给理由
娴熟的单片机C语言编程、会使用Protel软件或 AltiumDesigner软件设计PCB板和具备一定的英文阅读能力,你就是一个遇强则强的单片机高手了。[2] 抗干扰设计在...通过学习单片机,我们可以了解其中的原理和工作方式,进一步掌握电子信息系统设计和开发的核心技术。学习单片机有助于提高我们的问题解决能力和创新能力。在实际...

单片机解密的解密方法
因此非常廉价。大部分非侵入型攻击需要攻击者具备良好的处理器知识和软件知识。与之相反,侵入型的探针攻击则不需要太多的初始知识,而且通常可用一整套相似的技术对付宽范围的产品。因此,对单片机的攻击往往从侵入型的反向工程开始,积累的经验有助于开发更加廉价和快速的非侵入型攻击技术。

单片机 已经烧写进去程序了 但是我把这个程序忘了 能不能从单片机里面把...
如果单片机没有加密,可以把程序读出来。但是,读出来的并不是源程序,而是源程序编译之后生成的机器码。如果想得到源程序,可借助于反编译工具。但是,反编译之后得到的代码很难读懂。

单片机如果是8位的,那么它的数据总线是否有可能是16的,还是它的数据总...
一个计算机,内部通常有三条总线:地址总线,控制总线,数据总线 通常来说,三者的总线并不一定要完全相同,而说一个计算机是多少位的,就是指数据总线是多少位的.比如X86是16位机,其数据总线是16位的,其地址总线却是20位的,可以访问1M字节.51内核是8位,其数据总线是8位的.虽然51的地址取指总线也是8位...

我学的是电子信息工程,但我不知道从哪方面发展.
请个位高手帮我解解惑... 我学的是电子信息工程,但我不知道从哪方面发展.也不知道有哪些方面可以发展.我不知该怎么办?请个位高手帮我解解惑. 展开 ...在此推荐一本《电子设计丛零开始》(杨欣编著,清华大学出版社出版),该书比较系统全面地介绍了电子设计与制作的基础知识,模电、数电、单片机、Multisim电路仿真...

亲! 来看一下我这上网本还有没有利用价值。各功能能正常使用。就是版本...
28、把它改成单片机——比如做个电子宠物狗,和索尼公司竞争市场份额……29、路由器——如果家里有好几台电脑,可用一台自制“路由器”共享宽带。你和老婆...利用LPT口对外控制家用电器,实时数据交换!!远程网络监视!!!等等!!!44、珍藏——你可以将外壳等笨重的东西处理掉哦.剩下的板卡留做纪念.装在一个盒子里,...

懂PC机与单片机通过485通信的高手进,谢谢了。
232)或USB等;2,485用光耦偶合时,电阻值的选取比较关键;不能发送可能有这么几个可能性:单片机TX故障,TX光耦电路故障,485芯片TX故障,电脑转换接口RX故障;可以用示波器(同楼上说明),也可以使用互换法(用好的板子上的元件,换下可疑元件),试试!助早日解决!

学单片机是先学汇编语言还是C语言?
我建议是先学汇编,我也是先学的汇编,现在网上大部分视频都是零起步,教c的,但是同一个程序用c编写要比汇编大很多,而且汇编能从硬件上认识单片机,编写出来的程序运行效率高,我是零基础学的,学了一段时间后自己看了点网上的视频,c也能完成一些简单的程序了(我的c也是零基础),所以我建议是先...

单片机C51实现按键一次数码管加1程序问题。高手进。
设计一个单片机C51程序,实现功能是,1、按KEY1只有红灯亮,KEY2只有黄灯亮,KEY3只有绿灯亮。2、开始右数码管显示0,每按KEY1一次数码管显示加1,至9后再循环。先已经编好程序,第一个实现,但第二个总弄不对。感觉问题很简单,就是差一点,高手帮我看一下。... 展开 #...

东山县17598516160: 求助高手:单片机对外部EEPROM进行读写的程序,在仿真时能将结果显示在发光二极管上.
玉哄莱亿: /*----------------------------------------------- 名称:IIC协议 EEPROM24c02 公司:上海浩豚电子科技有限公司 编写:师访 日期:2009.5 修改:无 内容:此程序用于检测EEPROM性能,测试方法如下:写入24c02一些数据,然后在内存中清除这些数据...

东山县17598516160: 单片机执行外部EEPROM程序 -
玉哄莱亿: 是一边读指令一边执行.建议偿试:一、在EEPROM端用示波器查一下PSEN和ALE的时序.二、在EEPROM内写入75 90 ff 22,如果上电后P1口全是高电平,则正常.三、在EEPROM内写入75 90 00 22,如果上电后P1口全是低电平,则正常.四、如果通过了第二、三步的测式,还是不能运行的话,在代码里查找对P0、P2口的操作,把这些操作都停掉.使用外部程序存储器时,最好不要再用P0、P2口做GPIO.五、第四步这后还没有效果的话,估计硬件还是有问题.

东山县17598516160: 如何用51单片机来检测一个外接EEPROM的好坏 -
玉哄莱亿: EEPROM存储器,有并行的,如28系列的,IIC的,如24系列的. 24系列的,比较好接电路,只需要2个脚与单片机相连,重点是写IIC通信程序.逐个单元写入一个特定的数,如AAH,55H等,然后再读出来,看是否相同,如有一个单元的数据读/写不同,就说明芯片有问题. 并行的,如28系列的,要与单片机连接,就有点麻烦,需要用到地址总线,数据总线,读/写控制线,扩展成外部数据存储器电路.检测好坏的方法与上面的相同.

东山县17598516160: 基于PIC单片机对EEPROM读写的一种方法 -
玉哄莱亿: 是需要读写程序吗?从指定地址下读取一个字节:uchar ReadEEPROM(uchar EE_Addr) { EEADR=EE_Addr; //给地址 EEPGD=0; // RD=1; //开始读 return EEDATA; //直接返回读取的EEPROM } 将一个字节的数据写入指定地址里:bool ...

东山县17598516160: 51单片接的外接存储器EEPROM的地址究竟怎么用? -
玉哄莱亿: E0,E1,E2是EEPROM的片选地址(这个3个管脚都有效的话,非NC).当E0接Vcc时,其他两个接地,那么发信号start+1010_001_0/1就可以访问该EEPROM(1010:为EEPROM的通用器件地址;001:为E2、E1、E0的状态;0:对应写命令,1:对应读命令);若都接Vcc,发start+1010_111_0/1;以此类推. EEPROM的数据地址是接着写命令后发. 希望对你有所帮助!

东山县17598516160: 单片机与EEPROM通信问题 -
玉哄莱亿: 主要的程序就是以下几个,直接调用就可以了***************************************************************************///声明ISP/IAP/EEPROM寄存器地址//--------------------------------------------------------------------- sfr isp_data=0xe2; sfr isp_addressh=0xe3; sfr ...

东山县17598516160: 请问一下:PIC单片机对外部EEPROM进行读写的程序,在仿真时能将结果显示在发光二极管上. -
玉哄莱亿: 你在网上找51单片机对EEPROM读写,或找24C16读写程序,或找I2C接口EEPROM读写程序,会很多的 因为PIC的单片机大都有内部的,所以你搜PIC的,一般情况都是内部的

东山县17598516160: 51单片机如何往EEPROM 如何写掉电存储汇编程序. -
玉哄莱亿: 51单片机如何往EEPROM ,不同品牌的有点不一样,如 STC 系列的 读写方法 汇编 ; / *** *** *** *** *** / 读写 STC12C5204 EEPROM; / *** *** *** *** *** / 2K 字节 写 100,000 次 ; 0000-01FFH 0200-03FFHISPRH EQU 7AHISPRL EQU 7BH ...

东山县17598516160: 单片机外接EEPROM存储的问题 -
玉哄莱亿: 只要数据总容量不大于EEPROM芯片的容量,可以储存. 但只能以二进制数据储存,不能如硬盘U盘那样以文件方式储存.

东山县17598516160: 在avr单片机上对EEPROM的一个地址写一个数据,如write(1,0x01),write(2,0xFF) -
玉哄莱亿: EEP简单操作方法:写操作:EEPROMwrite(0X001B,1); 把1写进0x001B这个地址.读操作:i=EEPROMread(0X001B); 把0x001B这个地址的数据读到i里,也就是i=1.这样操作读写的数据才会正确.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网