资源简介
此程序为C51编写的24C01-24C16读写驱动程序,晶振22.1148,如果是其他的晶振,需要更改其中的两个延时函数,要保证1MS和5US的延时,在调用其中的write函数后,最好是延时10MS以上,否则容易失败,我最初就是这个地方延时时是5MS始终失败,搞了很久,后来把这个地方更改以后就成功了.在其中包括了一个PROTEUS仿真电路,运行时首先会写入一个字节到24C02中,然后读出取反给P1显示,显示结果是01100110B,中间间隔2个LED亮,2个不亮.
代码片段和文件信息
#include “reg52.h“
#include “intrins.h“
#define uchar unsigned char
#define uint unsigned int
sbit sda=P0^1;//;模拟I2C 数据传送位
sbit scl=P0^0;//;模拟I2C 时钟控制状态标志
void delay1(uint z)//延时为 1ms
{
unsigned char abc;
for(c=0;c for(b=80;b>0;b--)
for(a=10;a>0;a--);
}
void delay()//5us延时
{
unsigned char a;
for(a=3;a>0;a--);
}
void star()//开始
{
sda=1;
delay();//5us延时
scl=1;
delay();//5us延时
sda=0;
delay();//5us延时
}
void stop()//停止
{
sda=0;
delay();//5us延时
scl=1;
delay();//5us延时
sda=1;
delay();//5us延时
}
void ack()//应答
{ uchar z=0;
while((sda==1)&&(z<50))z++;//条件判断, sda=1,则没有应答。如果没有应答则延时:z<50,z++;后返回
scl=0;
delay();//5us延时
}
///写一个数据函数
//器件写地址 slave_write_address
//字节地址 byte_address
//待写入数据 data_data
void write(uchar slave_write_addressuchar byte_addressuchar data_data)//写一个数据
{
uchar temptemp1iii;
star();//开始
for(ii=0;ii<3;ii++)//根据 24CXX文档资料,和时序图,按顺序送:器件写地址,字节地址,数据
{
if(ii==0)
{
temp=slave_write_address;//送 器件写地址
temp1=slave_write_address;
}
else if(ii==1)
{
temp=byte_address;//送 字节地址
temp1=byte_address;
}
else if(ii==2)
{
temp=data_data;//送 数据
temp1=data_data;
}
for(i=0;i<8;i++)
{
scl=0;
delay();//5us延时
temp=temp1;
temp=temp&0x80;// 相 与 后,把不相关的位清零
if(temp==0x80)//根据前面 相 与 后,判断 temp是否等于0x80,是则该位为 1
sda=1;
else
sda=0;
delay();//5us延时
scl=1;
delay();//5us延时
scl=0;
delay();//5us延时
temp1=temp1<<1;//向左移出1位
}
sda=1;
delay();//5us延时
scl=1;
delay();//5us延时
ack();
}
stop();//停止
}
///读一个数据函数
//器件写地址 slave_write_address
//器件读地址 slave_read_address
//字节地址 byte_address
//读出的数据 data_data
uchar read(uchar slave_write_addressuchar byte_addressuchar slave_read_address)//读一个数据
{
uchar temptemp1iiixdata_data;
star();//开始
for(ii=0;ii<3;ii++)//根据 24CXX文档资料,和时序图,按顺序送:器件写地址,字节地址,器件读地址
{
if(ii==0)
{
temp=slave_write_address;//送 器件写地址
temp1=slave_write_address;
}
else if(ii==1)
{
temp=byte_address;//送 字节地址
temp1=byte_address;
}
else if(ii==2)
{
star();//开始
temp=slave_read_address;//送 器件读地址
temp1=slave_read_address;
}
for(i=0;i<8;i++)//开始读数据
{
scl=0;
delay();//5us延时
temp=temp1;
temp=temp&0x80;// 相 与 后,把不相关的位清零
if(temp==0x80)//根据前面 相 与 后,判断 temp是否等于0x80,是则该位为 1
sda=1;
else
sda=0;
delay();//5us延时
scl=1;
delay();//5us延时
scl=0;
delay();//5us延时
temp1=temp1<<1;//向左移出1位
}
sda=1;
delay();//5us延时
scl=1;
delay();//5us延时
ack();//应答
}
for(x=0;x<8;x++)
{
data_data=data_data<<1;//向左移入1位
sda=1;
delay();//5us延时
scl=0;
delay();//5us延时
scl=1;
delay();//5us延时
if(sda==1)//判断 数据线是否是高电平
data_data|=0x01;//把读到的数据 或 0X01
//else
//data_data|=0x00;
}
ack();//应答
stop();//停止
return data_data;//返回读到的数据
}
void main()
{
write(0xa00xff0x66);//向器件写一个数据:(0xa0 是器件写地址;0xff 是字节地址;0x66 是待写入的数据)
delay1(30);//写与读的时间间隔应大于10ms取决于器件 24C02的响应速度
//向器件读一个数据
//把读出的数据送 P1口显示
P1=~read(0xa00xff0xa1);//向器件读一个数据:(0xa0 是器件写地址;0xff 是字节地址;0xa1 是器件读
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 7905 2010-08-13 16:04 24c02-16
文件 3521 2010-08-13 16:04 24c02-16.c
文件 8224 2010-08-13 16:04 24c02-16.OBJ
....... 13421 2010-08-13 16:04 24c02-16.uvproj
文件 1041 2010-08-13 16:04 24c02-16.hex
文件 64 2010-08-13 16:04 24c02-16.lnp
文件 7538 2010-08-13 16:04 24c02-16.LST
文件 12704 2010-08-13 16:04 24c02-16.M51
....... 56644 2010-08-13 16:04 24c02-16.uvopt
....... 57622 2010-08-11 08:40 24c02-16_uvopt.bak
....... 13421 2010-08-10 23:19 24c02-16_uvproj.bak
文件 99723 2010-08-13 16:04 24c64.DSN
文件 885 2010-08-13 16:04 24c64.PWI
文件 19 2010-08-11 08:40 ExtDll.iex
文件 99700 2010-08-11 08:40 Last Loaded 24c64.DBK
文件 749 2010-08-13 16:04 STARTUP.OBJ
文件 6376 2009-05-07 14:37 STARTUP.A51
文件 14048 2010-08-13 16:04 STARTUP.LST
文件 1002 2010-08-13 16:04 24c02-16.plg
----------- --------- ---------- ----- ----
404607 19
- 上一篇:DES加密解密算法C++程序设计
- 下一篇:MAX485两个单片机半双工通信
相关资源
- MAX485两个单片机半双工通信
- pic18系列单片机C语言程序例程
- 基于8051单片机的数字电压表设计
- 基于51单片机的电子琴程序 protues仿真
- 单片机课程设计教程
- 51单片机做红外遥控
- 51单片机GPS程序
- 51单片机C语言电流电压测量代码
- 基于STM32单片机的多路数据采集系统设
- labview与单片机rs232串口通信
- 基于51单片机的c语言编写的计算器程
- 基于C语言STC89C52单片机电子密码锁的
- 基于51单片机的DDS信号发生器AD9833程序
- 一个基于单片机的温湿度程序
- GSM发短信 GPS 单片机C语言实现
- 基于单片机的温度智能控制系统
- 基于 51 单片机 多进程 多任务 纯 C语
- 单片机简易计算器的设计包含设计报
- 51单片机控制PS2键盘的程序KEIL环境C
- 8052单片机温度计程序
- 单片机课程设计数字温度控制器
- FFT算法的C语言实现可以直接用在单片
- 单片机TEA算法加密程序
- 基于STM32单片机+MPU6050传感器做的载人
- 基于51单片机Max7219驱动8×8点阵PROTEU
- 基于51单片机控制的篮球比赛计时、计
- C8051F120单片机C语言程序代码,经典例
- 基于51单片机的人体感应灯设计
- 51单片机产生PWM的程序和怎样控制直流
- 51单片机Modbus协议
评论
共有 条评论