找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1102|回复: 1
打印 上一主题 下一主题
收起左侧

这个IIC总线程序为什么每次开启之后显示的数据为原来的一半?不是应该接着单片机关...

[复制链接]
跳转到指定楼层
楼主
ID:494791 发表于 2019-3-25 10:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include"reg52.h"
#define uchar unsigned char
#define uint unsigned int
bit write=0;
sbit scl=P2^1;
sbit sda=P2^0;
uchar sec,tcnt;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
uint x,y;
uchar code table[10]={0x3f,0x06,0x5b,0x4f,0x66,
                      0x6d,0x7d,0x07,0x7f,0x6f};
void delay()
{ ; ; }
void delay1ms(uint z)
{  
   for(x=z;x>0;x--)
     for(y=110;y>0;y--);
}
void start()   //开始信号
{
  sda=1;
  delay();
  scl=1;
  delay();
  sda=0;
  delay();
}
void stop()       //结束信号
{
  sda=0;
  delay();
  scl=1;
  delay();
  sda=1;
  delay();
}
void respons()
{
   uchar i;
   scl=1;
   delay();
   while((sda==1)&&(i<250))
   i++;
   scl=0;
   delay();
}
void init()    //初始化函数
{
   sda=1;
   delay();
   scl=1;
   delay();
}
void writebyte(uchar date)    //写
{
   uchar i,temp;
   temp=date;
   for(i=0;i<8;i++)
   {
        temp=temp<<1;//将temp左移一位,最高位移入CY位,然后将CY赋给SDA进而在SCL的控制下发送出去
     scl=0;
     delay();
     sda=CY;
     delay();
     scl=1;
     delay();
   }
   scl=0;
   delay();
   sda=1;
   delay();
}
uchar readbyte()
{
  uchar i,k;
  scl=0;
  delay();
  sda=1;
  delay();
  for(i=0;i<8;i++)
  {
       scl=1;
     delay();
     k=(k<<1)|sda;//将k左移一位后与SDA进行或运算,依次把8个独立的位放入1字节中完成接收
     scl=0;
     delay();
  }
  return k;
}
void writeadd(uchar address,uchar date)//向任一地址写一字节的数据
{
    start();
    writebyte(0xa0);//发送从器件地址
    respons();
    writebyte(address);    // 发送地址
    respons();
    writebyte(date);//发送数据
    respons();
    stop();
}
uchar readadd(uchar address)//从中任一地址读取一字节的数据
{
   uchar date;
   start();
   writebyte(0xa0);//发送从器件地址
   respons();
   writebyte(address);// 发送地址
   respons();
   start();
   writebyte(0xa1);// 发送数据
   date=readbyte();//读数据
   stop();
   return date;
}
void display(uchar yiwei,uchar erwei)
{
      LSA=0;
      LSB=0;
      LSC=0;
      P0=table[erwei];
      delay1ms(10);
      LSA=1;
      LSB=0;
      LSC=0;
      P0=table[yiwei];
      delay1ms(10);
}
void main()
{
   init();
   sec=readadd(2);//读出保存的数据赋给sec
   if(sec>100)
    sec=0;
   TMOD=0x01;
   ET0=1;
   EA=1;
   TH0=0x3c;
   TL0=0xb0;
   TR0=1;
   while(1)
   {
        display(sec/10,sec%10);
     if(write==1)
     {
       write=0;
       writeadd(2,sec);
     }
   }
}
void time0() interrupt 1
{
   TH0=0x3c;
   TL0=0xb0;
   tcnt++;
   if(tcnt==20)
   {
         tcnt=0;
      sec++;
      write=1;
      if(sec==100)
      sec=0;
   }
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:466164 发表于 2019-3-25 22:37 | 只看该作者
从新上电可能初始值刚好激发程序,建议你把EA=1放最后打开。阀门从最小到最大。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表