资源简介
此程序为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两个单片机半双工通信
相关资源
- 单片机c语言源程序(51定时器 八个按
- 用单片机控制蜂鸣器播放旋律程序(
- 合泰触摸单片机BS84B08C实际应用代码上
- 基于STM32单片机的心率体温测量仪
- 九齐单片机源码
- 单片机PID控制(C语言)
- 基于单片机的交通灯设计.doc
- C51单片机技术教程(304页)
- C51单片机交通
- 单片机C语言实战开发108例
- stm32库函数代码自动生成器V1.2
- 单片机电子密码锁
- 单片机程序(附初级、中级、高级共
- 按键可调万年历(单片机程序)
- 51单片机数码管四层电梯模拟系统
- 基于51单片机的温控系统
- 51单片机protues文件(KST-51.DSN)
- 51单片机交通灯设计
- 基于51单片机的简易计算器
- 单片机按键长按
- 基于51单片机多路超声波报警设计
- 51单片机红外智能小车
- 单片机控制绕线机.c
- qt上位机采集51单片机温湿度数据
- AVR单片机SPI通讯程序 (C语言源代码)
- BP神经网络C语言工程当前最终版
- 汉字取模软件----单片机使用必备
- 基于51单片机射频RFID卡考勤上课上班
- 基于C51与1602液晶显示屏的万年历电子
- 可以在单片机上计算的BP神经网络C语
川公网安备 51152502000135号
评论
共有 条评论