📄 serial_kuozhan_c.c
字号:
//***************************************************
//实现功能:实现单片机模拟IIC总线对24cxx的读写
//目标板 :至强51开发板
//开发商 :电子开发网www.dzkf.com (专业提供开发方案,
// 电子元器件网上订购,单片机培训服务)
//对开发板有什么疑问,请上我们的论坛bbs.dzkf.com探讨
//***************************************************
#define uchar unsigned char
#define uint unsigned int
#define device_addr 0xa0
#include <reg51.h>
sbit scl=P1^2; //24c02 SCL
sbit sda=P1^1; //24c02 SDA
sbit P16=P1^6;
sbit P15=P1^5;
sbit P14=P1^4;
sbit P13=P1^3;
uchar temp_write[]={2,3,4};
uchar temp_read[3];
uchar read_byte(uchar address); //从24c02的地址address中读取一个字节数据
void write_byte(uchar address,uchar info); //向24c02的address地址中写入一字节数据info
void write_n_byte(uchar address,uchar w_num,uchar *p);
void read_n_byte(uchar address,uchar r_num,uchar *p);
void start(void);
void stop(void);
void send(unsigned char send_data);
void IIC_send(uchar temp);
uchar IIC_read(void);
void wait_ack(void);
//******************主函数***********************
//描 述:实现单片机模拟IIC总线对24cxx的读写
//入口参数:无
//返回参数:无
//设 计:ycj
//最后修改:时间(2006.5.4) 修改人(ycj)
//***********************************************
int main(void)
{unsigned char i;
//*******************测试写一个字节***************
//对24cxx的01h地址写一个数据08h
write_byte(1,8);
i=read_byte(1);
//读24cxx的01h地址并验证是否是刚才写进去的08h
if(i==8)
P16=0;//是,点亮P1.6脚的发光二极管
//*******************测试写n个字节***************
//从24cxx的地址02h开始连续写3个数据,分别是02h , 03h , 04h
write_n_byte(2,3,temp_write);
read_n_byte(2,3,temp_read);
//读24cxx的01h地址并验证是否是刚才写进去的08h
if(temp_read[0]==2)
P15=0;//是,点亮P1.6脚的发光二极管
if(temp_read[1]==3)
P14=0;//是,点亮P1.6脚的发光二极管
if(temp_read[2]==4)
P13=0;//是,点亮P1.6脚的发光二极管
while(1);//检验完成;
}
//*******************对24cxx读一个字节***********************
//描 述:实现单片机模拟IIC总线对24cxx的读一个字节
//入口参数:uchar address : 要读的地址
//返回参数:uchar i : 返回读到的数据
//设 计:ycj
//最后修改:时间(2006.5.4) 修改人(ycj)
//***********************************************************
uchar read_byte(uchar address)
{
uchar i;
start();
IIC_send(device_addr);
wait_ack();
IIC_send(address);
wait_ack();
start();
IIC_send(device_addr+1);
wait_ack();
i=IIC_read();
stop();
return(i);
}
//*******************对24cxx读n个字节***********************
//描 述:实现单片机模拟IIC总线对24cxx的读n个字节
//入口参数:uchar address : 要读的地址
// uchar r_num : 要读的数量
// uchar *p : 读出来存放的首地址
//返回参数:无
//设 计:ycj
//最后修改:时间(2006.5.4) 修改人(ycj)
//***********************************************************
void read_n_byte(uchar address,uchar r_num,uchar *p)
{uchar i;
start();
IIC_send(device_addr);
wait_ack();
IIC_send(address);
wait_ack();
for(i=0;i<r_num;i++)
{
start();
IIC_send(device_addr+1);
wait_ack();
*p=IIC_read();
p++;
}
stop();
}
//*******************对24cxx写n个字节***********************
//描 述:实现单片机模拟IIC总线对24cxx的写n个字节
//入口参数:uchar address : 要写入的开始地址
// uchar w_num : 要写入数据的数量
// uchar *p : 要写入的数据开始地址
//返回参数:无
//设 计:ycj
//最后修改:时间(2006.5.4) 修改人(ycj)
//**********************************************************
void write_n_byte(uchar address,uchar w_num,uchar *p)
{uchar i;
start();
IIC_send(device_addr);
wait_ack();
IIC_send(address);
wait_ack();
for(i=0;i<w_num;i++)
{
IIC_send(*p);
wait_ack();
p++;
}
stop();
}
//*******************对24cxx写一个字节***********************
//描 述:实现单片机模拟IIC总线对24cxx的写一个字节
//入口参数:uchar address : 要写的地址
// uchar info : 要写入的数据
//返回参数:无
//设 计:ycj
//最后修改:时间(2006.5.4) 修改人(ycj)
//***********************************************************
void write_byte(uchar address,uchar info)
{
start();
IIC_send(device_addr);
wait_ack();
IIC_send(address);
wait_ack();
IIC_send(info);
wait_ack();
stop();
}
//******************时间延迟函数**********************
//描 述:用指令实现延时一段时间
//入口参数:int i,为时间延迟参数
//出口参数:无
//设计人:ycj
//最后修改:时间(2006.5.4) 修改人(ycj)
//****************************************************
void delay_time(unsigned int i)
{
while(i)
i--;
}
//****************IIC产生start信号函数*****************
//描 述:模拟IIC总线发送一个start信号
//入口参数:无
//返回参数:无
//设 计:ycj
//最后修改:时间(2006.5.4) 修改人(ycj)
//*****************************************************
void start()
{
sda=1;
delay_time(1);
scl=1;
delay_time(1);
sda=0;
delay_time(1);
scl=0;
delay_time(1);
}
//****************IIC产生stop信号函数******************
//描 述:模拟IIC总线发送一个stop信号
//入口参数:无
//返回参数:无
//设 计:ycj
//最后修改:时间(2006.5.4) 修改人(ycj)
//*****************************************************
void stop()
{
scl=0;
delay_time(1);
sda=0;
delay_time(1);
scl=1;
delay_time(1);
sda=1;
delay_time(2500);
}
//*******************IIC发送数据函数********************
//描 述:模拟IIC总线发送数据
//入口参数:uchar temp : 待发送的数据
//返回参数:无
//设 计:ycj
//最后修改:时间(2006.5.4) 修改人(ycj)
//******************************************************
void IIC_send(uchar temp)
{
uchar i;
scl=0;
delay_time(1);
for (i=0;i<8;i++)
{
if (temp&0x80)
sda=1;
else
sda=0;
delay_time(1);
scl=1;
delay_time(1);
scl=0;
delay_time(1);
sda=0;
temp=temp<<1;
}
}
//****************从IIC总线上读数据函数****************
//描 述:从IIC总线上读一个byte的数据
//入口参数:无
//返回参数:uchar k : 返回从总线上读到的数据
//设 计:ycj
//最后修改:时间(2006.5.4) 修改人(ycj)
//*****************************************************
uchar IIC_read(void)
{
uchar i,j,k=0;
scl=0;
delay_time(1);
for (i=0;i<8;i++){
sda=1;
delay_time(1);
scl=1;
delay_time(1);
if (sda==1)
j=1;
else
j=0;
k=(k<<1)|j;
scl=0;
delay_time(1);
}
return(k);
}
//*******************等待应答函数***********************
//描 述:等待24cxx的应答信号
//入口参数:无
//返回参数:无
//设 计:ycj
//最后修改:时间(2006.5.4) 修改人(ycj)
//******************************************************
void wait_ack(void)
{unsigned char i;
scl=0;
delay_time(1);
sda=1;
delay_time(1);
scl=1;
delay_time(1);
while(1)
{
if (sda==1)
i++;
else
break;
if (i==255)
while(1);
}
scl=0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -