当前位置:首页 > 生活百科

c51单片机编程教程(分享单片机编程步骤)

栏目:生活百科日期:2025-05-05浏览:0

自己学习记录用,有些乱,

1、IIC,eeprom24c02驱动配置

本实验是基于EEPROM的24C02驱动配置的编程,主要记录一些编程的重点节点的理解:

1、IIC驱动配置:精准的时钟配置,计算每一步所需要的指令周期,相加是10us。

2、IIC的起始信号配置,根据IIC的时序特性配置。

3、IIC终止信号配置,根据IIC的时序特性配置。

4、I2cSendByte(unsigned char dat): 通过I2C发送一个字节。在SCL时钟信号高电平期间,保持发送信号SDA保持稳定。

5、I2cReadByte(),函数功能 : 使用I2c读取一个字节

6、void At24c02Write(unsigned char addr,unsigned char dat) 函数功能 :向 24c02的一个地址写入一个数据。

发送写器件地址是根据24C02的电路特性和地址特性获得。24C02是有E0,E1,E2寻址,根据下面两图片可知是8位寻址,因E0、E1、E2引脚接地,而是写所以,R/W位为零。,即发送器件地址位0xa0,同理接收时,接收器件地址为0xa1.

7、unsigned char At24c02Read(unsigned char addr)函数功能 : 读取24c02的一个地址的一个数据

2、24C02或者24C16进行字节、页读取、页存取

void i2cStart(void) //开始时序{SDA=1;SCL=1;_delay(2); //延时2μsSDA=0;_delay(2);SCL=0;}void i2cStop(void) //结束时序{SDA=0;_delay(2);SCL=1;_delay(2);SDA=1;}void i2cAck_MCU(void) //应答时序{SDA=0;_delay(2);SCL=1;_delay(2);SCL=0;_delay(2);SDA=1;_delay(4);}void i2cNoAck_MCU(void) //非应答时序{SDA=1;_delay(2);SCL=1;_delay(2);SCL=0;_delay(2);}

24C02/16存储空间大小

24C02就是有2Kbit = 2000/8 = 250个字节,24C16就是有16kbit = 2000个字节,24C02一页最多可以写入8个字节,因此可以分成32页,24C16一页最多可以写入16个字节,因此可以分成128页。
1、字节写操作

void WriteByte_24LC16B(unsigned char input)

{

unsigned char bit_count;

for(bit_count=8;bit_count!=0;bit_count&–)

{

_delay(2);

SDA=(_Bool)(input&&0x80);

_delay(2);

SCL=1;

_delay(2);

SCL=0;

input=input&<&<1;

_delay(2);

}

SDA=1;

SDA_CTRL=1;//这里需要看自己使用的芯片设置SDA的IO口为输入状态,我用的是HT45F67芯片,SDA端口设置为输入状态,用于判断SDA是否接到主机的应答信号

_delay(2);

SCL=1;

_delay(2);

if(SDA == 1)

ack = 0;

else

ack = 1;

SCL=0;

SDA_CTRL=0; //此处根据自己所使用的芯片将SDA所在的Io口设置为输出状态

}

void Write_24LC16B(unsigned char Wdata,unsigned int RomAddress)

{

unsigned char block;

WriteDeviceAddress=0B10100000;

block=RomAddress/256;

RomAddress=RomAddress%256;

WriteDeviceAddress=WriteDeviceAddress|(block&<&<1);

i2cStart();

WriteByte_24LC16B(WriteDeviceAddress);

WriteByte_24LC16B((unsigned char)RomAddress);

WriteByte_24LC16B(Wdata);

i2cStop();

_delay(5500);

}

2、字节读操作

unsigned char ReadByte_24LC16B()

{

unsigned char bit_count,rbyte=0;

SDA=1;

SDA_CTRL=1;

_delay(10);

for(bit_count=8;bit_count!=0;bit_count&–)

{

rbyte=rbyte&<&<1;

_delay(2);

SCL=1;

rbyte=rbyte|((unsigned char)(SDA));

_delay(2);

SCL=0;

_delay(2);

}

SDA_CTRL=0;

return(rbyte);

}

unsigned char Read_24LC16B(unsigned int RomAddress)

{

unsigned char output,block;

ReadDeviceAddress=0B10100001;

WriteDeviceAddress=0B10100000;

block=RomAddress/256;

RomAddress=RomAddress%256;

WriteDeviceAddress=WriteDeviceAddress|(block&<&<1);

ReadDeviceAddress=ReadDeviceAddress|(block&<&<1);

i2cStart();

WriteByte_24LC16B(WriteDeviceAddress);

WriteByte_24LC16B((unsigned char)RomAddress);

i2cStart();

WriteByte_24LC16B(ReadDeviceAddress);

output=ReadByte_24LC16B();

i2cNoAck_MCU();

i2cStop();

_delay(2000);

return(output);

}

3、页写操作

Wdata为输入数组的首地址,RomAddress为需要进行存储的地址,范围在0~2047之间,cnt为一次需要写入的字节个数,建议采用8的倍数的cnt,因为本函数不采用自动分页,不是8的倍数会在超出页写入最多的字节数之后覆盖掉原来的数。

void WritePage_24LC16B(unsigned char *Wdata,unsigned int RomAddress,unsigned char cnt)

{

unsigned char block;

WriteDeviceAddress=0B10100000;

block=RomAddress/256;

RomAddress=RomAddress%256;

WriteDeviceAddress=WriteDeviceAddress|(block&<&<1);

i2cStart();

WriteByte_24LC16B(WriteDeviceAddress);

WriteByte_24LC16B((unsigned char)RomAddress);

while(cnt&–)

{

WriteByte_24LC16B(*Wdata++);

}

i2cStop();

}

注意:连续进行多页写操作,需要在WritePage_24LC16B函数后添加150μs以上的延迟,这段时间,24C02内部需要将数据存储到芯片内部。

例子:

D_buffer[8] = {1,2,3,4,5,6,7,8};

WritePage_24LC16B(D_buffer,0,8);

_delay(150); //延迟150μs以及以上

WritePage_24LC16B(D_buffer,8,8);

4、页读操作
void ReadPage_24LC16B(unsigned char *Rdata,unsigned int RomAddress,unsigned char cnt)

{

unsigned char block;

ReadDeviceAddress=0B10100001;

WriteDeviceAddress=0B10100000;

block=RomAddress/256;

RomAddress=RomAddress%256;

WriteDeviceAddress=WriteDeviceAddress|(block&<&<1);

ReadDeviceAddress=ReadDeviceAddress|(block&<&<1);

i2cStart();

WriteByte_24LC16B(WriteDeviceAddress);

WriteByte_24LC16B((unsigned char)RomAddress);

i2cStart();

WriteByte_24LC16B(ReadDeviceAddress);

while(cnt&>1)

{

*Rdata++ = ReadByte_24LC16B();

cnt&–;

i2cAck_MCU();//发送完读地址后,需要应答一下

}

*Rdata = ReadByte_24LC16B();

i2cNoAck_MCU();//读取最后一个字节需要非应答

i2cStop();

_delay(2000);

“c51单片机编程教程(分享单片机编程步骤)” 的相关文章

便携服务器终端(便携终端管理程序)

在去年年末,Clockwork公布了一套名为DevTerm的开源便携式终端。DevTerm从上世纪80年代流行的TandyTRS-80便携式PC中汲取灵感,仅有...

cad画虚线快捷键命令(cad角度命令输入方法)

CAD在我们打工人心目中,简直绝了。但是日常工作中,总觉得有点不得劲的地方,所以熟悉掌握和运用快捷键是我们提高绘图速度的法宝之一,下面了解下快捷键都有哪些!一、...

什么是项目管理信息系统(项目管理系统的4个重要特征)

在日常的项目工作中,不知道大家会不会发现以下的这些问题:1、项目越来越大,似乎所有事情都不能跟踪,很多事情都挤在一起十分混乱。虽然有Excel表等传统工具,帮助...

三星死机如何解决(手机强制恢复出厂设置)

5月23日凌晨,大量三星手机用户反馈,自己的手机出现了黑屏、重启、死机等不正常现象。从目前的情况来看,问题依然没有解决,而且根据网友在微博、贴吧发帖的情况来看,...

aso优化学习的主要内容是什么(优化aso的7个重点内容)

ASO是提升APP在各个应用市场排行榜(榜单排名)和搜索结果(关键词)排名的过程。ASO日常工作中,需重点关注榜单和关键词的排名变化。APP通过ASO获得更多流...

lol转服要多久一次(有关英雄联盟转服知识点)

转区系统将于7月22日下午14:00时重新开放,与旧版转区系统相比,转区系统2.0进行了如下升级与变更:1我们不会因为转区冻结召唤师在任何大区的角色,只是转区过...

4s店送的基础保养包括什么(13个基础保养项目)

一般保养车主们都会选择去4S店,因为比较专业、正规,那4S店保养项目有哪些呢?下面一起来看看4S店保养项目汇总。4S店保养项目汇总1、车身内外照明电器及用电设备...

企业推广文案总结(AIDA模型撰写推广文案)

本文作者将与大家分享自己对于推广文案写作的心得,即:标题和前文吸人眼球;内文成败在于是否引起用户的兴趣;内文要完成用户的信任;内文需要激起用户的行动。在笔者当时...

2020千兆路由器评测排名(200以内最强的5款路由器)

一、前言和介绍说起Wi-Fi,我们已经十分熟悉,虽然该技术距今只有28年,但普及速度堪称惊人,凭借优越的网速体验迅速蔓延至全球,这种看不见摸不着的东西,存在于当...

华数电视怎么投屏手机(最实用的2种投屏方式)

今天为大家整理了一波电视投屏教程,轻松就能学会,视频、照片、游戏一键投,大屏观看更畅快!视频投屏小屏追剧不过瘾,投屏功能来帮你。将手机与电视连接同一Wi-Fi,...