//**程序名称:51单片机实现对24C02进行页写、顺序读取并显示验证 //**编写人:**** //**修改人:**** //**程序目的:熟悉I2C总线协议,实现51模拟I2C时序和24C02通信 //**功能描述:51单片机将8个字节数据写入24C02的一页中,然后顺序读出,每隔1秒送P0口LED显示 //**其他说明:本程序是采用某51开发板,若在其他地方验证可更改相关端口及延时程序等。 //** 程序编写前曾参考过多个教程,最终自己编程通过,并详加注释。 //** 可供初学者参考,并不对程序的可靠性等作保证。 //**开发工具:keil 7.50 (C51) //**日期: //************************************************************************************* #include#include //因为用到_nop_(); typedef unsigned char uchar; sbit SCL = P3^3; //注意P1、P2、P3口有内部上拉电阻,可直接连SDA和SCL,若想用P0需外接上拉电阻,否则连上无法输出高电平! sbit SDA = P3^4; uchar j; //用于计数50ms的个数的全局变量 uchar code ToSDAdataBuffer[8] = {0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00}; //写入24C02的一组数据,8个字节对应24C02的一页(共32页),这里把这些要验证的常数放到程序存储区 uchar ReceivedData[8]; //用于存储接收的8个字节数据(1页)的数组 //本例51为单主机,24C02为从机,不需要总线裁决 //延时5us子程序 void delay5us(void) { _nop_(); //时序图要求开始建立时间tSU.STA大于4.7us,开始保持时间tHD.STA大于4us。51中每个_nop_();延时1个CPU cycle,即1us。 _nop_(); //如考虑不同CPU频率不同,可用带参数的延时,参数在前面宏定义。 _nop_(); _nop_(); _nop_(); } //50ms定时器0中断函数 void timer0() interrupt 1 //j是个全局变量,不是返回值,所以这里还是void。 { TH0 = (65536-46080)/256; //11.0592MHz时每50ms一次定时器中断 TL0 = (65536-46080)%256; j++; //也可以把判断j到20,并给P0口送显示数据的程序放在中断里处理 } //延时1秒的子程序,用于将读取的数据每隔一秒显示在LED上 void delay1s(void) { j = 0; TMOD = 0x01; //方式1的16位计数器 TH0 = (65536-46080)/256; TL0 = (65536-46080)%256; EA = 1; ET0 = 1; TR0 = 1; //启动定时器0工作 while(j < 20) //j达到20之前空操作,达到20时说明已到1s,下面关中断和定时器0 ; EA = 0; ET0 = 0; TR0 = 0; } //约2ms的延时 void delay(uchar t) { uchar x,y; for(x=0;x
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』