此测试程序是先写后读,已经测度通过,希望对你有用!!! /
24c02测试程序 20111201 wqz
/
#include<reg52h>
#include<intrinsh>typedef unsigned char uchar;#define delay5us() _nop_();_nop_();_nop_();_nop_();_nop_();
// _nop_();_nop_();_nop_();_nop_();_nop_(); //延时sbit SDA=P2^7; //IIC总线
sbit SCL=P2^6;
sbit IO =P1^7; //595控制信号
sbit RLK =P1^6;
sbit CLK =P1^5;void my_delay1ms(int t); //晶振频率为110592时,延时为1ms
void Start(); //起始信号
void stop(); //结束信号
void ACK(); //写应答
bit test(); //测试应答信号
void nn(); //不应答
void write_1byte(uchar num);//写一字节数据
uchar read_1byte(); //读一字节数据
uchar write_data(uchar addr,uchar Data,uchar num); //将数据写入24C02中
void write_mpage(uchar addr,uchar Data,uchar num); //页写
void read_data(uchar addr,uchar p,uchar num2); //从24C02中读出数据/
主函数
/void main()
{
uchar i,j,aa; uchar dis1[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,<br> 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //0--F
uchar dis2[16]; //将dis1中的数据写入24C02后读出存在dis2中
write_mpage(0,dis1,16); //写
my_delay1ms(10);
read_data(0,dis2,16); // 读
my_delay1ms(10); while(1)
{
for(j=0;j<16;j++) //将读出的数据显示在数码管上,测试正确性
{
aa=dis2[j];
RLK=0;
for(i=0;i<8;i++)
{
aa<<=1;
IO=CY;
CLK=0;
CLK=1;
}
RLK=1;
my_delay1ms(2000);
}
}
}//void my_delay1ms(int t) //晶振频率为110592时,延时为1ms
{
uchar i,j; while(t--)
{
for(i=10;i>0;i--)
for(j=41;j>0;j--);
}
}//void Start() //起始信号
{
SDA=1;
SCL=1;
delay5us();
SDA=0;
delay5us();
SCL=0;
delay5us();
SDA=1;
}//void stop() //结束信号
{
SDA=0;
delay5us();
SCL=0;
SCL=1;
delay5us();
SDA=1;
}//void ACK() //写应答
{
SDA=0;
SCL=1;
delay5us();
SCL=0;
delay5us();
SDA=1;
}//bit test() //测试应答信号
{
bit a; SDA=1;
delay5us();
SCL=1;
a=SDA;
SCL=0;
return(a);
}//void nn() //不应答
{
SDA=1;
SCL=0;
delay5us();
SCL=1;
}//void write_1byte(uchar num)//写一字节数据
{
uchar i,date; date=num;
for(i=0;i<8;i++)
{
date<<=1;
SDA=CY;
delay5us();
SCL=1;
delay5us();
SCL=0;
}
}//uchar read_1byte() //读一字节数据
{
uchar i,tember=0; for (i=0;i<8;i++)
{
tember<<=1;
if(SDA)
tember|=0x01;
SCL=1;
delay5us();
SCL=0;
}
return tember;
}//uchar write_data(uchar addr,uchar Data,uchar num) //将数据写入24C02中
{
uchar i,diz; diz=addr;
Start();
write_1byte(0xa0);
test();
write_1byte(diz);
test();
for(i=0;i<num;)
{
write_1byte(Data++);
test();
i++;
diz++;
if((diz&0x07)==0) break;
}
stop();
return (num-i);
}//void write_mpage(uchar addr,uchar Data,uchar num) //页写
{
uchar ff; ff=num;
do
{
ff=write_data( addr+(num-ff),Data+(num-ff),ff);
my_delay1ms(10);
}
while(ff);
}//void read_data(uchar addr,uchar p,uchar num2) //从24C02中读出数据
{
uchar i; Start();
write_1byte(0xa0);
test();
write_1byte(addr);
test();
Start();
write_1byte(0xa1);
test();
for(i=0;i<num2-1;i++)
{
p++=read_1byte();
ACK();
}
p=read_1byte();
nn();
stop();
}
在器件在有它各自的址,但它们有两不同的区分方法,如:EEPROM芯片它不仅有内部地,它还有外接的几个引脚用于区分不同的EEPROM芯片,而温度传感器它的内部地址每一个都不同(出厂时就已写入)。有还有就是I2C有8位地址和10位地址两种。
有一个51单片机的
/
LED闪烁的简单试验
连接方法: JP11(P2)和JP1用8PIN排线连接起来
/
#include <reg51h> //此文件中定义了51的一些特殊功能寄存器
void delay(unsigned int i); //声明延时函数
main()
{
P1 = 0x00; //置P0口为低电平
delay(600); // 调用延时程序
P1 = 0xff; //置P0口为高电平
delay(600); // 调用延时程序
}
/延时函数/
void delay(unsigned int i)
{
unsigned char j;
for(i; i > 0; i--)
for(j = 255; j > 0; j--);
}
单片机是连线
以上就是关于有没有单片机程序,是把IIC的数据读出来。是有应答的。。具体还没想到思路,还想有人执教一下全部的内容,包括:有没有单片机程序,是把IIC的数据读出来。是有应答的。。具体还没想到思路,还想有人执教一下、单片机IIC总线上24c02写数据问题。、编写一个c程序来控制LED闪烁,通过iic总线,就是sbit sda....sbit scl.... 求告知 应该怎么编写等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)