基于STC89C52单片机比赛记分牌的设计程序
- 提问者网友:愿为果
- 2021-04-23 04:19
- 五星知识达人网友:撞了怀
- 2021-04-23 05:15
关键是电池,用于室外的,难找足量的电池
- 1楼网友:底特律间谍
- 2021-04-23 06:29
就弄个at24c02读写程序,注释详细看这个也应该用不到专门的时钟芯片,思路:开机进入主循环之前读取芯片中的数据,设置个标志位没30秒取反一次。或者但秒=0或为60时取反一次也是半分种吸和或断开,
利用单片机本身的定时器,例如每个50ms中断一次20次就是一秒,
bit ack; //应答标志位
sbit sda=p2^1; sbit scl=p2^0;
void start_i2c() { sda=1; //发送起始条件的数据信号 _nop(); scl=1; _nop(); //起始条件建立时间大于4.7us,延时 _nop(); _nop(); _nop(); _nop(); sda=0; //发送起始信号 _nop(); //起始条件锁定时间大于4μ _nop(); _nop(); _nop(); _nop(); scl=0; //钳住i2c总线,准备发送或接收数据 _nop(); _nop(); } void stop_i2c() { sda=0; //发送结束条件的数据信号 _nop(); //发送结束条件的时钟信号 scl=1; //结束条件建立时间大于4μ _nop(); _nop(); _nop(); _nop(); _nop(); sda=1; //发送i2c总线结束信号 _nop(); _nop(); _nop(); _nop(); }
void sendbyte(unsigned char c) { unsigned char bitcnt; for(bitcnt=0;bitcnt<8;bitcnt++) //要传送的数据长度为8位 { if((c<<bitcnt)&0x80)sda=1; //判断发送位 else sda=0; _nop(); scl=1; //置时钟线为高,通知被控器开始接收数据位 _nop(); _nop(); //保证时钟高电平周期大于4μ _nop(); _nop(); _nop(); scl=0; } _nop(); _nop(); sda=1; //8位发送完后释放数据线,准备接收应答位 _nop(); _nop(); scl=1; _nop(); _nop(); _nop(); if(sda==1)ack=0; else ack=1; //判断是否接收到应答信号 scl=0; _nop(); _nop(); }
unsigned char rcvbyte() { unsigned char retc; unsigned char bitcnt; retc=0; sda=1; //置数据线为输入方式 for(bitcnt=0;bitcnt<8;bitcnt++) { _nop(); scl=0; //置时钟线为低,准备接收数据位 _nop(); _nop(); //时钟低电平周期大于4.7us _nop(); _nop(); _nop(); scl=1; //置时钟线为高使数据线上数据有效 _nop(); _nop(); retc=retc<<1; if(sda==1)retc=retc+1; //读数据位,接收的数据位放入retc中 _nop(); _nop(); } scl=0; _nop(); _nop(); return(retc); }
void ack_i2c(void) { sda=0; _nop(); _nop(); _nop(); scl=1; _nop(); _nop(); //时钟低电平周期大于4μ _nop(); _nop(); _nop(); scl=0; //清时钟线,钳住i2c总线以便继续接收 _nop(); _nop(); }
bit isendstr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no) { unsigned char i; for(i=0;i<no;i++) { start_i2c(); //启动总线 sendbyte(sla); //发送器件地址 if(ack==0)return(0); sendbyte(suba); //发送器件子地址 if(ack==0)return(0); sendbyte(*s); //发送数据 if(ack==0)return(0); stop_i2c(); //结束总线 delayms(1); //必须延时等待芯片内部自动处理数据完毕 s++; suba++; } return(1); }
bit ircvstr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no) { unsigned char i;
start_i2c(); //启动总线 sendbyte(sla); //发送器件地址 if(ack==0)return(0); sendbyte(suba); //发送器件子地址 if(ack==0)return(0);
start_i2c(); sendbyte(sla+1); if(ack==0)return(0);
for(i=0;i<no-1;i++) { *s=rcvbyte(); //发送数据 ack_i2c(); //发送就答位 s++; } *s=rcvbyte(); noack_i2c(); //发送非应位 stop_i2c(); //结束总线 return(1); }