您的位置:首页技术文栏单片机C51
内容搜索:
阅读内容
背景:#EDF0F5 #FAFBE6 #FFF2E2 #FDE6E0 #F3FFE1 #DAFAF3 #EAEAEF 默认  

24C0X存储器计数程序

[日期:2008-06-24 ] [来源:net 作者:佚名] [字体: (投递新闻)
 

1.实验任务

    本实验实现的是向24C02存储计数,并通过数码管显示

2.实验目的

    掌握24C02的读写时序,学会利用单片机24C02写数据和读数据。

3.实验原理   

    I2C总线是一种用于IC器件之间连接的二线制总线。它通过SDA(串行数据线)及SCL(串行时钟线)两根线在连到总线上的器件之间传送信息。

当时钟线SCL为高电平时,数据线SDA由高电平跳变为低电平定义为“开始”信号,起始状态应处于任何其他命令之前;当SCL线处于高电平时,SDA线发生低电平到高电平的跳变为“结束”信号。器件将处于备用方式(Standby MODE).开始和结束信号都是由主器件产生。在开始信号以后,总线即被认为处于忙状态;在结束信号以后的一段时间内,总线被认为是空闲的。I2C总线的数据传送格式是:在I2C总线开始信号后,送出的第一个字节数据是用来选择从器件地址的,其中前7位为地址码,第8位为方向位(R/W)读写控制。方向位为“0”表示发送,即主器件把信息写到所选择的从器件;方向位为“1”表示主器件将从从器件读信息。开始信号后,系统中的各个器件将自己的地址和主器件送到总线上的地址

进行比较,如果与主器件发送到总线上的地址一致,则该器件即为被主器件寻址的器件,其接收信息还是发送信息则由第8(R/W)确定。

I2C总线上每次传送的数据字节数不限,但每一个字节必须为8位,而且每个传送的字节后面必须跟一个应答位(ACK,ACK信号在第9个时钟周期时出现。数据传送每次都是先传最高位,通常从器件在接收到每个字节后都会作出响应,即释放SCL线返回高电平,准备接收下一个数据字节,主器件可继续传送。如果从器件正在处理一个实时事件而不能接收数据时,(例如正在处理一个内部中断,在这个中断处理完之前就不能接收I2C总线上的数据字节)可以使时钟SCL线保持低电平,从器件必须使SDA保持高电平,此时主器件产生1个结束信号,使传送异常结束,迫使主器件处于等待状态。当从器件处理完毕时将释放SCL线,主器件继续传送。当主器件发送完一个字节的数据后,接着发出对应于SCL线上的一个时钟(ACK)认可位,在此时钟内主器件释放SDA线,一个字节传送结束,而从器件的响应信号将SDA线拉成低电平,使SDA在该时钟的高电平期间为稳定的低电平。从器件的响应信号结束后,SDA线返回高电平,进入下一个传送周期。

24C02的时序图如下:

1)起始与停止时序图:

21836763d9454aaabee6f49b1b8b656b.bmp

2)写数据时序图

e8282fbd12cad371954907612ca84aeb.bmp

4.电路原理图

2a6f25902e56713d68927a413ba9782b.bmp

5.实验源程序

#include "reg52.h"
#include <stdio.h>
#include <absacc.h>
unsigned char code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
unsigned char sec;        //定义计数值,每过1秒,sec加1
unsigned int tcnt;        //定时中断次数
sbit P2_1=P2^1;
bit  write=0;             //写24C08的标志;
sbit gewei=P2^2;          //个位选通定义
sbit shiwei=P2^3;         //十位选通定义
/////////24C08读写驱动程序////////////////////
sbit scl=P3^7;  //24c08 SCL
sbit sda=P3^6;  //24c08 SDA
void delay1(unsigned char x)
{  unsigned int i;
  for(i=0;i<x;i++);
  ;}
void flash()
{  ;  ; }
void x24c08_init()  //24c08初始化子程序
 {scl=1; flash(); sda=1; flash();}
void start()        //启动I2C总线
{sda=1; flash(); scl=1; flash(); sda=0; flash(); scl=0; flash();}
void stop()         //停止I2C总线
{sda=0; flash(); scl=1; flash(); sda=1; flash();}
void writex(unsigned char j)  //写一个字节
{  unsigned char i,temp;
   temp=j;
   for (i=0;i<8;i++)
   {temp=temp<<1; scl=0; flash(); sda=CY; flash(); scl=1; flash();}
   scl=0; flash(); sda=1; flash();
}
unsigned char readx()   //读一个字节
{
   unsigned char i,j,k=0;
   scl=0; flash(); sda=1;
   for (i=0;i<8;i++)
   {  flash(); scl=1; flash();
      if (sda==1) j=1;
      else j=0;
      k=(k<<1)|j;
   scl=0;}
   flash(); return(k);
}
void clock()         //I2C总线时钟
{
   unsigned char i=0;
   scl=1; flash();
   while ((sda==1)&&(i<255))i++;
   scl=0; flash();
}
////////从24c02的地址address中读取一个字节数据/////
unsigned char x24c08_read(unsigned char address)
{
   unsigned char i;
   start(); writex(0xa0);
   clock(); writex(address);
   clock(); start();
   writex(0xa1); clock();
   i=readx(); stop();
   delay1(10);
   return(i);
}
//////向24c02的address地址中写入一字节数据info/////
void x24c08_write(unsigned char address,unsigned char info)
{
   EA=0;
   start(); writex(0xa0);
   clock(); writex(address);
   clock(); writex(info);
   clock(); stop();
   EA=1;
   delay1(50);
}
/////////////24C08读写驱动程序完/////////////////////
void Delay(unsigned int tc)     //延时程序
{
 while( tc != 0 )   
    {unsigned int i;   
     for(i=0; i<100; i++); 
     tc--;}
}
void LED()                  //LED显示函数
{
   shiwei=0; P0=table[sec/10]; Delay(8); shiwei=1;
   gewei=0;  P0=table[sec%10]; Delay(5); gewei=1;
}
void t0(void) interrupt 1 using 0  //定时中断服务函数
{
TH0=(65536-50000)/256; //对TH0 TL0赋值
TL0=(65536-50000)%256; //重装计数初值
tcnt++;        //每过250ust tcnt加一
if(tcnt==20)  //计满20次(1秒)时
  {
    tcnt=0;   //重新再计
    sec++;
    write=1;  //1秒写一次24C08
    if(sec==100) //定时100秒,在从零开始计时
      {sec=0;}
  }
}
void main(void)
{
P2_1=0;
TMOD=0x01;  //定时器工作在方式1
ET0=1;  EA=1;
x24c08_init();        //初始化24C08
sec=x24c08_read(2);//读出保存的数据赋于sec
TH0=(65536-50000)/256; //对TH0 TL0赋值
TL0=(65536-50000)%256; //使定时器0.05秒中断一次
TR0=1;           //开始计时
 while(1)
  {
  LED();
 if(write==1) //判断计时器是否计时一秒
    {
  write=0;              //清零
     x24c08_write(2,sec);  //在24c08的地址2中写入数据sec
 }
   }
}

阅读:
录入:JETTA

推荐 】 【 打印
本文评论
      全部评论
发表评论


点评: 字数
姓名:
站长推荐