×
单片机 > 单片机程序设计 > 详情

51单片机实现对24C02进行页写、顺序读取并显示验证

发布时间:2020-05-28 发布时间:
|
//*************************************************************************************
//**程序名称: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
					
					
					


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
51单片机CO2检测显示程序解析